Advertisement
Usow_Maxim

Lab_12.11

Jun 8th, 2018
78
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 11.08 KB | None | 0 0
  1. #include <windows.h>
  2. #include <stdio.h>
  3.  
  4. struct sessiya
  5. {
  6.     char name[20];
  7.     char surname[20];
  8.     char otch[20];
  9.     int ist;
  10.     int prog;
  11.     int matem;
  12.     int phis;
  13.     int srznach;
  14.     sessiya* next;
  15.     sessiya* prev;
  16. };
  17.  
  18. int SaveInt(bool one = false);
  19. sessiya* vvod(sessiya* List);
  20. sessiya* udalenie(sessiya* List);
  21. char* myStrCpy(char* str, int &start, char symbol_stop);
  22. int GetListSize(sessiya* List);
  23. sessiya* FindBookOnIndex(sessiya* List, UINT index);
  24. sessiya* ReadFile(const char* fileName);
  25. void WriteFile(const char* fileName, sessiya* List);
  26. sessiya* GetFirstElementList(sessiya* List);
  27.  
  28. int main()
  29. {
  30.     SetConsoleOutputCP(1251);
  31.     SetConsoleCP(1251);
  32.     int menu;
  33.     sessiya* List = NULL;
  34.     while (true)
  35.     {
  36.         printf("1.Ввод данных с клавиатуры\n2.Чтение данных из файла\n3.Удаление выбранного элемента массива\n4.Запись данных в файл\n5.Вывод данных\n6.Выход\nВаш выбор: ");
  37.         menu = SaveInt(true);
  38.         switch (menu)
  39.         {
  40.             case 1:
  41.                 List = vvod(List);
  42.                 break;
  43.             case 2:
  44.             {
  45.  
  46.                 List = ReadFile("sessiya.txt");
  47.                 break;
  48.             }
  49.             case 3:
  50.                 List = udalenie(List);
  51.                 break;
  52.             case 4:
  53.             {
  54.                 WriteFile("sessiya.txt", List);
  55.             }
  56.             case 5:
  57.             {
  58.                 sessiya* copyList = List;
  59.                 int index = 0;
  60.                 while(copyList != NULL)
  61.                 {
  62.                     if (copyList->srznach >= 4)
  63.                     {
  64.                         printf("_____________________\n%d-%s %s %s \nИстория: %d\nМатематика: %d\nПрограммирование: %d\nФизика: %d\nПолучает стипендию\n", index + 1, copyList->surname, copyList->name, copyList->otch, copyList->ist, copyList->matem, copyList->prog, copyList->phis);
  65.                     }
  66.                     else
  67.                     {
  68.                         printf("_____________________\n%d-%s %s %s \nИстория: %d\nМатематика: %d\nПрограммирование: %d\nФизика: %d\nНе получает стипендию\n", index + 1, copyList->surname, copyList->name, copyList->otch, copyList->ist, copyList->matem, copyList->prog, copyList->phis);
  69.                     }
  70.                     if(copyList->next != NULL)
  71.                         copyList = copyList->next;
  72.                     else
  73.                         copyList = NULL;
  74.                     index++;
  75.                 }
  76.             }
  77.                 break;
  78.             case 6:
  79.                 exit(1);
  80.             default:
  81.             break;
  82.         }
  83.     }
  84.     return 0;
  85. }
  86.  
  87. sessiya* ReadFile(const char* fileName) //Функция считывает структуры из файла в бинарном виде
  88. {
  89.     FILE* f = fopen(fileName, "rb");
  90.     sessiya* List = NULL;
  91.     if(f == NULL)
  92.         printf("Ошибка открытия файла!\n");
  93.     else
  94.     {
  95.         fseek(f, 0, SEEK_END);
  96.         long lSize = ftell(f);
  97.  
  98.         char* buffer = new char[lSize + 1];
  99.         int ListSize = 0;
  100.  
  101.         rewind(f);
  102.         if(fread(buffer, 1, lSize, f))
  103.         {
  104.             buffer[lSize] = '\0';
  105.             for(int i = 0; i < lSize; i++)
  106.                 if(buffer[i] == '\n')
  107.                     ListSize++;
  108.             int start = 0;
  109.             for(int i = 0; i < ListSize; i++)
  110.             {
  111.                 sessiya* newSessiya = new sessiya;
  112.  
  113.                 char* temp = myStrCpy(buffer, start, ',');
  114.                 strcpy(newSessiya->surname, temp);
  115.                 delete[] temp;
  116.  
  117.                 temp = myStrCpy(buffer, start, ',');
  118.                 strcpy(newSessiya->name, temp);
  119.                 delete[] temp;
  120.  
  121.                 temp = myStrCpy(buffer, start, ',');
  122.                 strcpy(newSessiya->otch, temp);
  123.                 delete[] temp;
  124.  
  125.                 temp = myStrCpy(buffer, start, ',');
  126.                 newSessiya->ist = atoi(temp);
  127.                 delete[] temp;
  128.  
  129.                 temp = myStrCpy(buffer, start, ',');
  130.                 newSessiya->matem = atoi(temp);
  131.                 delete[] temp;
  132.  
  133.                 temp = myStrCpy(buffer, start, ',');
  134.                 newSessiya->prog = atoi(temp);
  135.                 delete[] temp;
  136.  
  137.                 temp = myStrCpy(buffer, start, '\n');
  138.                 newSessiya->phis = atoi(temp);
  139.                 delete[] temp;
  140.                 if(List != NULL)
  141.                 {
  142.                     List->next = newSessiya;
  143.                     newSessiya->prev = List;
  144.                     newSessiya->next = NULL;
  145.                     List = List->next;
  146.                 }
  147.                 else
  148.                 {
  149.                     List = newSessiya;
  150.                     List->next = NULL;
  151.                     List->prev = NULL;
  152.                 }
  153.             }
  154.         }
  155.     }
  156.     if(f != NULL)
  157.         fclose(f);
  158.     List = GetFirstElementList(List);
  159.     printf("Из файла было считано %d Студентов и сохранены в список.\n", GetListSize(List));
  160.     return List;
  161. }
  162. void WriteFile(const char* fileName, sessiya* List) //Функция записывает структуры в файл в бинарном виде
  163. {
  164.     if(List == NULL)
  165.         printf("Список пуст, нечего записывать в файл!\n");
  166.     else
  167.     {
  168.         FILE* f = fopen(fileName, "wb");
  169.         if(f == NULL)
  170.         {
  171.             printf("Ошибка открытия файла!\n");
  172.         }
  173.         else
  174.         {
  175.             rewind(f);
  176.             sessiya* copyList = List;
  177.             for(int i = 0; i < GetListSize(List); i++)
  178.             {
  179.                 char string[10] = "";
  180.  
  181.                 fwrite(copyList->surname, sizeof(char) * strlen(copyList->surname), sizeof(char), f);
  182.                 fwrite(",", 1, 1, f);
  183.  
  184.                 fwrite(copyList->name, sizeof(char) * strlen(copyList->name), sizeof(char), f);
  185.                 fwrite(",", 1, 1, f);
  186.  
  187.                 fwrite(copyList->otch, sizeof(char) * strlen(copyList->otch), sizeof(char), f);
  188.                 fwrite(",", 1, 1, f);
  189.  
  190.                 itoa(copyList->ist, string, 10);
  191.                 fwrite(string, sizeof(char) * strlen(string), sizeof(char), f);
  192.                 fwrite(",", 1, 1, f);
  193.  
  194.                 itoa(copyList->matem, string, 10);
  195.                 fwrite(string, sizeof(char) * strlen(string), sizeof(char), f);
  196.                 fwrite(",", 1, 1, f);
  197.  
  198.                 itoa(copyList->prog, string, 10);
  199.                 fwrite(string, sizeof(char) * strlen(string), sizeof(char), f);
  200.                 fwrite(",", 1, 1, f);
  201.  
  202.                 itoa(copyList->phis, string, 10);
  203.                 fwrite(string, sizeof(char) * strlen(string), sizeof(char), f);
  204.                 fwrite("\n", 1, 1, f);
  205.  
  206.                 copyList = copyList->next;
  207.             }
  208.         }
  209.         if(f != NULL)
  210.             fclose(f);
  211.     }
  212.     printf("Было сохранено %d Студентов в файл.\n", GetListSize(List));
  213. }
  214.  
  215. sessiya* GetFirstElementList(sessiya* List) //Функция возвращает первый элемент списка
  216. {
  217.     sessiya* copyList = List;
  218.     while(copyList->prev != NULL)
  219.         copyList = copyList->prev;
  220.     return copyList;
  221. }
  222.  
  223. sessiya* FindBookOnIndex(sessiya* List, UINT index) //Функция поиска книги по индексу. Возвращает NULL если не нашёл;
  224. {
  225.     sessiya* copyList = List;
  226.     UINT i = 0;
  227.     while(copyList != NULL && i != index)
  228.     {
  229.         copyList = copyList->next;
  230.         i++;
  231.     }
  232.     return copyList;
  233. }
  234.  
  235. int GetListSize(sessiya* List) //Возвращает длину списка
  236. {
  237.     sessiya* copyList = List;
  238.     int i = 0;
  239.     while(copyList != NULL)
  240.     {
  241.         copyList = copyList->next;
  242.         i++;
  243.     }
  244.     return i;
  245. }
  246.  
  247. char* myStrCpy(char* str, int &start, char symbol_stop)
  248. {
  249.     char* buffer = NULL;
  250.     int bufferSize = 0;
  251.     while(str[start + bufferSize] != symbol_stop)
  252.     {
  253.         bufferSize++;
  254.     }
  255.     buffer = new char[bufferSize + 1];
  256.     for(int currentCursor = 0; currentCursor < bufferSize; currentCursor++)
  257.         buffer[currentCursor] = str[start + currentCursor];
  258.     buffer[bufferSize] = '\0';
  259.     start += bufferSize + 1;
  260.     return buffer;
  261. }
  262.  
  263. int SaveInt(bool one)
  264. {
  265.     char str[10];
  266.     while(true)
  267.     {
  268.         scanf("%s", str);
  269.         if(atoi(str))
  270.             break;
  271.         else
  272.             printf("Введите значение n > 0: ");
  273.     }
  274.     if(one)
  275.     {
  276.         char arr[10];
  277.         arr[0] = str[0];
  278.         return atoi(arr);
  279.     }
  280.     else
  281.         return atoi(str);
  282. }
  283.  
  284. sessiya* vvod(sessiya* List)
  285. {
  286.     sessiya* copyList = NULL;
  287.     if(List != NULL)
  288.     {
  289.         copyList = List;
  290.         while(copyList->next != NULL)
  291.             copyList = copyList->next;
  292.     }
  293.     sessiya* newSessiya = new sessiya;
  294.     printf("Введите фамилию: ");
  295.     scanf("%s", newSessiya->surname);
  296.     printf("Введите имя: ");
  297.     scanf("%s", newSessiya->name);
  298.     printf("Введите отчество: ");
  299.     scanf("%s", newSessiya->otch);
  300.     printf("Введите оценку по истории: ");
  301.     newSessiya->ist = SaveInt(true);
  302.     printf("Введите оценку по математике: ");
  303.     newSessiya->matem = SaveInt(true);
  304.     printf("Введите оценку по программированию: ");
  305.     newSessiya->prog = SaveInt(true);
  306.     printf("Введите оценку по физике: ");
  307.     newSessiya->phis = SaveInt(true);
  308.     newSessiya->srznach = ((newSessiya->matem + newSessiya->ist + newSessiya->phis + newSessiya->prog) / 4);
  309.     if(List != NULL)
  310.     {
  311.         copyList->next = newSessiya;
  312.         newSessiya->prev = copyList;
  313.         newSessiya->next = NULL;
  314.     }
  315.     else
  316.     {
  317.         List = newSessiya;
  318.         newSessiya->next = NULL;
  319.         newSessiya->prev = NULL;
  320.     }
  321.  
  322.     return List;
  323. }
  324.  
  325. sessiya* udalenie(sessiya* List)
  326. {
  327.     printf("Введите номер элемента массива для удаления: ");
  328.     int ud = SaveInt();
  329.     sessiya* deletedSessiya = FindBookOnIndex(List, ud - 1);
  330.     if(deletedSessiya == NULL)
  331.     {
  332.         printf("Элемент не найден...\n");
  333.     }
  334.     else
  335.     {
  336.         if(deletedSessiya->prev != NULL && deletedSessiya->next != NULL)
  337.         {
  338.             deletedSessiya->prev->next = deletedSessiya->next;
  339.             deletedSessiya->next->prev = deletedSessiya->prev;
  340.         }
  341.         else
  342.         {
  343.             if(deletedSessiya->prev != NULL)
  344.                 deletedSessiya->prev->next = NULL;
  345.             else
  346.                 if(deletedSessiya->next != NULL)
  347.                     deletedSessiya->next->prev = NULL;
  348.                 else
  349.                     List = NULL;
  350.         }
  351.         delete deletedSessiya;
  352.     }
  353.     return List;
  354. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement