2016-12-08 2 views
1

Итак, я написал программу для использования структуры и массива для вычисления максимальной/минимальной оценки (и в скором времени средней) учащихся из файла. В то время как я выяснил минимальные и максимальные оценки, я также хочу добавить, какой студент имел самый высокий класс и самый низкий класс. Как я могу найти строку массива и отобразить .first и .last структуры?Как настроить таргетинг на массив в C++

#include <iostream> 
#include <string> 
#include <fstream> 
#include <array> 

using namespace std; 

struct student { 

    int id; 
    string first; 
    string last; 
    float grade; 
}; 

string getFileName(); 
void fillArrayFromFile(ifstream&, student[], int&); 
float calculateMaximumGrade(student[], int); 
float calculateMinimumGrade(student[], int); 
float calculateAverageGrade(student[], int); 



int main() { 

    int numofStudents = 5; 

    const int NUM_VALS = 5; 

    student studentArray[NUM_VALS]; 
    ifstream filename; 
    //filename.open(getFileName() + ".txt"); 

    fillArrayFromFile(filename, studentArray, numofStudents); 

cout << "Highest grade: " << calculateMaximumGrade(studentArray,  numofStudents) << endl; 
cout << "Lowest grade: " << calculateMinimumGrade(studentArray, numofStudents) << endl; 
//cout << "Average grade: " << calculateAverageGrade(studentArray, numofStudents) << endl; 

return 0; 
} 

string getFileName() 
{ 
// To be completed 

return 0; 
} 

void fillArrayFromFile(ifstream& ins, student studentArray[], int& numberOfStudents) 
{ 
ins.open("input.txt"); 



for (int i = 0; i < numberOfStudents; i++) { 

    ins >> studentArray[i].id; 
    ins >> studentArray[i].first; 
    ins >> studentArray[i].last; 
    ins >> studentArray[i].grade; 

} 

ins.close(); 

return; 
} 

// calculate the maximum grade in the array 
float calculateMaximumGrade(student studentArray[], int numberOfStudents) 
{ 
float max = 0; 
max = studentArray[0].grade; 

for (int i = 0; i < numberOfStudents; i++) { 

    if (studentArray[i].grade > max) { 

     max = studentArray[i].grade; 

    } 

} 
return max; 
} 

// calculate the minimum grade in the array 
float calculateMinimumGrade(student studentArray[], int numberOfStudents) 
{ 
float min = 0; 
min = studentArray[0].grade; 

for (int i = 0; i < numberOfStudents; i++) { 

    if (studentArray[i].grade < min) { 

     min = studentArray[i].grade; 

    } 

} 
return min; 
} 

// calculate the average grade in the array 
float calculateAverageGrade(student studentArray[], int numberOfStudents) 
{ 
// To be completed 
return 0; 
} 
+0

Последнее является студентомArray [numberOfStudents - 1], сначала studentArray [0] – brettmichaelgreen

+0

Вы можете сделать следующее .... пока вы оцениваете максимальное значение, не просто отслеживайте максимальное значение, но также и объект, чей класс вы назначаете max. Для этого создайте объект студента типа letSay MaxObject и назначьте MaxObject = student [i] под полем if вдоль стороны max = ... и после цикла отобразите поля созданного вами объекта. И если вы не хотите отображать в этой функции, вы можете передать ссылку на объект-ученик на эту функцию, и после того, как эта функция закончится, ваш отправленный объект ссылки будет содержать значения max students. То же самое для отображения Min Student –

ответ

0

Вам нужно хранить не только max в вашей calculateMaximumGrade функции, но и индекс элемента, который имеет тот max класс. То есть:

int calculateMaximumGrade(student studentArray[], int numberOfStudents) 
{ 
    float max = studentArray[0].grade; 
    int index_of_max = 0; 

    for (int i = 0; i < numberOfStudents; i++) { 

     if (studentArray[i].grade > max) { 
      index_of_max = i; 
      max = studentArray[i].grade; 
     } 

    } 
    return index_of_max; 
} 

Как вы видите, вы можете вернуться не max, но его index. Тогда вы должны сделать следующее в вашем main:

int index_of_max = calculateMaximumGrade(studentArray,  numofStudents); 
cout << "Highest grade: " << studentArray[index_of_max].grade << ". Student, who got it: " << studentArray[index_of_max].first << " " << studentArray[index_of_max].last << endl; 

Вы должны делать то же самое с Average и Min функций.

0

Вы можете изменить (и переименовать) свою функцию calculateMinimumGrade, чтобы записать индекс ученика с наименьшим классом и вернуть его вместо самой оценки.

// find the student with the lowest grade 
int findLowestStudent(student studentArray[], int numberOfStudents) 
{ 
int lowest = 0; 
float min = 0; 
min = studentArray[0].grade; 

for (int i = 0; i < numberOfStudents; i++) { 

    if (studentArray[i].grade < min) { 

     min = studentArray[i].grade; 
     lowest = i; 
    } 

} 
return lowest; 
} 

Затем вы можете использовать индекс для доступа к классу учащихся.

int lowest = findLowestStudent(studentArray, numofStudents); 
cout << "Lowest grade: " << studentArray[lowest].grade << endl; 

Вы можете использовать тот же индекс, чтобы получить доступ к названию студента. Очевидно, вам нужно будет внести аналогичные изменения в calculateMaximumGrade.

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