1

我需要编写一个 C 程序来读取1<=students<=25班级中的学生人数(),并让每个学生阅读他的考试成绩10/20 15/20等(1<=score<=20)并打印学生的最高和最高分数以及班级的平均分数。

我制作了这个程序,但for由于某种原因它只执行了一次循环。

你能帮我理解为什么吗?

这是代码:

#include <stdio.h>

int main(void) {
    int m,i,b,sum,min,max,mo;
    sum=0;
    while (m<1 || m>25) {
            printf("give number of students ");
            scanf("%d",&m);
    }
    for (i=1; i<(m+1); i++) {
            while (b<1 || b>20) {
            printf("give score of  %d student",i);
            scanf("%d",&b);
            }

            if(i==1) {
                    min=b;
                    max=b;
            }
            else {
                    if(b<min) min=b;
                    if(b>max) max=b;
            }
            sum=sum+b;
    }
    mo=sum/m;
    printf("max is  %d and min is  %d and avg is  %d",max,min,mo);
}
4

4 回答 4

1

首先 - 初始化你的变量:

int m,i,b,sum,min,max,mo; // these are declared and uninitialized

m = 0;  // now it's initialized to 0
i = 0;
...

如果您不将它们初始化为某些东西,那么您将不知道它们从什么开始。

第二 - 您需要更改的值b

for (i=1; i<(m+1); i++) {
        while (b<1 || b>20) {  <-- here you're checking for b being valid
        printf("give score of %d student",i);
        scanf("%d",&b);
        }

因此,b 中的第一次将在 1 到 20 之间,如果您不将其重置为无效的值,您将永远不会再回到这里。记录 b 的值后:

    sum=sum+b;
    b = 0;   // we're done with b for now, set it to something invalid for the while()
}
于 2012-11-09T18:40:38.587 回答
1

你忘了初始化B变量,所以它循环了 m​​ 次,从不要求你插入分数!

于 2012-11-09T18:42:37.017 回答
1

1.你在这里初始化'm',没有任何先验值

    int m,i,b,sum,min,max,mo;

2.没有值,你检查这个条件。这意味着,将使用垃圾值。(可能/可能不满足您的条件)

    while (m<1 || m>25) {

3. m的关键scanf在前一个while内。没有它,您的 FOR 将运行基本 i=1 并停止。

    for (i=1; i<(m+1); i++) {

您需要了解 C 中的垃圾值以及在使用变量之前将变量初始化为初始值的重要步骤。

您可以在此链接上阅读更多内容: 什么是垃圾值/它在 C 中是如何发生的

于 2012-11-09T18:44:14.337 回答
1

未初始化m并在while条件下使用

undefined behaviour在条件下使用未初始化的局部变量

想要实现相同的

利用

do
{
  printf("give number of students ");
            scanf("%d",&m);
}
while(m<1 || m>25);

for (i=1; i<(m+1); i++)改变条件,因为i<=m它是一种很好的技术<,然后1 在这个循环中添加使用相同的do while循环

于 2012-11-09T18:37:23.703 回答