Создайте структуру, которая содержит указатель на массив - PullRequest
0 голосов
/ 21 марта 2020

Я НЕ МОГУ ИСПОЛЬЗОВАТЬ ВЕКТОРЫ ДЛЯ НАЗНАЧЕНИЯ

Мне нужно создать структуру, в которой будет храниться следующая информация: имя студента, идентификационный номер, указатель на массив результатов тестов, средний балл теста, буквенная оценка.

Программа должна вести список результатов тестов для группы студентов. Он должен спросить пользователя, сколько учеников в классе и сколько баллов за тестирование. Количество тестов будет одинаковым для каждого ученика. Программа должна динамически распределять массив структур. Каждый член тестов структур должен указывать на динамически размещенный массив, который будет содержать результаты тестов. После динамического распределения массивов программа должна запросить у пользователя идентификационный номер и все результаты тестов для каждого учащегося. Средний балл должен быть рассчитан и сохранен в среднем члене структуры. Показать информацию о студенте.

У меня возникают проблемы, когда пользователь вводит результаты тестов в функцию inputScores. Я не могу понять, как получить доступ к члену структуры права. Можете ли вы взглянуть на мой код и помочь мне понять, что я делаю неправильно?

Вот моя структура:

struct Grade
{
    string name;
    int idNum;
    int* tests;
    double average;
    char grade;
};

Вот мои функции:

//user enters number of students which is then used as the size of the dynamically allocated struct array
int inputStudents();
//user enters number of tests for each student which is then used as the size of the dynamically allocated array of test scores in the structure
int inputTests();                   
string inputName();                 
int inputID();  
//user inputs scores for each student. this is a function i'm struggling with               
int *inputScores(int *testScores, int numTests);        
double calcAvg(int *testScores, int numTests);          
char calcGrade(double);     
void display(Grade*, int);  

Вот мое основное:

int main()
{
    Grade *studentList;
    int size = inputStudents();
    studentList = new Grade[size];      //dynamically create array of Grade struct

    int numTests = inputTests();        //number of test scores stored in numTests                      

    for (int i = 0; i < size; i++)                  //loop to store all student's info
    {
        studentList[i].name = inputName();
        studentList[i].idNum = inputID();
        studentList[i].tests = inputScores(studentList[i].tests, numTests, i);
        studentList[i].average = calcAvg(studentList[i].tests, numTests);
        studentList[i].grade = calcGrade(studentList[i].average);
    }

    display(studentList, size);

    delete[] studentList;

    return 0;
}

Вот функция, с которой я борюсь. Каждый раз, когда я ссылаюсь на studentList, появляется другая ошибка. Моя программа даже не скомпилируется, и я уверен, что именно эта функция и является причиной. Здесь я передаю элемент структуры tests, а не всю структуру. Я также передаю количество тестов и счетчик из l oop в main, который говорит нам, для какого студента пользователь вводит результаты тестов.

int *inputScores(int *studentList, int numTests, int count)         
{
    cout << endl;
    cout << "Enter the test scores:\n";

    for (int i = 0; i < numTests; i++)
    {
        studentList[count].tests = new int[numTests];       //my error says the studentList must have a class type
        cout << "Score " << (i + 1) << ": ";        
        cin >> studentList[count]->tests[i];                //my error says studentList must have a pointer type 
        cout << endl;
    }

    return studentList->tests;     //my error says studentList must have a point-to-class type

}

Ответы [ 2 ]

1 голос
/ 21 марта 2020

Ваша функция inputScores объявлена ​​следующим образом

int *inputScores(int *studentList, int numTests, int count)

, что означает, что studentList - это указатель на int (который можно рассматривать как массив). Далее в функции вы попытаетесь сделать это:

studentList[count].tests = new int[numTests];

Если studentList - это int* (или int массив), тогда studentList[count] - это просто int. Вы пытаетесь получить доступ к переменной-члену tests из int. Но int является примитивным типом.

Когда вы вызывали эту функцию в main, вы правильно передали int*:

studentList[i].tests = inputScores(studentList[i].tests, numTests, i);

Таким образом, обрабатывая переменную, как на самом деле int * вместо Grade * должно решить первую из ваших проблем. Вам также следует изменить имя переменной, поскольку вы на самом деле не передаете studentList, это скорее переменная tests. Это должно помочь уменьшить некоторую путаницу.

int *inputScores(int *tests, int numTests, int count)

После этого вы поймете, что даже если вы передадите studentList[i].tests своей функции inputScores, у вас будет память утечка и не сможет получить доступ к памяти, которую вы думали, что вы только что заполнены. Вы ДОЛЖНЫ заполнить память, но когда вы попытались присвоить новое значение tests через tests = new int[numTests];, это изменило только локальную копию tests.

Чтобы исправить эту проблему, вам нужно передать tests по ссылке, например:

int *inputScores(int*& tests, int numTests, int count)

Это позволит любым изменениям, которые вы вносите в свою функцию в int*, tests, сохраняться вне функции.

1 голос
/ 21 марта 2020

Вы передаете указатель на тестовый массив каждого студента на inputScores(), но получаете доступ к нему как указатель на студента. Вам придется изменить функцию inputScores(), как указано ниже:

void inputScores(int *tests, int numTests, int count)
{
    cout << endl;
    cout << "Enter the test scores:\n";


    for (int i = 0; i < numTests; i++)
    {
        cout << "Score " << (i + 1) << ": ";        
        cin >> tests[i];
        cout << endl;
    }
}

Кроме того, я сделал еще одну модификацию. Всегда лучше, если вызывающая функция выделяет память и передает ссылку на массив. Поэтому нам нужно вызвать функцию inputScores (), как показано ниже

studentList[i].tests = new int[numTests];
inputScores(studentList[i].tests, numTests, i);

Это вывод, который я получил:

How many students are there?
3
How many tests does each student have?
2
Enter the student's name:
Joohn
Enter the student's ID number:
1

Enter the test scores:
Score 1: 12

Score 2: 13

Enter the student's name:
Jack
Enter the student's ID number:
2

Enter the test scores:
Score 1: 67

Score 2: 45

Enter the student's name:
Jill
Enter the student's ID number:
3

Enter the test scores:
Score 1: 56

Score 2: 89


--------------------------------------------------------
Here is all the info I have for each student:
Student #1: 
Name: Joohn
ID Number: 1
Test Scores: Average Grade: 12
Letter Grade: F

Student #2: 
Name: Jack
ID Number: 2
Test Scores: Average Grade: 56
Letter Grade: F

Student #3: 
Name: Jill
ID Number: 3
Test Scores: Average Grade: 72
Letter Grade: C


--------------------------------------------------------
...