C语言找错 题目:从键盘输入一个班(不超过30人)学生某门课的成绩,

从键盘输入一个班(不超过30人)学生某门课的成绩,当输入成绩为负值时,则输入结束,统计并输出不及格人数并打印不及格学生的成绩,按成绩高低排序,输出该班最高分及最低分。
下面是我的程序代码,运行时却发现人数超过30人后仍可继续输入,求大神帮忙找一下错误在哪。马上要交了,急求啊!!!

#include<stdio.h>
#define N 30
main()
{
int a[N],i=0,j,k,m=0,t;
do
{
printf("输入学生成绩a[%d]=",i);
scanf("%d",&a[i]);
i++;
}
while(a[i-1]>=0);
k=i-2;
for(i=0;i<k;i++)
{
for(j=i+1;j<k+1;j++)
if(a[i]>a[j]){
t=a[i];a[i]=a[j];a[j]=t;
}
if(a[i]<60){
printf("不及格成绩a[%d]=%d\n",i,a[i]);
m++;
}
}
printf("不及格人数m=%d\n",m);
printf("该班最高成绩a[%d]=%d\n",k,a[k]);
printf("该班最低成绩a[0]=%d\n",a[0]);
getch();
}

只有你输入的成绩为负数时才会停止让你输入,因为你有判断while(a[i-1]>=0);

所以如果你输入的大于零他会一直让你输入;

另外使用getch,应包含头文件#include <conio.h>

完整代码

#include<stdio.h>
#include <conio.h>
#define N 30
void main()
{
int a[N],i=0,j,k,m=0,t;
do
{
printf("输入学生成绩a[%d]=",i);
scanf("%d",&a[i]);
i++;
}
while(a[i-1]>=0);
k=i-2;
for(i=0;i<k;i++)
{
for(j=i+1;j<k+1;j++)
if(a[i]>a[j]){
t=a[i];a[i]=a[j];a[j]=t;
}
if(a[i]<60){
printf("不及格成绩a[%d]=%d\n",i,a[i]);
m++;
}
}
printf("不及格人数m=%d\n",m);
printf("该班最高成绩a[%d]=%d\n",k,a[k]);
printf("该班最低成绩a[0]=%d\n",a[0]);
getch();
}

追问

可是你的程序除了头文件加了一个以外,不是和我的是一样的么?这样的话会导致超过30时还能继续输入啊!怎么才能解决这个问题呢?

追答

如果想解决的话,就把while条件换成
while(i<30);就是执行30次循环。

追问

这样的话,刚刚的问题解决了,但是输入负值时不能结束的问题又来了···求解怎么同时解决这两个问题?

追答

哦,才明白你的意思,那就这样
while(i=0);

温馨提示:答案为网友推荐,仅供参考
第1个回答  2014-06-17
do
{
printf("输入学生成绩a[%d]=",i);
scanf("%d",&a[i]);
i++;
}
while(a[i-1]>=0); //这行改为 while(i<N); 就可以了
//a[i-1] 当i>30,会越界,但是不会退出循环。

如果对你有帮助 请采纳追问

这样改的话,越界问题解决了,但是输入负值时不能结束的问题又出来了···求解怎么同时解决这两个问题···

追答

do
{
printf("输入学生成绩a[%d]=",i);
scanf("%d",&a[i]);
i++;
}
while(i=0);

第2个回答  2014-06-17
整体功能稳定啊
问题是
getchar();
函数名称不能缩写的!
还有,要求是30人,可是你的循环次数应该试着30
相似回答