在 C 中搜索二维数组时出现严重错误

Searching through a 2D array in C goes horible wrong

所以我有一个作业,其中有一个问题,要求你构建一个 5 行 4 列的二维数组,每个数组都包含成绩。该问题要求您确定有多少成绩低于 60,60 和 70 之间等等(直到 100)。问题是,当我尝试搜索它时,应该只有 20 个总成绩,但我的解决方案给出了一些牵强附会的数字,例如 60,000 或其他。我不知道我的代码有什么问题。我使用了两个 for 循环来搜索数组。附件是我试过的。非常感谢您的帮助

#include <stdio.h>

int main(){
    double grades[5][4] = {
        {69, 58, 95, 78},
        {84, 75, 86, 32},
        {75, 68, 65, 73},
        {99, 54, 24, 88},
        {65, 78, 84, 65}
    };

    int lessthan60, sixtyseventy, seventyeighty, eightyninety, greaterthan90;
    for (int r = 0; r < 5; r++){
        for (int c=0; c < 4; c++){
            if (grades[r][c] < 60){
                lessthan60++;
            }
            else if (grades[r][c] >=60 && grades[r][c] < 70){
                sixtyseventy++;
            }
            else if (grades[r][c] >=70 && grades[r][c] < 80){
                seventyeighty++;
            }
            else if (grades[r][c] >=80 && grades[r][c] < 90){
                eightyninety++;
            }
            else{
                greaterthan90++;
            }
        }
    }

    printf("Grades less than 60: %d\n", lessthan60);
    printf("Grades between 60 and 70: %d\n", sixtyseventy);
    printf("Grades between 70 and 80: %d\n", seventyeighty);
    printf("Grades between 80 and 90: %d\n", eightyninety);
    printf("Grades between 90 and 100: %d\n", greaterthan90);

    return 0;
}

这些变量有自动存储期限

int lessthan60, sixtyseventy, seventyeighty, eightyninety, greaterthan90;

未初始化且具有不确定的值。您必须明确地将它们初始化为零

int lessthan60 = 0, sixtyseventy = 0, seventyeighty = 0, eightyninety = 0, greaterthan90 = 0;

另外if语句可以写得更简单像

        if (grades[r][c] < 60){
            lessthan60++;
        }
        else if ( grades[r][c] < 70){
            sixtyseventy++;
        }
        else if ( grades[r][c] < 80){
            seventyeighty++;
        }
        else if ( grades[r][c] < 90){
            eightyninety++;
        }
        else{
            greaterthan90++;
        }

此外,最好使用命名常量代替幻数 4 和 5,例如

enum { ROWS = 5, COLS = 4 };

double grades[ROWS][COLS] = {
    {69, 58, 95, 78},
    {84, 75, 86, 32},
    {75, 68, 65, 73},
    {99, 54, 24, 88},
    {65, 78, 84, 65}
};

//...

for (int r = 0; r < ROWS; r++){
    for (int c=0; c < COLS; c++){
    //... 

这样,您将从垃圾值开始。

您需要将小于 60、sixtyseventy、seventyeighty、eightyninety、greaterthan90 的计数器初始化为零。