2012-05-04 5 views
0

У меня проблема с получением минимального, максимального и среднего значений элементов 2D-массива.Получение среднего, минимального и максимального чисел в 2D-массиве

У меня есть 2D-массив, содержащий учеников и классы.

Я генерирую оценки с рандом. Например Когда я ввожу 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; 
    } 
} 

Что я делаю неправильно? Также как я могу получить min, max для каждого массива?

+0

Что такое декларация 'Ā'? –

+0

int A [30] [30]; , извините :) –

+0

Вы не инициализировали 'sum' перед его использованием и возвращаетесь во время первой итерации внешнего цикла. Есть ли причина, по которой вы не используете 'std :: vector' для хранения данных и' std :: accumulate', чтобы добавить значения? Вы можете получить min и max с помощью 'min_element' и' max_element'. –

ответ

0

Проблема заключается в том, что в вашей findAverage функции у вас есть оператор возврата внутри цикла, что цикл по строк. Если вы хотите очень простое исправление, добавьте еще один параметр в функцию 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

Нет, вам не нужна дополнительная библиотека, для которой они находятся в стандартной библиотеке, накапливает все значения в контейнере, а std :: minmax возвращает кортеж (группировку значений) минимального и максимального значений , std :: tie распаковывает этот кортеж в существующие переменные.Это очень чистый, эффективный и современный подход к возврату нескольких значений из функции. Я добавлю некоторые ссылки на мой ответ. – 111111

Смежные вопросы