高手帮我看一下c语言中的代码哪儿有问题?

来源:百度知道 编辑:UC知道 时间:2024/06/08 04:03:12
#include<stdio.h>
void main(void)
{
int f,i,k1=0,k2=0,k3=0,k4=0,k5=0,max=0,min=0,h=0;
float p=0;
printf("输入成绩\n");
do{
scanf("%d",&i);
if(i>=0 && i<60)
k1++;
else if(i>=60 && i<70)
k2++;
else if(i>=70 && i<80)
k3++;
else if(i>=80 && i<90)
k4++;
else if(i>=90 && i<=100)
k5++;
else
{
printf("输入有误");
f=0;
}
h+=i;
if (max<i)
max=i;
if(min>i)
min=i;

if ((char)i=='\n')
f=0;
}while(f!=0);
p=h/(k1+k2+k3+k4+k5+0.0);
printf("%d\t%d\t%d\t%d\t%d\n",k1,k2,k3,k4,k5);
printf("%f\t%d\t%d\n",p,max,min);
}

1,你既然用do while(f !=0),那么就应该给f赋初值,比如f=1;
2, min求最小值,应该先给min赋一个很大的值,至少比你所选的范围大,比如说101,这样才能得到最小值。按照你原来的程序,min始终为0
3,用scanf("%d",&i); 又用if((char)i=='\n') ,你可能想当输入'/n'时退出,但是scanf("%d",&i)后i不可能取得'/n'应该用别的方法判断结束。比如说i<0时结束什么的。
把这三点改正后程序就对了。

建议楼主作如下修改:
1、f初始化为1
2、min初始化为100(100分是最高的了)
3、将语句"printf("输入有误"); f=0;"直接修改为break,省去语句"if ((char)i=='\n') f=0; ",这是很关键的一步,因为如果按楼主的方法即使我输入了一个错误的数字,例如111,虽然程序已经设定了f=0,但仍然会执行后面的语句(h+=i; if (max<i) max=i; if(min>i) min=i; ),直至到while(f!=0),跳出循环,但是这已经导致数据的错误,如max=111。用了break语句后可以使程序如果遇到无效数据立刻跳出循环,防止对前面的数据造成影响,而且你在前面已经有跳出循环的方法,后面再定义一个是否有点累赘?

原程序错误点:
[1] if ((char)i=='\n')i为整形变量不能吸收字符。
[2] if(min>i) min=i; min的初始值为0,除非输入有误(输入的是负数),否则永远不会小于i的值。应该初始化为 100 。
[3] if (max<i) max=i; if(min>i) min=i; 判断条件不严密,如果i=101,输入有误但却同样满足max<i这个条件,这时max=101了。反之i<0时,min就会得到一个负值。
[4] 在“h+=i;”之前没有条件