Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
2 / курс.docx
Скачиваний:
0
Добавлен:
16.05.2025
Размер:
773.78 Кб
Скачать

Содержание

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

3.2 Результат тестирования

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

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

#include <stdio.h>

#include <string.h>

#include <iostream>

#include <list>

#include <fstream>

using namespace std;

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

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

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

void dobavka(const char* fname);

void zag1();

void zag2();

void prosmotrbd1(const char* fname);

void prosmotrbd2(const char* fname);

void sort_name(const char* fname);

void sort_status(const char* fname);

void sort_genre(const char* fname);

void sort_type(const char* fname);

void sort_voz_duration(const char* fname);

void sort_ub_duration(const char* fname);

void sort_voz_rating(const char* fname);

void sort_ub_rating(const char* fname);

void sort_voz_year(const char* fname);

void sort_ub_year(const char* fname);

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

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 type[15]; //Тип аниме

char genre[15]; //Жанр

char status[15]; //Статус

float rating; //Рейтинг

int year; //Год выпуска

int duration; //Продолжительность

}trip;

#pragma warning(disable : 4996)

//main_Begin______________________________________________________________

int main()

{

int var;

char otv;

char fname_i[20] = FNAME_I;

char fname_r[20] = FNAME_R;

setlocale(LC_ALL, "Russian");

for (; ;)

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

system("cls");

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

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

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

cout << (" 3 - сортировка базы по \n");

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

cout << (" 5 - поиск по типу\n");

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

cout << (" 7 - завершение задачи\n");

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

cin >> var;

switch (var)

{

default:break;

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

{

cout << " Файл базы данных аниме " << fname_i;

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

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

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

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

{

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

cin >> fname_i;

}

else break;

}

if (!proverka_file(fname_i, PR_W))

{

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

break;

}

cout << " Создаем базу " << fname_i << endl;

getchar();

dobavka(fname_i);

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

if (proverka_file(fname_i, PR_R))

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

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

break;

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

{

cout << (" Файл базы данных аниме ", fname_i);

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

cout << (" Будут добавлены новые записи? [Y/N] ");

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

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

{

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

cin >> fname_i;

if (!proverka_file(fname_i, PR_R))

{

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

break;

}

}

}

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

dobavka(fname_i);

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

break;

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

{

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

break;

}

system("cls");

cout << (" Введите вид сортировки ") << endl;

cout << (" 1 - Сортировка базы по названию\n");

cout << (" 2 - Сортировка базы по статусу\n");

cout << (" 3 - Сортировка базы по жанру\n");

cout << (" 4 - Сортировка базы по типу\n");

cout << (" 5 - Сортировка базы по продолжительности (возрастание)\n");

cout << (" 6 - Сортировка базы по продолжительности (убывание)\n");

cout << (" 7 - Сортировка базы по райтингу (возрастание)\n");

cout << (" 8 - Сортировка базы по рейтингу (убывание)\n");

cout << (" 9 - Сортировка базы по году выпуска (возрастание)\n");

cout << (" 10 - Сортировка базы по году выпуска (убывание)\n");

cout << (" Введите вид сортировки -> ");

cin >> var;

switch (var)

{

default: break;

case 1:

{

sort_name(fname_i);

cout << ("\n Сортировка по названию закончена.");

}

break;

case 2:

{

sort_status(fname_i);

cout << ("\n Сортировка по базы по статусу закончена.");

}

break;

case 3:

{

sort_genre(fname_i);

cout << ("\n Сортировка по жанру закончена.");

}

break;

case 4:

{

sort_type(fname_i);

cout << ("\n Сортировка по типу закончена.");

}

break;

case 5:

{

sort_voz_duration(fname_i);

cout << ("\n Сортировка по продолжительности (возрастание) закончена.");

}

break;

case 6:

{

sort_ub_duration(fname_i);

cout << ("\n Сортировка по продолжительности (убывание) закончена.");

}

break;

case 7:

{

sort_voz_rating(fname_i);

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

}

break;

case 8:

{

sort_ub_rating(fname_i);

cout << ("\n Сортировка по рейтингу (убывание) закончена.");

}

break;

case 9:

{

sort_voz_year(fname_i);

cout << ("\n Сортировка по году выпуска (возрастание) закончена.");

}

break;

case 10:

{

sort_ub_year(fname_i);

cout << ("\n Сортировка по году выпуска (убывание) закончена.");

}

break;

}

case 4: if (!proverka_file(fname_i, PR_R))

{

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

break;

}

prosmotrbd1(fname_i);

cout << endl << endl;

system("pause");

break;

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

{

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

break;

}

if (!proverka_file(fname_r, PR_W))

{

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

break;

}

poisktype(fname_i, fname_r);

cout << ("\n Поиск по типу закончен.");

system("pause");

break;

case 6: if (!proverka_file(fname_r, PR_R))

{

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

break;

}

prosmotrbd2(fname_r);

cout << endl << endl;

system("pause");

break;

case 7: return 0;

}

}

}

//main_End________________________________________________________________

//Dobavka_Begin___________________________________________________________

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

void dobavka(const char* fname)

{

char otv;

trip table;

FILE* baza;

baza = fopen(fname, PR_A);

rewind(baza);

do

{

cout << (" Название: ");

cin >> table.name;

cout << (" Тип: ");

cin >> table.type;

cout << (" Жанр: ");

cin >> table.genre;

cout << (" Год выпуска: ");

cin >> table.year;

cout << (" Рейтинг: ");

cin >> table.rating;

cout << (" Продолжительность: ");

cin >> table.duration;

cout << (" Статус: ");

cin >> table.status;

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

cout << ("\n Продолжим?[Y/N]");

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

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

fclose(baza);

return;

}

//Dobavka_End_____________________________________________________________

//Zag1_Begin______________________________________________________________

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

void zag1()

{

int i;

cout << ("\n");

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

cout << ("-");

printf("\n");

printf("|%20s|%7s|%8s|%10s|%17s|%7s|%11s|\n",

"Название", "Тип", "Жанр", "Статус", "Продолжительность", "Рейтинг", "Год выпуска");

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

printf("-");

return;

}

//Zag1_End________________________________________________________________

//Zag2_Begin______________________________________________________________

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

void zag2()

{

int i;

printf("\n");

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

printf("-");

printf("\n");

printf("|%7s|%20s|%8s|%10s|%17s|%7s|%11s|\n",

"Тип", "Название ", "Жанр", "Статус", "Продолжительность", "Рейтинг", "Год выпуска");

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

printf("-");

return;

}

//Zag2_End________________________________________________________________

//ProsmotrBD1_Begin_______________________________________________________

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

void prosmotrbd1(const char* fname)

{

int i;

trip table;

FILE* baza;

baza = fopen(fname, PR_R);

printf("\n База данных аниме");

zag1();

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

{

printf("\n|%20s|%7s|%8s|%10s|%17i|%7g|%11i|", table.name, table.type, table.genre,

table.status, table.duration, table.rating, table.year);

}

printf("\n");

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

printf("-");

fclose(baza);

return;

}

//ProsmotrBd1_End_________________________________________________________

//ProsmotrBd2_Begin_______________________________________________________

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

void prosmotrbd2(const char* fname)

{

int i;

trip table;

FILE* baza;

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

printf("\n База данных аниме ");

zag2();

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

{

printf("\n|%7s|%20s|%8s|%10s|%17i|%7g|%11i|", table.type, table.name, table.genre,

table.status, table.duration, table.rating, table.year);

}

printf("\n");

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

printf("-");

fclose(baza);

return;

}

//ProsmotrBd2_End_________________________________________________________

//sort_name_Begin______________________________________________________

//Поиск названия аниме по алфавиту

void sort_name(const char* fname)

{

int i;

int fl;

trip ppp, table;

FILE* baza;

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

do {

rewind(baza);

fl = 0;

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

fseek(baza, i, SEEK_SET))

{

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

{

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

{

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

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

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

fl = 1;

}

}

}

} while (fl);

fclose(baza);

return;

}

//sort_name_End________________________________________________________

//Sort_type_Begin_________________________________________________________

void sort_type(const char* fname)

{

int i;

int fl;

trip ppp, table;

FILE* baza;

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

do {

rewind(baza);

fl = 0;

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

fseek(baza, i, SEEK_SET))

{

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

{

if (strncmp(table.type, ppp.type, 15) > 0)

{

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

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

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

fl = 1;

}

}

}

} while (fl);

fclose(baza);

return;

}

//sort_type_End________________________________________________________

//Sort_status_Begin_________________________________________________________

//Сортировка по статусу

void sort_status(const char* fname)

{

int i;

int fl;

trip ppp, table;

FILE* baza;

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

do {

rewind(baza);

fl = 0;

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

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

{

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

{

if (strncmp(table.status, ppp.status, 15) > 0)

{

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

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

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

fl = 1;

}

}

}

} while (fl);

fclose(baza);

return;

}

//Sort_status_End___________________________________________________________

//Sort_genre_Begin_________________________________________________________

//Сортировка по жанру

void sort_genre(const char* fname)

{

int i;

int fl;

trip ppp, table;

FILE* baza;

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

do {

rewind(baza);

fl = 0;

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

fseek(baza, i, SEEK_SET))

{

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

{

if (strncmp(table.genre, ppp.genre, 15) > 0)

{

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

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

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

fl = 1;

}

}

}

} while (fl);

fclose(baza);

return;

}

//Sort_ganre_End___________________________________________________________

void sort_voz_duration(const char* fname)

{

int i;

int fl;

trip ppp, table;

FILE* baza;

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

do {

rewind(baza);

fl = 0;

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

fseek(baza, i, SEEK_SET))

{

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

{

if (table.duration > ppp.duration)

{

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

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

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

fl = 1;

}

}

}

} while (fl);

fclose(baza);

return;

}

void sort_ub_duration(const char* fname)

{

int i;

int fl;

trip ppp, table;

FILE* baza;

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

do {

rewind(baza);

fl = 0;

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

fseek(baza, i, SEEK_SET))

{

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

{

if (table.duration < ppp.duration)

{

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

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

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

fl = 1;

}

}

}

} while (fl);

fclose(baza);

return;

}

void sort_voz_rating(const char* fname)

{

int i;

int fl;

trip ppp, table;

FILE* baza;

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

do {

rewind(baza);

fl = 0;

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

fseek(baza, i, SEEK_SET))

{

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

{

if (table.rating > ppp.rating)

{

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

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

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

fl = 1;

}

}

}

} while (fl);

fclose(baza);

return;

}

void sort_ub_rating(const char* fname)

{

int i;

int fl;

trip ppp, table;

FILE* baza;

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

do {

rewind(baza);

fl = 0;

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

fseek(baza, i, SEEK_SET))

{

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

{

if (table.rating < ppp.rating)

{

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

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

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

fl = 1;

}

}

}

} while (fl);

fclose(baza);

return;

}

void sort_voz_year(const char* fname)

{

int i;

int fl;

trip ppp, table;

FILE* baza;

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

do {

rewind(baza);

fl = 0;

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

fseek(baza, i, SEEK_SET))

{

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

{

if (table.year > ppp.year)

{

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

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

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

fl = 1;

}

}

}

} while (fl);

fclose(baza);

return;

}

void sort_ub_year(const char* fname)

{

int i;

int fl;

trip ppp, table;

FILE* baza;

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

do {

rewind(baza);

fl = 0;

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

fseek(baza, i, SEEK_SET))

{

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

{

if (table.year < ppp.year)

{

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

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

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

fl = 1;

}

}

}

} while (fl);

fclose(baza);

return;

}

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

{

char type[15];

trip table;

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

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

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

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

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

scanf("%s", &type);

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

if (strncmp(table.type, type, 15) == 0)

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

fclose(out);

fclose(in);

return;

}

//Poiskpost_End________________________________________________________

//proverka_file_Begin_____________________________________________________

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

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

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

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

return(0);

return(1);

}

//proverka_file_End_______________________________________________________

Соседние файлы в папке 2