将显示数组的 5 个 for 循环压缩为 1?

Condensing for 5 for-loops that display an array into 1?

有没有办法将五个 for 循环压缩为一个,并让它们分别显示不同的变量和字母?目前,我有一个循环和五个其他循环,if/else 以保持它的简洁,但这似乎是多余的并且违背了制作循环的真正目的。

所以我决定 post 整个源代码,这样人们就可以更深入地了解我的意图。这是一个每次 运行 都会创建 100 个随机成绩的程序,我必须对它们进行排序,然后显示它们。我知道我可以做 5 个 for 循环,但我想编写更简洁、更高效的代码。

困难的部分是编写一个循环,该循环可以一致地显示 5 个数组,即使数组的大小每隔 运行 都会发生变化。

#include <iostream>
#include <vector>
using namespace std;

int main(){
    int grades[100];
    int sizeA=0, sizeB=0, sizeC=0, sizeD=0, sizeF=0;
    std::vector<int> gradeA, gradeB, gradeC, gradeD, gradeF;

    srand(time(NULL));

    for(int i = 0; i < 100; i++){
        grades[i] = rand() % 100 + 1;  
    }

    for(int i = 0; i < 100; i++){
        if (grades[i] < 100 || grades[i] > 0){
            if (grades[i]>=90)
                gradeA.push_back(grades[i]);
            else if (grades[i]>=70)
                gradeB.push_back(grades[i]);
            else if (grades[i]>=50)
                gradeC.push_back(grades[i]);
            else if (grades[i]>=20)
                gradeD.push_back(grades[i]);
            else if (grades[i])
                gradeF.push_back(grades[i]);
        } else {
            cout << "uhh.. ";
            return(0);
        }
    }

    sizeA = gradeA.size();
    sizeB = gradeB.size();
    sizeC = gradeC.size();
    sizeD = gradeD.size();
    sizeF = gradeF.size();


    /**toggle ? showgrades(gradeA, size) : (int?)null;**/

}   

如何使用函数进行循环并使用所需信息调用它

void printGrades(const std::vector<int>& grades, char level) {
  cout << num << " " << level << " students: ";
  for(int i = 0; i < grades.size(); i++){
    cout << grades[i] << " ";
  cout << endl;
}

所以当你想打印它们时:

printGrades(gradeA, 'A');
printGrades(gradeB, 'B');
printGrades(gradeC, 'C');
printGrades(gradeD, 'D');
printGrades(gradeF, 'F');

如果我是你,我会创建一个 class 学生,然后是一个二维数组,其中每一行代表学生的类别,一行代表学生的列数。

这可以表示为大小为 5 的固定大小数组,其中每个单元格都是 class Studentstd::vector

最小工作示例:

#include <iostream>
#include <vector>

using namespace std;

class Student {
public:
    Student(int grade, char category) : grade(grade), category(category) {}
    int getGrade(void) { return grade; }
    char getCategory(void) { return category; }
private:
    int grade;     // 0, ..., 20
    char category; // A, ..., F
};

int main(void) {
    vector<class Student> std[5]; // cell 0 is for A students, ..., cel 4 is for F students
    std[0].push_back({20, 'A'}); std[0].push_back({19, 'A'});
    std[1].push_back({15, 'B'});
    std[2].push_back({17, 'C'}); std[2].push_back({17, 'C'});
    std[3].push_back({14, 'D'});
    std[4].push_back({15, 'F'});

    for (int i = 0; i < 5; ++i) {
        if(std[i].size()) {
            cout << std[i].size() << " " << std[i][0].getCategory() << " students: ";
            for (auto& student : std[i]) {
                cout << student.getGrade() << " ";
            }
            cout << endl;
        }     
    }
    return 0;
}

输出:

2 A students: 20 19 
1 B students: 15 
2 C students: 17 17 
1 D students: 14 
1 F students: 15

附录:

我知道您想使代码紧凑,但是:

for(int a = 0; a < sizeA; a++){
    cout << gradeA[a] << " ";
} aS = 1; bS = 0; cout << endl;

很酷,因为 reader 无法读取它。我建议您将其更改为:

for(int a = 0; a < sizeA; a++){
    cout << gradeA[a] << " ";
}
aS = 1;
bS = 0;
cout << endl;

因为 reader 期望在右花括号后看不到任何代码。这是一般性的说法。