使用C ++中的循环将不同的数组传递给同一个函数?

时间:2017-06-13 02:28:10

标签: c++ arrays loops

我正在编写一个程序,允许用户为五个学生中的每一个输入四个测试分数。提示说要使用五个1D阵列来执行此操作,每个学生一个存储四个测试分数。我想以一种方式编写代码,我遍历所有五个数组,在一个循环中将每个数组发送到函数,但我无法弄清楚是否可能。我想这样做的原因是因为我希望用户能够将全局常量NUM_STUDENTS更改为他们拥有的学生数量以及该计划的工作方式。 (我知道使用2D阵列会更容易,但我认为我们不应该这样做)。这是我唯一想到的,但这意味着,如果有人,比如10个学生,他们将不得不调整代码,而不仅仅是改变全局常量。

const int NUM_STUDENTS = 5;
const int NUM_TESTS = 4;
void getStudent(string);
void getScores(double [], int);
int main()
{
string students[NUM_STUDENTS];
double studentOne[NUM_TESTS];
double studentTwo[NUM_TESTS];
double studentThree[NUM_TESTS];
double studentFour[NUM_TESTS];
double studentFive[NUM_TESTS];
for(int i = 0; i < NUM_STUDENTS; i++)
    {
        //Get student: function to get students name
        getStudent( students[i] );
        //Get test scores: function to get students four test scores
        if( i == 0)
        {
            getScores( studentOne, i );
        }
        else if( i == 1 )
        {
            getScores( studentTwo, i );
        }
        else if( i == 2 )
        {
            getScores( studentThree, i );
        }
        else if( i == 3 )
        {
            getScores( studentFour, i );
        }
        else if( i == 4 )
        {
            getScores( studentFive, i );
        }
    } 
return 0;
}
void getStudent(string students)
{
    cout << "Enter the student's name: ";
    getline(cin, students);
    cout << students;
    cout << endl;
}
void getScores(double testScores[], int student)
{
    for(int i = 0; i < NUM_TESTS; i++)
    {
        cout<< "Enter test scores for student " << (student + 1) << ": ";
        cin >> testScores[i];
    }
    for(int i = 0; i < NUM_TESTS; i++)
    {
        cout << testScores[i] << endl;
    }
}

这是我到目前为止所做的,这似乎在很大程度上起作用,但是我并不是真的想要这样做。

2 个答案:

答案 0 :(得分:2)

你是对的,2D数据结构最适合这样的问题,但由于你只限于1D阵列,你正在做的事情很好

然而,迭代各个测试对我来说更有意义,并且在转到下一个测试之前获得每个人的相同测试分数,因为这通常是测试评分的方式。

除此之外,没有必要将学生数组传递给函数。由于您只处理一个值(测试分数),您只需传递学生姓名和测试编号,并将该学生的分数返回并测试到正确的数组。

string studentNames[NUM_STUDENTS] = {"Bob", "Sally", "Rick", "Tim", "Stacy"};

double studentOne[NUM_TESTS];
double studentTwo[NUM_TESTS];
double studentThree[NUM_TESTS];
double studentFour[NUM_TESTS];
double studentFive[NUM_TESTS];

for(int i = 0; i < NUM_TESTS; i++) {
    studentOne[i] = getScore(i, studentNames[0]);
    studentTwo[i] = getScore(i, studentNames[1]);
    studentThree[i] = getScore(i, studentNames[2]);
    studentFour[i] = getScore(i, studentNames[3]);
    studentFive[i] = getScore(i, studentNames[4]);
}

getScore为:

double getScore(int test, string name) {
    int score;
    cout << name << "'s score for test #" << test+1<< ": ";
    cin >> score;
    return score;
}

答案 1 :(得分:1)

在这种情况下,我会使用预处理器宏。您可以使用预处理器粘贴/连接来获得所需的结果。

// change naming of arrays to use numbers
double student1[NUM_TESTS];
// etc.

...

// Define a macro that pastes a value onto 'student'
#define student(num) student##num

...

// Call the macro inside the for loop
for (int i = 0; i < NUM_STUDENTS; i++)
{
    getStudent(student(i), i);
}

http://www.cprogramming.com/reference/preprocessor/token-pasting-operator.html