Advertisement
Usow_Maxim

Lab_12.8_Version_1

Jun 8th, 2018
88
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 19.73 KB | None | 0 0
  1. #include <cstdio>
  2. #include <windows.h>
  3. #include <conio.h>
  4. #include <iostream>
  5.  
  6. using namespace std;
  7.  
  8. struct Book //Структура книги
  9. {
  10.     char* author; //Имя автора книги
  11.     char* name; //Название книги
  12.     int pages; //Количество страниц в книге
  13.     int price; //Цена книги
  14.     Book* next; //Указатель на следующую книгу
  15.     Book* prev; //Указатель
  16. };
  17. Book* CreateBook(); //Функция создания стандартной книги
  18. Book* AddBook(Book* List); //Функция добавления книги в список книг
  19. Book* EditBook(Book* book); //Функция редактирования книги в списке книг
  20. Book* RemoveBook(Book* book); //Функция удаления книги из списка книг
  21. Book* BookEditor(Book* book); //Редактор книги
  22. int Write_int(bool zero = false); //Безопасный ввод числа
  23. char* strEdit(bool Number = false); //Редактор строки
  24. Book* FindBookOnIndex(Book* List, UINT index); //Функция поиска книги по индексу. Возвращает NULL если не нашёл
  25. int GetListSize(Book* List); //Возвращает длину списка
  26. void OutputBooks(Book* List); //Вывод списка книг
  27. void DeleteList(Book* List); //Удаляет список книг
  28. Book* ReadFile(const char* fileName); //Функция считывает структуры из файла в бинарном виде
  29. void WriteFile(const char* fileName, Book* List); //Функция записывает структуры в файл в бинарном виде
  30. char* myStrCpy(char* str, int &start, char symbol_stop); //Строка которую читаем, позиция с которой необходимо считать, символ на котором чтение будет закончено
  31. Book* GetFirstElementList(Book* List); //Функция возвращает первый элемент списка
  32.  
  33. int main()
  34. {
  35.     SetConsoleCP(1251);
  36.     SetConsoleOutputCP(1251);
  37.  
  38.     Book* List = NULL; //Создаём указатель на список книг
  39.  
  40.     bool whileRun = true;
  41.     while(whileRun) //Главный цикл программы
  42.     {
  43.         system("cls"); //Очистка экрана
  44.         printf("[Главное меню]\n1.Добавить книгу\n2.Редактировать книгу\n3.Удалить книгу\n4.Показать список книг\n5.Сохранить список книг\n6.Загрузить список книг\n7.Выход\nВвод: ");
  45.         switch(Write_int())
  46.         {
  47.         case 1: //[Главное меню] :: Добавить книгу
  48.         {
  49.             List = AddBook(List);
  50.             break;
  51.         }
  52.         case 2: //[Главное меню] :: Редактировать книгу
  53.             List = EditBook(List);
  54.             break;
  55.         case 3: //[Главное меню] :: Удалить книгу
  56.             List = RemoveBook(List);
  57.             break;
  58.         case 4: //[Главное меню] :: Показать список книг
  59.             OutputBooks(List);
  60.             break;
  61.         case 5: //[Главное меню] :: Сохранить список книг
  62.             WriteFile("out.txt", List);
  63.             break;
  64.         case 6: //[Главное меню] :: Загрузить список книг
  65.             List = ReadFile("out.txt");
  66.             break;
  67.         case 7: //[Главное меню] :: Выход
  68.             whileRun = false;
  69.             break;
  70.         default:
  71.             break;
  72.         }
  73.     }
  74.     DeleteList(List);
  75.     return 0;
  76. }
  77.  
  78. Book* CreateBook() //Функция создания книги
  79. {
  80.     Book* newBook = new Book;
  81.     newBook->author = new char[7];
  82.     strcpy(newBook->author, "Author");
  83.     newBook->name = new char[5];
  84.     strcpy(newBook->name, "Name");
  85.     newBook->pages = 0;
  86.     newBook->price = 0;
  87.     newBook->prev = NULL;
  88.     newBook->next = NULL;
  89.     return newBook;
  90. }
  91.  
  92. int Write_int(bool zero) //Безопасный ввод числа
  93. {
  94.     char str[10];
  95.     int value = 0;
  96.     while(true)
  97.     {
  98.         scanf("%s", str);
  99.         value = atoi(str)? atoi(str) : 0;
  100.         if(zero)
  101.         {
  102.             if(str[0] == '0')
  103.                 value = 0;
  104.             if(value >= 0)
  105.                 break;
  106.             else
  107.                 printf("Введите значение |n| >= 0: ");
  108.         }
  109.         else
  110.         {
  111.             if(value > 0)
  112.                 break;
  113.             else
  114.                 printf("Введите значение |n| > 0: ");
  115.         }
  116.     }
  117.     return value;
  118. }
  119.  
  120. Book* AddBook(Book* List) //Функция добавления книги в список книг
  121. {
  122.     if(List != NULL)
  123.     {
  124.         Book* copyList = List;
  125.  
  126.         Book* newBook = BookEditor(NULL);
  127.         while(copyList->next != NULL)
  128.             copyList = copyList->next;
  129.  
  130.         copyList->next = newBook;
  131.         newBook->prev = copyList;
  132.     }
  133.     else
  134.         List = BookEditor(NULL);
  135.     printf("Книга успешно добавлена в список книг!\n");
  136.     printf("Нажмите любую клавишу для продолжения...\n");
  137.     _getch();
  138.     return List;
  139. }
  140.  
  141. Book* EditBook(Book* List) //Функция редактирования книги в списке книг
  142. {
  143.     system("cls");
  144.     printf("Введите индекс редактируемой книги: ");
  145.     UINT index = Write_int(true);
  146.     Book* editBook = FindBookOnIndex(List, index);
  147.     if(editBook != NULL)
  148.     {
  149.         BookEditor(editBook);
  150.         printf("Книга %d была успешно изменена!\n", index);
  151.     }
  152.     else
  153.     {
  154.         printf("Книга не найдена...\n");
  155.     }
  156.     printf("Нажмите любую клавишу для продолжения...\n");
  157.     _getch();
  158.     return List;
  159. }
  160.  
  161. Book* RemoveBook(Book* List) //Функция удаления книги из списка книг
  162. {
  163.     system("cls");
  164.     printf("Введите индекс удаляемой книги: ");
  165.     UINT index = Write_int(true);
  166.  
  167.     Book* deletedBook = FindBookOnIndex(List, index);
  168.     if(deletedBook == NULL)
  169.     {
  170.         printf("Книга не найдена...\n");
  171.     }
  172.     else
  173.     {
  174.         if(deletedBook->prev != NULL && deletedBook->next != NULL)
  175.         {
  176.             deletedBook->prev->next = deletedBook->next;
  177.             deletedBook->next->prev = deletedBook->prev;
  178.         }
  179.         else
  180.         {
  181.             if(deletedBook->prev != NULL)
  182.                 deletedBook->prev->next = NULL;
  183.             else
  184.                 if(deletedBook->next != NULL)
  185.                     deletedBook->next->prev = NULL;
  186.                 else
  187.                     List = NULL;
  188.         }
  189.         delete deletedBook;
  190.     }
  191.     printf("Нажмите любую клавишу для продолжения...\n");
  192.     _getch();
  193.     return List;
  194. }
  195.  
  196. int GetListSize(Book* List) //Возвращает длину списка
  197. {
  198.     Book* copyList = List;
  199.     int i = 0;
  200.     while(copyList != NULL)
  201.     {
  202.         copyList = copyList->next;
  203.         i++;
  204.     }
  205.     return i;
  206. }
  207.  
  208. Book* GetFirstElementList(Book* List) //Функция возвращает первый элемент списка
  209. {
  210.     Book* copyList = List;
  211.     while(copyList->prev != NULL)
  212.         copyList = copyList->prev;
  213.     return copyList;
  214. }
  215.  
  216. void DeleteList(Book* List) //Удаляет список книг
  217. {
  218.     while(List != NULL)
  219.     {
  220.         Book* tmp = List;
  221.         List = List->next;
  222.         delete tmp;
  223.     }
  224. }
  225.  
  226. char* strEdit(bool Number) //Редактор строки
  227. {
  228.     system("cls");
  229.  
  230.     HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
  231.     COORD pos;
  232.     pos.Y = 1;
  233.     pos.X = 0;
  234.     char* cloneStr = NULL;
  235.     char* str = NULL;
  236.     if(Number)
  237.         printf("Число:\n");
  238.     else
  239.         printf("Строка:\n");
  240.  
  241.     while(true)
  242.     {
  243.         int symbol = _getch();
  244.  
  245.         cloneStr = new char[pos.X + 1];
  246.         for (int i = 0; i < pos.X; i++)
  247.             if (str[i] != '\0')
  248.                 cloneStr[i] = str[i];
  249.         str = new char[pos.X + 1];
  250.         for (int i = 0; i < pos.X; i++)
  251.             str[i] = cloneStr[i];
  252.         delete[] cloneStr;
  253.  
  254.         if (symbol >= 97 && symbol <= 122 && !Number && pos.X < 50)
  255.         {
  256.             str[pos.X] = symbol;
  257.             printf("%c", str[pos.X]);
  258.             pos.X++;
  259.         }
  260.  
  261.         if(symbol == 32 && !Number && pos.X < 50)
  262.         {
  263.             str[pos.X] = ' ';
  264.             printf("%c", ' ');
  265.             pos.X++;
  266.         }
  267.  
  268.         if(symbol >= 48 && symbol <= 58 && pos.X < 50 && Number)
  269.         {
  270.             str[pos.X] = symbol;
  271.             printf("%c", str[pos.X]);
  272.             pos.X++;
  273.         }
  274.  
  275.         if (symbol == 8 && pos.X > 0)
  276.         {
  277.             str[pos.X] = ' ';
  278.             pos.X--;
  279.             SetConsoleCursorPosition(hConsole, pos);
  280.             printf("%s", " ");
  281.         }
  282.  
  283.         SetConsoleCursorPosition(hConsole, pos);
  284.         if (symbol == 13)
  285.         {
  286.             str[pos.X] = '\0';
  287.             break;
  288.         }
  289.     }
  290.     delete[] cloneStr;
  291.     return str;
  292. }
  293.  
  294. Book* BookEditor(Book* book)
  295. {
  296.     if(book == NULL)
  297.         book = CreateBook();
  298.     bool RUN = true;
  299.     while(RUN)
  300.     {
  301.         system("cls");
  302.         printf("[Редактор книг]\n1.Автор\n2.Название\n3.Кол. стр.\n4.Цена\n5.Сохранить\n6.Стандартная книга.\nВыбор: ");
  303.         int intt = Write_int();
  304.         switch(intt)
  305.         {
  306.             case 1:
  307.                 book->author = strEdit();
  308.                 break;
  309.             case 2:
  310.                 book->name = strEdit();
  311.                 break;
  312.             case 3:
  313.                 book->pages = atoi(strEdit(true));
  314.                 break;
  315.             case 4:
  316.                 book->price = atoi(strEdit(true));
  317.                 break;
  318.             case 5:
  319.                 RUN = false;
  320.                 break;
  321.             case 6:
  322.                 if(book != NULL)
  323.                     delete book;
  324.                 book = CreateBook();
  325.                 RUN = false;
  326.                 break;
  327.             default:
  328.                 break;
  329.         }
  330.     }
  331.     return book;
  332. }
  333.  
  334. Book* FindBookOnIndex(Book* List, UINT index) //Функция поиска книги по индексу. Возвращает NULL если не нашёл;
  335. {
  336.     Book* copyList = List;
  337.     UINT i = 0;
  338.     while(copyList != NULL && i != index)
  339.     {
  340.         copyList = copyList->next;
  341.         i++;
  342.     }
  343.     return copyList;
  344. }
  345.  
  346. void OutputBooks(Book* List) //Вывод списка книг
  347. {
  348.     if(List == NULL)
  349.     {
  350.         system("cls");
  351.         printf("Список пуст, заполните список хотя-бы одним элементом!\nНажмите любую клавишу для продолжения...\n");
  352.         _getch();
  353.         return;
  354.     }
  355.     UINT Size = GetListSize(List);
  356.     Book* copyList = List;
  357.  
  358.     Book** Array = new Book*[Size];
  359.     int* index = new int[Size];
  360.     for(UINT i = 0; i < Size; i++)
  361.     {
  362.         index[i] = i;
  363.         Array[i] = copyList;
  364.         if(copyList->next != NULL)
  365.             copyList = copyList->next;
  366.     }
  367.     int temp = 0; //Временная переменная, чтобы менять индексы местами
  368.     bool RUN = true, output = false;
  369.     while(RUN)
  370.     {
  371.         system("cls");
  372.         printf("[Вывод списка книг]\n1.По индексу\n2.По автору\n3.По названию\n4.По кол. стр.\n5.По цене\n6.Рекомендация\n7.Назад\nВыбор: ");
  373.         switch(Write_int())
  374.         {
  375.             case 1:
  376.                 RUN = false;
  377.                 output = true;
  378.                 break;
  379.             case 2: //Сортировка по автору
  380.                 for (UINT i = 0; i < Size - 1; i++)
  381.                     for (UINT j = 0; j < Size - i - 1; j++)
  382.                         if (strcmp(Array[index[j]]->author, Array[index[j + 1]]->author)> 0)
  383.                         {
  384.                             temp = index[j];
  385.                             index[j] = index[j + 1];
  386.                             index[j + 1] = temp;
  387.                         }
  388.                 RUN = false;
  389.                 output = true;
  390.                 break;
  391.             case 3: //Сортировка по названию
  392.                 for (UINT i = 0; i < Size - 1; i++)
  393.                     for (UINT j = 0; j < Size - i - 1; j++)
  394.                         if (strcmp(Array[index[j]]->name, Array[index[j + 1]]->name)> 0)
  395.                         {
  396.                             temp = index[j];
  397.                             index[j] = index[j + 1];
  398.                             index[j + 1] = temp;
  399.                         }
  400.                 RUN = false;
  401.                 output = true;
  402.                 break;
  403.             case 4: //Сортировка по количеству страниц
  404.                 for (UINT i = 0; i < Size - 1; i++)
  405.                     for (UINT j = 0; j < Size - i - 1; j++)
  406.                         if (Array[index[j]]->pages > Array[index[j + 1]]->pages)
  407.                         {
  408.                             temp = index[j];
  409.                             index[j] = index[j + 1];
  410.                             index[j + 1] = temp;
  411.                         }
  412.                 RUN = false;
  413.                 output = true;
  414.                 break;
  415.             case 5: //Сортировка по цене
  416.                 for (UINT i = 0; i < Size - 1; i++)
  417.                     for (UINT j = 0; j < Size - i - 1; j++)
  418.                         if (Array[index[j]]->price > Array[index[j + 1]]->price)
  419.                         {
  420.                             temp = index[j];
  421.                             index[j] = index[j + 1];
  422.                             index[j + 1] = temp;
  423.                         }
  424.                 RUN = false;
  425.                 output = true;
  426.                 break;
  427.             case 6:
  428.                 printf("[Вывод списка/Рекомендация]\n");
  429.                 for(UINT i = 0; i < Size; i++)
  430.                     if(Array[i]->pages <= 100)
  431.                         printf("[%d] %s %s %d %d\n", index[i], Array[index[i]]->author,
  432.                             Array[index[i]]->name, Array[index[i]]->pages, Array[index[i]]->price);
  433.                 RUN = false;
  434.                 break;
  435.             case 7:
  436.                 RUN = false;
  437.                 break;
  438.             default:
  439.                 break;
  440.         }
  441.         if(output)
  442.         {
  443.             system("cls");
  444.             printf("[Вывод списка/По индексу]\n");
  445.             for (UINT i = 0; i < Size; i++)
  446.                 printf("[%d] %s %s %d %d\n", index[i], Array[index[i]]->author,
  447.                        Array[index[i]]->name, Array[index[i]]->pages, Array[index[i]]->price);
  448.         }
  449.     delete[] index;
  450.     delete[] Array;
  451.     }
  452.     printf("Для продолжения нажмите любую клавишу...\n");
  453.     _getch();
  454. }
  455.  
  456. char* myStrCpy(char* str, int &start, char symbol_stop) //Строка которую читаем, позиция с которой необходимо считать, символ на котором чтение будет закончено
  457. {
  458.     char* buffer = NULL;
  459.     int bufferSize = 0;
  460.     while(str[start + bufferSize] != symbol_stop)
  461.     {
  462.         bufferSize++;
  463.     }
  464.     buffer = new char[bufferSize + 1];
  465.     for(int currentCursor = 0; currentCursor < bufferSize; currentCursor++)
  466.         buffer[currentCursor] = str[start + currentCursor];
  467.     buffer[bufferSize] = '\0';
  468.     start += bufferSize + 1;
  469.     return buffer;
  470. }
  471.  
  472. Book* ReadFile(const char* fileName) //Функция считывает структуры из файла в бинарном виде
  473. {
  474.     FILE* f = fopen(fileName, "rb");
  475.     Book* List = NULL;
  476.     if(f == NULL)
  477.         printf("Ошибка открытия файла!\n");
  478.     else
  479.     {
  480.         fseek(f, 0, SEEK_END);
  481.         long lSize = ftell(f);
  482.  
  483.         char* buffer = new char[lSize + 1];
  484.         int ListSize = 0;
  485.  
  486.         rewind(f);
  487.         if(fread(buffer, 1, lSize, f))
  488.         {
  489.             buffer[lSize] = '\0';
  490.             for(int i = 0; i < lSize; i++)
  491.                 if(buffer[i] == '\n')
  492.                     ListSize++;
  493.             int start = 0;
  494.             for(int i = 0; i < ListSize; i++)
  495.             {
  496.                 Book* newBook = new Book;
  497.  
  498.                 char* temp = myStrCpy(buffer, start, ',');
  499.                 newBook->author = new char[strlen(temp)];
  500.                 strcpy(newBook->author, temp);
  501.                 delete[] temp;
  502.  
  503.                 temp = myStrCpy(buffer, start, ',');
  504.                 newBook->name = new char[strlen(temp)];
  505.                 strcpy(newBook->name, temp);
  506.                 delete[] temp;
  507.  
  508.                 temp = myStrCpy(buffer, start, ',');
  509.                 newBook->pages = atoi(temp);
  510.                 delete[] temp;
  511.  
  512.                 temp = myStrCpy(buffer, start, '\n');
  513.                 newBook->price = atoi(temp);
  514.                 delete[] temp;
  515.                 if(List != NULL)
  516.                 {
  517.                     List->next = newBook;
  518.                     newBook->prev = List;
  519.                     newBook->next = NULL;
  520.                     List = List->next;
  521.                 }
  522.                 else
  523.                 {
  524.                     List = newBook;
  525.                     List->next = NULL;
  526.                     List->prev = NULL;
  527.                 }
  528.             }
  529.         }
  530.     }
  531.     if(f != NULL)
  532.         fclose(f);
  533.     List = GetFirstElementList(List);
  534.     printf("Из файла было считано %d книг и сохранены в список.\n", GetListSize(List));
  535.     printf("Для продолжения нажмите любую клавишу...\n");
  536.     _getch();
  537.     return List;
  538. }
  539. void WriteFile(const char* fileName, Book* List) //Функция записывает структуры в файл в бинарном виде
  540. {
  541.     if(List == NULL)
  542.         printf("Список пуст, нечего записывать в файл!\n");
  543.     else
  544.     {
  545.         FILE* f = fopen(fileName, "wb");
  546.         if(f == NULL)
  547.         {
  548.             printf("Ошибка открытия файла!\n");
  549.         }
  550.         else
  551.         {
  552.             rewind(f);
  553.             Book* copyList = List;
  554.             for(int i = 0; i < GetListSize(List); i++)
  555.             {
  556.                 char string[10] = "";
  557.  
  558.                 fwrite(copyList->author, sizeof(char) * strlen(copyList->author), sizeof(char), f);
  559.                 printf("|%s|", copyList->author);
  560.                 fwrite(",", 1, 1, f);
  561.                 fwrite(copyList->name, sizeof(char) * strlen(copyList->name), sizeof(char), f);
  562.                 fwrite(",", 1, 1, f);
  563.                 itoa(copyList->pages, string, 10);
  564.                 fwrite(string, sizeof(char) * strlen(string), sizeof(char), f);
  565.                 fwrite(",", 1, 1, f);
  566.                 itoa(copyList->price, string, 10);
  567.                 fwrite(string, sizeof(char) * strlen(string), sizeof(char), f);
  568.                 fwrite("\n", 1, 1, f);
  569.                 copyList = copyList->next;
  570.             }
  571.         }
  572.         if(f != NULL)
  573.             fclose(f);
  574.     }
  575.     system("cls");
  576.     printf("[Сохранить список книг]\nБыло сохранено %d книг в файл.\n", GetListSize(List));
  577.     printf("Для продолжения нажмите любую клавишу...\n");
  578.     _getch();
  579. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement