【问题标题】:How to target an array in a struct in c++如何在 C++ 中定位结构中的数组
【发布时间】:2016-12-08 16:14:19
【问题描述】:

所以我编写了一个程序来使用结构和数组来计算文件中学生的最高/最低成绩(很快就会是平均成绩)。虽然我确实计算出了最低和最高成绩,但我还想添加最高成绩和最低成绩的学生。如何找到数组行并显示结构的 .first 和 .last?

#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;
}

【问题讨论】:

  • 最后是 studentArray[numberOfStudents - 1],首先是 studentArray[0]
  • 您可以执行以下操作 .... 在评估最大值时,不仅要跟踪最大值,还要跟踪您分配给 max 变量的等级的对象。为此,创建一个学生类型的对象 letSay MaxObject 并在 if 旁边的 max = ... 下分配 MaxObject = student[i],然后循环显示您创建的对象的字段。如果您不想在该函数中显示,那么您可以将对学生对象的引用传递给此函数,并且在此函数结束后,您发送的引用对象将保存最大学生的值。与显示 Min Student 相同

标签: c++ arrays struct


【解决方案1】:

您不仅需要在calculateMaximumGrade 函数中存储max,还需要存储具有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;

您应该对 AverageMin 函数执行相同的操作。

【讨论】:

    【解决方案2】:

    您可以更改(和重命名)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 进行类似的更改。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-07-27
      • 2012-10-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-18
      • 2011-12-29
      相关资源
      最近更新 更多