2012-05-04 125 views
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; 
    } 
} 

我在做什么错?另外我怎么能得到每阵列的最小值,最大值?

+0

什么是'A'的声明? –

+0

int A [30] [30]; ,对不起:) –

+0

在使用它之前,你还没有初始化'sum',并且在外循环的第一次迭代中返回。有没有理由不使用'std :: vector'来存储数据,'std :: accumulate'来加起来呢?您可以通过'min_element'和'max_element'获得最小值和最大值。 –

回答

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); 
+0

准确的行啊,非常感谢。这工作得很好。 –

+0

您仍然必须将总和初始化为0.0。 – Spidey

1

对于初学者来说,你是从你的循环内返回:

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

你能看到外环将只执行一次?

+0

但是,当两个循环执行时,它只会打印出最新的一个,而不是第一个。 –

+0

这是因为您在每个循环中重置了“sum”。 –

+0

了解,非常感谢! :) –

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

+0

嗯,我没有很多关于容器的想法。我了解矢量,但是什么是领带和积累呢?我需要一个额外的图书馆吗? –

+0

std :: tie(min,max)= std :: minmax(gr.begin(),gr.end()); 该操作实际上做了什么? –

+0

不,你不需要为它们添加额外的库,它们在标准库中,accumulate将容器中的所有值相加,并且std :: minmax返回最小值和最大值的元组(值组) 。 std :: tie将该元组解压缩到现有变量中。这是从函数返回多个值的非常干净,高效且现代的方法。我会添加一些对我的答案的引用。 – 111111

相关问题