Advertisement
Guest User

Untitled

a guest
Apr 9th, 2020
215
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 9.18 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <Windows.h>
  3. #define BDFILE_NAME "studients.bd"
  4. #define DEL_N(str) if (str[strlen(str) - 1] == '\n') str[strlen(str) - 1] = '\0';
  5.  
  6. struct Class
  7. {
  8.     int ratsCount;
  9.     char name[100];
  10.     unsigned int rats[60];
  11. };
  12.  
  13. struct Student
  14. {
  15.     unsigned int groupNum;
  16.     unsigned int middleRat;
  17.     unsigned int classesCount;
  18.     char Name[100];
  19.     Class classes[30];
  20. };
  21.  
  22. /*bool CheckStr(const char* str1, const char* str2)
  23. {
  24.     int len = (strlen(str1) > strlen(str2) ? strlen(str2) : strlen(str1));
  25.  
  26.     for (int i = 0; i < len; i++)                                           //Убрана из-за нерентабельности. При больших объемах данных может крутится хоть сутки.
  27.     {                                                                       //Все дело в том, что если при проверке тебе придется прокрутить цикл примерно 450 раз
  28.         if (str1[i] > str2[i])                                              //и выполнить одну доп. проверку, то при использовании этой функции придется крутиться
  29.             return true;                                                    //минимум 270 0000 раз. Это при условии мин. длины фамилий. А если взять длинную
  30.     }                                                                       //допустим Хусейналибабабекович, то его умноженная 270к и кол-во прокруток превысит потолок.
  31.                                                                             //Есть способы обхода, но они идут вразрез с данным шейкерским алгоритмом сортировки. Увы.
  32.     return false;
  33. }*/
  34.  
  35. void SortBD()
  36. {
  37.     int sel = 3;
  38.  
  39.     while (true)
  40.     {
  41.         system("cls");
  42.         printf("Выберите метод сортировки:\n1 - Стандартная сортировка по номерам групп и фамилиям\n2 - Сортировка по средней оценке\n0 - Отмена\n");
  43.         scanf("%d", &sel);
  44.  
  45.         if (sel == 0)
  46.             return;
  47.         else if (sel == 1)
  48.             break;
  49.         else if (sel == 2)
  50.             break;
  51.     }
  52.    
  53.     HANDLE hFile = CreateFile(TEXT(BDFILE_NAME), GENERIC_READ | GENERIC_WRITE, FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
  54.  
  55.     if (hFile == INVALID_HANDLE_VALUE)
  56.     {
  57.         printf("Ошибка открытия файла базы\n");
  58.         system("pause");
  59.         return;
  60.     }
  61.  
  62.     DWORD dwFileSize = GetFileSize(hFile, NULL);
  63.  
  64.     if (dwFileSize < sizeof(Student))
  65.     {
  66.         printf("Файл не содержит данных\n");
  67.         system("pause");
  68.     }
  69.     else
  70.     {
  71.         Student* studentTemp = new Student;
  72.         Student* studentOne;
  73.         Student* studentTwo;
  74.  
  75.         HANDLE hMap = CreateFileMapping(hFile, NULL, PAGE_READWRITE, 0, 0, NULL);
  76.         LPVOID lpMapFile = MapViewOfFile(hMap, FILE_MAP_ALL_ACCESS, 0, 0, 0);
  77.  
  78.         bool emptyFlag = false;
  79.         DWORD dwI = 0;
  80.  
  81.         while (!emptyFlag)
  82.         {
  83.             emptyFlag = true;
  84.  
  85.             for (dwI = 0; dwI < dwFileSize - sizeof(Student); dwI += sizeof(Student))
  86.             {
  87.                 studentOne = reinterpret_cast<Student*>(reinterpret_cast<DWORD>(lpMapFile) + dwI);
  88.                 studentTwo = reinterpret_cast<Student*>(reinterpret_cast<DWORD>(lpMapFile) + dwI + sizeof(Student));
  89.  
  90.                 bool rez = false;
  91.                 if (sel == 1)
  92.                     rez = studentTwo->groupNum < studentOne->groupNum;
  93.                 else
  94.                     rez = studentTwo->middleRat > studentOne->middleRat;
  95.  
  96.                 if (rez)
  97.                 {
  98.                     DWORD dwWritten;
  99.                     WriteProcessMemory(GetCurrentProcess(), studentTemp, studentTwo, sizeof(Student), &dwWritten);
  100.                     WriteProcessMemory(GetCurrentProcess(), studentTwo, studentOne, sizeof(Student), &dwWritten);
  101.                     WriteProcessMemory(GetCurrentProcess(), studentOne, studentTemp, sizeof(Student), &dwWritten);
  102.                     emptyFlag = false;
  103.                 }
  104.                 else if (sel == 1 && studentTwo->groupNum == studentOne->groupNum)
  105.                 {
  106.                     //if (CheckStr(studentOne->Name, studentTwo->Name)) //Проверка по алфавиту каждой буквы
  107.                     if (studentTwo->Name[0] < studentOne->Name[0]) //Проверка только по первой
  108.                     {
  109.                         DWORD dwWritten;
  110.                         WriteProcessMemory(GetCurrentProcess(), studentTemp, studentTwo, sizeof(Student), &dwWritten);
  111.                         WriteProcessMemory(GetCurrentProcess(), studentTwo, studentOne, sizeof(Student), &dwWritten);
  112.                         WriteProcessMemory(GetCurrentProcess(), studentOne, studentTemp, sizeof(Student), &dwWritten);
  113.                         emptyFlag = false;
  114.                     }
  115.                 }
  116.             }
  117.  
  118.             for (dwI = dwFileSize; dwI > 0; dwI -= sizeof(Student))
  119.             {
  120.                 studentOne = reinterpret_cast<Student*>(reinterpret_cast<DWORD>(lpMapFile) + dwI);
  121.                 studentTwo = reinterpret_cast<Student*>(reinterpret_cast<DWORD>(lpMapFile) + dwI - sizeof(Student));
  122.  
  123.                 bool rez = false;
  124.                 if (sel == 1)
  125.                     rez = studentTwo->groupNum > studentOne->groupNum;
  126.                 else
  127.                     rez = studentTwo->middleRat < studentOne->middleRat;
  128.  
  129.                 if (rez)
  130.                 {
  131.                     DWORD dwWritten;
  132.                     WriteProcessMemory(GetCurrentProcess(), studentTemp, studentTwo, sizeof(Student), &dwWritten);
  133.                     WriteProcessMemory(GetCurrentProcess(), studentTwo, studentOne, sizeof(Student), &dwWritten);
  134.                     WriteProcessMemory(GetCurrentProcess(), studentOne, studentTemp, sizeof(Student), &dwWritten);
  135.                     emptyFlag = false;
  136.                 }
  137.                 else if (sel == 1 && studentTwo->groupNum == studentOne->groupNum)
  138.                 {
  139.                     //if (CheckStr(studentTwo->Name, studentOne->Name)) //Проверка по алфавиту каждой буквы
  140.                     if (studentTwo->Name[0] > studentOne->Name[0]) //Проверка только первой буквы
  141.                     {
  142.                         DWORD dwWritten;
  143.                         WriteProcessMemory(GetCurrentProcess(), studentTemp, studentTwo, sizeof(Student), &dwWritten);
  144.                         WriteProcessMemory(GetCurrentProcess(), studentTwo, studentOne, sizeof(Student), &dwWritten);
  145.                         WriteProcessMemory(GetCurrentProcess(), studentOne, studentTemp, sizeof(Student), &dwWritten);
  146.                         emptyFlag = false;
  147.                     }
  148.                 }
  149.             }
  150.  
  151.             if (emptyFlag)
  152.                 break;
  153.         }
  154.  
  155.         UnmapViewOfFile(lpMapFile);
  156.         CloseHandle(hMap);
  157.  
  158.         delete studentTemp;
  159.  
  160.         studentTemp = nullptr;
  161.         studentOne = nullptr;
  162.         studentTwo = nullptr;
  163.     }
  164.  
  165.     CloseHandle(hFile);
  166.  
  167.     system("cls");
  168.     printf("Сортировка завершена успешно!\n");
  169.     system("pause");
  170. }
  171.  
  172. void AddStud()
  173. {
  174.     FILE* file = fopen(BDFILE_NAME, "r+b");
  175.     if (file == NULL)
  176.     {
  177.         file = fopen(BDFILE_NAME, "wb");
  178.         if (file == NULL)
  179.         {
  180.             printf("Ошибка при чтении/создании файла базы.\n");
  181.             system("pause");
  182.             return;
  183.         }
  184.     }
  185.  
  186.     system("cls");
  187.  
  188.     Student student;
  189.     char buff[255] = { 0 };
  190.  
  191.     printf("Введите номер группы: ");
  192.     scanf("%d", &student.groupNum);
  193.     fgets(buff, 255, stdin);
  194.  
  195.     printf("Введите имя и инициалы студента: ");
  196.     fgets(student.Name, 100, stdin);
  197.     DEL_N(student.Name);
  198.  
  199.     printf("Введите кол-во предметов студента: ");
  200.     scanf("%d", &student.classesCount);
  201.     fgets(buff, 255, stdin);
  202.  
  203.     for (int i = 0; i < student.classesCount; i++)
  204.     {
  205.         int middle = 0;
  206.  
  207.         printf("Введите название предмета #%d: ", i + 1);
  208.         fgets(student.classes[i].name, 100, stdin);
  209.         DEL_N(student.classes[i].name);
  210.  
  211.         printf("Количество оценок у данного студента: ");
  212.         scanf("%d", &student.classes[i].ratsCount);
  213.         fgets(buff, 255, stdin);
  214.  
  215.         for (int j = 0; j < student.classes[i].ratsCount; j++)
  216.         {
  217.             printf("Введите оценку #%d: ", j);
  218.             scanf("%d", &student.classes[i].rats[j]);
  219.             fgets(buff, 255, stdin);
  220.  
  221.             middle += student.classes[i].rats[j];
  222.         }
  223.  
  224.         student.middleRat = middle / student.classes[i].ratsCount;
  225.     }
  226.  
  227.     fseek(file, 0, SEEK_END);
  228.  
  229.     fwrite(&student, sizeof(Student), 1, file);
  230.  
  231.     fclose(file);
  232. }
  233.  
  234. void ShowInfo()
  235. {
  236.     FILE* file = fopen(BDFILE_NAME, "rb");
  237.     if (file == NULL)
  238.     {
  239.         printf("Ошибка при открытии файла базы.\n");
  240.         system("pause");
  241.         return;
  242.     }
  243.  
  244.     system("cls");
  245.  
  246.     Student* student;
  247.  
  248.     fseek(file, 0, SEEK_END);
  249.     int filesize = ftell(file);
  250.     fseek(file, 0, SEEK_SET);
  251.  
  252.     int i;
  253.     for (i = 0; i < filesize; i += sizeof(Student))
  254.     {
  255.         student = new Student;
  256.         ZeroMemory(student, sizeof(Student));
  257.  
  258.         fread(student, sizeof(Student), 1, file);
  259.  
  260.         printf("-----\nИмя студента %s\nГруппа: %d\nСредняя оценка: %d\nПредметы: \n", student->Name, student->groupNum, student->middleRat);
  261.         for (int j = 0; j < student->classesCount; j++)
  262.         {
  263.             printf("\n%s: ", student->classes[j].name);
  264.             for (int k = 0; k < student->classes[j].ratsCount; k++)
  265.                 printf("%d ", student->classes[j].rats[k]);
  266.         }
  267.         printf("\n\n");
  268.  
  269.         delete student;
  270.         student = nullptr;
  271.     }
  272.  
  273.     fclose(file);
  274.  
  275.     system("pause");
  276. }
  277.  
  278. int main()
  279. {
  280.     SetConsoleCP(1251);
  281.     SetConsoleOutputCP(1251);
  282.  
  283.     int sel = 3;
  284.  
  285.     while (true)
  286.     {
  287.         system("cls");
  288.         printf("Выберите действие: \n1 - Добавить информацию об ученике\n2 - Вывести список учеников\n3 - Выполнить сортировку списка студентов\n0 - Выход\n");
  289.         scanf("%d", &sel);
  290.  
  291.         if (sel == 0)
  292.             break;
  293.         else if (sel == 1)
  294.             AddStud();
  295.         else if (sel == 2)
  296.             ShowInfo();
  297.         else if (sel == 3)
  298.             SortBD();
  299.     }
  300.  
  301.     system("pause");
  302.     return 0;
  303. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement