一道C语言题,为什么输出的结果为负数?

#include<stdio.h>
#define input scanf
struct student
{char num[10];
char name[10];
int score[3];
int total;
float avr;
}stu[10];
main()
{int i,j,w,max,maxi,sum;
float avr;
printf("Please input 10 students data\n");
for(i=0;i<10;i++)
{printf("The NO.%1d number:",i+1);
input("%s",stu[i].num);
printf("name:");
input("%s",stu[i].name);
for(j=0;j<3;j++)
{printf("score%1d:",j+1);
scanf("%d",&stu[i].score[j]);
}
}
max=0;
maxi=0;
for(i=0;i<10;i++)
{sum=0;
for(j=0;j<3;j++)
sum+=stu[i].score[j];
stu[i].total=sum;
stu[i].avr=(float)sum/3;
if(sum>max)
{max=sum;
maxi=i;
}
w+=stu[i].total;
avr=w/10;
}
printf("number name score1 score2 score3 total average\n");
for(i=0;i<10;i++)
{printf("%6s%7s",stu[i].num,stu[i].name);
for(j=0;j<3;j++)
printf("%8d",stu[i].score[j]);
printf("%8d",stu[i].total);
printf("%8.2f\n",stu[i].avr);
}
printf("All students' average=%8.2f\n",avr);
printf("The best student is %s\nName:%s\nTotal=%d\n",stu[maxi].num,stu[maxi].name,max);
}
最后输出的结果中全部学生的平均值位2000多的一个负数,找不到原因。求高手!

你的主要原因是变量w没有初始化,是内存中的遗留值,导致最后输出的结果中全部学生的平均值为2000多的一个负数。

修改后源码软下:


#include <stdio.h>
#include <stdlib.h>
#define input scanf
struct student
{
    char num[10];
    char name[10];
    int score[3];
    int total;
    float avr;
}stu[10];
 
main()
{
    int i,j,w,max,maxi,sum;
    float avr;
    printf("Please input 3 students data\n");
    for(i=0;i<3;i++)
    {
        printf("The NO.%1d number:",i+1);
        input("%s",&stu[i].num);    
        printf("name:");
        input("%s",&stu[i].name);   
        for(j=0;j<3;j++)
        {
            printf("score%1d:",j+1);
            scanf("%d",&stu[i].score[j]);
        }
    }
    max=0;
    maxi=0;
    w=0;//w赋值为0
    for(i=0;i<3;i++)
    {
        sum=0;
        for(j=0;j<3;j++)
            sum+=stu[i].score[j];
        stu[i].total=sum;
        stu[i].avr=(float)sum/3.0;
        if(sum>max)
        {
            max=sum;
            maxi=i;
        }
        w+=stu[i].total;
        avr=w/3;
    }
    printf("number   name  score1  score2  score3   total  average\n");
    for(i=0;i<3;i++)
    {
        printf("%6s%7s",stu[i].num,stu[i].name);
        for(j=0;j<3;j++)
            printf("%8d",stu[i].score[j]);
        printf("%8d",stu[i].total);
        printf("%8.2f\n",stu[i].avr);
    }
    printf("All students' average=%8.2f\n",avr);
    printf("The best student is %s\nName:%s\nTotal=%d\n",stu[maxi].num,stu[maxi].name,max);
    system("pause");
    return 0;
}

编译运行后的结果如下:

其中源程序和可执行程序均可从附件中下载。

温馨提示:内容为网友见解,仅供参考
第1个回答  2013-11-02
#include<stdio.h>
#define input scanf
struct student
{
    char num[10];
    char name[10];
    int score[3];
    int total;
    float avr;
}stu[10];

main()
{
    int i,j,w,max,maxi,sum;
    float avr;
    printf("Please input 10 students data\n");
    for(i=0;i<10;i++)
    {
        printf("The NO.%1d number:",i+1);
        input("%s",&stu[i].num);    //输入的时候没加取址符
        printf("name:");
        input("%s",&stu[i].name);   //输入的时候没加取址符
        for(j=0;j<3;j++)
        {
            printf("score%1d:",j+1);
            scanf("%d",&stu[i].score[j]);
        }
    }
    max=0;
    maxi=0;
    for(i=0;i<10;i++)
    {
        sum=0;
        for(j=0;j<3;j++)
            sum+=stu[i].score[j];
        stu[i].total=sum;
        stu[i].avr=(float)sum/3;
        if(sum>max)
        {
            max=sum;
            maxi=i;
        }
        w+=stu[i].total;
        avr=w/10;
    }
    printf("number   name  score1  score2  score3   total  average\n");
    for(i=0;i<10;i++)
    {
        printf("%6s%7s",stu[i].num,stu[i].name);
        for(j=0;j<3;j++)
            printf("%8d",stu[i].score[j]);
        printf("%8d",stu[i].total);
        printf("%8.2f\n",stu[i].avr);
    }
    printf("All students' average=%8.2f\n",avr);
    printf("The best student is %s\nName:%s\nTotal=%d\n",stu[maxi].num,stu[maxi].name,max);
}

    请放心使用,有问题的话请追问

    满意请及时采纳,谢谢,采纳后你将获得5财富值。

    你的采纳将是我继续努力帮助他人的最强动力!

本回答被提问者采纳

一道C语言题,为什么输出的结果为负数?
你的主要原因是变量w没有初始化,是内存中的遗留值,导致最后输出的结果中全部学生的平均值为2000多的一个负数。修改后源码软下:include <stdio.h>#include <stdlib.h>#define input scanfstruct student{ char num[10]; char name[10]; int score[3]; int total; float avr;}...

c语言问题,为什么会输出负数
这个问题有多种可能,不一而足。算法有错误,最终计算结果是负数。输出自然会是负数。例如:int a=1;int b=a-2;printf("b=%d",b);\/\/输出结果:b=-1超过变量类型的最大取值范围,发生溢出。例如Turbo C里int是16位,取值范围-32768~32767。如果计算过程当中,数值超过32767,由于补码的关系。结...

C语言运行结果的时候为什么会出现负数
必然是溢出了。

【C语言】有没有大佬知道这个程序为什么会输出一个负数?
程序会输出负数的原因是,在这个程序中你没有对每次运算的结果进行检查,因此当乘积超出了long类型的最大值时,就会产生溢出,导致结果为负数。为了避免这个问题,你可以在每次运算后检查结果是否已经超出了long类型的范围,并在必要时退出循环。可以这样改:include<stdio.h> main(){ long i;i=chengji(...

为什么我c语言取随机数取出来的都是负数啊?
确实,用C是负数 因为C的编译器对于大于32767的int型数(RAND_MAX+1=32768)处理上变成了一个负数-32768,这是机器在处理上它被规定成这样了。所以运算以后还是个负数了。

为什么C语言算出来是负数?大神们帮忙检查一下吧
for(n=2;n<=16;n=n+2)m=m*(n+1)*(n+2);你的m的初步估计是3的8次方4的8次方乘以2 144194 然后肯定是超出界限了。。int是2个字节。。也就是16位,第一位是数据的正负0正1负,15位是数值最大的值是32767 超出了。。。然后你最后结果的反正是超出范围了。,。最终是哪里超出的就不...

C语言问题,输出结果总是负数,求教
你定义的类型不一致,前边定义是双精度double的实数,后边输出用的是%f单精度的浮点型,这两个数精度差太多,在C++里double输出用的是%lf,你看看这里是不是,要么把前边类型改成float,要么后边输出改成%lf

C语言程序,结果会出现负0,请问怎么办?
这是圆周率数值的截断误差引起的,算出的向量就是接近0的负数。要想得正0,圆周率给个 (四舍)五入值:pai=3.14159265359;就可以了。但不能保证别的特殊的输入数会不会 该正0 出现负0。

C语言这个问题为什么到一定程度就会出负数?
应该是因为你使用的是有符号数,long在VC6.0中占4个字节,当最高位是1的时候,该long变量就是负数;建议将所有的long类型修改为unsigned long

C语言 为什么我这个程序输入正确数后 结果总为负数
那么长的结果 你不把数据类型改长一点 那么就会数据溢出 变成负数的

相似回答