Добавил:
t.me Установите расширение 'SyncShare' для решения тестов в LMS (Moodle): https://syncshare.naloaty.me/ . На всякий лучше отключить блокировщик рекламы с ним. || Как пользоваться ChatGPT в России: https://habr.com/ru/articles/704600/ || Также можно с VPNом заходить в bing.com через Edge браузер и общаться с Microsoft Bing Chat, но в последнее время они форсят Copilot и он мне меньше нравится. || Студент-заочник ГУАП, группа Z9411. Ещё учусь на 5-ом курсе 'Прикладной информатики' (09.03.03). || Если мой материал вам помог - можете написать мне 'Спасибо', мне будет очень приятно :) Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лабораторные работы / z9411_КафкаРС_лр_13.docx
Скачиваний:
12
Добавлен:
18.05.2022
Размер:
267.49 Кб
Скачать

Текст программы

/*Бинарные файлы.

Ввод/вывод с использованием функций библиотек языка C

Программа работы с базой данных "Расписание"

Создание базы

Добавление новых записей

Просмотр базы

Поиск расписания по названию пункта назначения с созданием файла выборки

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

Сортировка в порядке возрастания стоимости билета

*/

#define _CRT_SECURE_NO_WARNINGS //При компиляции функции scanf и printf считаются

#define _CRT_SECURE_NO_DEPRECATE //небезопасными, вылезают предупреждения (C6031, C6271).

#define _CRT_NONSTDC_NO_DEPRECATE //Используя эти строки мы принимаем на себя всю ответственность.

#include <stdio.h>

#include <string.h>

#include <iostream>

#include <locale.h>

#define FNAME_I "D:\\bd15.dat" //имя файла с исходной базой

#define FNAME_R "D:\\bd25.dat" //имя файла с результатами поиска

int checkFile(const char *, const char *); //проверка наличия файла

void addElem(const char *fname);

void outputHeader1();

void outputHeader2();

void viewDatabase1(const char *fname);

void viewDatabase2(const char *fname);

void searchDestination(const char *fname1, const char *fname2);

void sortName(const char *fname);

void sortPrice(const char *fname);

const char PR_R[] = "rb"; //признак открытия бинарного файла на чтение

const char PR_S[] = "r+b"; //признак открытия файла на чтение и запись

const char PR_W[] = "wb"; //признак открытия файла на запись

const char PR_A[] = "ab"; //признак открытия файла на добавление

typedef struct {

char name[15]; //номер рейса

char destination[15]; //пункт назначения

int price; //стоимость билета (тыс. руб.)

int distance; //протяжённость линии (км)

char plane[10]; //тип самолёта

}trip;

int main()

{

setlocale(LC_ALL, "Russian");

int var;

char otv;

char fname_i[20] = FNAME_I;

char fname_r[20] = FNAME_R;

for (; ;)

{//Выбор вида действия

printf("\n Вид действия:\n");

printf(" 1 - создание базы данных\n");

printf(" 2 - добавление новых записей\n");

printf(" 3 - сортировка по номеру рейса\n");

printf(" 4 - сортировка расписания по цене билета\n");

printf(" 5 - поиск расписания по названию пункта назначения\n");

printf(" 6 - просмотр базы данных\n");

printf(" 7 - просмотр базы данных поиска расписаний\n");

printf(" 8 - завершение задачи\n");

printf(" Введите вид действия ->");

scanf("%i", &var);

switch (var)

{

default:break;

case 1: if (checkFile(fname_i, PR_R))

{

printf(" Файл базы данных расписаний с именем ", fname_i);

printf(" был создан раньше.\n");

printf(" Создаём файл с новым именем? [Y/N] ");

while ((otv = getchar()) == '\n');

if (otv == 'Y' || otv == 'y' || otv == 'Н' || otv == 'н')

{

printf(" Задайте имя создаваемого файла: ");

scanf("%s", fname_i);

}

else break;

}

if (!checkFile(fname_i, PR_W))

{

printf("\n Ошибка открытия файла для записи\n");

break;

}

printf(" Создаем базу ", fname_i, '\n');

getchar();

addElem(fname_i);

printf("\n Создание файла закончено.\n");

if (checkFile(fname_i, PR_R))

printf(" База данных готова к работе\n");

else printf("\n база не создана\n");

break;

case 2: if (checkFile(fname_i, PR_R))

{

printf(" Файл базы данных расписаний с именем ", fname_i);

printf(" был создан раньше.\n");

printf(" Будем добавлять новые записи в него? [Y/N] ");

while ((otv = getchar()) == '\n');

if (otv == 'N' || otv == 'n' || otv == 'Т' || otv == 'т')

{

printf(" Задайте имя файла другой базы: ");

scanf("%s", fname_i);

if (!checkFile(fname_i, PR_R))

{

printf(" Такая база данных не создавалась\n");

break;

}

}

}

printf(" Добавляем записи в файл ", fname_i, '\n');

addElem(fname_i);

printf("\n Изменение файла закончено.");

break;

case 3: if (!checkFile(fname_i, PR_S))

{

printf("\n Ошибка открытия файла для чтения и записи\n");

break;

}

sortName(fname_i);

printf("\n Сортировка по номеру рейса закончена.");

break;

case 4: if (!checkFile(fname_i, PR_S))

{

printf("\n Ошибка открытия файла для чтения и записи\n");

break;

}

sortPrice(fname_i);

printf("\n Сортировка по цене билета закончена.");

break;

case 5: if (!checkFile(fname_i, PR_R))

{

printf("\n Ошибка открытия файла для чтения\n");

break;

}

if (!checkFile(fname_r, PR_W))

{

printf("\n Ошибка открытия файла для записи\n");

break;

}

searchDestination(fname_i, fname_r);

printf("\n Поиск по названию пункта назначения закончен.");

break;

case 6: if (!checkFile(fname_i, PR_R))

{

printf("\n Ошибка открытия файла для чтения\n");

break;

}

viewDatabase1(fname_i);

break;

case 7: if (!checkFile(fname_r, PR_R))

{

printf("\n Ошибка открытия файла для чтения\n");

break;

}

viewDatabase2(fname_r);

break;

case 8: return 0;

}

}

}

//Добавление новых элементов в базу данных

void addElem(const char* fname)

{

char otv;

trip schedule;

FILE* baza;

baza = fopen(fname, PR_A);

rewind(baza);

do

{

printf("\n Номер рейса? ");

scanf("%s", &schedule.name);

printf(" Пункт назначения? ");

scanf("%s", &schedule.destination);

printf(" Стоимость билета? (тыс. руб) ");

scanf("%i", &schedule.price);

printf(" Протяжённость линии? (км) ");

scanf("%i", &schedule.distance);

printf(" Тип самолёта? ");

scanf("%s", &schedule.plane);

fwrite(&schedule, sizeof(schedule), 1, baza);

printf("\n Продолжать?[Y/N]");

while ((otv = getchar()) == '\n');

} while (otv == 'Y' || otv == 'y' || otv == 'Н' || otv == 'н');

fclose(baza);

return;

}

//Вывод заголовка при просмотре исходного файла

void outputHeader1()

{

int i;

printf("\n");

for (i = 1; i <= 66; i++)

printf("-");

printf("\n");

printf("|%15s|%15s|%10s|%10s|%10s|\n", "Рейс № ", "Пункт наз.",

"Стоимость", "Протяженн.", "Самолёт ");

for (i = 1; i <= 66; i++)

printf("-");

return;

}

//Вывод заголовка при просмотре файла поиска расписания

void outputHeader2()

{

int i;

printf("\n");

for (i = 1; i <= 66; i++)

printf("-");

printf("\n");

printf("|%15s|%15s|%10s|%10s|%10s|\n", "Пункт наз.", "Рейс № ",

"Стоимость", "Протяженн.", "Самолёт ");

for (i = 1; i <= 66; i++)

printf("-");

return;

}

//Просмотр базы данных расписаний

void viewDatabase1(const char *fname)

{

int i;

trip schedule;

FILE* baza;

baza = fopen(fname, PR_R);

printf("\n База данных расписаний");

outputHeader1();

while (fread(&schedule, sizeof(schedule), 1, baza) > 0)

{

printf("\n|%15s|%15s|%10i|%10i|%10s|", schedule.name, schedule.destination,

schedule.price, schedule.distance, schedule.plane);

}

printf("\n");

for (i = 1; i <= 66; i++)

printf("-");

fclose(baza);

return;

}

//Просмотр базы данных поиска расписаний по пункту назначения

void viewDatabase2(const char *fname)

{

int i;

trip schedule;

FILE* baza;

baza = fopen(fname, PR_R); //открываем файл на чтение

printf("\n База данных поиска расписаний по пункту назначения");

outputHeader2();

while (fread(&schedule, sizeof(schedule), 1, baza) > 0)

{

printf("\n|%15s|%15s|%10i|%10i|%10s|", schedule.destination, schedule.name,

schedule.price, schedule.distance, schedule.plane);

}

printf("\n");

for (i = 1; i <= 66; i++)

printf("-");

fclose(baza);

return;

}

//Поиск расписаний по названию пунктов назначения

void searchDestination(const char *fname1, const char *fname2)

{

char destination[15];

trip schedule;

FILE* in, //исходный файл

* out; //файл результатов поиска

in = fopen(fname1, PR_R); //открываем файл на чтение

out = fopen(fname2, PR_W); //открываем файл на запись

printf("\n Название пункта назначения для поиска? ");

scanf("%s", &destination);

while (fread(&schedule, sizeof(schedule), 1, in) > 0)

if (strncmp(schedule.destination, destination, 15) == 0)

fwrite(&schedule, sizeof(schedule), 1, out);

fclose(out);

fclose(in);

return;

}

//Сортировка по номеру рейса по алфавиту

void sortName(const char *fname)

{

int i;

int fl;

trip ppp, schedule;

FILE* baza;

baza = fopen(fname, PR_S); //открываем файл на чтение и запись

do {

rewind(baza);

fl = 0;

for (i = 0; fread(&schedule, sizeof(schedule), 1, baza) > 0; i += sizeof(schedule),

fseek(baza, i, SEEK_SET)) //позиция i от НАЧАЛА файла

{

if (fread(&ppp, sizeof(schedule), 1, baza) > 0)

{

if (strncmp(schedule.name, ppp.name, 15) > 0)

{

fseek(baza, i, SEEK_SET); //позиция i от НАЧАЛА файла

fwrite(&ppp, sizeof(schedule), 1, baza);

fwrite(&schedule, sizeof(schedule), 1, baza);

fl = 1;

}

}

}

} while (fl);

fclose(baza);

return;

}

//Сортировка по убыванию стоимости билета

void sortPrice(const char *fname)

{

int i;

int fl;

trip ppp, schedule;

FILE* baza;

baza = fopen(fname, PR_S); //открываем файл на чтение и запись

do {

rewind(baza);

fl = 0;

for (i = 0; fread(&schedule, sizeof(schedule), 1, baza) > 0; i += sizeof(schedule),

fseek(baza, i, SEEK_SET))

{

if (fread(&ppp, sizeof(schedule), 1, baza) > 0)

{

if (schedule.price > ppp.price)

{

fseek(baza, i, SEEK_SET); //позиция i от НАЧАЛА файла

fwrite(&ppp, sizeof(schedule), 1, baza);

fwrite(&schedule, sizeof(schedule), 1, baza);

fl = 1;

}

}

}

} while (fl);

fclose(baza);

return;

}

//проверка наличия физического файла

int checkFile(const char *fname, const char *pr)

{//Открываем файл

if (!(fopen(fname, pr))) //файл не существует

return(0);

return(1);

}