Структура, вложенная в другую структуру как вектор - PullRequest
0 голосов
/ 26 января 2019

Итак, в основном я делаю программу, в которой хранится информация об учениках и баллы учеников внутри структур.Мне нужна помощь, чтобы выяснить, как сохранять значения в векторных оценках для каждого учащегося, учитывая, что у некоторых по 2-3 балла за тестирование, и вся информация поступает из входного файла.

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

// Structures
struct Scores
{
    int id;
    string course = "";
    int credit;
    int score;
};

struct Person
{
    int id;
    string name = "";
    string phone = "";
    vector<Scores> grades;
};

// Function prototypes
void displayOne(vector<Person>, int);

int main()
{
    ifstream inputFile;
    ifstream inputFile2;
    inputFile.open("StudentInfo.txt");
    inputFile2.open("StudentScores.txt");

    Scores tempScore;
    Person tempStudent;
    vector<Person> students;

    if (inputFile)
    {
        int value = 0;
        string name = "";
        string phone = "";
        while (inputFile >> value >> name >> phone)
        {

            tempStudent.id = value;
            tempStudent.name = name;
            tempStudent.phone = phone;
            students.push_back(tempStudent);
        }
    }
    else cout << "Error Opening StudentInfo.txt.. Try again." << endl;

    displayOne(students, 12546);
    displayOne(students, 15667);
    displayOne(students, 14388);

    inputFile.close();
    inputFile2.close();

//displayOne(15667);

//displayAll();

    return 0;

}

// Function definitions
void displayOne(vector<Person> students, int verifyID)
{
    bool foundID = false;
    int index = 0;
    for (int i = 0; i < students.size(); i++)
    {
        if (students[i].id == verifyID)
        {
            foundID = true;
            index = i;
        }

    }
    if (students[index].id == verifyID)
    {
        cout << "Student ID: " << students[index].id << " ";
        cout << "Student Name: " << students[index].name << " ";
        cout << "Student Phone: " << students[index].phone << " ";
        cout << "=================================";
        cout << endl;
        cout << students[index].grades[].course << endl;
    }
}

Мне нужноуметь вызывать функцию, которая позволяет мне подсчитать << ученики [0] - количество учеников, а также отобразить каждый класс, который они посещают, баллы, которые они достигли, и т. д. </p>

1 Ответ

0 голосов
/ 26 января 2019

Похоже, вам, возможно, придется использовать id для сопоставления учащихся с результатами, подобными соединению SQL.

Когда вы просматриваете StudentScores.txt и считываете каждый результат во временную Scores, вам нужно будет найти student в students, который соответствует Scores::id. Найдя этого ученика, вы можете push_back получить временную оценку.

Что-то вроде

Scores tempscore;
while (inputFile2 >> tempscore) // requires a >> overload for Scores, but here I'm 
                                // just using it as shorthand for "read in a Scores." 
                                // Strongly consider the >> overload though.
{
    auto & id = tempscore.id; // make this c++11 proof. C++11 doesn't handle 
                              // capturing  members 
    // find student who matches id
    auto found = std::find_if(students.begin(), 
                              students.end(), 
                              [id] (const Student& s) { return s.id == id; })
    if (found != students.end()) // actually found a match
    { 
        found->grades.push_back(tempscore); // add score
    }
    else
    {
        // handle missing student. Log it and discard? Abort? Your call.
    }
}

Документация для std::find_if

[id] (const Student& s) { return s.id == id; } является лямбда-выражением . Он обеспечивает быструю и грязную функцию, которая вызывается find_if для проверки, найдена ли она.

Вы можете найти std::map более полезным для хранения students, чем std::vector. std::map<id, Person> students; делает поиск таким же простым, как

Scores tempscore;
while (inputFile2 >> tempscore)
{
    // find student who matches id
    try
    {
        students.at(tempscore.id).grades.push_back(tempscore); // add score
    }
    catch (const std::out_of_range &)
    {
        // handle missing student. 
    }
}

std::map отлично подходит для простых поисков, но не так хорош в итерации, как std::vector, и имеет гораздо больше накладных расходов, которые могут превысить экономию при поиске в коротких списках. Если список студентов длинный и программа много ищет в id s, используйте map. Если он сканирует весь список, возможно, вам лучше использовать vector.

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