Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <Windows.h>
- #define BDFILE_NAME "studients.bd"
- #define DEL_N(str) if (str[strlen(str) - 1] == '\n') str[strlen(str) - 1] = '\0';
- struct Class
- {
- int ratsCount;
- char name[100];
- unsigned int rats[60];
- };
- struct Student
- {
- unsigned int groupNum;
- unsigned int middleRat;
- unsigned int classesCount;
- char Name[100];
- Class classes[30];
- };
- /*bool CheckStr(const char* str1, const char* str2)
- {
- int len = (strlen(str1) > strlen(str2) ? strlen(str2) : strlen(str1));
- for (int i = 0; i < len; i++) //Убрана из-за нерентабельности. При больших объемах данных может крутится хоть сутки.
- { //Все дело в том, что если при проверке тебе придется прокрутить цикл примерно 450 раз
- if (str1[i] > str2[i]) //и выполнить одну доп. проверку, то при использовании этой функции придется крутиться
- return true; //минимум 270 0000 раз. Это при условии мин. длины фамилий. А если взять длинную
- } //допустим Хусейналибабабекович, то его умноженная 270к и кол-во прокруток превысит потолок.
- //Есть способы обхода, но они идут вразрез с данным шейкерским алгоритмом сортировки. Увы.
- return false;
- }*/
- void SortBD()
- {
- int sel = 3;
- while (true)
- {
- system("cls");
- printf("Выберите метод сортировки:\n1 - Стандартная сортировка по номерам групп и фамилиям\n2 - Сортировка по средней оценке\n0 - Отмена\n");
- scanf("%d", &sel);
- if (sel == 0)
- return;
- else if (sel == 1)
- break;
- else if (sel == 2)
- break;
- }
- HANDLE hFile = CreateFile(TEXT(BDFILE_NAME), GENERIC_READ | GENERIC_WRITE, FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
- if (hFile == INVALID_HANDLE_VALUE)
- {
- printf("Ошибка открытия файла базы\n");
- system("pause");
- return;
- }
- DWORD dwFileSize = GetFileSize(hFile, NULL);
- if (dwFileSize < sizeof(Student))
- {
- printf("Файл не содержит данных\n");
- system("pause");
- }
- else
- {
- Student* studentTemp = new Student;
- Student* studentOne;
- Student* studentTwo;
- HANDLE hMap = CreateFileMapping(hFile, NULL, PAGE_READWRITE, 0, 0, NULL);
- LPVOID lpMapFile = MapViewOfFile(hMap, FILE_MAP_ALL_ACCESS, 0, 0, 0);
- bool emptyFlag = false;
- DWORD dwI = 0;
- while (!emptyFlag)
- {
- emptyFlag = true;
- for (dwI = 0; dwI < dwFileSize - sizeof(Student); dwI += sizeof(Student))
- {
- studentOne = reinterpret_cast<Student*>(reinterpret_cast<DWORD>(lpMapFile) + dwI);
- studentTwo = reinterpret_cast<Student*>(reinterpret_cast<DWORD>(lpMapFile) + dwI + sizeof(Student));
- bool rez = false;
- if (sel == 1)
- rez = studentTwo->groupNum < studentOne->groupNum;
- else
- rez = studentTwo->middleRat > studentOne->middleRat;
- if (rez)
- {
- DWORD dwWritten;
- WriteProcessMemory(GetCurrentProcess(), studentTemp, studentTwo, sizeof(Student), &dwWritten);
- WriteProcessMemory(GetCurrentProcess(), studentTwo, studentOne, sizeof(Student), &dwWritten);
- WriteProcessMemory(GetCurrentProcess(), studentOne, studentTemp, sizeof(Student), &dwWritten);
- emptyFlag = false;
- }
- else if (sel == 1 && studentTwo->groupNum == studentOne->groupNum)
- {
- //if (CheckStr(studentOne->Name, studentTwo->Name)) //Проверка по алфавиту каждой буквы
- if (studentTwo->Name[0] < studentOne->Name[0]) //Проверка только по первой
- {
- DWORD dwWritten;
- WriteProcessMemory(GetCurrentProcess(), studentTemp, studentTwo, sizeof(Student), &dwWritten);
- WriteProcessMemory(GetCurrentProcess(), studentTwo, studentOne, sizeof(Student), &dwWritten);
- WriteProcessMemory(GetCurrentProcess(), studentOne, studentTemp, sizeof(Student), &dwWritten);
- emptyFlag = false;
- }
- }
- }
- for (dwI = dwFileSize; dwI > 0; dwI -= sizeof(Student))
- {
- studentOne = reinterpret_cast<Student*>(reinterpret_cast<DWORD>(lpMapFile) + dwI);
- studentTwo = reinterpret_cast<Student*>(reinterpret_cast<DWORD>(lpMapFile) + dwI - sizeof(Student));
- bool rez = false;
- if (sel == 1)
- rez = studentTwo->groupNum > studentOne->groupNum;
- else
- rez = studentTwo->middleRat < studentOne->middleRat;
- if (rez)
- {
- DWORD dwWritten;
- WriteProcessMemory(GetCurrentProcess(), studentTemp, studentTwo, sizeof(Student), &dwWritten);
- WriteProcessMemory(GetCurrentProcess(), studentTwo, studentOne, sizeof(Student), &dwWritten);
- WriteProcessMemory(GetCurrentProcess(), studentOne, studentTemp, sizeof(Student), &dwWritten);
- emptyFlag = false;
- }
- else if (sel == 1 && studentTwo->groupNum == studentOne->groupNum)
- {
- //if (CheckStr(studentTwo->Name, studentOne->Name)) //Проверка по алфавиту каждой буквы
- if (studentTwo->Name[0] > studentOne->Name[0]) //Проверка только первой буквы
- {
- DWORD dwWritten;
- WriteProcessMemory(GetCurrentProcess(), studentTemp, studentTwo, sizeof(Student), &dwWritten);
- WriteProcessMemory(GetCurrentProcess(), studentTwo, studentOne, sizeof(Student), &dwWritten);
- WriteProcessMemory(GetCurrentProcess(), studentOne, studentTemp, sizeof(Student), &dwWritten);
- emptyFlag = false;
- }
- }
- }
- if (emptyFlag)
- break;
- }
- UnmapViewOfFile(lpMapFile);
- CloseHandle(hMap);
- delete studentTemp;
- studentTemp = nullptr;
- studentOne = nullptr;
- studentTwo = nullptr;
- }
- CloseHandle(hFile);
- system("cls");
- printf("Сортировка завершена успешно!\n");
- system("pause");
- }
- void AddStud()
- {
- FILE* file = fopen(BDFILE_NAME, "r+b");
- if (file == NULL)
- {
- file = fopen(BDFILE_NAME, "wb");
- if (file == NULL)
- {
- printf("Ошибка при чтении/создании файла базы.\n");
- system("pause");
- return;
- }
- }
- system("cls");
- Student student;
- char buff[255] = { 0 };
- printf("Введите номер группы: ");
- scanf("%d", &student.groupNum);
- fgets(buff, 255, stdin);
- printf("Введите имя и инициалы студента: ");
- fgets(student.Name, 100, stdin);
- DEL_N(student.Name);
- printf("Введите кол-во предметов студента: ");
- scanf("%d", &student.classesCount);
- fgets(buff, 255, stdin);
- for (int i = 0; i < student.classesCount; i++)
- {
- int middle = 0;
- printf("Введите название предмета #%d: ", i + 1);
- fgets(student.classes[i].name, 100, stdin);
- DEL_N(student.classes[i].name);
- printf("Количество оценок у данного студента: ");
- scanf("%d", &student.classes[i].ratsCount);
- fgets(buff, 255, stdin);
- for (int j = 0; j < student.classes[i].ratsCount; j++)
- {
- printf("Введите оценку #%d: ", j);
- scanf("%d", &student.classes[i].rats[j]);
- fgets(buff, 255, stdin);
- middle += student.classes[i].rats[j];
- }
- student.middleRat = middle / student.classes[i].ratsCount;
- }
- fseek(file, 0, SEEK_END);
- fwrite(&student, sizeof(Student), 1, file);
- fclose(file);
- }
- void ShowInfo()
- {
- FILE* file = fopen(BDFILE_NAME, "rb");
- if (file == NULL)
- {
- printf("Ошибка при открытии файла базы.\n");
- system("pause");
- return;
- }
- system("cls");
- Student* student;
- fseek(file, 0, SEEK_END);
- int filesize = ftell(file);
- fseek(file, 0, SEEK_SET);
- int i;
- for (i = 0; i < filesize; i += sizeof(Student))
- {
- student = new Student;
- ZeroMemory(student, sizeof(Student));
- fread(student, sizeof(Student), 1, file);
- printf("-----\nИмя студента %s\nГруппа: %d\nСредняя оценка: %d\nПредметы: \n", student->Name, student->groupNum, student->middleRat);
- for (int j = 0; j < student->classesCount; j++)
- {
- printf("\n%s: ", student->classes[j].name);
- for (int k = 0; k < student->classes[j].ratsCount; k++)
- printf("%d ", student->classes[j].rats[k]);
- }
- printf("\n\n");
- delete student;
- student = nullptr;
- }
- fclose(file);
- system("pause");
- }
- int main()
- {
- SetConsoleCP(1251);
- SetConsoleOutputCP(1251);
- int sel = 3;
- while (true)
- {
- system("cls");
- printf("Выберите действие: \n1 - Добавить информацию об ученике\n2 - Вывести список учеников\n3 - Выполнить сортировку списка студентов\n0 - Выход\n");
- scanf("%d", &sel);
- if (sel == 0)
- break;
- else if (sel == 1)
- AddStud();
- else if (sel == 2)
- ShowInfo();
- else if (sel == 3)
- SortBD();
- }
- system("pause");
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement