错题1 EOJ C语言 数组去重排

P.S.题目来自EOJ

本来抱着快过刷分的心理做的这道题,但无奈水平有限,提交之后在某个样例上一直runtime error。最后在大佬的指点下终于找到了问题并成功AC了ヾ(◍°∇°◍)ノ゙

下面进入正文。

——————————————————————

题目:

1015. 排序去重

单点时限: 2.0 sec
内存限制: 256 MB

有 n 个 1 到 1000 之间的整数 (1≤n≤100),对于其中重复的数字,只保留一个,把其余相同的数去掉。然后再按照指定的排序方式把这些数排序。

输入格式
第 1 行为字母 A 或 D,A 表示按照升序排序,D 表示按照降序排序。
第 2 行开始有若干个用一个空格或换行符分隔的正整数。
输出格式
相互之间用一个空格分隔的经去重和排序后的正整数。最后一个数后没有空格。

样例
input
A
20 40 32 67 40 20 89 300 400 15
output
15 20 32 40 67 89 300 400
——————————————————————

思路:

输入命令 -> 输入数组 -> qsort库函数由小到大排序 -> 输出时,根据命令是A还是D确定顺序,并控制与已经输出重复的元素不再输出

——————————————————————

代码:

以下是错误的代码(有两处错误)(改正方法详见注释)【捂脸】

#include<stdio.h>
#include<stdlib.h>

int compare(const void *a, const void *b)
{
    return (*(int *)a - *(int *)b);
}

int main()
{
    int data[100];
    int i=0,j=0;
    char state;

    scanf("%c",&state);
    while(scanf("%c",&data[i])!=EOF)   	//data是int类型,所以%c错误,应该为%d
        i++;

    qsort(data,i+1,sizeof(int),compare);

    if(state=='A')
    {
        printf("%d",data[0]);
        for(j=1;data[j]!='\0';j++)        //我们的目的是遍历有效数据,而不是遍历整个数组
        								  //这样会出现垃圾值和0 数组跑飞越界,导致出错
        								  //所以改为判断条件改为j<=i
        {
            if(data[j]!=data[j-1])
                printf(" %d",data[j]);
        }
    }
    if(state=='D')
    {
        printf("%d",data[i]);
        for(j=i-1;j>=0;j--)
        {
            if(data[j]!=data[j+1])
                printf(" %d",data[j]);
        }
    }
    return 0;
}

——————————————————————

启示:

1.遍历数组有效数据的循环的结束判定条件

如果数组没有存满有效数据,则不要使用 array[i]!=’\0’
有可能导致垃圾值参与运算或输出。

2.注意格式说明的使用
  • %d 整型输出,%ld 长整型输出

  • %o 以八进制数形式输出整数

  • %x 以十六进制数形式输出整数

  • %u 以十进制数形式输出无符号整数

  • %f 以小数形式输出实数

  • %c 输出一个字符

  • %s 输出一个字符串(或字符型数组)

  • %e 以指数形式输出实数

猜你喜欢

转载自blog.csdn.net/qq_43467698/article/details/88653501