我正在编写一个程序,允许用户为五个学生中的每一个输入四个测试分数。提示说要使用五个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;
}
}
这是我到目前为止所做的,这似乎在很大程度上起作用,但是我并不是真的想要这样做。
答案 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