
- •Введение
- •1 Постановка задачи
- •2 Спецификация
- •Содержание
- •3.1 Текст программы
- •3.2 Результат тестирования
- •3 Текст программы
- •3.1 Текст программы
- •3.2 Результат тестирования
- •4 Описание программы
- •4.1 Общие сведения
- •4.2 Функциональное назначение
- •4.3 Описание логической структуры
- •4.4 Спецификация основных функций
- •4.5 Используемые технические средства
- •4.6 Вызов и загрузка
- •Содержание
- •5.1 Назначение программы
- •5.3 Описание задачи
Содержание
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_______________________________________________________