Скачиваний:
23
Добавлен:
11.07.2021
Размер:
509.94 Кб
Скачать

Заключение

Таким образом, в рамках представленной курсовой работы была решена задача по хранению и обработке сведений расписания поездов – создана информационно–справочная система на базе бинарного файла. Задача осуществлена с помощью структурного типа данных – структур, базовых управляющих конструкций – последовательность, ветвление, цикл, а также использован как способ хранения информации бинарный файл.

В программе реализованы следующие элементы в виде пользовательских функций:

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) {

tmp = 0;

printf("__________________________________________________________________________\n");

printf("| Номер | Назначение | Тип поезда | Время отправления | Время пути |\n");

printf("\n__________________________________________________________________________\n");

ticketOut(name);

printf("\n__________________________________________________________________________\n");

break;

}

if (tmp == 1)

printf("\nРейс с данным номером не был найден.\n");

system("pause");

fclose(f);

}

void searchTravel(char* file) { // поиск самого быстрого поезда определенного типа

int time_min = 100000000, n = 0, pos = –1;

char station[15], type_info[12];

system("cLs");

if ((f = fopen(file, "rb+")) == NULL) { //открытие файла и проверка на правильность открыя

perror("\nОшибка открытия файла.");

puts("\nНажмите любую клавишу для выхода в меню...\n");

system("pause");

return;

}

puts("\nВведите пункт назначения:\n");

scanf("%15s", station);

puts("\nВведите тип поезда:\n");

scanf("%12s", type_info);

while (fread(&name, sizeof(struct train), 1, f)) {

n++;

if (strcmp(name.arrivial, station) == 0)

if (strcmp(name.type, type_info) == 0)

if (time_min >= name.time_travel_hour * 60 + name.time_travel_minute) {

pos = n;

time_min = name.time_travel_hour * 60 + name.time_travel_minute;

}

}

if (pos == –1)

printf("\nПодходящих рейсов нет.\n");

else {

printf("\n__________________________________________________________________________\n");

printf("| Номер | Назначение | Тип поезда | Время отправления | Время пути |\n");

printf("__________________________________________________________________________\n");

fseek(f, (pos – 1) * sizeof(struct train), SEEK_SET);// Установка указателя на запись

fread(&name, sizeof(struct train), 1, f);//Считывание записи из файла в ОП

ticketOut(name);

printf("\n__________________________________________________________________________\n");

}

system("pause");

fclose(f);

}

void del(char* file1) { // функция удаления записи

FILE* f1, * f2;

int num;

char file2[] = "tmp";

system("cls");

if ((f1 = fopen(file1, "rb")) == NULL)

{

perror("\nОшибка открытия файла.");

puts("\nДля продолжения нажмите любую кнопку...\n");

system("pause");

return;

}

if ((f2 = fopen(file2, "wb")) == NULL)

{

perror("\nОшибка открытия файла.");

puts("\nДля продолжения нажмите любую кнопку...\n");

system("pause");

return;

}

printf("Введите номер рейса, сведения о которой хотите удалить.\n");

fflush(stdin);

scanf("%d", &num);

printf("\n");

while (fread(&name, sizeof(struct train), 1, f1))

if (num != name.number) // Сравнение номеров

fwrite(&name, sizeof(struct train), 1, f2); // Запись во временный файл

puts("\n Запись успешно удалена.\n");

system("pause");

fclose(f1);

fclose(f2);

remove(file1);

rename(file2, file1);

}

void printFile() { // вывод текстового файла с заданием на экран

char ch = 0;

FILE* file = fopen("zad.txt", "r");

system("cLs");

while (!feof(file) && !ferror(file)) {

ch = getc(file);

if (ch != EOF)

{

putchar(ch);

}

}

fclose(file);

system("pause");

}

void edit(char* file) { // Редактирование записи

int n = 0, num, point, tmp = 1;

system("cLs");

if ((f = fopen(file, "rb+")) == NULL) { //открытие файла и проверка на правильность открыя

perror("\nОшибка открытия файла.");

puts("\nНажмите любую клавишу для выхода в меню...\n");

system("pause");

return;

}

puts("Введите номер рейса для редактирования.\n");

scanf("%d", &num);

while (fread(&name, sizeof(struct train), 1, f)) {

n++;

if (name.number == num) {

tmp = 0;

fseek(f, (n – 1) * sizeof(struct train), SEEK_SET);// Установка указателя на запись

fread(&name, sizeof(struct train), 1, f);//Считывание записи из файла в ОП

printf("__________________________________________________________________________\n");

printf("| Номер | Назначение | Тип поезда | Время отправления | Время пути |\n");

printf("__________________________________________________________________________\n");

ticketOut(name);//Вывод ее на экран

printf("\n__________________________________________________________________________\n");

puts("\n\tВыберите поле для редактирования:\n");

puts("\t1. Номер поезда.\n");

puts("\t2. Пункт назначения.\n");

puts("\t3. Тип поезда.\n");

puts("\t4. Время отправления.\n");

puts("\t5. Время пути.\n");

puts("\t6. Изменить запись полностью.\n\n");

scanf("%d", &point);

system("cLs");

if (point == 1 || point == 6) {

puts("\tНомер поезда.\n");

scanf("%d", &name.number);

}

if (point == 2 || point == 6) {

puts("\tПункт назначения.\n");

scanf("%15s", name.arrivial);

}

if (point == 3 || point == 6) {

puts("\tТип поезда.\n");

scanf("%12s", name.type);

}

if (point == 4 || point == 6) {

puts("\tВремя отправления. (часы и минуты через пробел)\n");

scanf("%2d %2d", &name.time_departure_hour, &name.time_departure_minute);

}

if (point == 5 || point == 6) {

puts("\tВремя пути. (часы и минуты через пробел)\n");

scanf("%2d %2d", &name.time_travel_hour, &name.time_travel_minute);

}

// Установка указателя на эту запись

fseek(f, (n – 1) * sizeof(struct train), SEEK_SET);

//Запись измененной записи из ОП в файл

fwrite(&name, sizeof(struct train), 1, f);

break;

}

}

if (tmp) printf("Нет записи о рейсе с введённым номером.\n");

system("pause");

fclose(f);

}

int menu(char* file_name) { // меню

int item;

while (1)

{

system("cLs");

puts(" \t\tМ Е Н Ю");

puts(" \n\t 1. Просмотр задания.");

puts(" \n\t 2. Создать и добавить.");

puts(" \n\t 3. Поиск рейса по временному промежутку.");

puts(" \n\t 4. Поиск рейса по номеру.");

puts(" \n\t 5. Поиск самого быстрого рейса.");

puts(" \n\t 6. Просмотр информации о рейсах.");

puts(" \n\t 7. Удаление.");

puts(" \n\t 8. Редактирование.");

puts(" \n\t 9. Выход.");

puts(" \nВведите номер пункта меню: ");

scanf("%d", &item);

switch (item) {

case 1:

printFile();

break;

case 2:

addInf(file_name);

break;

case 3:

searchDeparture(file_name);

break;

case 4:

searchNum(file_name);

break;

case 5:

searchTravel(file_name);

break;

case 6:

show(file_name);

break;

case 7:

del(file_name);

break;

case 8:

edit(file_name);

break;

case 9:

system("cLs");

printf("\n\nРабота программы закончена. Спасибо.\n\n\n");

system("pause");

return 0;

default: {

system("cLs");

printf("\n\nПункт меню отсутствует.\n\n\n");

system("pause");

return 2;

}

}

}

}

int main() {

char file_name[25];

setlocale(LC_ALL, "Rus");

puts("Пожалуйста, введите имя файла:\n");

gets(file_name);

menu(file_name);

return 0;

}

Соседние файлы в папке курсовая программирование на яву 1 курс