Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <Windows.h>
- #include <io.h>
- using namespace std;
- const int m = 5; // Количество предметов
- const int n = 30; // Максимальное количество студентов в группе
- typedef struct {
- char fio[50];
- int group;
- float marks[m];
- } Student;
- int main();
- void data_entry();
- void stats();
- void sort_students(Student students[], int len) {
- Student temp;
- int min_indx;
- for (int i = 0; i < len; i++) {
- min_indx = i;
- for (int j = i + 1; j < len; j++) {
- if (strcmp(students[j].fio, students[min_indx].fio) < 0) {
- min_indx = j;
- }
- }
- temp = students[min_indx];
- students[min_indx] = students[i];
- students[i] = temp;
- }
- }
- int save_group(Student group[], int len) {
- FILE* output_file;
- fopen_s(&output_file, "students.bin", "wb");
- if (output_file) {
- fwrite(group, sizeof(Student), len, output_file);
- fclose(output_file);
- return 1;
- }
- else {
- return 0;
- }
- }
- int read_group(Student students[]) {
- FILE* input_file;
- fopen_s(&input_file, "students.bin", "rb");
- if (input_file) {
- int len = _filelength(_fileno(input_file)) / sizeof(Student);
- fread(students, sizeof(Student), len, input_file);
- fclose(input_file);
- return len;
- }
- else {
- return -1;
- }
- }
- void create_student() {
- system("cls");
- printf("[Создание нового студента]\n\n");
- int group_number;
- while (1) {
- printf("Введите номер группы для нового студента (0 - выйти): ");
- if (scanf_s("%d", &group_number) != 1) {
- while (getchar() != '\n');
- printf("Ошибка: введите корректное значение\n");
- continue;
- }
- else break;
- }
- if (group_number == 0) {
- system("cls");
- printf("[Ввод данных]\n\n1 - Добавить нового студента\n0 - Вернуться назад\n\n");
- return;
- }
- while (getchar() != '\n');
- FILE* input;
- fopen_s(&input, "students.bin", "rb");
- if (input) {
- int count = _filelength(_fileno(input)) / sizeof(Student);
- fclose(input);
- Student* group = new Student[count + 1];
- int len = read_group(group);
- if (len == -1) {
- printf("\nНе удалось прочитать данные о студентах. Нажмите Enter, чтобы продолжить.");
- while (getchar() != '\n');
- system("cls");
- printf("[Ввод данных]\n\n1 - Добавить нового студента\n0 - Вернуться назад\n\n");
- return;
- }
- group[len].group = group_number;
- system("cls");
- printf("Введите ФИО нового студента: ");
- gets_s(group[len].fio);
- printf("\n");
- for (int i = 0; i < m; i++) {
- printf("Введите оценку по предмету #%d: ", i + 1);
- while (scanf_s("%f", &group[len].marks[i]) != 1 or (group[len].marks[i] < 0 or group[len].marks[i] > 5)) {
- while (getchar() != '\n');
- printf("Введите оценку в формате числа от 0 до 5.\n");
- printf("Введите оценку по предмету #%d: ", i + 1);
- }
- }
- while (getchar() != '\n');
- if (save_group(group, len + 1)) printf("\nДанные сохранены. Нажмите Enter, чтобы продолжить.");
- else printf("\nНе удалось сохранить данные. Нажмите Enter, чтобы продолжить.");
- while (getchar() != '\n');
- system("cls");
- printf("[Ввод данных]\n\n1 - Добавить нового студента\n0 - Вернуться назад\n\n");
- }
- else {
- printf("\nНе удалось открыть файл с данными о студентах. Нажмите Enter, чтобы продолжить.");
- while (getchar() != '\n');
- system("cls");
- printf("[Ввод данных]\n\n1 - Добавить нового студента\n0 - Вернуться назад\n\n");
- }
- }
- void data_entry() {
- system("cls");
- printf("[Ввод данных]\n\n1 - Добавить нового студента\n0 - Вернуться назад\n\n");
- int inp;
- while (1) {
- printf("Выберите пункт меню: ");
- if (scanf_s("%d", &inp) != 1) {
- while (getchar() != '\n');
- printf("Ошибка: введите корректное значение\n");
- continue;
- }
- while (getchar() != '\n');
- if (inp == 1) create_student();
- else if (inp == 0) {
- system("cls");
- printf("[Главное меню]\n\n1 - Ввод данных\n2 - Статистика\n3 - Журнал\n4 - Сортировки\n0 - Выйти\n\n");
- break;
- }
- else {
- printf("Ошибка: такого пункта не существует\n");
- }
- }
- }
- void print_table(Student students[], int len, int group = -1) {
- int max_name_len = 0;
- for (int i = 0; i < len; i++) {
- if (strlen(students[i].fio) > max_name_len) max_name_len = strlen(students[i].fio);
- }
- char title[256];
- sprintf_s(title, "|%-*s|\0", max_name_len, "Имя");
- for (int i = 0; i < m; i++) {
- char x[25];
- sprintf_s(x, "Предмет #%d|", i + 1);
- strcat_s(title, sizeof(title), x);
- }
- strcat_s(title, sizeof(title), "Средний балл|");
- strcat_s(title, sizeof(title), "Группа|");
- printf("%s\n", title);
- char* underline = new char[2 + max_name_len + 11 * m + 7 + 13];
- for (int i = 0; i < 2 + max_name_len + 11 * m + 7 + 13; i++) underline[i] = '—';
- underline[2 + max_name_len + 11 * m + 7 + 13] = '\0';
- printf("%s\n", underline);
- for (int i = 0; i < len; i++) {
- if (group != -1 && students[i].group != group) continue;
- char str[256];
- sprintf_s(str, "|%-*s|\0", max_name_len, students[i].fio);
- for (int j = 0; j < m; j++) {
- char x[25];
- sprintf_s(x, "%10.2f|", students[i].marks[j]);
- strcat_s(str, sizeof(str), x);
- }
- int sum = 0; float average;
- for (int x = 0; x < m; x++) {
- sum += students[i].marks[x];
- }
- average = (float)sum / m;
- char x[25];
- sprintf_s(x, "%12.2f|", average);
- strcat_s(str, sizeof(str), x);
- sprintf_s(x, "%6d|", students[i].group);
- strcat_s(str, sizeof(str), x);
- printf("%s\n", str);
- }
- printf("%s\n", underline);
- }
- void journal() {
- system("cls");
- int group_number;
- while (1) {
- printf("Введите номер группы: ");
- if (scanf_s("%d", &group_number) != 1) {
- while (getchar() != '\n');
- printf("Ошибка: введите корректное значение\n");
- continue;
- }
- else break;
- }
- while (getchar() != '\n');
- FILE* group;
- fopen_s(&group, "students.bin", "rb");
- if (!group) {
- printf("\nНе удалось открыть файл со студентами. Нажмите Enter, чтобы продолжить.");
- }
- else {
- int count = _filelength(_fileno(group)) / sizeof(Student);
- fclose(group);
- Student* students = new Student[count];
- int students_number = read_group(students);
- sort_students(students, count);
- if (students_number != -1) {
- system("cls");
- print_table(students, students_number, group_number);
- printf("\nНажмите Enter, чтобы продолжить.");
- }
- else {
- printf("\nНе удалось прочитать данные о группе. Нажмите Enter, чтобы продолжить");
- }
- }
- while (getchar() != '\n');
- system("cls");
- printf("[Главное меню]\n\n1 - Ввод данных\n2 - Статистика\n3 - Журнал\n4 - Сортировки\n0 - Выйти\n\n");
- }
- void get_student(int mode) {
- char group_name[25];
- system("cls");
- int group_number;
- while (1) {
- printf("Введите номер группы: ");
- if (scanf_s("%d", &group_number) != 1) {
- while (getchar() != '\n');
- printf("Ошибка: введите корректное значение\n");
- continue;
- }
- else break;
- }
- while (getchar() != '\n');
- FILE* file;
- fopen_s(&file, "students.bin", "rb");
- if (file) {
- int count = _filelength(_fileno(file)) / sizeof(Student);
- Student* students = new Student[count];
- int len = read_group(students);
- if (len == -1) {
- printf("\nНе удалось прочитать данные о студентах. Нажмите Enter, чтобы продолжить.");
- while (getchar() != '\n');
- system("cls");
- printf("[Статистика]\n\n1 - Определить лучшего студента\n2 - Определить худшего студента\n3 - Определить среднестатистического стундента\n0 - Вернуться в меню\n\n");
- }
- else {
- int subject;
- printf("\nВведите номер предмета (1-%d): ", m);
- while (1) {
- scanf_s("%d", &subject);
- while (getchar() != '\n');
- if (subject < 1 or subject > m) {
- printf("Номер предмета должен быть от 1 до %d\n", m);
- printf("Введите номер предмета(1-%d): ", m);
- }
- else break;
- }
- if (mode == 1) {
- float max_mark = -1;
- int best = -1;
- for (int i = 0; i < len; i++) {
- if (students[i].group != group_number) continue;
- if (students[i].marks[subject - 1] > max_mark) {
- max_mark = students[i].marks[subject - 1];
- best = i;
- }
- }
- if (best == -1) {
- printf("В выбранной группе нет студентов.\n\nНажмите Enter, чтобы продолжить.");
- while (getchar() != '\n');
- system("cls");
- printf("[Статистика]\n\n1 - Определить лучшего студента\n2 - Определить худшего студента\n3 - Определить среднестатистического стундента\n0 - Вернуться в меню\n\n");
- return;
- }
- printf("\nЛучший студент по предмету #%d - %s. Его оценка - %.2f\n\nНажмите Enter, чтобы продолжить.", subject, students[best].fio, students[best].marks[subject - 1]);
- while (getchar() != '\n');
- system("cls");
- printf("[Статистика]\n\n1 - Определить лучшего студента\n2 - Определить худшего студента\n3 - Определить среднестатистического стундента\n0 - Вернуться в меню\n\n");
- }
- else if (mode == 2) {
- float min_mark = 6;
- int worst = -1;
- for (int i = 0; i < len; i++) {
- if (students[i].group != group_number) continue;
- if (students[i].marks[subject - 1] < min_mark) {
- min_mark = students[i].marks[subject - 1];
- worst = i;
- }
- }
- if (worst == -1) {
- printf("В выбранной группе нет студентов.\n\nНажмите Enter, чтобы продолжить.");
- while (getchar() != '\n');
- system("cls");
- printf("[Статистика]\n\n1 - Определить лучшего студента\n2 - Определить худшего студента\n3 - Определить среднестатистического стундента\n0 - Вернуться в меню\n\n");
- return;
- }
- printf("\nХудший студент по предмету #%d - %s. Его оценка - %.2f\n\nНажмите Enter, чтобы продолжить.", subject, students[worst].fio, students[worst].marks[subject - 1]);
- while (getchar() != '\n');
- system("cls");
- printf("[Статистика]\n\n1 - Определить лучшего студента\n2 - Определить худшего студента\n3 - Определить среднестатистического стундента\n0 - Вернуться в меню\n\n");
- }
- else if (mode == 3) {
- float sum = 0, average;
- for (int i = 0; i < len; i++) sum += students[i].marks[subject - 1];
- average = sum / len;
- int closest = -1;
- float diff = 6;
- for (int i = 0; i < len; i++) {
- if (students[i].group != group_number) continue;
- if (abs(average - students[i].marks[subject - 1]) < diff) {
- diff = abs(average - students[i].marks[subject - 1]);
- closest = i;
- }
- }
- if (closest == -1) {
- printf("В выбранной группе нет студентов.\n\nНажмите Enter, чтобы продолжить.");
- while (getchar() != '\n');
- system("cls");
- printf("[Статистика]\n\n1 - Определить лучшего студента\n2 - Определить худшего студента\n3 - Определить среднестатистического стундента\n0 - Вернуться в меню\n\n");
- return;
- }
- printf("\nСреднестатистиеский студент по предмету #%d - %s. Его оценка - %.2f\n\nНажмите Enter, чтобы продолжить.", subject, students[closest].fio, students[closest].marks[subject - 1]);
- while (getchar() != '\n');
- system("cls");
- printf("[Статистика]\n\n1 - Определить лучшего студента\n2 - Определить худшего студента\n3 - Определить среднестатистического стундента\n0 - Вернуться в меню\n\n");
- }
- }
- }
- else {
- printf("\nНе удалось открыть файл со студентами. Нажмите Enter, чтобы продолжить.");
- while (getchar() != '\n');
- system("cls");
- printf("[Статистика]\n\n1 - Определить лучшего студента\n2 - Определить худшего студента\n3 - Определить среднестатистического стундента\n0 - Вернуться в меню\n\n");
- }
- }
- void stats() {
- system("cls");
- printf("[Статистика]\n\n1 - Определить лучшего студента\n2 - Определить худшего студента\n3 - Определить среднестатистического стундента\n0 - Вернуться в меню\n\n");
- int inp;
- while (1) {
- printf("Выберите пункт меню: ");
- if (scanf_s("%d", &inp) != 1) {
- while (getchar() != '\n');
- printf("Ошибка: введите корректное значение\n");
- continue;
- }
- while (getchar() != '\n');
- if (inp == 1) get_student(1);
- else if (inp == 2) get_student(2);
- else if (inp == 3) get_student(3);
- else if (inp == 0) {
- system("cls");
- printf("[Главное меню]\n\n1 - Ввод данных\n2 - Статистика\n3 - Журнал\n4 - Сортировки\n0 - Выйти\n\n");
- break;
- }
- else {
- printf("Ошибка: такого пункта не существует\n");;
- }
- }
- }
- void swap(Student* a, Student* b) {
- Student temp = *a;
- *a = *b;
- *b = temp;
- }
- int compare(const void* s1, const void* s2)
- {
- // Приводим указатели к нужному типу
- Student* st1 = (Student*)s1;
- Student* st2 = (Student*)s2;
- // Сравниваем поля group
- if (st1->group < st2->group)
- return -1; // Первая структура меньше второй
- else if (st1->group > st2->group)
- return 1; // Первая структура больше второй
- else // Поля group равны, сравниваем поля fio
- return strcmp(st1->fio, st2->fio); // Возвращаем результат сравнения строк
- }
- void shuttle_sort(int mode) {
- system("cls");
- FILE* input;
- fopen_s(&input, "students.bin", "rb");
- if (input) {
- int count = _filelength(_fileno(input)) / sizeof(Student);
- fclose(input);
- Student* students = new Student[count + 1];
- int len = read_group(students);
- if (len == -1) {
- printf("\nНе удалось прочитать данные о студентах. Нажмите Enter, чтобы продолжить.");
- while (getchar() != '\n');
- system("cls");
- printf("[Сортировка по имени и группе]\n\n1 - Группа по возрастанию, имя по возрастанию\n2 - Группа по возрастанию, имя по убыванию\n3 - Группа по убыванию, имя по возрастанию\n4 - Группа по убыванию, имя по убыванию\n0 - Выйти\n\n");
- return;
- }
- if (mode == 1) {
- for (int i = 1; i < count; i++) {
- if (students[i].group < students[i - 1].group || (students[i].group == students[i - 1].group && strcmp(students[i].fio, students[i - 1].fio) < 0)) {
- swap(students[i], students[i - 1]);
- for (int j = i; j >= 1; j--) {
- if (students[j].group < students[j - 1].group || (students[j].group == students[j - 1].group && strcmp(students[j].fio, students[j - 1].fio) < 0)) swap(students[j], students[j - 1]);
- }
- }
- }
- }
- else if (mode == 2) {
- for (int i = 1; i < count; i++) {
- if (students[i].group < students[i - 1].group || (students[i].group == students[i - 1].group && strcmp(students[i].fio, students[i - 1].fio) > 0)) {
- swap(students[i], students[i - 1]);
- for (int j = i; j >= 1; j--) {
- if (students[j].group < students[j - 1].group || (students[j].group == students[j - 1].group && strcmp(students[j].fio, students[j - 1].fio) > 0)) swap(students[j], students[j - 1]);
- }
- }
- }
- }
- else if (mode == 3) {
- for (int i = 1; i < count; i++) {
- if (students[i].group > students[i - 1].group || (students[i].group == students[i - 1].group && strcmp(students[i].fio, students[i - 1].fio) < 0)) {
- swap(students[i], students[i - 1]);
- for (int j = i; j >= 1; j--) {
- if (students[j].group > students[j - 1].group || (students[j].group == students[j - 1].group && strcmp(students[j].fio, students[j - 1].fio) < 0)) swap(students[j], students[j - 1]);
- }
- }
- }
- }
- else if (mode == 4) {
- for (int i = 1; i < count; i++) {
- if (students[i].group > students[i - 1].group || (students[i].group == students[i - 1].group && strcmp(students[i].fio, students[i - 1].fio) > 0)) {
- swap(students[i], students[i - 1]);
- for (int j = i; j >= 1; j--) {
- if (students[j].group > students[j - 1].group || (students[j].group == students[j - 1].group && strcmp(students[j].fio, students[j - 1].fio) > 0)) swap(students[j], students[j - 1]);
- }
- }
- }
- }
- print_table(students, count);
- printf("\nНажмите Enter, чтобы продолжить.");
- while (getchar() != '\n');
- system("cls");
- printf("[Сортировка по имени и группе]\n\n1 - Группа по возрастанию, имя по возрастанию\n2 - Группа по возрастанию, имя по убыванию\n3 - Группа по убыванию, имя по возрастанию\n4 - Группа по убыванию, имя по убыванию\n0 - Выйти\n\n");
- }
- else {
- printf("Не удалось открыть файл с данными студентов. Нажмите Enter, чтобы продолжить.");
- while (getchar() != '\n');
- system("cls");
- printf("[Сортировка по имени и группе]\n\n1 - Группа по возрастанию, имя по возрастанию\n2 - Группа по возрастанию, имя по убыванию\n3 - Группа по убыванию, имя по возрастанию\n4 - Группа по убыванию, имя по убыванию\n0 - Выйти\n\n");
- }
- }
- void sort_a() {
- system("cls");
- printf("[Сортировка по имени и группе]\n\n1 - Группа по возрастанию, имя по возрастанию\n2 - Группа по возрастанию, имя по убыванию\n3 - Группа по убыванию, имя по возрастанию\n4 - Группа по убыванию, имя по убыванию\n0 - Выйти\n\n");
- int inp;
- while (1) {
- printf("Выберите пункт меню: ");
- if (scanf_s("%d", &inp) != 1) {
- while (getchar() != '\n');
- printf("Ошибка: введите корректное значение\n");
- continue;
- }
- while (getchar() != '\n');
- if (inp == 1) shuttle_sort(1);
- else if (inp == 2) shuttle_sort(2);
- else if (inp == 3) shuttle_sort(3);
- else if (inp == 4) shuttle_sort(4);
- else if (inp == 0) {
- system("cls");
- printf("[Сортировки]\n\n1 - По имени и номеру группы\n2 - По среднему баллу\n0 - Выйти\n\n");
- break;
- }
- else {
- printf("Ошибка: такого пункта не существует\n");;
- }
- }
- }
- void selection_sort(int mode) {
- system("cls");
- FILE* input;
- fopen_s(&input, "students.bin", "rb");
- if (input) {
- int count = _filelength(_fileno(input)) / sizeof(Student);
- fclose(input);
- Student* students = new Student[count + 1];
- int len = read_group(students);
- if (len == -1) {
- printf("\nНе удалось прочитать данные о студентах. Нажмите Enter, чтобы продолжить.");
- while (getchar() != '\n');
- system("cls");
- printf("[Сортировка по среднему баллу]\n\n1 - По убыванию\n2 - По возрастанию\n0 - Выйти\n\n");
- return;
- }
- if (mode == 1) {
- for (int i = 0; i < count - 1; i++) {
- int min_index = i;
- for (int j = i + 1; j < count; j++) {
- int sum_1 = 0, sum_2 = 0; float average_1, average_2;
- for (int x = 0; x < m; x++) {
- sum_1 += students[j].marks[x];
- sum_2 += students[min_index].marks[x];
- }
- average_1 = (float)sum_1 / m;
- average_2 = (float)sum_2 / m;
- if (average_1 > average_2) {
- min_index = j;
- }
- }
- swap(&students[i], &students[min_index]);
- }
- }
- else if (mode == 2) {
- for (int i = 0; i < count - 1; i++) {
- int min_index = i;
- for (int j = i + 1; j < count; j++) {
- int sum_1 = 0, sum_2 = 0; float average_1, average_2;
- for (int x = 0; x < m; x++) {
- sum_1 += students[j].marks[x];
- sum_2 += students[min_index].marks[x];
- }
- average_1 = sum_1 / m;
- average_2 = sum_2 / m;
- if (average_1 < average_2) {
- min_index = j;
- }
- }
- swap(&students[i], &students[min_index]);
- }
- }
- print_table(students, count);
- printf("\nНажмите Enter, чтобы продолжить.");
- while (getchar() != '\n');
- system("cls");
- printf("[Сортировка по среднему баллу]\n\n1 - По убыванию\n2 - По возрастанию\n0 - Выйти\n\n");
- }
- else {
- printf("Не удалось открыть файл с данными студентов. Нажмите Enter, чтобы продолжить.");
- while (getchar() != '\n');
- system("cls");
- printf("[Сортировка по среднему баллу]\n\n1 - По убыванию\n2 - По возрастанию\n0 - Выйти\n\n");
- }
- }
- void sort_b() {
- system("cls");
- printf("[Сортировка по среднему баллу]\n\n1 - По убыванию\n2 - По возрастанию\n0 - Выйти\n\n");
- int inp;
- while (1) {
- printf("Выберите пункт меню: ");
- if (scanf_s("%d", &inp) != 1) {
- while (getchar() != '\n');
- printf("Ошибка: введите корректное значение\n");
- continue;
- }
- while (getchar() != '\n');
- if (inp == 1) selection_sort(1);
- else if (inp == 2) selection_sort(2);
- else if (inp == 0) {
- system("cls");
- printf("[Сортировки]\n\n1 - По имени и номеру группы\n2 - По среднему баллу\n0 - Выйти\n\n");
- break;
- }
- else {
- printf("Ошибка: такого пункта не существует\n");;
- }
- }
- }
- void sorts() {
- system("cls");
- printf("[Сортировки]\n\n1 - По имени и номеру группы\n2 - По среднему баллу\n0 - Выйти\n\n");
- int inp;
- while (1) {
- printf("Выберите пункт меню: ");
- if (scanf_s("%d", &inp) != 1) {
- while (getchar() != '\n');
- printf("Ошибка: введите корректное значение\n");
- continue;
- }
- while (getchar() != '\n');
- if (inp == 1) sort_a();
- else if (inp == 2) sort_b();
- else if (inp == 0) {
- system("cls");
- printf("[Главное меню]\n\n1 - Ввод данных\n2 - Статистика\n3 - Журнал\n4 - Сортировки\n0 - Выйти\n\n");
- break;
- }
- else {
- printf("Ошибка: такого пункта не существует\n");;
- }
- }
- }
- int main() {
- SetConsoleCP(1251);
- SetConsoleOutputCP(1251);
- system("cls");
- FILE* _file;
- fopen_s(&_file, "students.bin", "rb");
- if (!_file) {
- fopen_s(&_file, "students.bin", "wb");
- fclose(_file);
- }
- else {
- fclose(_file);
- }
- printf("[Главное меню]\n\n1 - Ввод данных\n2 - Статистика\n3 - Журнал\n4 - Сортировки\n0 - Выйти\n\n");
- int inp;
- while (1) {
- printf("Выберите пункт меню: ");
- if (scanf_s("%d", &inp) != 1) {
- while (getchar() != '\n');
- printf("Ошибка: введите корректное значение\n");
- continue;
- }
- while (getchar() != '\n');
- if (inp == 1) data_entry();
- else if (inp == 2) stats();
- else if (inp == 3) journal();
- else if (inp == 4) sorts();
- else if (inp == 0) {
- system("cls");
- break;
- }
- else {
- printf("Ошибка: такого пункта не существует\n");
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement