SaveText.Ru

Без имени
  1. //Заголовок структуры Student
  2. #pragma once
  3. #include<fstream>
  4. struct Student
  5. {
  6.         char NameLast[20]; // Фамилия
  7.         char Name[20]; // Имя
  8.         int Age; //Возраст
  9.         int Course; // Курс
  10.         //метод записи данных в файл
  11.         //поток должен быть уже открыт
  12.         bool write(std::ofstream* fout);
  13.         //метод чтения данных из файла
  14.         //поток должен быть уже открыт
  15.         bool read(std::ifstream* fin);
  16. };
  17.  
  18. //Реализация методов структуры Student
  19. using namespace std;
  20. //методыструктуры Student        
  21. bool Student::write(ofstream* fout) {
  22.         //Еслифайлнеоткрыт
  23.         if (!fout) return false;
  24.         //записываем
  25.         fout->write((char*)this, sizeof(Student));
  26.         if (fout->good())
  27.                 return true;
  28.         //else
  29.         return false;
  30. }
  31. //метод чтения данных из файла
  32. //поток должен быть уже открыт
  33. bool Student::read(ifstream* fin) {
  34.         //Если файл не открыт
  35.         if (!fin) return false;
  36.         if (fin->peek() == eof) return false;
  37.         fin->read((char*)this, sizeof(Student));
  38.         if (fin->good())
  39.                 return true;
  40.         //else
  41.         return false;
  42. }
  43.  
  44. //Заголовок структоры Item
  45. #pragma once
  46. //Элемент односвязного списка
  47. struct Item{
  48.         Student data;
  49.         Item* next;
  50.         //конструктор
  51.         Item(Student* st) {
  52.                 //копируем поля из параметра st в поле data
  53.                 strcpy_s(data.NameLast, st->NameLast);
  54.                 strcpy_s(data.Name, st->Name);
  55.                 data.Age = st->Age;
  56.                 data.Course = st->Course;
  57.                 next = null;
  58.         }
  59. };
  60.  
  61.  
  62. //Заголовок файла Mylist
  63. #pragma once
  64. class MyList
  65. {
  66.         Item* Head; //Указатель на начало списка
  67. public:
  68.         MyList() :Head(null) {}; //Конструктор по умолчанию (Head = NULL)
  69.         ~MyList();//Деструктор
  70.         void AddToTop(Student* st); // добавление записи в начало списка
  71.         void AddToEnd(Student* st); // добавление записи в конец списка
  72.         void Show(); // вывод списка на экран
  73.         void Clear(); // очистка списка (удаление всех эл.)
  74.         bool LoadToFile(char* file_name); // сохранение списка в файл
  75.         bool ReadFromFile(char* file_name); // чтение из файла в тот же список
  76.         bool isEmpty() {
  77.                 if (Head == null) return true;
  78.                 else
  79.                         return false;
  80.         }
  81.         bool DeleteLast();
  82.         Student* Search(char Name[30], int Age);
  83. };
  84.  
  85. //Реализация методов класса Mylist
  86. #include<iostream>
  87. #include<fstream>
  88. #include<string.h>
  89. #include<stdlib.h>
  90. #include<iomanip>
  91.  
  92. using namespace std;
  93. //Деструкторкласса List
  94. MyList::~MyList()
  95. {
  96.         Clear();
  97. }
  98. // очистка списка (удаление всех эл.)
  99. void MyList::Clear()
  100. {
  101.         while (Head != null) //Пока по адресу есть хоть что-то
  102.         {
  103.                 Item* temp = Head->next; //Сразу запом. указатель на адрес след. элемента структуры
  104.                 delete Head; //Освобождаем память по месту начала списка
  105.                 Head = temp; //Меняем адрес начала списка
  106.         }
  107.         Head = null;
  108. }
  109. /*функция добавления новой записи в начало списка*/
  110. void MyList::AddToTop(Student* st)
  111. {
  112.         Item* temp = new Item(st); //Выделение памяти под новый элемент
  113.         temp->next = Head; //Указываем, что адрес следуюдего элемента это старое начало списка
  114.         Head = temp;    //Смена адреса начала списка
  115. }
  116. /*функция добавления новой записи в конец списка*/
  117. void MyList::AddToEnd(Student* st)
  118. {
  119.         Item* tmpNewItem = new Item(st); //Выделениепамятиподновыйэлемент
  120.         //если список пустой, то новый эл. это голова списка
  121.         if (Head == null) {
  122.                 Head = tmpNewItem;
  123.                 return;
  124.         }
  125.         //если список не пустой, то переходим на последний эл. и добавляем в конец
  126.         Item* p = Head;
  127.         while (p->next != null) {
  128.                 p = p->next;
  129.         }
  130.         //теперь р указывает на последний эл-т
  131.         p->next = tmpNewItem; //добавляем новый эл-т в конец
  132. }
  133.  
  134. /*вывод списка на экран*/
  135. void MyList::Show()
  136. {
  137.         Item* temp = Head; //Объявляем указатель, он указывает на начало
  138.         system("cls"); // очисткаэкрана
  139.         cout << setw(20) << "NameLast" << setw(20) << "Name" <<
  140.                 setw(10) << "Age" << setw(10) << "Course" << endl; // выводзаголовка
  141.         cout << "___________________________________________________________"
  142.                 << endl << endl;
  143.         while (temp != null) //Пока по адресу на начало есть данные
  144.         {
  145.                 //Выводим все элементы структуры
  146.                 cout << setw(20) << temp->data.NameLast; //Выводимени
  147.                 cout << setw(20) << temp->data.Name; //Выводфамилии
  148.                 cout << setw(10) << temp->data.Age; //Выводвозраста
  149.                 cout << setw(10) << temp->data.Course << endl; //Выводкурса
  150.                 //Переходим на следующий адрес из списка
  151.                 temp = temp->next;
  152.         }
  153.         cout << "___________________________________________________________" << endl << endl;
  154. }
  155. // чтение из файла в тот же список
  156. // старыеэлеметыудаляются
  157. bool MyList::ReadFromFile(char* file_name)
  158. {
  159.         //еслиимяфайлаотсутствует
  160.         if (file_name == null) return false;
  161.         ifstream fin;
  162.         fin.open(file_name, ios::binary | ios::in);
  163.         //Если файл не открыт
  164.         if (!fin) return false;
  165.         // когда файл открыт    
  166.         Clear(); // удаляем старые элементы
  167.         //в цикле читаем из файла и добавляем в конец списка
  168.         Student tmpStud;
  169.         bool isOk;
  170.         while (!fin.eof()) {
  171.                 if (fin.peek() != eof) {
  172.                         isOk = tmpStud.read(&fin);
  173.                         if (!isOk) {
  174.                                 fin.close(); //Закрываемфайл
  175.                                 return false;
  176.                         }
  177.                         AddToEnd(&tmpStud);
  178.                 }
  179.         }
  180.         fin.close(); //Закрываемфайл
  181.         return true;
  182. }
  183.  
  184. bool MyList::LoadToFile(char* file_name)
  185. {
  186.         //еслиимяфайлаотсутствует
  187.         if (file_name == null) return false;
  188.         ofstream fout(file_name, ios::binary | ios::out);
  189.         //Еслифайлнеоткрыт
  190.         if (!fout) return false;
  191.         Item* temp = Head; //Обьявляем указатель, он указывает на начало списка
  192.         while (temp != null) //Пока по адресу на начало есть данные
  193.         {
  194.                 temp->data.write(&fout);
  195.                 temp = temp->next; //переходим на следующий адрес из списка
  196.                 if (!fout.good()) {
  197.                         fout.close();
  198.                         return false; //если ошибка записи
  199.                 }
  200.         }
  201.         fout.close();
  202.         return true;
  203. }
  204. bool MyList::DeleteLast()
  205. {
  206.         if (isEmpty())
  207.         {
  208.                 return false;
  209.         }
  210.         if (Head->next == null)
  211.         {
  212.                 delete Head;
  213.                 Head = null;
  214.                 return true;
  215.         }
  216.         Item* p = Head;
  217.         while (p->next->next != null)
  218.         {
  219.                 p = p->next;
  220.         }
  221.         delete p->next;
  222.         p->next = null;
  223.         return true;
  224. }
  225.  
  226. Student* MyList::Search(char NameLast[30], int Age)
  227. {
  228.         Item* p = Head;
  229.         while (p != null)
  230.         {
  231.                 if (strcmp(p->data.NameLast, NameLast) == 0 && p->data.Age == Age)
  232.                 {
  233.                         return&p->data;
  234.                 }
  235.                 p = p->next;
  236.         }
  237.         return null;
  238. }
  239.  
  240. //main
  241.  
  242. #include<iostream>
  243. #include<fstream>
  244. #include<string.h>
  245. #include<stdlib.h>
  246. #include<iomanip>
  247. #include"windows.h"
  248. #include<ctime>
  249. using namespace std;
  250. //      прототипыфункций       
  251. //реализацияпунктаменю "1: Read from the file"
  252. void ReadListFromFile(MyList* lst);
  253. //реализацияпунктаменю "3: Add student"
  254. void AddStudToList(MyList* lst);
  255. //реализацияпунктаменю "4: Save to the file"
  256. void LoadListToFile(MyList* lst);
  257.  
  258. void DeleteLastGuy(MyList* lst);
  259. void SearchGuy(MyList* lst);
  260.  
  261. void SetColor(int text, int bg)
  262. {
  263.         HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);
  264.         SetConsoleTextAttribute(hStdOut, (WORD)((bg << 4) | text));
  265. }
  266.  
  267. int main()
  268. {
  269.         setlocale(0, "");
  270.         SetConsoleCP(1251);
  271.         SetConsoleOutputCP(1251);
  272.         cout.setf(ios::left); // выравнивание по левому краю
  273.         bool flag = true; // флаг продолжения работы
  274.         int choice;   // выбор пользователя
  275.         Student student; // переменная типа Студент
  276.         MyList spisok; // переменная типа Список
  277.         while (flag)
  278.         {
  279.                 system("cls"); // очисткаэкрана
  280.                 cout << "         Меню" << endl;
  281.                 cout << "______________________" << endl;
  282.                 cout << "1: Чтение из файла" << endl;
  283.                 cout << "2: Показать список" << endl;
  284.                 cout << "3: Добавить студента" << endl;
  285.                 cout << "4: Сохванить в файл" << endl;
  286.                 cout << "5: Удалить последнюю запись" << endl;
  287.                 cout << "6: Поиск" << endl;
  288.                 cout << "7: Сортировать" << endl;
  289.                 cout << "8: Выход" << endl;
  290.                 cout << "______________________" << endl << endl;
  291.                 cout << "Сделайте выбор (1-8): ";
  292.                 cin >> choice;
  293.                 switch (choice)
  294.                 {
  295.                 case 1: ReadListFromFile(&spisok); system("PAUSE"); break;
  296.                 case 2: spisok.Show(); system("PAUSE"); break;
  297.                 case 3: AddStudToList(&spisok); break;
  298.                 case 4: LoadListToFile(&spisok); break;
  299.                 case 5: DeleteLastGuy(&spisok); system("pause"); break;
  300.                 case 6: SearchGuy(&spisok); system("pause"); break;
  301.                 case 7: cout << "Not implemented :(  "; system("pause"); break;
  302.                 case 8: flag = false; break;
  303.                 default: cout << "You are  wrong. " << endl;
  304.                 }
  305.         }
  306.         system("PAUSE");
  307.         return 0;
  308. }
  309. //реализацияпунктаменю "1: Read from the file"
  310. void ReadListFromFile(MyList* lst) {
  311.         if (lst == null) {
  312.                 cout << "Неправильный список." << endl;
  313.                 return;
  314.         }
  315.         char file_name[30]; // если имя файла задается пользователем
  316.         //ifstreamfin("E:\1\stud40.dat", ios::binary | ios::in);
  317.         cout << "Имя исходного файла: ";
  318.         cin >> file_name;
  319.         if (!lst->ReadFromFile(file_name))
  320.                 cout << "Не тот файлn";
  321.         else
  322.                 cout << "Данные полученыn";
  323. }
  324. //реализация пункта меню "3: Addstudent"
  325. void AddStudToList(MyList* lst) {
  326.         if (lst == null) {
  327.                 cout << "Неправильный список!!!" << endl;
  328.                 return;
  329.         }
  330.         Student st;
  331.         system("cls"); // Очисткаэкрана
  332.         cin.ignore(); //Игнорируемсимвол
  333.         cout << "Фамилия:  "; cin.getline(st.NameLast, 20); //Вводфамилии
  334.         cout << "Имя:  "; cin.getline(st.Name, 20); //Вводимени
  335.         cout << "Возраст: "; cin >> st.Age; //Вводвозраста
  336.         cin.ignore(); //Игнорируемсимвол
  337.         cout << "Курс: "; cin >> st.Course; //Вводкурса
  338.         cin.ignore(); //Игнорируемсимвол
  339.         lst->AddToTop(&st);
  340. }
  341. //реализацияпунктаменю "4: Save to the file"
  342. void LoadListToFile(MyList* lst) {
  343.         if (lst == null) {
  344.                 cout << "Неправильный список!!" << endl;
  345.                 return;
  346.         }
  347.         char file_name[30];
  348.         system("cls");
  349.         cout << "Имя исходного файла: ";
  350.         cin >> file_name;
  351.         cout << "Начинайте писать...n";
  352.         if (lst->LoadToFile(file_name)) //Еслиоткрытиефайлапрошлоуспешно
  353.         {
  354.                 cout << "Созданный файлn";
  355.         }
  356.         else
  357.                 cout << "Файл не создаетсяn";
  358.         system("pause");
  359. }
  360.  
  361.  
  362.  
  363. void DeleteLastGuy(MyList* lst)
  364. {
  365.         bool isOk;
  366.         isOk = lst->DeleteLast();
  367.         if (isOk)
  368.         {
  369.                 cout << "Удаление завершеноn";
  370.         }
  371.         else
  372.         {
  373.                 cout << "Ошибкаn";
  374.         }
  375. }
  376. void SearchGuy(MyList* lst)
  377. {
  378.  
  379.         Student st;
  380.         system("cls"); // Очисткаэкрана
  381.         cin.ignore(); //Игнорируемсимвол
  382.         cout << "Поиск студента nn";
  383.         cout << "Фамилия:  "; cin.getline(st.NameLast, 20); //Вводфамилии     
  384.         cout << "Имя:  "; cin >> (st.Age);
  385.         Student* d;
  386.         d = lst->Search(st.NameLast, st.Age);
  387.         if (d == null)
  388.         {
  389.                 cout << "nСтудент не найденnn";
  390.                 return;
  391.         }
  392.         cout << "nСтудент найденn"
  393.                 << "nИмя:  " << d->Name
  394.                 << "nФамилия:  " << d->NameLast
  395.                 << "nВозраст:  " << d->Age
  396.                 << "nКурс:  " << d->Course
  397.                 << endl << endl;
  398. }

Share with your friends:

Print