C++ Вопрос Помощь с написанием функции для курсача

Опа, твоя мать проститутка
Пользователь
Статус
Оффлайн
Регистрация
30 Мар 2019
Сообщения
130
Реакции[?]
36
Поинты[?]
1K
Написал основную часть программы, но с личным заданием справится не смог.


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


Студент потока характеризуется следующими данными:
- ФИО (до 50 символов);
- номер группы;
- набор из пяти оценок за последнюю сессию (без указания предметов);
- размер стипендии.

1) разработать (и программно реализовать) динамические структуры данных и
алгоритмы их обработки, позволяющие поддерживать выполнение следующих функций:
- консольный ввод/вывод данных о всех студентах потока;
- файловый ввод/вывод данных о потоке;
- редактирование данных о студентах и группах потока, включающее операции
добавления/удаления групп и студентов;
2) разработать и программно реализовать алгоритмы обработки базы данных,
предусмотренные персональным заданием

Реализация основной части.
C++:
#include <iostream>
#include <windows.h>
#include <string>
#include <vector>
#include <fstream>
using namespace std;
int program = 1;
struct Node
{
    int student_number;
    int stipend; int stipend_group;
    int student_group;
    int score_1, score_2, score_3, score_4, score_5;
    string name;
    Node* Next, * Prev;
};

class List
{
    Node* Head, * Tail;
public:
    List() :Head(NULL), Tail(NULL) {};
    ~List();
    void show();
    void change();
    void menu();
    void del();
    void add(int student_number, int stipend, int student_group, int score_1, int score_2, int score_3, int score_4, int score_5, string name);
    void task(int student_count, int group);
};

List::~List()
{
    while (Head)
    {
        Tail = Head->Next;
        delete Head;
        Head = Tail;
    }
}

void List::add(int student_number, int stipend, int student_group, int score_1, int score_2, int score_3, int score_4, int score_5, string name)        //Добавление студента
{
    Node* temp = new Node;
    temp->Next = NULL;
    temp->student_number = student_number;
    temp->stipend = stipend;
    temp->student_group = student_group;
    temp->score_1 = score_1;
    temp->score_2 = score_2;
    temp->score_3 = score_3;
    temp->score_4 = score_4;
    temp->score_5 = score_5;
    temp->name = name;
    if (Head != NULL)
    {
        temp->Prev = Tail;
        Tail->Next = temp;
        Tail = temp;
    }
    else
    {
        temp->Prev = NULL;
        Head = Tail = temp;
    }
}

void List::task(int student_count, int group) //Вывести перечень групп потока с указанием(для каждой группы) процента суммарной стипендии группы по отношению к сумарной стипендии потока
{
    Node* temp = new Node;
    int* Arr = new int[group];
    for (int i = 0; i < student_count; i++)
    {
        Arr[i] = temp->student_number;
        temp = temp->Next;
    }

}

void List::del()                      //Удаление
{
    int index = 0;
    int a;
    while (index == 0)
    {
        cout << "1. Удаление студента\n";
        cout << "2. Удаление группы\n";
        cout << "0. Выход\n";
        cin >> a;
        if (a == 1)
        {
            Node* temp = Head;
            int n = 0;
            while (temp != NULL)
            {
                n++;
                temp = temp->Next;
            }
            temp = Head;
            cout << "Номер студента: ";
            int b;
            int m = 0;
            int pos = 0;
            cin >> b;
            for (int i = 0; i < n + m; i++)
            {
                if (temp != NULL)
                {
                    if (b == temp->student_number)
                    {
                        Node* Prevdel = temp->Prev;
                        Node* Nextdel = temp->Next;
                        if (Prevdel != 0 && i != 0)
                            Prevdel->Next = Nextdel;
                        if (Nextdel != 0 && i != 0)
                            Nextdel->Prev = Prevdel;
                        if (i == 0 + pos)
                        {
                            Head = Nextdel;
                            pos++;
                        }
                        if (i == n - pos)
                        {
                            Tail = Prevdel;

                        }
                        m = temp->student_number;
                        delete temp;
                        temp = Head;
                    }
                    else
                        temp = temp->Next;
                }
            }
            show();
        }
        if (a == 2)
        {
            Node* temp = Head;
            int n = 0;
            int pos = 0;
            int student_group;
            int m = 0;
            cout << "Группа: ";
            cin >> student_group;
            while (temp != NULL)
            {
                n++;
                temp = temp->Next;
            }
            temp = Head;
            for (int i = 0; i < n + m; i++)
            {
                if (temp != NULL)
                {
                    if (student_group == temp->student_group)
                    {
                        Node* Prevdel = temp->Prev;
                        Node* Nextdel = temp->Next;                      
                        if (Prevdel != 0 && i != 0)
                            Prevdel->Next = Nextdel;
                        if (Nextdel != 0 && i != 0)
                            Nextdel->Prev = Prevdel;
                        if (i == 0 + pos)
                        {
                            Head = Nextdel;
                            pos++;
                        }
                        if (i == n - pos)
                        {
                            Tail = Prevdel;

                        }
                        m = temp->student_number;
                        delete temp;
                        temp = Head;
                    }
                    else
                        temp = temp->Next;
                }
            }
            show();
        }
        if (a == 0)
        {
            index++;
        }
    }
}

void List::show()                     //Вывод списка
{
    Node* temp = Head;
    cout << "Список студентов:\n";
    if (Head != NULL)
    {
        while (temp != NULL)
        {
            cout << temp->student_number << ". ";
            cout << temp->name << " ";
            cout << "Группа - " << temp->student_group << " ";
            cout << "Стипендия - " << temp->stipend << " ";
            cout << "Оценки: " << temp->score_1 << ", " << temp->score_2 << ", " << temp->score_3 << ", " << temp->score_4 << ", " << temp->score_5 << " ";
            temp = temp->Next;
            cout << "\n";
        }
    }
    else
        cout << "Список пуст\n";
}

void List::change()           //Редактор
{
    Node* temp = Head;
    int num;
    cout << "Номер студента: ";
    cin >> num;
    while (temp->student_number != num)
    {
        temp = temp->Next;
    }
    int a = -1;
    while (a != 0)
    {
        cout << "Изметить данные о " << temp->name << "\n";
        cout << "1. Изменить имя\n";
        cout << "2. Изменить группу\n";
        cout << "3. Изменить размер стипендии\n";
        cout << "4. Изменить 1-ую оценку\n";
        cout << "5. Изменить 2-ую оценку\n";
        cout << "6. Изменить 3-ю оценку\n";
        cout << "7. Изменить 4-ую оценку\n";
        cout << "8. Изменить 5-ую оценку\n";
        cout << "0. Выход\n";
        int stipend, student_group, score_1, score_2, score_3, score_4, score_5;
        string name;
        cin >> a;
        if (a == 1)
        {
            cout << "Имя студента: ";
            getline(cin, name);
            getline(cin, name);
            temp->name = name;
        }
        if (a == 2)
        {
            cout << "Группа студента: ";
            cin >> student_group;
            temp->student_group = student_group;
        }
        if (a == 3)
        {
            cout << "Введите стипендию: ";
            cin >> stipend;
            temp->stipend = stipend;
        }
        if (a == 4)
        {
            cout << "Введите оценку: ";
            cin >> score_1;
            temp->score_1 = score_1;
        }
        if (a == 5)
        {
            cout << "Введите оценку: ";
            cin >> score_2;
            temp->score_2 = score_2;
        }
        if (a == 6)
        {
            cout << "Введите оценку: ";
            cin >> score_3;
            temp->score_3 = score_3;
        }
        if (a == 7)
        {
            cout << "Введите оценку: ";
            cin >> score_4;
            temp->score_4 = score_4;
        }
        if (a == 8)
        {
            cout << "Введите оценку: ";
            cin >> score_5;
            temp->score_5 = score_5;
        }
        cout << "Измененные данные о " << temp->name << ":\n";
        cout << temp->student_number << ". ";
        cout << temp->name << " ";
        cout << "Группа - " << temp->student_group << " ";
        cout << "Стипендия - " << temp->stipend << " ";
        cout << "Оценки:" << temp->score_1 << ", " << temp->score_2 << ", " << temp->score_3 << ", " << temp->score_4 << ", " << temp->score_5 << "\n";
    }
}

void List::menu()//функция меню
{
    int index = 0;
    while (index == 0)
    {
        int a;
        cout << "Меню\n";
        cout << "1. Заполнение студентов\n2. Вывод списка студентов\n3. Файловый импорт\n4. Файловый экспорт\n5. Редактирование\n6. Удаление\n0. Выйти из меню\n";
        cin >> a;
        if (a==1)
        {
            int n, student_number, stipend, student_group, score_1, score_2, score_3, score_4, score_5;
            string name;
            cout << "Введите количество студентов\n";
            cin >> n;
            student_number = 1;
            for (int i = 0; i < n; i++)
            {
                cout << "Введите имя студента\n";
                getline(cin, name);
                getline(cin, name);
                cout << "Введите группу студента\n";
                cin >> student_group;
                cout << "Введите стипендию\n";
                cin >> stipend;
                cout << "Введите оценки через enter\n";
                cin >> score_1 >> score_2 >> score_3 >> score_4 >> score_5;
                add(student_number, stipend, student_group, score_1, score_2, score_3, score_4, score_5, name);
                student_number++;
            }
            cout << endl;
            show();
            cout << endl;
        }
        if (a==2)
        {
            cout << endl;
            show();
            cout << endl;
        }
        if (a==3)
        {
            int n, student_number, stipend, student_group, score_1, score_2, score_3, score_4, score_5;
            string name; string s;
            ifstream file("import.txt");
            if (!file.is_open())
            {
                cout << "Ошибка открытия файла!\n" << endl;
            }
            else
            {
                vector<string> strings;
                while (getline(file, s, ','))
                {
                    strings.push_back(s);
                }
                file.close();
                string student_groups, stipends, marks;
                int n;
                while (!empty(strings))
                {
                    name = strings[0];
                    while (name[0] == ' ')
                    {
                        name.erase(0, 2);
                    }
                    student_number = stoi(name);
                    name.erase(0, 2);
                    student_groups = strings[1];
                    stipends = strings[2];
                    marks = strings[3];
                    student_groups.erase(0, 8);    
                    student_group = stoi(student_groups);
                    stipends.erase(0, 10);
                    stipend = stoi(stipends);
                    marks.erase(0, 8);  
                    score_1 = stoi(marks);
                    marks.erase(0, 2);
                    score_2 = stoi(marks);
                    marks.erase(0, 2);
                    score_3 = stoi(marks);
                    marks.erase(0, 2);
                    score_4 = stoi(marks);
                    marks.erase(0, 2);
                    score_5 = stoi(marks);
                    add(student_number, stipend, student_group, score_1, score_2, score_3, score_4, score_5, name);
                    strings.erase(strings.begin(), strings.begin() + 4);

                }
                cout << endl;
                show();
                cout << endl;
            }
        }
        if (a==4)
        {
            Node * temp = Head;
            ofstream in;
            in.open("export.txt", ios_base::trunc);
            while (temp != NULL)
            {
                in << temp->student_number << ". ";
                in << temp->name << " ";
                in << "Группа - " << temp->student_group << " ";
                in << "Стипендия - " << temp->stipend << " ";
                in << "Оценки:" << temp->score_1 << ", " << temp->score_2 << ", " << temp->score_3 << ", " << temp->score_4 << ", " << temp->score_5 << " ";
                temp = temp->Next;
                in << "\n";
            }
            in.close();
        }
        if (a==5)
        {
            cout << endl;
            show();
            change();
            cout << endl;
        }
        if (a==6)
            del();
        if (a==0)
            index++;
    }
}

int main()
{
    SetConsoleOutputCP(1251);
    SetConsoleCP(1251);
    List student;
    while (program == 1)
    {
        student.menu();
        cout << "Рестарт программы - 1\nЗавершение программы - 0\n";
        cin >> program;
    }
    return 0;
}
 
Последнее редактирование:
Пользователь
Статус
Оффлайн
Регистрация
23 Авг 2020
Сообщения
77
Реакции[?]
157
Поинты[?]
56K
таки а в чем проблема?
(не вдаваясь глубоко в код и не пытаясь что-то поменять, опираясь только на твой)
у тебя весь поток в одном списке, правильно? проходишь по нему, берешь стипендию и плюсуешь соответствующей группе (пару "группа - суммарная стипендия группы" можно через словарь например сделать), а также плюсуешь к сумме потока. потом проходишься по группам и высчитываешь их процент (сумма группы / сумма потока * 100% ). выводишь. все
 
Сверху Снизу