Прочитайте информацию о студентах из файла .txt, а затем вычислите среднее значение и найдите буквенную оценку. - PullRequest
0 голосов
/ 30 ноября 2018

Я работаю над этой программой, чтобы прочитать учащимся имя, фамилию и 5 классов и поместить информацию об учениках в структуру.Оттуда я пытаюсь использовать другие функции, чтобы найти среднюю оценку, буквенную оценку, максимальную оценку и минимальную оценку.У меня возникли проблемы с правильным способом считывания и хранения информации о студентах, а затем вызова информации о студентах в других функциях для вычисления среднего, буквенного балла и т. Д. Моя функция «displayAverages» не отображает никаких имен, а оценки огромныотрицательные числа.ЕСЛИ вы можете помочь мне (после того, как ваша головная боль от просмотра моего кода исчезнет, ​​то есть), я буду признателен.

#include "pch.h"
#include <iostream> 
#include <string> 
#include <fstream>
#include <iomanip>
#include <cmath> 
#include <vector>
#include <sstream>

using namespace std;

// Global variables
const int MAX_STUDENTS = 22;
const int MAX_GRADES = 5;
const string FILENAME = "NamesGrades.txt";

struct Student{
    string name;
    double grades[MAX_GRADES];
    double average;
    int max;
    int min;
}students[MAX_STUDENTS];
char getLetterGrade(double grade);

void getData(Student &students)
{
    ifstream fileIn;
    int numStudents = 0;

    fileIn.open(FILENAME.c_str());
    if (fileIn.fail())
    {
        cout << "Could not open file" << endl;
        system("PAUSE");
        exit(1);
    }

    while (fileIn) {
        for (int i = 0; i < MAX_STUDENTS; i++)
        {
            Student students;
            getline(fileIn, students.name);
            for (size_t i = 0; i < MAX_GRADES; i++)
            {
                fileIn >> students.grades[i];
            }
            return;
        }
    }

    fileIn.close();

    return;
}



void displayAverages(Student students) {
    double total;
    //double average;
    int maxLength = 50;

    cout << setprecision(1) << fixed << showpoint;

    // Providing a header
    cout << "\n\nGrade Averages\n";
    cout << setw(maxLength + 1) << left << "Name" << setw(4) << right <<

        "Average" << setw(6) << "Grade" << endl;

    for (int i = 0; i < 22; i++)
    {
        cout << setw(maxLength + 1) << left << students.name;
        total = 0;

        for (int j = 0; j < MAX_GRADES; j++)
        {
            total += students.grades[i];
        }

        students.average = (double)total / MAX_GRADES;

        cout << setw(7) << right << students.average << setw(6) <<

            getLetterGrade(students.average) << endl;
    }
}


char getLetterGrade(double grade) {
        {
        if (grade > 90) {
            return 'A';
        }
        else if (grade > 80) {
            return 'B';
        }
        else if (grade > 70) {
            return 'C';
        }
        else if (grade > 60) {
            return 'D';
        }
        else {
            return 'F';
        }
    }

}

Ответы [ 2 ]

0 голосов
/ 30 ноября 2018

Во-первых, ваш код должен иметь лучшую структуру!

void getData(Student &students)
{
    ifstream fileIn;
    int numStudents = 0;// you are not using this variable

    fileIn.open(FILENAME.c_str());
    if (fileIn.fail())
    {
        cout << "Could not open file" << endl;
        system("PAUSE");
        exit(1);
    }
    while (fileIn) {
        for (int i = 0; i < MAX_STUDENTS; i++)//you should use auto here
        {
            Student students;//here you are making local object instead of changing the data off passed argument, you should get rid of this
            getline(fileIn, students.name);
            for (size_t i = 0; i < MAX_GRADES; i++)//you should use auto here
            {
                fileIn >> students.grades[i];
            }
            return;//you will return from you function after reading first student data so you should get rid of this
        }
    }
    fileIn.close();
    return;
}

После изменений:

void getData(Student &students) {
    ifstream fileIn;
    fileIn.open(FILENAME.c_str());
    if(fileIn.fail()) {
        cout << "Could not open file" << endl;
        system("PAUSE");
        exit(1);
    }
    while(fileIn) {
        for(auto i = 0; i < MAX_STUDENTS; i++) {
            getline(fileIn, students.name);
            for(auto i = 0; i < MAX_GRADES; i++)
                fileIn >> students.grades[i];
        }
    }
    fileIn.close();
}
0 голосов
/ 30 ноября 2018

Давайте посмотрим на вашу getData() функцию.Он определяется как:

void getData(Student &students)

Поскольку тип возвращаемого значения void, я предполагаю, что вы, вероятно, передадите Student, а затем измените его в функции.Тем не менее, вы делаете:

Student students;
getline(fileIn, students.name);

Ой!Это объявляет новый students, который скрывает параметр students.Поэтому, когда вы делаете students.name, вы говорите о локальной переменной, а не о параметре.

Убейте это новое объявление, и все должно работать так, как вы ожидали!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...