/
Pereroncino
/
Proga
Обзор
Документация
Войти
/
Pereroncino
/
Proga
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
lab11.cpp
192 строки
7 KB
Pereroncino
create: lab11.cpp
28 апр 2026, 07:59
Верифицирован
28 апр 2026, 07:59
22262fa
Код
Авторство
О чём код?
#include <stdio.h> #include <conio.h> #include <string.h> #include <stdlib.h> struct Student { char fio[50]; int grades[4]; float scholarship; } s1; // Прототипы с улучшенной логикой void create(char *name); void print(char *name); void append(char *name); void remove_bad(char *name); void modify(char *name); void report(char *name); int main() { char choice; char filename[] = "students.dat"; while (1) { system("CLS"); puts("=== СИСТЕМА УЧЕТА СТУДЕНТОВ ==="); puts("1 - Создать новый файл (N=10)"); puts("2 - Просмотреть список"); puts("3 - Добавить новую запись"); puts("4 - Удалить должников (с двойками)"); puts("5 - Изменить оценки (по фамилии)"); puts("6 - Сформировать ведомость (.txt)"); puts("0 - Выход"); choice = _getch(); switch (choice) { case '1': create(filename); break; case '2': print(filename); break; case '3': append(filename); break; case '4': remove_bad(filename); break; case '5': modify(filename); break; case '6': report(filename); break; case '0': return 0; default: puts("\n Неверный выбор! Нажмите любую клавишу..."); _getch(); } } } void create(char *name) { FILE *f = fopen(name, "wb"); if (!f) { perror("\n Ошибка создания файла"); _getch(); return; } system("CLS"); printf("--- Создание файла (заполнение 10 записей) ---\n"); for (int i = 0; i < 10; i++) { printf("\nСтудент #%d\nФИО: ", i + 1); scanf("%s", s1.fio); printf("4 оценки через пробел: "); for (int j = 0; j < 4; j++) scanf("%d", &s1.grades[j]); s1.scholarship = 0; fwrite(&s1, sizeof(s1), 1, f); } fclose(f); puts("\n Файл успешно создан!"); _getch(); } void print(char *name) { FILE *f = fopen(name, "rb"); if (!f) { printf("\n Файл %s не найден!", name); _getch(); return; } system("CLS"); printf("%-20s | %-10s | %-10s\n", "ФИО", "Оценки", "Стипендия"); printf("----------------------------------------------\n"); int count = 0; while (fread(&s1, sizeof(s1), 1, f)) { printf("%-20s | %d %d %d %d | %8.2f\n", s1.fio, s1.grades[0], s1.grades[1], s1.grades[2], s1.grades[3], s1.scholarship); count++; } if (count == 0) puts(" Файл пуст."); fclose(f); _getch(); } void append(char *name) { FILE *f = fopen(name, "ab"); if (!f) { perror("\n Ошибка открытия"); _getch(); return; } printf("\nДобавление студента\nФИО: "); scanf("%s", s1.fio); printf("4 оценки: "); for (int i = 0; i < 4; i++) scanf("%d", &s1.grades[i]); s1.scholarship = 0; fwrite(&s1, sizeof(s1), 1, f); fclose(f); puts(" Запись добавлена."); _getch(); } void remove_bad(char *name) { FILE *f = fopen(name, "rb"); if (!f) { printf("\n Файл не найден."); _getch(); return; } FILE *temp = fopen("temp.dat", "wb"); int deleted_count = 0, total = 0; while (fread(&s1, sizeof(s1), 1, f)) { int has_two = 0; for (int i = 0; i < 4; i++) if (s1.grades[i] == 2) has_two = 1; if (!has_two) { fwrite(&s1, sizeof(s1), 1, temp); } else { deleted_count++; } total++; } fclose(f); fclose(temp); remove(name); rename("temp.dat", name); printf("\n Обработано записей: %d. Удалено студентов с двойками: %d", total, deleted_count); _getch(); } void modify(char *name) { char search_fio[50]; FILE *f = fopen(name, "rb+"); if (!f) { printf("\n Ошибка доступа к файлу!"); _getch(); return; } printf("\n Введите фамилию для правки: "); scanf("%s", search_fio); int found = 0; while (fread(&s1, sizeof(s1), 1, f)) { if (strcmp(s1.fio, search_fio) == 0) { found = 1; printf(" Найдено! Текущие оценки: %d %d %d %d\n", s1.grades[0], s1.grades[1], s1.grades[2], s1.grades[3]); printf(" Введите новые 4 оценки: "); for (int i = 0; i < 4; i++) scanf("%d", &s1.grades[i]); fseek(f, -sizeof(s1), SEEK_CUR); fwrite(&s1, sizeof(s1), 1, f); printf(" Данные обновлены."); break; } } if (!found) printf(" Студент с фамилией %s не найден.", search_fio); fclose(f); _getch(); } void report(char *name) { FILE *fb = fopen(name, "rb+"); if (!fb) { printf("\n Ошибка чтения базы."); _getch(); return; } FILE *ft = fopen("stipendia.txt", "w"); if (!ft) { printf("\n Ошибка создания текстового отчета."); fclose(fb); return; } fprintf(ft, "ВЕДОМОСТЬ НАЗНАЧЕНИЯ СТИПЕНДИЙ\n"); fprintf(ft, "====================================\n"); int count = 0; while (fread(&s1, sizeof(s1), 1, fb)) { int only5 = 1, only45 = 1, has_bad = 0; for (int i = 0; i < 4; i++) { if (s1.grades[i] != 5) only5 = 0; if (s1.grades[i] < 4) only45 = 0; if (s1.grades[i] < 3) has_bad = 1; } if (only5) s1.scholarship = 5000.0; else if (only45) s1.scholarship = 3500.0; else s1.scholarship = 0.0; // Обновляем стипендию в бинарном файле fseek(fb, -sizeof(s1), SEEK_CUR); fwrite(&s1, sizeof(s1), 1, fb); fseek(fb, 0, SEEK_CUR); // Синхронизация потока if (s1.scholarship > 0) { fprintf(ft, "%-20s | Стипендия: %8.2f руб.\n", s1.fio, s1.scholarship); count++; } } fclose(fb); fclose(ft); printf("\n Отчет готов! Включено студентов: %d. Проверьте файл stipendia.txt", count); _getch(); }