Материал: Курсовая

Внимание! Если размещение файла нарушает Ваши авторские права, то обязательно сообщите нам

4.5 Функция searchNum(char* file)

Назначение: нахождение рейса по номеру и вывод информации о нем.

Входные данные: file – указатель на файл.

Выходные данные: отсутствуют.

Вспомогательные переменные:

– int num – номер искомого рейса.

– int tmp – индикатор наличия подходящего рейса, изначально равно 1.

Описание работы функции: открытие в режиме чтения и проверка на правильность открытия файла. Ввод искомого номера рейса num. В цикле с условием, чтение до конца файла, номер каждой структуры сравнивается с искомым номером. Если номера равны выводится таблица с информацией о рейсе, с помощью функции ticketOut(struct train name), и индикатор tmp принимает значение 0. Если таких рейсов не было найдено и индикатор tmp = 0, то выводится уведомление «Рейс с данным номером не был найден.». Закрытие файла.

4.6 Функция searchTravel(char* file)

Назначение: поиск самого быстрого поезда определенного типа.

Входные данные: 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). Закрытие файла.

4.7 Функция del(char* file1)

Назначение: удаление записи.

Входные данные: file – указатель на файл.

Выходные данные: отсутствуют.

Вспомогательные переменные:

– f1 – переменная типа FILE.

– f2 – переменная типа FILE.

– char file2 – название файла.

– int num – номер удаляемого рейса.

Описание работы функции: для удаления записи о файле производится запись информации из исходного файла во вспомогательный, исключая информацию о рейсе, которую нужно удалить. Исходный файл необходимо удалить, а вспомогательному присвоить имя файла исходного. Пользователь вводит номер рейса в переменную num, запись о котором необходимо удалить. Производится сравнение в цикле, если значения совпали, то информация не записывается во вспомогательный файл. Закрытие потоков на файлы. Удаление исходного файла с помощью функции remove(). Переименование с помощью функции rename().

4.8 Функция printFile()

Назначение: вывод задания на экран.

Входные данные: отсутствуют.

Выходные данные: отсутствуют.

Вспомогательные переменные:

– file – типа FILE указатель на файл для чтения задания из файла.

– char ch – для считывания текста.

Описание работы функции: открытие текстового файла и посимвольное чтение из него с помощью цикла. Закрытие файла

4.9 Функция edit(char* file)

Назначение: редактирование информации о рейсе

Входные данные: 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, то выводится уведомление «Нет записи о рейсе с введённым номером.».

4.10 Функция menu(char* file_name)

Назначение: главное меню через который осуществлен пользовательский интерфейс.

Входные данные: file_name – указатель на файл.

Выходные данные: отсутствуют.

Вспомогательные переменные:

– int intem – номер пункта меню.

Описание работы функции: пользователь вводит номер пункта меню и вызывается соответствующая функция. Программа заканчивает работу, когда выбран пункт меню 9 – «Выход».

5 Результаты работы программы

Ввод имени файла пользователем показан на рисунке 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. Овсянников, А. В. Алгоритмы и структуры данных: учебно–методический комплекс для специальности 1–31 03 07 «Прикладная информатика (по направлениям)». Ч. 1 / А. В. Овсянников, Ю. А. Пикман ; БГУ, Фак. социокультурных коммуникаций, Каф. информационных технологий. – Минск : БГУ, 2015. – 124 с. : ил. – Библиогр.: с. 122.

  2. Основы языка С. [Электронный ресурс]. – URL: https://younglinux.info/c (дата обращения 30.05.2020).

  3. Пышкин Е.В. Структуры данных и алгоритмы: реализация на C/C++. – СПб.: ФТК СПБГПУ, 2009.– 200 с.

  4. Программирование на С и С++. [Электронный ресурс]. URL:http://www.c–cpp.ru/books (дата обращения 18.06.2021).

  5. Павловская Т.А., С/С++. Программирование на языке высокого уровня. – СПб.: Питер, 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) {