Файл: Контрольная работа 1 по дисциплине информатика выполнил Злотников С. В. Группа мит23.docx
ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 25.10.2023
Просмотров: 26
Скачиваний: 2
ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
Министерство цифрового развития, связи и
массовых коммуникаций Российской Федерации
Сибирский государственный университет телекоммуникаций и информатики
Контрольная работа № 1
по дисциплине: ИНФОРМАТИКА
Выполнил: Злотников С.В.
Группа: МИТ-23
Вариант: 12
Проверила: Лебеденко Людмила Федоровна
Новосибирск, 2023
Задание к контрольной работе
Написать программу
-
Создать файл STUDENT.dat, содержащий записи следующей структуры:
-
ФИО студента; -
его экзаменационные оценки по трем дисциплинам.
-
Программа должна выполнять следующую обработку файла: выбирает из файла студентов, имеющих хотя бы одну задолженность. Вывести ФИО этих студентов и количество несданных экзаменов.
Принципы создания и обработки бинарных файлов на языке Си
Текстовые файлы хранят данные в виде текста. Это значит, что если, например, мы записываем целое число 12345678 в файл, то записывается 8 символов, а это 8 байт данных, несмотря на то, что число помещается в целый тип. Кроме того, вывод и ввод данных является форматированным, то есть каждый раз, когда мы считываем число из файла или записываем его в файл, то происходит трансформация числа в строку или обратно. Это затратные операции, которых можно избежать. Текстовые файлы позволяют хранить информацию в виде, понятном для человека. Можно, однако, хранить данные непосредственно в бинарном виде. Для этих целей используются бинарные файлы. Запись в файл осуществляется с помощью функции:
size_t fwrite ( const void * ptr, size_t size, size_t count, FILE * stream ); |
Функция возвращает число удачно записанных элементов. В качестве аргументов принимает указатель на массив, размер одного элемента, число элементов и указатель на файловый поток. Вместо массива, конечно, может быть передан любой объект. Запись в бинарный файл объекта похожа на его отображение: берутся данные из оперативной памяти и пишутся как есть. Для считывания используется функция fread:
size_t fread ( void * ptr, size_t size, size_t count, FILE * stream ); |
Функция возвращает число удачно прочитанных элементов, которые помещаются по адресу ptr. Всего считывается count элементов по size байт.
Обработка бинарных файлов
Если файл открыт в бинарном режиме, его можно записывать или считывать побайтно. Функция fseek() позволяет обращаться с бинарным файлом как с массивом и переходить к любой позиции в файле, обеспечивая возможность произвольного доступа. Если текстовые файлы являются файлами с последовательным доступом, то к бинарным файлам может применяться произвольный доступ.
Схема алгоритма решения задачи
Программа на языке Си
// Язык C
#include
#include
#include
const char * FILENAME = "STUDENT.dat";
void Choose()
{
FILE* fp = fopen(FILENAME, "r"); // открыть файл на чтение
// переменные для хранения результатов ввода с файла
char surname[64];
char name[64];
char father[64];
int first, second, third;
puts("");
// Пока файл можно прочитать
while (fscanf(fp, "%s%s%s%d%d%d", surname, name, father, &first, &second, &third) > 0) {
if (first <= 2 || second <= 2 || third <= 2) { // если есть хотя бы 1 задолженность
printf("%s %s %s %d\n", surname, name, father, (first <= 2) + (second <= 2) + (third <= 2));
}
}
puts("");
fclose(fp); // закрыть файл
}
void AppendOrCreate()
{
int answer = 0;
printf("1. Добавить запись в файл STUDENT.dat\n");
printf("2. Начать запись нового файла\n");
scanf("%d", &answer);
FILE* fp = NULL;
if (answer == 1) {
// нужно использовать старый файл
fp = fopen(FILENAME, "a"); // a -append -> Добавить
}
else if (answer == 2) {
char fname[64];
puts("Введите название файла: ");
scanf("%s", fname);
// нужно создать новый файл
fp = fopen(fname, "a");
if (fp == NULL) {
fp = fopen(fname, "w"); // создать
}
}
else {
exit(1); // ошибка
}
if (fp == NULL) { // если проблемы с файлом, выходим из программы
exit(2); // ошибка
}
char surname[64];
char name[64];
char father[64];
int first, second, third;
// ввод новых данных
printf("Имя: ");
scanf("%s", name);
printf("Фамилия: ");
scanf("%s", surname);
printf("Отчество: ");
scanf("%s", father);
printf("Оценка за 1 предмет: ");
scanf("%d", &first);
printf("Оценка за 2 предмет: ");
scanf("%d", &second);
printf("Оценка за 3 предмет: ");
scanf("%d", &third);
// запись новых данных
fprintf(fp, "%s %s %s %d %d %d\n", surname, name, father, first, second, third);
fclose(fp); // закрыть файл
}
int main() // главная функция - точка входа в программу
{
int answer = -1; // сохранение ответа пользователя
while (1) {
// варианты выбора пользователя
printf("0. Выход из программы.\n");
printf("1. Выбрать из файла студентов, имеющих хотя бы одну задолженность.\n");
printf("2. Добавить запись в файл или начать запись нового файла.\n");
scanf("%d", &answer); // ввод ответа с клавиатуры
if (answer == 0) {
puts("Завершаю программу...");
return 1;
}
if (answer == 1) {
Choose(); // Выбрать из файла студентов, имеющих хотя бы одну задолженность
}
else if (answer == 2) {
AppendOrCreate(); // Добавить запись в файл или начать запись нового файла
}
else {
puts("Что-то пошло нет так...");
exit(3);
}
}
}
Скрины экранов с результатами выполнения программы
Выводы
Для выполнения контрольной работы были изучены принципы создания и обработки бинарных файлов на языке Си. Перед разработкой программного продукта была составлена блок-схема (алгоритм) решения задачи. В ходе контрольной работы создан файл STUDENT.dat, содержащий данные о ФИО студентов и их экзаменационных оценках по трем дисциплинам. Для возможности выбора студентов, имеющих задолженности по дисциплинам, разработана программа. Она позволяет выводить на экран ФИО студентов, получивших неудовлетворительные оценки за экзамен, и количество экзаменов, которые не сданы. Результаты работы программы представлены на рис. выше.
16.02.2023