C语言不声明函数造成的错误(swust oj 排序查找)
问题描述
对N个学生的成绩按从大到小的顺序排序,N个学生的成绩整数用scanf 输入,输入的成绩在[0,100]之间。排序完成后,输入一个成绩,要求用逐个比较查找的方式找出该成绩是该组中第几个元素的值(即第几名)。如果该成绩不在数组中,则输出“no this score!”。 要求:
1、把排序算法写成函数形式,在主函数中输入N个数据,然后调用排序函数排序。
2、在排序过程中尽量减少数据的交换和移动。
3、把查找算法写成函数形式,在主函数中输入1个数据,然后调用查找函数查找。
第一行输出N个已经排好序的成绩,每两个成绩之间有一个空格隔开,每10个数据换一行(由大到小排列)。 第二行输出你要查找的成绩的名次(如果成绩相同,则并列,如果该成绩不在数组中,则输出“no this score!”)。
最初的代码:
void fuck_this_shit();
void fuck_the_world();
int n, a[40], damn;
void main()
{
scanf("%d\n", &n);
for(int i = 0; i < n; i++)
{
scanf("%d", &a[i]);
}
scanf("%d", &damn);
fuck_the_world(a);
fuck_this_shit(damn);
}
void fuck_the_world()
{
int t;
for(int i = 0; i < n; ++i)
{
for(int k = 0; k < n - i; k++)
{
if(a[k] < a[k + 1])
{
int t = a[k];
a[k] = a[k + 1];
a[k + 1] = t;
}
}
}
int j;
for(j = 0; j < n; j++)
{
if(j == 9)
printf("%d\n", a[j]);
else
printf("%d ", a[j]);
}
}
void fuck_this_shit()
{
int i, m = 0;
for(i = 0; i < n; i++)
{
if(damn == a[i])
{
m++;
break;
}
}
if(m > 0)
printf("\n%d", i + 1);
else
printf("\nno this score!");
}
这样写代码在codeblocks上运行结果是没错的,但在oj上运行结果是
原因是没有声明参数,书上说可以不声明参数,但如果不声明参数也就没法往里面传递参数了。 所以在main里面把参数传给函数就会引发错误。
codeblocks可以运行是因为它的编译器比较智能,无视了错误,这种写法是不行的。
改错后的代码:
void fuck_this_shit(int damn, int a[], int n);
void fuck_the_world(int a[], int n);
void main()
{
int damn, a[50], n;
scanf("%d\n", &n);
for(int i = 0; i < n; i++)
{
scanf("%d", &a[i]);
}
scanf("%d", &damn);
fuck_the_world(a, n);
fuck_this_shit(damn, a, n);
}
void fuck_the_world(int a[], int n)
{
int t, s = 0, i = 0;
for(int i; i < n - 1; ++i)
{
for(int k = 0; k < n - i - 1; k++)
{
if(a[k] < a[k + 1])
{
int t = a[k];
a[k] = a[k + 1];
a[k + 1] = t;
}
}
}
int j;
for(j = 0; j < n; j++)
{
s = j % 10;
if((j + 1) % 10 == 0)
printf("%d\n", a[j]);
else if(j != n - 1)
printf("%d ", a[j]);
else
printf("%d", a[j]);
}
}
void fuck_this_shit(int damn, int a[], int n)
{
int i, m = 0;
for(i = 0; i < n; i++)
{
if(damn == a[i])
{
m++;
break;
}
}
if(m > 0)
printf("\n%d", i + 1);
else
printf("\nno this score!");
}
改错时也没有再用全局变量了,注意。
如有错误,请指正。