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 以指数形式输出实数