Проблемы с выделением памяти Передача / Возвращение структуры * Массив

Пожалуйста, помогите мне с моей домашней работой. У меня эта программа работает нормально в режиме отладки, но как только я использую режим выпуска, она вылетает с прерыванием ().

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

Требование заключается в том, что я должен использовать массив * для динамического выделения памяти.

"Ваша программа должна работать для любого количества студентов. Когда программа запускается, она должна запрашивать у пользователя количество студентов, подлежащих обработке. Затем она должна динамически распределять массив такого размера (массив структур студентов / оценок)".

Затем мне нужно: "Вызвать функцию, чтобы ввести пары имя / оценка учащегося и сохранить их в массиве".

Так я должен создать массив в основной или внутри функции? Как я могу вернуть / передать массив *, не мешая распределению памяти?

#include <iostream>
#include <iomanip>
#include <string>

using namespace std;

struct Student
{
    string name;    //student's name
    int score;      //student's score
};

//function prototypes
void inputNameScore(Student*, int&);
void sortArray(Student* , int);
double avgScore(Student* , int);
void displayTable(Student* , int, double);

int main()
{   
    Student* arrayOfStudentPtr;     //pointer of type student to receive returned array pointer
    int numberOfStudents;           //number of students to be entered by user
    double average;                 //total score average   

    cout << "Please enter the number of students: ";
    cin >> numberOfStudents;

    arrayOfStudentPtr = new Student[numberOfStudents];  //dynamic array of type Student assigned to pointer

    inputNameScore(arrayOfStudentPtr, numberOfStudents);
    sortArray(arrayOfStudentPtr, numberOfStudents);
    average = avgScore(arrayOfStudentPtr, numberOfStudents);

    displayTable(arrayOfStudentPtr, numberOfStudents, average);    

    return 0;
}

void inputNameScore(Student* arrayOfStudentPtr, int& numberOfStudents)
{   
    for (int i = 0; i < numberOfStudents; i++)
    {
        cout << endl << "Enter the name for student " << i + 1 << ": ";
        cin.ignore();
        getline(cin, arrayOfStudentPtr[i].name);
        cout << endl << "Enter the student's score: ";      
        cin >> arrayOfStudentPtr[i].score;
        while (arrayOfStudentPtr[i].score > 105 || arrayOfStudentPtr[i].score < 0)
        {
            cout << "Student's score can't be negative or greater than 105." << endl;
            cout << endl << "Enter the student's score: ";
            cin >> arrayOfStudentPtr[i].score;
        }
    }
}

void sortArray(Student* arrayOfStudentPtr, int numberOfStudents)
{
    Student Temp;   //holds a student struct object
    bool swap;      //swap is initialized to false at the start of each loop. If it is still false at end of loop we know there is nothing else to sort
    do
    {
        swap = false;
        for (int i = 0; i < numberOfStudents; i++)
        {
            if (arrayOfStudentPtr[i].score > arrayOfStudentPtr[i + 1].score)
            {
                Temp = arrayOfStudentPtr[i];
                arrayOfStudentPtr[i] = arrayOfStudentPtr[i + 1];
                arrayOfStudentPtr[i + 1] = Temp;
                swap = true;
            }
        }
    } while (swap);
}

double avgScore(Student* arrayOfStudentPtr, int numberOfStudents)
{
    int total;      //total of all grades
    double average; //average of all grades
    total = 0;

    for (int i = 0; i < numberOfStudents; i++)
    {
        total = arrayOfStudentPtr[i].score;
    }
    average = total / numberOfStudents;
    //average = static_cast<double>(total) / numberOfStudents;
    return average;
}

void displayTable(Student* arrayOfStudentPtr, int numberOfStudents, double average)
{   
    cout << endl << setw(31) << left << "Name" << setw(6) << right << "Score" << endl;
    cout << "-------------------------------------" << endl;
    for (int i = 0; i < numberOfStudents; i++)
    {
        cout << setw(31) << left << arrayOfStudentPtr[i].name << setw(6) << right << arrayOfStudentPtr[i].score << endl;
    }
    cout << "-------------------------------------" << endl;
    cout << setw(31) << left << "Average: " << setw(6) << right << endl;
}

1 ответ

Решение

Следующий код будет работать.

void sortArray(Student* arrayOfStudentPtr, int numberOfStudents)
    {
        Student Temp;   //holds a student struct object
        bool swap;      //swap is initialized to false at the start of each loop. If it is still false at end of loop we know there is nothing else to sort
        do
        {
            swap = false;
            for (int i = 0; i < numberOfStudents-1; i++)
            {
                if (arrayOfStudentPtr[i].score > arrayOfStudentPtr[i + 1].score)
                {
                    Temp = arrayOfStudentPtr[i];
                    arrayOfStudentPtr[i] = arrayOfStudentPtr[i + 1];
                    arrayOfStudentPtr[i + 1] = Temp;
                    swap = true;
                }
            }
        } while (swap);
    }
Другие вопросы по тегам