Возвращать значения из параллельных массивов и использовать эти значения в последующих функциях

Я в растерянности. Я перепробовал несколько вещей и у меня работает 90% программы. На самом деле, он компилируется и работает нормально. Мой вывод — очень странные символы, где должна быть буквенная оценка.

В нашем учебнике нет примеров с такими вещами, и их очень трудно найти. Мне нужно вернуть буквенную оценку в одной функции и использовать ее в таблице позже в другой функции. Как ты это делаешь?

#include <iostream>
#include <iomanip>
#include <string>
using namespace std;

// function prototypes
void getData(string [], string [], int []);
char calculateGrade(char []);
void printResult(string [], string [], int [], char [], int);

int main()
{
// define 4 parallel arrays
const int NO_OF_STUDENTS = 5;
string studentFNames[NO_OF_STUDENTS];
string studentLNames[NO_OF_STUDENTS];
int testScores[NO_OF_STUDENTS];
char letterGrades[NO_OF_STUDENTS];

// call getData() to populate three of the four parallel arrays
getData(studentFNames, studentLNames, testScores);

// call calculateGrade() to provide values for the fourth parallel array
calculateGrade(letterGrades);

// call printResult() to display report form the parralel arrays
printResult(studentFNames, studentLNames, testScores, letterGrades, NO_OF_STUDENTS);

return 0;
}

// function definition getData()
void getData(string fName[], string lName[], int scores[])
{
// the follow arrays are used for test data (do not modify)
string fNameTest[5] = {"Humpty", "Jack", "Mary", "Jack", "King"};
string lNameTest[5] = {"Dumpty", "Horner", "Lamb", "Sprat", "Cole"};
int scoresTest[5] = {59, 88, 100, 75, 60};// use a suitable loop to populate the appropriate "empty" arrays
// with values from the three initialized test arrays
for(int index = 0; index < 5; index++)
{
fName[index] = fNameTest[index];
lName[index] = lNameTest[index];
scores[index] = scoresTest[index];
}
}

// function definition for calculateGrade()
char calculateGrade(char letter[])
{
int score;
char gradeLetter[5] = {'A', 'B', 'C', 'D', 'F'};

//for(int i = 0; i < 5; i++)
//{

if(score > 89)
{
return gradeLetter[0];
}
if(score > 79)
{
return gradeLetter[1];
}
if(score > 69)
{
return gradeLetter[2];
}
if(score > 59)
{
return gradeLetter[3];
}return gradeLetter[4];

//}

}

// function definition for printResults()
void printResult(string lName[], string fName[], int score[], char letter[], int size)
{
cout << setw(15) << left << "Student Name" << setw(9) << right << "Test Score" << " " << setw(5) << "Grade" << endl << endl;
for(int index = 0; index < size; index++)
{
cout << setw(15) << left << (lName[index] + ", " + fName[index]);
cout << setw(9) << right << score[index] << " " << setw(5) << letter[index] << endl;
}
}

Вот программа. Имейте в виду, что мне нужно использовать только три функции, и я не могу изменить ни одну из констант или локальных переменных. Я подозреваю, что позже мы собираемся изменить эту программу для чтения из файла, но это не проблема на данный момент.

Я пробовал цикл for с операторами if / else if / else, который дает пики, алмазы и w. Я пытался использовать массивы для gradeLetter и testScores, и я все еще получаю вздор в ответ.

Любая помощь будет принята с благодарностью. Извините, если что-то подобное было сделано. Это кошмар в поисках чего-то подобного.

1

Решение

Попробуйте следующий метод вместо вашего:

// function definition for calculateGrade()
void calculateGrade(const int NO_OF_STUDENTS, int *testScores, char *letter)
{
for(int i = 0; i < NO_OF_STUDENTS; i++)
{

if(testScores[i] > 89)
{
letter[i] = 'A';
}
else if(score > 79)
{
letter[i] = 'B';
}
else if(score > 69)
{
letter[i] = 'C';
}
else if(score > 59)
{
letter[i] = 'D';
}
else // As you are a beginner, try to always cover all the possibilities in an if chain, you'll thank me later
printf("Please give a score greater than 59 for student number %d", i);}

и звоните так:

calculateGrade(NO_OF_STUDENTS, testScores, letterGrades);

Поскольку это домашнее задание, я позволю вам узнать значение звездочки и почему я не возвращаю значение.

И последний совет, возможно, на более поздний момент, когда вы лучше разберетесь в языке, попробуйте сгруппировать поля в классе или структуре (почти то же самое в C ++, проверьте это Каковы различия между структурой и классом в C ++? для различий) и вместо массива имен, фамилий и результатов вы получите что-то вроде:

struct Student
{
string fName;
string lName;
int testScore;
}

Student students[NO_OF_STUDENTS];
1

Другие решения

Этот код написан не очень хорошо, но для быстрого исправления вы можете просто инициализировать char LetterGrades[]так же, как вы инициализировали 3 других массива. Итак, вы могли бы сделать>

    char calculateGrade(char letter[])
{
int score;
char gradeLetter[5] = {'A', 'B', 'C', 'D', 'F'};

for(int i=0; i<5; i++) {
letter[i] = gradeLetter[i];
}

if(score > 89)
{
return gradeLetter[0];
}
if(score > 79)
{
return gradeLetter[1];
}
if(score > 69)
{
return gradeLetter[2];
}
if(score > 59)
{
return gradeLetter[3];
}

return gradeLetter[4];

//}

}

Выходной сигнал в порядке, выводятся «A», «B», «C» и т. Д.
Еще одна вещь, ваш printResult функция плохо написана. Он ничего не делает, а просто перечисляет все массивы (протестируйте, и вы увидите, что оценка 59 получает «А», а оценка 100 — «С»). Вы должны сделать код, чтобы оценки и оценки соответствовали людям, которые их заработали.

0

calculateGrade имеет две проблемы:

  1. Вы можете увидеть из вашего компилятора предупреждения. score неинициализирован
  2. Это ничего не назначает letter[]

Концепция вашей программы заключается в том, что каждый индекс представляет студента. Итак, что вы хотите, это взять оценку индекса (студент) и присвоить его этому индексу (студент) letter,

Для этого нам нужно взять счет и письмо. Итак, ваше определение должно выглядеть так: void calculateGrade(int[], char[]);, Внутренне, вместо того, чтобы возвращать оценочное письмо, вы бы прислали его char[],

0
По вопросам рекламы [email protected]