Назначение: нахождение рейса по номеру и вывод информации о нем.
Входные данные: file – указатель на файл.
Выходные данные: отсутствуют.
Вспомогательные переменные:
– int num – номер искомого рейса.
– int tmp – индикатор наличия подходящего рейса, изначально равно 1.
Описание работы функции: открытие в режиме чтения и проверка на правильность открытия файла. Ввод искомого номера рейса num. В цикле с условием, чтение до конца файла, номер каждой структуры сравнивается с искомым номером. Если номера равны выводится таблица с информацией о рейсе, с помощью функции ticketOut(struct train name), и индикатор tmp принимает значение 0. Если таких рейсов не было найдено и индикатор tmp = 0, то выводится уведомление «Рейс с данным номером не был найден.». Закрытие файла.
Назначение: поиск самого быстрого поезда определенного типа.
Входные данные: file – указатель на файл.
Выходные данные: отсутствуют.
Вспомогательные переменные:
– char station[15] – искомый пункт назначения.
– char type_info[12] – искомый тип поезда.
– int time_min – минимальное время в минутах, изначально равно 100000000.
– int n – номер структуры, изначально равно 0.
– int pos – номер позиции рейса с минимальным временем, изначально равен –1.
Описание работы функции: открытие в режиме чтения и проверка на правильность открытия файла. Ввод искомого пункта назначения и искомого типа поезда соответственно station и type_info. В цикле с условием, чтение до конца файла, проверка пункта назначения и типа поезда каждой структуры. Подходящие по условию рейсы проверяются на время в пути путем подсчета общего времени в минутах, если время проверяющегося рейса меньше time_min, то запоминается позиция и минимальное время обновляется. После цикла при p = –1, выводится «Подходящих рейсов нет.», иначе если p не равен –1, то выводится рейс с минимальным временем, с помощью функции ticketOut(struct train name). Закрытие файла.
Назначение: удаление записи.
Входные данные: file – указатель на файл.
Выходные данные: отсутствуют.
Вспомогательные переменные:
– f1 – переменная типа FILE.
– f2 – переменная типа FILE.
– char file2 – название файла.
– int num – номер удаляемого рейса.
Описание работы функции: для удаления записи о файле производится запись информации из исходного файла во вспомогательный, исключая информацию о рейсе, которую нужно удалить. Исходный файл необходимо удалить, а вспомогательному присвоить имя файла исходного. Пользователь вводит номер рейса в переменную num, запись о котором необходимо удалить. Производится сравнение в цикле, если значения совпали, то информация не записывается во вспомогательный файл. Закрытие потоков на файлы. Удаление исходного файла с помощью функции remove(). Переименование с помощью функции rename().
Назначение: вывод задания на экран.
Входные данные: отсутствуют.
Выходные данные: отсутствуют.
Вспомогательные переменные:
– file – типа FILE указатель на файл для чтения задания из файла.
– char ch – для считывания текста.
Описание работы функции: открытие текстового файла и посимвольное чтение из него с помощью цикла. Закрытие файла
Назначение: редактирование информации о рейсе
Входные данные: file – указатель на файл.
Выходные данные: лтсутствуют.
Вспомогательные переменные:
– int n – номер структуры, изначально равен 0.
– int num – номер рейса для редактирования.
– int point – номер пункта меню.
– int tmp – индикатор наличия искомого рейса, изначально равен 1.
Описание работы функции: открытие в режиме чтения и записи, проверка на правильность открытия файла. Ввод номера рейса для редактирования num. При нахождении рейса с искомым номером, меняется значение индикатора tmp на 0, выводится шапка таблицы и информация о записи с помощью функции ticketOut(struct train name). Далее выводится меню редактирования:
Выберите поле для редактирования:
1. Номер поезда.
2. Пункт назначения.
3. Тип поезда.
4. Время отправления.
5. Время пути.
6. Изменить запись полностью.
Пользователь вводит номер пункта меню и с помощью условий изменяется информация о рейсе. После чего записывается информация в файл и он закрывается. Если рейса с таким номером не обнаружено и tmp = 1, то выводится уведомление «Нет записи о рейсе с введённым номером.».
Назначение: главное меню через который осуществлен пользовательский интерфейс.
Входные данные: file_name – указатель на файл.
Выходные данные: отсутствуют.
Вспомогательные переменные:
– int intem – номер пункта меню.
Описание работы функции: пользователь вводит номер пункта меню и вызывается соответствующая функция. Программа заканчивает работу, когда выбран пункт меню 9 – «Выход».
Ввод имени файла пользователем показан на рисунке 1.
Рисунок 1 – Ввод имени файла
Очистка экрана после ввода имени файла и вывод текста меню на экран. На рисунке 2 можно видеть, что пользователю предоставляется выбор позиции, ввод номера которой он осуществляет под текстом меню.
Рисунок 2 – Меню
Просмотр задания соответствует пункту меню 1. На рисунке 3 представлен текст задания.
Рисунок 3 – Вывод текста задания, соответствует 1 пункту меню
Чтобы добавить записи о рейсах, пользователю необходимо выбрать пункт меню 2; работа функции представлена на рисунке 4.
Для поиска рейса в определенный временной промежуток, пользователю необходимо выбрать пункт 3; работа функции представлена на рисунке 5.
Если пользователь знает номер рейса, он может просмотреть информацию о нем выбрав 4 пункт; работа функции представлена на рисунке 6.
Рисунок 4 – Добавление новых записей о рейсах, соответствует 2 пункту меню
Рисунок 5 – Поиск рейса в определенный временной промежуток, соответствует 3 пункту меню
Рисунок 6 – Поиск информации по номеру рейса, соответствует 4 пункту меню
Выбрав 5 пункт меню, пользователь сможет найти самый быстрый рейс определенного типа поезда, например, до Саратова, тип поезда – пассажирский (рисунок 7).
Рисунок 7 – Поиск самого быстрого пассажирского рейса до Саратова, выполнено с помощью 5 пункта меню
Просмотр информации обо всех рейсах в форме таблицы производится выбором 6 пункта меню; работа функции представлена на 8 рисунке.
При необходимости удалить информацию о рейсе пользователю необходимо выбрать 7 пункт меню, после чего ввести номер рейса (рисунок 9). На 10 рисунке можно увидеть, что записи больше нет.
Также можно изменить информацию о рейсе как 1 поля, так и все поля. Для редактирования пользователь выбирает 8 пункт меню. Чтобы отредактировать запись, нужно знать номер рейса. При вводе номера появляется информация о рейсе и меню выбора (рисунок 11). После выбора пункта меню редактирования происходит изменение записи (рисунок 12). Изменение информации можно увидеть в общей таблице на рисунке 13.
Для завершения работы с базой данных необходимо выбрать 9 пункт (рисунок 14).
Рисунок 8 – Информация о рейсах, соответствует 6 пункту меню
Рисунок 9 – Удаление информации о рейсе, соответствует 7 пункту меню
Рисунок 10 – Таблица с информацией обо всех рейсах после удаления записи
Рисунок 11 – Редактирование записи, меню редактирования, соответствует 8 пункту меню
Рисунок 12 – Выбор 3 пункта меню редактирования, изменение типа поезда
Рисунок 13 – Результат редактирования записи
Рисунок 14 – Завершение работы, соответствует 9 пункту меню
Таким образом, в рамках представленной курсовой работы была решена задача по хранению и обработке сведений расписания поездов – создана информационно–справочная система на базе бинарного файла. Задача осуществлена с помощью структурного типа данных – структур, базовых управляющих конструкций – последовательность, ветвление, цикл, а также использован как способ хранения информации бинарный файл.
В программе реализованы следующие элементы в виде пользовательских функций:
1. Чтение данных из файла.
2. Запись данных в файл.
3. Редактирование данных в файле.
4. Удаление записи из файла.
5. Поиск записи по ключевому слову.
На основании полученных результатов можно сделать вывод, что задача выполнена.
Овсянников, А. В. Алгоритмы и структуры данных: учебно–методический комплекс для специальности 1–31 03 07 «Прикладная информатика (по направлениям)». Ч. 1 / А. В. Овсянников, Ю. А. Пикман ; БГУ, Фак. социокультурных коммуникаций, Каф. информационных технологий. – Минск : БГУ, 2015. – 124 с. : ил. – Библиогр.: с. 122.
Основы языка С. [Электронный ресурс]. – URL: https://younglinux.info/c (дата обращения 30.05.2020).
Пышкин Е.В. Структуры данных и алгоритмы: реализация на C/C++. – СПб.: ФТК СПБГПУ, 2009.– 200 с.
Программирование на С и С++. [Электронный ресурс]. URL:http://www.c–cpp.ru/books (дата обращения 18.06.2021).
Павловская Т.А., С/С++. Программирование на языке высокого уровня. – СПб.: Питер, 2017. – 464 c.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <locale.h>
#include <conio.h>
struct train { //объявление структуры
char arrivial[15];
int number;
char type[12];
int time_departure_hour;
int time_departure_minute;
int time_travel_hour;
int time_travel_minute;
} name;
void addIng(char*);
void ticketOut(struct train);
void show(char*);
void searchDeparture(char*);
void searchTravel(char*);
void searchNum(char*);
void del(char*);
void edit(char*);
void printFile(void);
int menu(char*);
FILE* f;
void addInf(char* file) { // функция добавления информации в файл
int i, n;
system("cLs");
if ((f = fopen(file, "ab")) == NULL) { //проверка правильности открытия файла
perror("\nОшибка открытия файла.");
puts("\nНажмите любую клавишу для выхода в меню...\n");
system("pause");
return;
}
printf("\nВведите количество рейсов.\n");
scanf("%d", &n);
for (i = 0; i < n; i++) { //добавление информации в файл
printf("Введите пункт прибытия:\n");
scanf("%15s", name.arrivial);
printf("\nВведите номер поезда:\n");
scanf("%3d", &name.number);
printf("\nВведите тип поезда:\n");
scanf("%12s", name.type);
printf("\nВведите время отправления (часы и минуты через пробел):\n ");
scanf("%d %d", &name.time_departure_hour, &name.time_departure_minute);
printf("\nВведите время пути (часы и минуты через пробел):\n ");
scanf("%d %d", &name.time_travel_hour, &name.time_travel_minute);
fwrite(&name, sizeof(struct train), 1, f);
}
printf("\nСпасибо! Информация была успешно добавлена.\n\n");
system("pause");
fclose(f);
}
void ticketOut(struct train name) { // функция вывода информации из бинарного файла через структуры
if (name.time_departure_minute < 10 && name.time_travel_minute < 10)
printf("\n| %5d | %15s | %12s | %2d:0%d | %2d:0%d |", name.number, name.arrivial, name.type, name.time_departure_hour, name.time_departure_minute, name.time_travel_hour, name.time_travel_minute); //оформление вывода с учетом количества выводимых символов для корректного отображения на экране
else if (name.time_travel_minute < 10)
printf("\n| %5d | %15s | %12s | %2d:%2d | %2d:0%d |", name.number, name.arrivial, name.type, name.time_departure_hour, name.time_departure_minute, name.time_travel_hour, name.time_travel_minute); //оформление вывода с учетом количества выводимых символов для корректного отображения на экране
else if (name.time_departure_minute < 10)
printf("\n| %5d | %15s | %12s | %2d:0%d | %2d:%2d |", name.number, name.arrivial, name.type, name.time_departure_hour, name.time_departure_minute, name.time_travel_hour, name.time_travel_minute); //оформление вывода с учетом количества выводимых символов для корректного отображения на экране
else
printf("\n| %5d | %15s | %12s | %2d:%2d | %2d:%2d |", name.number, name.arrivial, name.type, name.time_departure_hour, name.time_departure_minute, name.time_travel_hour, name.time_travel_minute); //оформление вывода с учетом количества выводимых символов для корректного отображения на экране
}
void show(char* file) { // вывод на экран содержимого файла в графленом виде
system("cLs");
if ((f = fopen(file, "rb")) == NULL) { //открытие файла и проверка на правильность открыя
perror("\nОшибка открытия файла.");
puts("\nНажмите любую клавишу для выхода в меню...\n");
system("pause");
return;
}
printf("__________________________________________________________________________\n");
printf("| Номер | Назначение | Тип поезда | Время отправления | Время пути |\n");
printf("__________________________________________________________________________");
while (fread(&name, sizeof(struct train), 1, f) == 1) //цикл для вывода на экран
ticketOut(name);
printf("\n__________________________________________________________________________\n\n");
system("pause");
fclose(f);
}
void searchDeparture(char* file) { // функция нахождения поездов отправляющихся в определенный временной промежуток
int time_first_hour, time_first_min, time_second_hour, time_second_min, time_first, time_second, n = 0, nal = 1;
char station[15];
system("cLs"); //очистка экрана
if ((f = fopen(file, "rb+")) == NULL) { //открытие файла и проверка на правильность открыя
perror("\nОшибка открытия файла.");
puts("\nНажмите любую клавишу для выхода в меню...\n");
system("pause");
return;
}
puts("Введите пункт назначения:\n");
scanf("%15s", station);
puts("\nОт какого времени искать? (часы и минуты через пробел)\n");
scanf("%d %d", &time_first_hour, &time_first_min);
time_first = time_first_hour * 60 + time_first_min;
puts("\nДо какого времени искать? (часы и минуты через пробел)\n");
scanf("%d %d", &time_second_hour, &time_second_min);
time_second = time_second_hour * 60 + time_second_min;
while (fread(&name, sizeof(struct train), 1, f)) {
n++;
if (strcmp(name.arrivial, station) == 0)
if (time_first <= name.time_departure_hour * 60 + name.time_departure_minute && time_second >= name.time_departure_hour * 60 + name.time_departure_minute) {
if (nal == 1) {
printf("\n__________________________________________________________________________\n");
printf("| Номер | Назначение | Тип поезда | Время отправления | Время пути |\n");
printf("__________________________________________________________________________\n");
}
nal = 0;
fseek(f, (n – 1) * sizeof(struct train), SEEK_SET);// Установка указателя на запись
fread(&name, sizeof(struct train), 1, f);//Считывание записи из файла в ОП
ticketOut(name);//Вывод ее на экран
}
}
if (nal == 1)
printf("\nПодходящих рейсов не найдено, выберите другое время\n");
else
printf("\n__________________________________________________________________________\n");
system("pause");
fclose(f);
}
void searchNum(char* file) { // функция поиска рейса с номером, введённым пользователем
int num, tmp = 1;
system("cLs");
if ((f = fopen(file, "rb+")) == NULL) { //открытие файла и проверка на правильность открыя
perror("\nОшибка открытия файла.");
puts("\nНажмите любую клавишу для выхода в меню...\n");
system("pause");
return;
}
puts("\nПожалуйста, введите номер рейса.\n");
scanf("%d", &num);
while (fread(&name, sizeof(struct train), 1, f))
if (name.number == num) {