Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <string>
- #include <cstring>
- #include <iostream>
- #include <fstream>
- #include <cstdio>
- #include <cstdlib>
- #include <clocale>
- #include <vector>
- #include <windows.h>
- #include <algorithm>
- using namespace std;
- vector < pair<string, pair<int, int> > > vec;//создаём вектор(список) для добавление студентов
- struct node //Наша Структура(средний балл, номер зачетной книжки и средний балл)
- {
- int ball; //средний балл
- string FIO;//ФИО студента
- int nomer;//номер зачетной книжки
- node *left;//левое поддерево
- node *right;//правое поддерево
- };
- node* crnode(string fio, int nomer, int ball) //Функция для создании нового места в памяти для нового узла
- {
- node *newnode = new node;//создает новое место в памяти
- newnode->ball = ball;
- newnode->FIO = fio;
- newnode->nomer = nomer;
- newnode->left = NULL;
- newnode->right = NULL;
- return newnode;
- }
- node* add_tree(node *root, string fio, int nomer, int ball) //Функция добавления нового узла в дерево
- {
- if (root == NULL)//если дерево root пустая, то добавляем узел в дереве
- root = crnode(fio, nomer, ball);
- if (root->FIO > fio) // Если ключ дерево root больше заданного ключа, значит узел надо добавить в левое поддерево
- {
- if (root->left == NULL)
- root->left = crnode(fio, nomer, ball);
- else
- add_tree(root->left, fio, nomer, ball);
- }
- if (root->FIO < fio) // Если ключ root меньше заданного ключа,значит надо добавить в правое поддерево
- {
- if (root->right == NULL)
- root->right = crnode(fio, nomer, ball);
- else
- add_tree(root->right, fio, nomer, ball);
- }
- return root;
- }
- void sort_tree(node *root) // Собственно просмотр нашего дерево и вывод уровня дерево
- {
- if (root == NULL)
- return;
- int ball = root->ball;
- string fio = root->FIO;
- int nomer = root->nomer;
- sort_tree(root->left);
- //cout << fio << " " << nomer << " " << ball << endl;
- vec.push_back(make_pair(fio, make_pair(nomer, ball)));//Добавляем студента в вектор
- sort_tree(root->right);
- }
- //Функция для сортировки по номеру зачетной книжки
- bool sortbynomer(pair<string, pair<int, int> > a, pair<string, pair<int, int> > b)
- {
- return a.second.first < b.second.first;
- }
- //Функция ддя сортировки по среднему баллу
- bool sortbyball(pair<string, pair<int, int> > a, pair<string, pair<int, int> > b)
- {
- return a.second.second < b.second.second;
- }
- int strtoint(string s){// Функция для преобразования строки в число
- int number = 0;
- for (int i = 0; i < s.size(); i++)
- if (s[i] >= '0' && s[i] <= '9')
- number = number * 10 + (s[i] - '0');
- return number;
- }
- int main() {
- setlocale(LC_CTYPE,".1251");
- ifstream input("in.txt");
- node *mytree = NULL;
- int m, n;
- int j = 0, ball, nomer;
- string fio, s, line;
- while(getline(input, line)){
- s = "";
- j = 0;
- for (int i = 0; i < line.size(); i++)//Отделяем ФИО, номер и средний балл от line
- if (line[i] == ' ')
- {
- if (j == 0)
- fio = s;
- if (j == 1)
- nomer = strtoint(s);
- j++;
- s = "";
- }
- else
- s += line[i];
- ball = strtoint(s);
- vec.push_back(make_pair(fio, make_pair(nomer, ball)));//Добавляем студента в вектор
- }
- system("cls");//Очистка экрана консоли
- ofstream output("in.txt");
- do
- {
- cout<<"Меню программы:\n "
- " 1. Добавить нового студента в файл\n "
- " 2. Удаление студента из файла\n "
- " 3. Изменить средний балл студента\n "
- " 4. Сортировка по Фамилии, по номеру зачетной книжки или по среднему баллу\n "
- " 5. Выход\n";
- cin >> m;
- if (m == 5){
- break;
- }
- system("cls");//Очистка экрана консоли
- if (m == 1){
- char fio[30], nomer[30], ball[30];
- cout << "Введите ФИО(без пробела), номер зачетной книжки и средний балл: \n";
- cin >> fio >> nomer >> ball;
- //OemToCharA это функция для русских слов в файле!!
- OemToCharA(fio, fio);
- vec.push_back(make_pair(fio, make_pair(strtoint(nomer), strtoint(ball))));//Добавляем нового студента в наш вектор
- }
- if (m == 2){
- char fio[30];
- int i, f = 0;
- cout << "Введите ФИО студента которого надо удалить: \n";
- cin >> fio;
- //OemToCharA это функция для русских слов в файле!!
- OemToCharA(fio, fio);
- for (i = 0; i < vec.size(); i++)//Ищем студента в списке
- if (fio == vec[i].first){
- vec.erase (vec.begin() + i);
- f = 1;
- cout << "Студент " << fio << " удалён из списка!\n";
- break;
- }
- if (f == 0)//Если f == 0, значит такого студента нету
- cout << "Такого студента нету в списке!\n";
- }
- if (m == 3){
- cout << "Введите ФИО студента и новый средний балл: \n";
- int ball, f = 0, i;
- char fio[30];
- cin >> fio >> ball;
- //OemToCharA это функция для русских слов в файле!!
- OemToCharA(fio, fio);
- for (i = 0; i < vec.size(); i++)
- if (vec[i].first == fio){
- vec[i].second.second = ball;//Изменяем средний балл студента
- f = 1;
- break;
- }
- if (f == 0)
- cout << "Такого студента нету!\n";
- else
- cout << "Средний балл изменен!\n";
- }
- if (m == 4){
- cout<<" 1. Сортировка по ФИО\n "
- "2. Сортировка по номеру зачетной книжни\n "
- "3. Сортировка по среднему баллу\n ";
- cin >> n;
- if (n == 1){
- for (int i = 0; i < vec.size(); i++)
- if (mytree == NULL)
- mytree = crnode(vec[i].first, vec[i].second.first, vec[i].second.second);
- else
- add_tree(mytree, vec[i].first, vec[i].second.first, vec[i].second.second);
- vec.clear();//Очистим вектор чтобы добавить в него сортированную списку
- sort_tree(mytree);
- }
- if (n == 2)
- sort(vec.begin(), vec.end(), sortbynomer);//Сортируем по номеру с помошью функции sort
- if (n == 2)
- sort(vec.begin(), vec.end(), sortbyball);//Сортируем по среднему баллу с помошью функции sort
- //ВЫВОДИМ НА ЭКРАН СОРТИРОВАННУЮ СПИСКУ
- for (int i = 0; i < vec.size(); i++)
- cout << vec[i].first << " " << vec[i].second.first << " " << vec[i].second.second << endl;
- }
- }while(true);
- for (int i = 0; i < vec.size(); i++)//Добаляем все наши изменения в файл
- output << vec[i].first << " " << vec[i].second.first << " " << vec[i].second.second << "\n";
- output.close();//Закрываем файл
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement