Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <string>
- #include <fstream> // chtenie faila
- #include <stdlib.h> //for using the function sleep
- #include <windows.h> // для Win32 систем
- #include <clocale>
- #include <typeinfo>
- #include <fstream>
- using namespace std;
- int const feldsUniversStruct = 9;
- int const maxRooms = 20;
- struct Hostel // структура
- {
- string HostelN; // номер ощежития
- string room; // номер комноты
- string debt; // долг
- };
- struct University // структура
- {
- string Rbook; // номер зачетки
- string name; // имя
- string surname; // фамелия
- string patronymic; // отчество
- string faculty; // факультет
- string teamN; // группа
- Hostel* HostelPtr = new Hostel(); // структура общага
- struct University* ptr; // указатель на следующий узел
- };
- struct DebtObrabot {
- int room;
- int debt;
- };
- //номер зачетки / фио / направление / группа / № Общаги / № комнаты /долги за общежитие
- // выбрать 5 комнат с макс долгом проживания
- // заголовки функций
- int main();
- void StekOperation();
- University* Dobav_head();
- University* delBySurname_(string valueDell);
- University* Corr_By_value();
- University* SearchByName();
- void Obrabotka();
- void Delete_ALL();
- void setFileName();
- void Help();
- void gotovo();
- void DelContent(string path);
- void WriteFromProgToTxt(string path);
- void ReedOfTxtToProg(string nameFile);
- void sortRoom();
- void Print();
- void SetValue(string num[]);
- University* ChekValidALL(string num[]);
- void SetUniversity(University* elem, string num[]);
- bool isEmpty();
- string getValue0(University* p);
- string getValue1(University* p);
- string getValue2(University* p);
- string getValue3(University* p);
- string getValue4(University* p);
- string getValue5(University* p);
- string getValue6(University* p);
- string getValue7(University* p);
- string getValue8(University* p);
- University* Prev(University* nod);
- University* Next(University* university_);
- int ValidChislo(string s);
- int ValidText(string s);
- void ReedOfTxtToProg(string nameFile);
- void headDel(University* temp);
- void headNextDel(University* temp);
- void DeleteEnd(University* temp);
- void DeletePreEnd(University* temp);
- void DeleteMidle(University* nod);
- int CountRooms();
- void quicksort(DebtObrabot* mas, int first, int last);
- void Shapka();
- University* head;
- //headR = NULL;
- string nameFile = "write.txt";
- bool isEmpty() { return head == NULL; } // Проверка, пуст ли список
- void setFileName() { cout << " \nVvedite name.txt: "; cin >> nameFile; }
- string getValue0(University* p) { return p->Rbook; } // Получение значения узла списка
- string getValue1(University* p) { return p->name; } // Получение значения узла списка patronymic
- string getValue2(University* p) { return p->surname; } // Получение значения узла списка
- string getValue3(University* p) { return p->patronymic; }
- string getValue4(University* p) { return p->faculty; } // Получение значения 2го узла списка
- string getValue5(University* p) { return p->teamN; }
- string getValue6(University* p) { return p->HostelPtr->HostelN; }
- string getValue7(University* p) { return p->HostelPtr->room; }
- string getValue8(University* p) { return p->HostelPtr->debt; }
- void SetValue(string num[]) {
- cout << "Введите номер зачетной книжки: "; cin >> num[0];
- cout << "Введите имя: "; cin >> num[1];
- cout << "Введите фамелию: "; cin >> num[2];
- cout << "Введите отчество: "; cin >> num[3];
- cout << "Введите направление: "; cin >> num[4];
- cout << "Введите группу: "; cin >> num[5];
- cout << "Введите № общежития: "; cin >> num[6];
- cout << "Введите № комноты: "; cin >> num[7];
- cout << "Введите долги: "; cin >> num[8];
- }
- void SetUniversity(University* elem, string num[]) {
- elem->Rbook = num[0];
- elem->name = num[1];
- elem->surname = num[2];
- elem->patronymic = num[3];
- elem->faculty = num[4];
- elem->teamN = num[5];
- elem->HostelPtr->HostelN = num[6];
- elem->HostelPtr->room = num[7];
- elem->HostelPtr->debt = num[8];
- }
- University* Prev(University* nod)
- {
- if (isEmpty()) return NULL;
- if (nod == head) return NULL;
- University* p = head;
- while (p->ptr != nod)
- p = p->ptr;
- return p;
- }
- University* Next(University* university_)
- {
- if (isEmpty()) return NULL;
- return university_->ptr;
- }
- int ValidChislo(string s) {
- for (auto c : s) {
- if ((c <= 'z') && (c >= 'a')) {
- cout << "Vi vveli text ne tuda"; return 0;
- }
- else if ((c <= 'Z') && (c >= 'A')) {
- cout << "Vi vveli text ne tuda"; return 0;
- }
- else if ((c <= 'Я') && (c >= 'А')) {
- cout << "Vi vveli text ne tuda"; return 0;
- }
- else if ((c <= 'я') && (c >= 'а')) {
- cout << "Vi vveli text ne tuda"; return 0;
- }
- }
- return 1;
- }
- int ValidText(string s) {
- for (auto c : s)
- if ((c <= '9') && (c >= '0')) {
- cout << "Vi vveli cislo ne tuda";
- return 0;
- }
- return 1;
- }
- University* ChekValidALL(string num[])
- {
- if (!ValidChislo(num[0])) { cout << " 0-HostelN \n"; return NULL; }
- if (!ValidText(num[1])) { cout << " 1-Rbook \n"; return NULL; }
- if (!ValidText(num[2])) { cout << " 2-name \n"; return NULL; }
- if (!ValidText(num[3])) { cout << " 3-name \n"; return NULL; }
- if (!ValidText(num[4])) { cout << " 4-name \n"; return NULL; }
- //if (!ValidChislo(num[5])) { cout << " 5-faculty \n"; return NULL; }
- if (!ValidChislo(num[6])) { cout << " 6-HostelN \n"; return NULL; }
- if (!ValidChislo(num[7])) { cout << " 7-room \n"; return NULL; }
- if (!ValidChislo(num[8])) { cout << " 8-debt \n"; return NULL; }
- }
- University* Add(string num[], University* university_ = NULL)
- {
- //ChekValidALL(num);
- University* elem = new University();
- SetUniversity(elem, num);
- if (university_ == NULL) // Добавление нового корня
- {
- if (head == NULL) {
- elem->ptr = NULL;
- head = elem;
- }
- else {
- elem->ptr = head;
- head = elem;
- }
- return elem;
- }
- elem->ptr = university_->ptr; // Добавление узла после текущего
- university_->ptr = elem;
- return elem;
- }
- University* getLast()
- {
- University* p = head;
- while (Next(p) != NULL)
- p = Next(p);
- return p;
- }
- void ReedOfTxtToProg(string nameFile)
- {
- ifstream inf(nameFile);
- // Если мы не можем открыть файл для чтения его содержимого,
- if (!inf)
- {
- // то выводим следующее сообщение об ошибке и выполняем функцию exit()
- cerr << nameFile << " could not be opened for reading!" << endl;
- cerr << "Perezagruzi programmu" << endl;
- Sleep(5000);
- exit(1);
- }
- //string z0, z1, z2, z3, z4, z5, z6, z7;
- string z[feldsUniversStruct];
- // Пока есть, что читать,
- int count=0;
- while (inf)
- {
- // то перемещаем то, что можем прочитать, в строку, а затем выводим эту строку на экран
- string strInput;
- getline(inf, strInput);
- int ci = 0;
- string word = "";
- int probels = 0;
- while ((strInput[ci] != NULL)) {
- strInput[ci];
- if (strInput[ci] != ' ') { word += strInput[ci]; }
- if ((strInput[ci] == ' ') || (strInput[ci + 1] == NULL)) {
- probels++;
- switch (probels) {
- case 1: z[0] = word;
- case 2: z[1] = word;
- case 3: z[2] = word;
- case 4: z[3] = word;
- case 5: z[4] = word;
- case 6: z[5] = word;
- case 7: z[6] = word;
- case 8: z[7] = word;
- case 9: z[8] = word;
- default: word = "";
- }
- }
- ci++;
- }
- University* s = getLast();
- if (strInput != "\0") { s = Add(z, s); }
- }
- Sleep(500);
- }
- void PrintRow(University* p)
- {
- if (isEmpty()) { cout << "Список пуст" << endl; return; }
- cout << getValue0(p)
- << " " << getValue1(p)
- << " " << getValue2(p)
- << " " << getValue3(p)
- << " " << getValue4(p)
- << " " << getValue5(p)
- << " " << getValue6(p)
- << " " << getValue7(p)
- << " " << getValue8(p)
- ;
- cout << endl;
- }
- void Print()
- { University* p = head;
- //int razmerUzlaBit = sizeof(p) + sizeof(p->faculty) + sizeof(p->HostelPtr) + sizeof(p->HostelPtr->debt) + sizeof(p->HostelPtr->HostelN) + sizeof(p->HostelPtr->room) + sizeof(p->name) + sizeof(p->patronymic) + sizeof(p->Rbook) + sizeof(p->surname) + sizeof(p->teamN) + sizeof(p->ptr);
- //cout << " Размер узла списка = "<< razmerUzlaBit / 8 << " байта." << endl; cout << endl;
- cout << "\n";
- if (isEmpty()) { cout << "Список пуст" << endl; return; }
- int count = -1;
- do {
- PrintRow(p);
- p = Next(p);
- count++;
- } while (p != NULL);
- /*cout << endl;
- cout << "Всего строк = " << count << " штук" << endl;*/
- }
- void headDel(University* temp)
- {
- University* t1 = temp;
- University* t2 = Next(temp);
- head = t2;
- t1 = NULL;
- delete t1;
- }
- void headNextDel(University* temp)
- {
- University* t1 = Prev(temp);
- University* t2 = temp;
- University* t3 = Next(temp);
- t1->ptr = t3;
- t2->ptr = NULL;
- delete t2;
- }
- void DeleteEnd(University* temp)
- {
- University* t1 = Prev(temp);
- University* t2 = temp;
- t1->ptr = NULL;
- delete t2;
- }
- void DeletePreEnd(University* temp)
- {
- University* t1 = Prev(temp);
- University* t2 = temp;
- University* t3 = Next(temp);
- t1->ptr = t3; delete t2;
- }
- void DeleteMidle(University* nod)
- {
- University* t1 = Prev(nod); // Удаление промежуточного узла
- University* t2 = nod;
- University* t3 = Next(nod);
- t1->ptr = t3;
- t2->ptr = NULL;
- delete t2;
- }
- University* delBySurname_(string valueDell) {
- University* head2 = head;
- if (head2 == NULL) { return NULL; } // В списке нет узлов
- University* temp = NULL;
- if (head2->surname == valueDell) { cout << "Удалить голову "; headDel(head2); return NULL; }
- head2 = head2->ptr;
- if (head2->surname == valueDell) { cout << "Удалить второй с головы "; headNextDel(head2); return NULL; }
- head2 = head2->ptr;
- int j = 0;
- while (head2->ptr->ptr != NULL) {
- temp = head2;
- if (temp->surname == valueDell) {
- cout << "Удаление в середине\n";
- DeleteMidle(temp);
- return NULL;
- }
- head2 = head2->ptr;
- j++;
- }
- if (head2->surname == valueDell) { cout << "Удалить второй с конца "; DeletePreEnd(head2); return NULL; }
- if (head2->ptr->surname == valueDell) { cout << "Удалить первыЙ с конца "; DeleteEnd(head2->ptr); return NULL; }
- }
- int chekValue(University* head, University* iPtr, string s1, string s2) {
- if (iPtr == NULL) return 0;
- if (s2 == "|комната") { return 1;}
- if (s1 == "|комната") { return 0;}
- int number1 = std::stoi(s1);
- int number2 = std::stoi(s2);
- if (number1 < number2) {
- return 1;
- }
- else { return 0; }
- }
- void Swap(University* ptr1, University* ptr2)
- {
- if (ptr1 == NULL || ptr2 == NULL) return;
- if (ptr1 == ptr2) return;
- University* prev1 = Prev(ptr1);
- University* prev2 = Prev(ptr2);
- University* next1 = Next(ptr1);
- University* next2 = Next(ptr2);
- if (ptr1 == head) {
- head = ptr2;
- ptr1->ptr = next2;
- ptr2->ptr = ptr1;
- }
- else {
- prev1->ptr = ptr2;
- ptr2->ptr = ptr1;
- ptr1->ptr = next2;
- }
- }
- void sortRoom() {
- University* ptr = NULL;
- University* headCop = head;
- int p = 0;
- if (headCop->ptr == NULL) {} // В списке нет узлов
- while (headCop != NULL) {
- if (headCop->ptr == NULL) break;
- if (headCop->name != "|имя") {
- if (chekValue(headCop, headCop->ptr, headCop->HostelPtr->room, headCop->ptr->HostelPtr->room)) {
- Swap(headCop, headCop->ptr);
- p++;
- }
- }
- headCop = headCop->ptr;
- }
- if (p != 0) {
- sortRoom();
- }
- }
- University* Dobav_head()
- {
- University* temp = NULL;
- University* head2 = head;
- string num[feldsUniversStruct];
- SetValue(num);
- ChekValidALL(num);
- University* elem = new University();
- SetUniversity(elem, num);
- elem->ptr = head2;
- head = elem;
- if (head2 == NULL) { return NULL; } // В списке нет узлов
- }
- University* Corr_By_value()
- {
- University* temp = NULL;
- University* head2 = head;
- int cor;
- string valueSearch;
- cout << "Введите фамелию для корректировки строки : "; cin >> valueSearch;
- if (head2 == NULL) { cout << "pusto "; return NULL; } // В списке нет узло
- int j = 0;
- while (head2 != NULL) {
- temp = head2;
- if (temp->surname == valueSearch) {
- cout << "зачетка_N-1 имя-2 фамелия-3 отчество-4 направление-5 группа-6 общага_N-7\n";
- cout << "комната-8 долг-9 Exit - anyKEY \n";
- {
- cin >> cor;
- switch (cor) {
- case 1:
- cout << "зачетка_N\n"; cin >> temp->Rbook;
- break;
- case 2:
- cout << "имя\n"; cin >> temp->name;
- break;
- case 3:
- cout << "фамелия\n"; cin >> temp->surname;
- break;
- case 4:
- cout << "отчество\n"; cin >> temp->patronymic;
- break;
- case 5:
- cout << "направление()\n"; cin >> temp->faculty;
- break;
- case 6:
- cout << "группа()\n"; cin >> temp->teamN;
- break;
- case 7:
- cout << "общага_N;\n"; cin >> temp->HostelPtr->HostelN;
- break;
- case 8:
- cout << "комната\n"; cin >> temp->HostelPtr->room;
- break;
- case 9:
- cout << "долг()\n"; cin >> temp->HostelPtr->debt;
- break;
- default:
- cout << "Exit Corr\n"; goto tryAgain2;
- break;
- }
- }
- // это лейбл
- }
- head2 = head2->ptr;
- j++;
- //break;
- }
- tryAgain2:return NULL;
- }
- University* SearchByName()
- {
- University* temp = NULL;
- University* head2 = head;
- string valueSearch;
- cout << "Поиск по фамилии: "; cin >> valueSearch;
- if (head2 == NULL) { cout << "pusto "; return NULL; } // В списке нет узло
- int j = 0;
- while (head2 != NULL) {
- temp = head2;
- if (temp->surname == valueSearch) {
- cout << "Поиск идет ... \n";
- PrintRow(temp);
- break;
- }
- head2 = head2->ptr;
- j++;
- }
- system("pause");
- }
- void WriteFromProgToTxt(string path){
- int count = -1;
- //string path = "write.txt";
- ofstream fout;
- fout.open(path, ofstream::app);
- if (!fout.is_open()) {
- cout << "Ошибка открытия фаила" << endl;
- Sleep(5000);
- }
- else {
- if (isEmpty()) { cout << "Список пуст" << endl; return; }
- University* p = head;
- do {
- fout << "\n" << getValue0(p)
- << " " << getValue1(p)
- << " " << getValue2(p)
- << " " << getValue3(p)
- << " " << getValue4(p)
- << " " << getValue5(p)
- << " " << getValue6(p)
- << " " << getValue7(p)
- << " " << getValue8(p)
- ;
- p = Next(p);
- count++;
- } while (p != NULL);
- }
- cout << "Всего строк = " << count << " штук. \n";
- fout.close();
- }
- void DelContent(string path)
- {
- ofstream fout;
- fout.open(path, ofstream::trunc);
- fout.close();
- }
- ///////////////////
- void Delete_ALL()
- {
- class University* p = head;
- if (p == NULL) return;
- do {
- University* d = p;
- p = p->ptr;
- delete d;
- } while (p != NULL);
- head = NULL;
- }
- int CountRooms()
- {
- sortRoom();
- University* t = head;
- int i = 1;
- int vsego=0;
- while (t != NULL) {
- if (t->ptr == NULL) return vsego;
- if (t->HostelPtr->room != t->ptr->HostelPtr->room){ i++; }
- t = t->ptr;
- vsego = i;
- }
- return vsego;
- }
- void quicksort(DebtObrabot* mas, int first, int last)
- {
- int mid, count1, count2;
- int f = first, l = last;
- mid = mas[(f + l) / 2].debt; //вычисление опорного элемента
- do
- {
- while (mas[f].debt > mid) f++;
- while (mas[l].debt < mid) l--;
- if (f <= l) //перестановка элементов
- {
- count1 = mas[f].debt;
- mas[f].debt = mas[l].debt;
- mas[l].debt = count1;
- count2 = mas[f].room;
- mas[f].room = mas[l].room;
- mas[l].room = count2;
- f++;
- l--;
- }
- } while (f < l);
- if (first < l) quicksort(mas, first, l);
- if (f < last) quicksort(mas, f, last);
- }
- void Obrabotka() {
- sortRoom();
- DebtObrabot ArrObrabotka[maxRooms];
- int i = 0;
- string s1;
- string s2;
- string s3;
- int number1=0;
- int number2=0;
- int number3 = 0;
- int a = 0;
- int k = 0;
- University* t = head;
- while (t != NULL) {
- if (t->name == "|имя") {// delBySurname_("|фамелия");
- t = t->ptr; continue; }
- s1 = t->HostelPtr->room;
- s3 = t->HostelPtr->debt;
- number3 = std::stoi(s3);
- number1 = std::stoi(s1);
- if (t->ptr == NULL) {
- t = t->ptr;
- a = a + number3;
- ArrObrabotka[i].debt = a;
- ArrObrabotka[i].room = number1;
- break;
- }
- s2 = t->ptr->HostelPtr->room;
- number2 = std::stoi(s2);
- a = a + number3;
- t = t->ptr;
- if (number1 != number2) {
- ArrObrabotka[i].debt = a;
- ArrObrabotka[i].room = number1;
- a = 0;
- i++;
- }
- }
- quicksort(ArrObrabotka, 0, maxRooms - 1);
- int y = 0;
- while (y<5) {
- cout << "Долг-" << ArrObrabotka[y].debt << " | НомерКомнаты-" << ArrObrabotka[y].room << " \n";
- y++;
- }
- system("pause");
- }
- void gotovo() {
- sortRoom();
- DelContent(nameFile);
- WriteFromProgToTxt(nameFile);
- Delete_ALL();
- ReedOfTxtToProg(nameFile);
- Print();
- }
- void Help()
- {
- system("cls");
- cout << "Dobav_head-1 delBySurname_-2 Corr_By_value-3 SearchByName-4 \n";
- cout << "Obrabotka-5 Delete_ALL-6 setFileName-7 Exit - anyKEY\n";
- cout << "Таблица находится в файле "<< nameFile <<". ";
- }
- void Shapka() {
- University* t = head;
- if (t == NULL || t->name != "|имя"
- ) {
- University* head2 = head;
- University* elem = new University();
- // зачетк / фио / направление / группа / № Общаги / № комнаты /долги за общежитие
- elem->Rbook = "|зачетка_N";
- elem->name = "|имя";
- elem->surname = "|фамелия";
- elem->patronymic = "|отчество";
- elem->faculty = "|направление";
- elem->teamN = "|группа";
- elem->HostelPtr->HostelN = "|общага_N";
- elem->HostelPtr->room = "|комната";
- elem->HostelPtr->debt = "|долг\a|";
- elem->ptr = head2;
- head = elem;
- }
- }
- void StekOperation()
- {
- WriteFromProgToTxt(nameFile);
- ReedOfTxtToProg(nameFile);
- Shapka();
- string valueDell;
- int opN;
- Help();
- gotovo();
- //cin >> opN;
- while (true)
- {
- cout << "OPERAVION # >> ";
- cin >> opN;
- switch (opN) {
- case 1:
- cout << "Dobav_head\n"; Dobav_head();
- break;
- case 2:
- cout << "delBySurname_\n"; cout << "Удаление по фамилии: "; cin >> valueDell; delBySurname_(valueDell);
- break;
- case 3:
- cout << "Corr_By_value\n"; Corr_By_value();
- break;
- case 4:
- cout << "SearchByName\n"; SearchByName();
- break;
- case 5:
- cout << "Obrabotka()\n"; Obrabotka();
- break;
- case 6:
- cout << "Delete_ALL()\n"; Delete_ALL();
- break;
- case 7:
- cout << "setFileName\n"; setFileName(); Delete_ALL(); WriteFromProgToTxt(nameFile); ReedOfTxtToProg(nameFile); Shapka();
- break;
- default:
- cout << "Exit\n"; Delete_ALL(); goto tryAgain;
- }
- Help();
- gotovo();
- }
- tryAgain: // это лейбл
- exit;
- }
- // Запуск программы: CTRL+F5 или меню "Отладка" > "Запуск без отладки"
- // Отладка программы: F5 или меню "Отладка" > "Запустить отладку"
- int main()
- {
- //setlocale(LC_ALL, "ru");
- setlocale(LC_CTYPE, "Russian");
- SetConsoleCP(1251);// установка кодовой страницы win-cp 1251 в поток ввода
- SetConsoleOutputCP(1251); // установка кодовой страницы win-cp 1251 в поток вывода
- setlocale(LC_ALL, "Rus"); // Подключение русского языка
- StekOperation();
- }
- // Советы по началу работы
- // 1. В окне обозревателя решений можно добавлять файлы и управлять ими.
- // 2. В окне Team Explorer можно подключиться к системе управления версиями.
- // 3. В окне "Выходные данные" можно просматривать выходные данные сборки и другие сообщения.
- // 4. В окне "Список ошибок" можно просматривать ошибки.
- // 5. Последовательно выберите пункты меню "Проект" > "Добавить новый элемент", чтобы создать файлы кода, или "Проект" > "Добавить существующий элемент", чтобы добавить в проект существующие файлы кода.
- // 6. Чтобы снова открыть этот проект позже, выберите пункты меню "Файл" > "Открыть" > "Проект" и выберите SLN-файл.
Add Comment
Please, Sign In to add comment