0

我在获取二维数组元素的最小值、最大值和平均值时遇到问题。

我有一个包含学生和成绩的二维数组。

我正在用 rand 生成成绩。例如,当我输入 2,2 时,它会将我打印出来

Courses : 01   02   Average   Min   Max
    ID   
    01     8   50     29
    02    74   59     29

,我的平均函数取第一个平均值,而不取其他平均值。

这是我的代码;

int A[30][30];

int findAverage(int noOfStudents ,int noOfGrades ){

    float sum,average;




    for (int i = 0 ; i < noOfGrades ; i++) {
        for (int j = 0; j<noOfStudents; j++) {

        sum += A[i][j];

        }
        average = sum / noOfGrades;
       // cout << "   " << format(average);
        sum = 0;
        return format(average);

    }

以及我如何使用它

int main() {

    int noOfCourses , noOfStudents;
    cin >> noOfCourses >> noOfStudents;
    cout << "Courses : " ;

    for (int i = 0; i < noOfCourses; i++) {
        if (i+1 >= 10) {

            cout << i+1 << "   ";
        }else{
            cout <<"0" << i+1 << "   ";

        }
    }

    cout << "Average   Min   Max";

    for(int i=0; i<noOfStudents; i++) {         //This loops on the rows.        

        for(int j=0; j<noOfCourses; j++) {     //This loops on the columns
            A[i][j] = genGrade(); 
        }
    }

    cout << "\n    ID   " << endl;

    for(int i=0; i<noOfStudents; i++) {  //This loops on the rows.

        if (i+1 >= 10) {

            cout <<"    " << i+1 << "   ";
        }else{
            cout <<"    0" << i+1 << "   ";

        }

        //cout <<"    0" << i+1 << "   ";

        for(int j=0; j<noOfCourses; j++) {  //This loops on the columns


            if (A[i][j] >= 10 && A[i][j] <=99) {

                cout <<" " << A[i][j]  << "  ";
            }
            if(A[i][j] < 10) {

                cout <<"  " << A[i][j] << "  ";
            }
            if (A[i][j] == 100) {

                cout << A[i][j] << "  ";
            }
        }
        cout <<"   "<<findAverage(noOfStudents,noOfCourses);
        cout << endl;
    }
}

我究竟做错了什么 ?另外我怎样才能得到每个数组的最小值,最大值?

4

3 回答 3

1

我强烈建议使用容器来完成这项任务。例如,您可以执行以下操作

typedef std::vector<float> grades;
std::vector<grades> student_grades;

//populate 

for(const grades& gr : student_grades) {
    float min, max, avg;
    std::tie(min, max)=std::minmax(gr.begin(), gr.end());
    avg=std::accumulate(gr.begin(), gr.end(), 0.0) / gr.size());
    std::cout << "Min" << min << " Max: " << max << " Avg: " << avg << std::endl;
}

http://en.cppreference.com/w/cpp/algorithm/minmax

http://en.cppreference.com/w/cpp/algorithm/accumulate

http://en.cppreference.com/w/cpp/utility/tuple/tie

于 2012-05-04T16:29:27.193 回答
1

对于初学者,您是从循环内部返回的:

for (int i = 0 ; i < noOfGrades ; i++) {
  for (int j = 0; j<noOfStudents; j++) {
    ...
  }
  ...
  return ...;
}

你能看到外循环如何只执行一次吗?

于 2012-05-04T16:27:02.067 回答
0

问题是在您的findAverage函数中,您在循环中有一个 return 语句,该语句循环遍历行。如果您想要一个非常简单的修复,请向findAverage函数添加另一个参数,以指示要计算哪一行的平均值。

int findAverage(int course ,int noOfGrades ){

    float sum,average;


    for (int j = 0; j<noOfStudents; j++) {

        sum += A[course][j];

    }
    average = sum / noOfGrades;
    return format(average);
 }

并这样称呼它

cout <<"   "<<findAverage(i,noOfCourses);
于 2012-05-04T16:30:40.733 回答