特定代码的输出不正确。 (最大,最小,grade_scanner)

时间:2018-09-25 13:30:11

标签: c

最近几天我一直在努力解决这个问题,但是没有运气。目的是找到总和,平均,最低和最高等级并显示它们。

这是我的代码,除最小,最大和等级输入外的所有内容似乎都有效

// Includes printf and scanf functions
#include <stdio.h>

int main(void) {
    unsigned int counter; // number of grade to be entered next
    int grade; // grade value
    int total; // sum of grades entered by user
    float average; // average of grades
    int maxi; // Max grade
    int mini; // min grade
    int i;
    int max;
    int min;

    maxi = 1;
    mini = 1;

    printf("Enter number of grades: "); // User enters number of grades
    scanf("%d", &counter); // Countss number of grades
    //scanf("%d%d", &min, &max);

    for (i = 1; i <= counter; i++) {
        printf("Enter grade %d: ", i); // User enters grade
        scanf("%d", &grade); // Counts grades
        //scanf("%d",&counter);

        if (grade < 0 || grade > 100) {
            printf("Please enter a number between 0 and 100!\n"); // Lets user know if input is invalid
            i--;
            break;
        }
        else {
            total = total + grade;
            average = (float)total / counter; // NOTE: integer division,    not decimal
        }
    }

    max = (grade < maxi) ? maxi : grade;
    min = (grade > mini) ? mini : grade;

    printf("Class average is: %.3f\n", average); // Displays average
    printf("Your maximum grade is %d\n", max); // Displays Max
    printf("Your minimum grade is %d\n", min); // Displays minimum
    printf("Sum: %d\n", total); // Displays total
}

输出:

Enter number of grades: 2
5
7
Enter grade 1: 4
Enter grade 2: 3
Class average is: 3.500
Your maximum grade is 3
Your minimum grade is 1
Sum: 7

由于某种原因,当我启动程序时,我必须输入一些数字,在本例中为5和7,然后它才提示我“输入成绩”,然后从那里计算出所有内容。此外,似乎最大值始终是我输入的最后一个等级,并且当输入中的任何地方都不为1时,最小值显示为1。我应该使用条件运算符作为最大/最小值,我尝试查找并阅读这本书,但他们只是使用a,b,c等字母,这让我感到困惑,所以我不确定自己做错了什么。

那会是什么弄乱了一切吗?如果不是,那我做错了吗?

另一件事是,我想如果要使计数器具有1-100的输入,就需要一个 循环,对吗?

编辑:刚意识到我必须删除max和min的scanf。这就是为什么我必须首先插入2个数字游戏的原因

5 个答案:

答案 0 :(得分:1)

我认为有两个主要问题

  • 变量total未初始化,因此第一次出现的total = total + grade;会调用未定义的行为。

    您必须将其显式初始化为0

  • 相同的变量grade用于保存重复的输入。循环后,grade仅保留最后一个输入值。

    您需要使用一个数组来存储输入和比较,或者在循环内随便比较和更新最小值和最大值。

答案 1 :(得分:1)

对于将来的参考,请分析不同功能的代码或添加注释,因为分析不熟悉的代码通常会花费很多时间。

min:问题出在这里,您正在用1初始化min值。在大多数情况下,该值低于输入等级。如果要初始化它,则应使用较高的数字。 例如:

#include <limits.h>
int min = INT_MAX;

max:您的“成绩”将始终是您扫描的最后输入的成绩。那不是你想要的。保存所有作为数组或列表输入的值将是很好的。

也是您的代码段结尾

max = (grade<maxi) ? maxi : grade;
min = (grade>mini) ? mini : grade;

只会比较一个年级。您需要比较所有输入的值。 您可以将它们放在for循环中。

gradeinput:您需要将输入内容临时保存在数组/列表之类的数据结构中,以便在程序中使用它们。

int x[counter];
for (i = 1; i <= counter; i++) {
    printf("Enter grade %d: ", i);
    x[i]=scanf("%d", &grade);
}

答案 2 :(得分:1)

  

..必须输入一些数字,在本例中为5和7,然后提示我“输入成绩”

之所以发生这种情况,是因为OP的stdout被缓冲了,而不是一次没有一个字符。

要确保在scanf()之前可以看到输出,请使用fflush()
参见What are the rules of automatic flushing stdout buffer in C?

printf("Enter number of grades: ");
fflush(stdout); // add
scanf("%d", &counter);

将其设置为较大的值,而不是设置min = 1

maxi = 1;
mini = 1;

maxi = 0;
mini = 100;
// or 
maxi = INT_MIN;
mini = INT_MAX;

将测试中的最小值/最大值移动到循环中以测试每个值,并将maxi, max折叠到同一变量中。

    if (max > grade) max = grade;
    if (min < grade) min = grade;

第一个total + grade是个问题,因为total尚未初始化。

// int total; // sum of grades entered by user
int total = 0; // sum of grades entered by user

每次通过循环都不必计算average。之后就足够了。

样式:在break;之后不需要else

该代码可以测试用户输入范围。但是i--是不正确的。如果代码要破解,只需break。如果将其编码为重试,则i--是有意义的,但是编码应为continue

注释// NOTE: integer division, not decimal不正确,因为(float) total / counter是FP部门。

    if (grade < 0 || grade > 100) {
      printf("Please enter a number between 0 and 100!\n");
      i--;
      continue;
    }
    total = total + grade;
  } // end for
  average = (float) total / counter;

通常应避免进行投射。

高级问题:请考虑以下情况,如果稍后对代码进行改进以处理更大范围的整数并使用更高精度的FP数学。

第一种形式使total变成float(这可能会失去精度),甚至可能使用float来计算商,即使average是{{ 1}}。当然,在升级过程中,double强制转换可以编辑为(float),但这是更新的常见故障。类型可以更改,但是它们的受影响对象使用未完全经过审查。

下面的第二种形式使(double)成为与total相同的类型,并对类型使用匹配的数学运算。减少因类型更改而需要的更改。 review 这种表单也更容易,因为不需要返回并检查FP类型average来查看是否强制转换为averagefloat甚至需要double

long double

答案 3 :(得分:0)

由于某种原因,当我启动程序时,我必须输入一些数字,在本例中为5和7,然后它才提示我“输入成绩”

“输入成绩”前有两个scanf

scanf("%d", &counter);
scanf("%d%d", &min, &max);

答案 4 :(得分:0)

#include <stdio.h>

int main(void) {
    int counter; // number of grade to be entered next
    int grade; // grade value
    int total=0; // sum of grades entered by user
    float average; // average of grades
    int i;
    int max;
    int min;

    printf("Enter number of grades: "); // User enters number of grades
    scanf("%d", &counter); // Countss number of grades

    for (i = 1; i <= counter; i++) {
        printf("Enter grade %d: ", i); // User enters grade
        scanf("%d", &grade); // Counts grades

        if (grade < 0 || grade > 100) {
            printf("Please enter a number between 0 and 100!\n"); // Lets user know if input is invalid
            i--;
        } else {
          if(i==1){
              max = grade;
              min = grade;
          }
          else{
              max = (grade < max) ? max : grade;
              min = (grade > min) ? min : grade;
          }
          total = total + grade;
          average = (float) total / counter; // NOTE: integer division,    not decimal
        }
      }

    printf("Class average is: %.3f\n", average); // Displays average
    printf("Your maximum grade is %d\n", max); // Displays Max
    printf("Your minimum grade is %d\n", min); // Displays minimum
    printf("Sum: %d\n", total); // Displays total
}

由于某些错误,我已经编辑了您的代码。首先,您没有初始化总数,这可能会使它产生一些垃圾值。第二个是减少 i 的值时不需要使用 break 。第三个是更新 min 和for循环之外的 max ,其中 grade 的值将是最后输入的成绩。而且根本不需要 maxi mini 。代码运行完美,无需等待伪值。干杯!