1

该程序正在计算整数平均值而不打印十进制值。它将结果打印为整数:N.000000。为什么?

//Store name, roll no, marks of 4 students using structure
//and calculating average
struct student
{
    char name[10];
    int roll_no;
    int marks;
};

void main()
{
    struct student s1,s2,s3,s4;
    float avg;
    clrscr();
    printf("\nEnter name, rollnumber and marks of student 1 : \n");
    scanf("%s%d%d",&s1. name,&s1. roll_no,&s1. marks);
    printf("\nEnter name, rollnumber and marks of student 2 : \n");
    scanf("%s%d%d",&s2. name,&s2. roll_no,&s2. marks);
    printf("\nEnter name, rollnumber and marks of student 3 : \n");
    scanf("%s%d%d",&s3. name,&s3. roll_no,&s3. marks);
    printf("\nEnter name, rollnumber and marks of student 4 : \n");
    scanf("%s%d%d",&s4. name,&s4. roll_no,&s4. marks);
    avg = (s1. marks + s2. marks + s3. marks + s4. marks) / 4;
    printf("\nAverage : %f",avg);

    getch();
}
4

5 回答 5

3
int marks;

表示每个标记都是一个整数。然后将它们相加,这也是一个整数。然后你将它们除以 4,这也是一个整数,所以这个操作将是一个整数除法 - 一个丢弃结果的小数部分的操作。把它除以4.0,你会没事的。

于 2012-09-06T15:03:26.340 回答
2
avg = (s1. marks + s2. marks + s3. marks + s4. marks) / 4;

由于所有标记都是整数并且 4 也是整数,因此除法将遵循整数规则 - 不会以任何小数开头。

尝试将其中一个标记投射到doublefloat,或者您可以.0在 4 之后添加一个。

于 2012-09-06T15:02:09.987 回答
1

您计算中的所有操作数都是int,所以您的结果是int

在计算中引入浮点数以保留平均值的小数部分:

avg = (s1. marks + s2. marks + s3. marks + s4. marks) / 4.0;
于 2012-09-06T15:03:30.310 回答
1

只需将总和除以 4.0

代码如下:

avg = (s1. marks + s2. marks + s3. marks + s4. marks) / 4.0;

这将解决您的问题。


这是因为您将标记作为一个int值并将其除以int值(即4)。因此,当您将两个int值相除时,结果将是一个int值。但是,当我们除以一个double值(即 4.0)时,结果将以double格式计算,然后float在分配给时转换为avg.

于 2012-09-06T15:05:57.193 回答
0

你有两个问题。

  1. 您的学生成绩是int类型,这意味着当您对其进行除法、加法或对它们进行大多数操作时,将是int除法、加法等,返回ints。

  2. 您的输出语句%d用作格式化指令,它将传递的值格式化为 int。

解决第一个问题

((float)s1.marks) + ...

将你投int给a float,而futureints加给floatsyield floats

解决第二个问题

printf("... %f ...", value);

将格式化该值,就好像它是一个浮点数(它应该是)。

还有其他解决方案,例如,许多金融系统不希望处理一分钱的小数,因此将值存储为考虑的最小小数的计数,并适当格式化为小数美元(11.03 美元,但存储值为 1103 )。

于 2012-09-06T15:08:11.127 回答