Advertisement
Usow_Maxim

Lab_10.8

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