二维数组。计算学生的平均值

时间:2021-06-12 15:14:06

标签: c++ arrays

我不明白为什么我无法计算平均值。平均值的输出与其他外观相同,详情见下图。我的老师让我把 AVG 归零,但我不知道把它放在哪里。

Output of the Code

#include <iostream>
using namespace std;

const int ROW = 3;
const int COL = 3;
const int D = 3;

void display(int nums[ROW][COL]);
void show(int ID[D]);

int main()
{
    int nums[ROW][COL];
    int ID[D];
    double AVG = 0;

    for (int i = 1; i <= ROW; i++) {
        cout << "Enter student ID[" << i << "]: ";
        cin >> ID[i];

        for (int j = 0; j < COL; j++) {
            cout << "Enter student[" << i << "] Grades [" << j + 1 << "]:";
            cin >> nums[i][j];

            AVG = AVG + nums[i][j];
        }
        AVG = AVG / 3;
    }

    for (int i = 1; i <= ROW; i++) {
        cout << "Student ID: " << ID[i] << endl;

        for (int j = 0; j < COL; j++) {
            cout << "Score: " << nums[i][j] << endl;
        }
        cout << "Average: " << AVG << endl;
    }
    return 0;
}

3 个答案:

答案 0 :(得分:1)

目前您正在计算平均值如下;

第一次迭代:

(90 + 90 + 90) / 3 = 90

第二次迭代:

(90 + 80 + 80 + 80)/3 = 110

第三次迭代:

(110 + 70 + 70 + 70)/3 = 106

如果你想得到所有成绩的平均值,这样做;

double AVG = 0;
double avg_tmp;
for (int i = 1; i <= ROW; i++) {
    avg_tmp = 0;
    cout << "Enter student ID[" << i << "]: ";
    cin >> ID[i];

    for (int j = 0; j < COL; j++) {
        cout << "Enter student[" << i << "] Grades [" << j + 1 << "]:";
        cin >> nums[i][j];

        avg_tmp += nums[i][j];
    }
    AVG += avg_tmp / 3;
}

答案 1 :(得分:1)

您对此问题有一些疑问:

  1. 您将 AVG 视为双精度数,而将其他变量视为整数。因此存在数据类型错误。 2.你在做数组索引时有问题。 这是解决方案。在这里,我将 AVG 声明为整数类型数组,以便它与您的代码保持相同。

    #include 使用命名空间标准;

     const int ROW = 3;
     const int COL = 3;
     const int D = 3;
    
     void display(int nums[ROW][COL]);
     void show(int ID[D]);
    
     int main ()
     {
     int nums[ROW][COL];
     int ID[D];
     int  AVG[ROW];
    
     for(int i=1; i<=ROW; i++)
     {
     cout << "Enter student ID[" << i <<"]: ";
     cin>>ID[i];
     AVG[i-1]=0;
    
     for(int j=0; j<COL; j++)
     {
     cout<<"Enter student[" << i << "] Grades [" <<j+1<<"]:" ;
     cin>>nums[i-1][j];
    
     AVG[i-1] = AVG[i-1] + nums[i-1][j];
     }
     AVG[i-1] = AVG[i-1] / 3;
     }
    
     for(int i=1; i<=ROW; i++)
     {
     cout <<"Student ID: " << ID[i] << endl;
    
     for(int j=0; j<COL; j++)
     {
     cout<<"Score: "<<nums[i-1][j]<<endl;
     }
     cout << "Average: " << AVG[i-1]<< endl;
     }
     return 0;
     }
    

答案 2 :(得分:0)

您最大的问题是您使用 for (int i = 1; i <= ROW; i++) 的循环限制调用了未定义行为。在 C/C++ 中,所有数组索引都是基于零的,有效索引为 0 <= i < n。所以你的 i 循环必须是 for (int i = 0; i < ROW; i++)

您不需要在第一组循环中计算总和或平均值。第一组嵌套循环是您输入循环,您只需在其中填充 IDnums 的元素。您只需要在第二组嵌套循环(例如您的输出循环)中使用 AVG 避免混合输入和输出逻辑。

仅在需要的范围内声明和初始化变量。这将解决您的教授在上面所说的内容。如果您仅在计算平均值的第一个输出循环中声明和初始化 AVG,它会自动为每个学生重置为零。

总而言之,你可以这样做:

#include <iostream>

const int ROW = 3;      /* good job on declaring constants */
const int COL = 3;
const int D = 3;

int main()
{
    int nums[ROW][COL] = {{0}};     /* initialize all plain-old arrays */
    int ID[D] = {0};

    for (int i = 0; i < ROW; i++) {
        std::cout << "\nEnter student ID[" << i + 1 << "]: ";
        /* you must validate EVERY user-input */
        if (!(std::cin >> ID[i])) {
            std::cerr << "error: invalid integer input.\n";
            return 1;
        }

        for (int j = 0; j < COL; j++) {
            if (!j)
                std::cout.put('\n');
            std::cout << "Enter student[" << i+1 << "] Grades [" << j+1 << "]: ";
            if (!(std::cin >> nums[i][j])) {  /* ditto */
                std::cout << "error: invalid integer input.\n";
                return 1;
            }
        }
    }
    
    for (int i = 0; i < ROW; i++) {
        double AVG = 0.;            /* declare / initialize in scope needed */
        
        std::cout << "\nStudent ID: " << ID[i] << '\n';

        for (int j = 0; j < COL; j++) {
            std::cout << "  Score: " << nums[i][j] << '\n';
            AVG += nums[i][j];      /* sum each score */
        }
        
        std::cout << "Average: " << AVG / COL << '\n';
    }
}

示例使用/输出

$ ./bin/studentavg

Enter student ID[1]: 1

Enter student[1] Grades [1]: 90
Enter student[1] Grades [2]: 89
Enter student[1] Grades [3]: 91

Enter student ID[2]: 2

Enter student[2] Grades [1]: 79
Enter student[2] Grades [2]: 81
Enter student[2] Grades [3]: 80

Enter student ID[3]: 3

Enter student[3] Grades [1]: 71
Enter student[3] Grades [2]: 70
Enter student[3] Grades [3]: 69

Student ID: 1
  Score: 90
  Score: 89
  Score: 91
Average: 90

Student ID: 2
  Score: 79
  Score: 81
  Score: 80
Average: 80

Student ID: 3
  Score: 71
  Score: 70
  Score: 69
Average: 70

检查一下,如果您还有其他问题,请告诉我。