Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Uchebnoe_posobie_dn_PYaVU_SI_15_nach2.doc
Скачиваний:
6
Добавлен:
01.07.2025
Размер:
4.24 Mб
Скачать

Пример программы

//Программа работы с базой данных "Экскурсии"

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

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

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

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

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

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

#include <stdio.h>

#include <stdlib.h>

#include <conio.h>

#include <string.h>

#include <iostream.h>;

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

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

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

void dobavka(char *fname) ; //добавление новых записей

void zag1() ; //вывод заголовка таблицы

void zag2() ; //вывод заголовка таблицы

void prosmotrbd1(char *fname) ; //просмотр содержимого файла

void prosmotrbd2(char *fname) ; //просмотр содержимого файла

void poiskcountry(char *fname1, char *fname2) ;//поиск по ключу

void sort_name(char *fname) ; //сортировка по строке

void sort_voz_cena(char *fname) ; //сортировка по числу

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

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

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

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

typedef struct {char name[15] ; //наименование экскурсии

char country[15] ; //страна

int cena ; //стоимость путевки

int time ; //продолжительность

char trans[10] ; //транспорт

}trip ;

//main_Begin______________________________________________________________

int main()

{int var ; //вид действия с содержимым файла

char otv ; //ответ пользователя

char fname_i[20] = FNAME_I ;

char fname_r[20] = FNAME_R ;

clrscr() ;

for( ; ;)

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

clrscr() ;

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

cout << " 1 - создание базы данных" << endl ;

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

cout << " 3 - сортировка по наименованию" << endl ;

cout << " 4 - сортировка по цене путёвки" << endl ;

cout << " 5 - поиск по стране" << endl ;

cout << " 6 - просмотр базы данных" << endl ;

cout << " 7 - просмотр базы данных поиска" << endl ;

cout << " 8 - завершение задачи" << endl ;

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

cin >> var ;

switch(var)

{default:break ;

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

{cout << " База данных экскурсий с именем "<< fname_i ;

cout << " была создана раньше." << endl ;

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

cin >> otv ;

cin.get() ; //убираем символ '\n' из потока

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

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

cin >> fname_i ;

}

else break ;

}

if(!proverka_file(fname_i, PR_W))

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

cout << " Для продолжения нажмите Enter->" ; getchar() ;

break ;

}

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

dobavka(fname_i) ;

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

if(proverka_file(fname_i, PR_R))

cout << " База данных готова к работе" << endl ;

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

cout << " Для продолжения нажмите Enter->" ; getchar() ;

break ;

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

{cout << " База данных экскурсий с именем "<< fname_i ;

cout << " была создана раньше." << endl ;

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

cin >> otv ;

cin.get() ; //убираем символ '\n' из потока

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

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

cin >> fname_i ;

if(!proverka_file(fname_i, PR_R))

{cout << " Такая база данных не создавалась" << endl ;

cout << " Для продолжения нажмите Enter->" ; getchar() ;

break ;

}

}

}

cout << " Добавляем записи в файл " << fname_i << endl ;

dobavka(fname_i) ;

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

cout << " Для продолжения нажмите Enter->" ; getchar() ;

break ;

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

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

cout << " Для продолжения нажмите Enter->" ; getchar() ;

break ;

}

sort_name(fname_i) ;

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

cout << " Для продолжения нажмите Enter->" ; getchar() ;

break ;

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

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

cout << " Для продолжения нажмите Enter->" ; getchar() ;

break ;

}

sort_voz_cena(fname_i) ;

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

cout << " Для продолжения нажмите Enter->" ; getchar() ;

break ;

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

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

cout << " Для продолжения нажмите Enter->" ; getchar() ;

break ;

}

if(!proverka_file(fname_r, PR_W))

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

cout << " Для продолжения нажмите Enter->" ; getchar() ;

break ;

}

poiskcountry(fname_i, fname_r) ;

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

cout << " Для продолжения нажмите Enter->" ; getchar() ;

break ;

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

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

cout << " Для продолжения нажмите Enter->" ; getchar() ;

break ;

}

prosmotrbd1(fname_i) ;

cout << "\n Для продолжения нажмите Enter->" ; getchar() ;

break ;

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

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

cout << " Для продолжения нажмите Enter->" ; getchar() ;

break ;

}

prosmotrbd2(fname_r) ;

cout << "\n Для продолжения нажмите Enter->" ; getchar() ;

break ;

case 8: return 0 ;

}

}

}

//main_End________________________________________________________________

//Dobavka_Begin___________________________________________________________

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

void dobavka(char *fname)

{char otv ;

trip excur ;

FILE *baza ;

baza = fopen(fname, PR_A) ;

rewind(baza) ;

do

{cout << "\n Наименование экскурсии? " ;

cin >> excur.name ;

cout << " Страна? " ;

cin >> excur.country ;

cout << " Стоимость путевки? " ;

cin >> excur.cena ;

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

cin >> excur.time ;

cout << " Транспорт? " ;

cin >> excur.trans ;

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

cout << "\n Продолжать?[Y/N]" ;

cin >> otv ;

cin.get() ;

}

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

fclose(baza) ;

}

//Dobavka_End_____________________________________________________________

//Zag1_Begin______________________________________________________________

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

void zag1()

{int i ;

cout << "\n" ;

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

cout << "-" ;

cout << endl ;

cout << "| Наименование |" << " Страна |" << " Стоимость|"

<< "Продолжит.|" << "Транспорт|" << endl ;

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

cout << "-" ;

}

//Zag1_End________________________________________________________________

//Zag2_Begin______________________________________________________________

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

void zag2()

{int i ;

cout << "\n" ;

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

cout << "-" ;

cout << endl ;

cout << "| Страна |" << " Наименование |" << " Стоимость|"

<< "Продолжит.|" << "Транспорт|" << endl ;

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

cout << "-" ;

}

//Zag2_End________________________________________________________________

//ProsmotrBD1_Begin_______________________________________________________

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

void prosmotrbd1(char *fname)

{int i ;

trip excur ;

FILE *baza ;

baza = fopen(fname, PR_R) ;

cout << "\n База данных экскурсий" ;

zag1() ;

rewind(baza) ;

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

{cout << "\n|" ;

cout.width(15) ; cout << excur.name << "|" ;

cout.width(15) ; cout << excur.country << "|" ;

cout.width(10) ; cout << excur.cena << "|" ;

cout.width(10) ; cout << excur.time << "|" ;

cout.width(9) ; cout << excur.trans << "|" ;

}

cout << "\n" ;

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

cout << "-" ;

fclose(baza) ;

}

//ProsmotrBd1_End_________________________________________________________

//ProsmotrBd2_Begin_______________________________________________________

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

void prosmotrbd2(char *fname)

{int i ;

trip excur ;

FILE *baza ;

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

cout << "\n База данных поиска экскурсий по стране" ;

zag2() ;

rewind(baza) ;

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

{cout << "\n|" ;

cout.width(15) ; cout << excur.country << "|" ;

cout.width(15) ; cout << excur.name << "|" ;

cout.width(10) ; cout << excur.cena << "|" ;

cout.width(10) ; cout << excur.time << "|" ;

cout.width(9) ; cout << excur.trans << "|" ;

}

cout << endl ;

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

cout << "-" ;

fclose(baza) ;

}

//ProsmotrBd2_End_________________________________________________________

//PoiskCountry_Begin______________________________________________________

//Поиск по стране пребывания

void poiskcountry(char *fname1, char *fname2)

{unsigned char country[15] ;

trip excur ;

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

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

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

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

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

cin >> country ;

rewind(in) ;

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

if(strncmp(excur.country, country, 15) == 0)

{fwrite(&excur, sizeof(excur), 1, out) ;

}

fclose(out) ;

fclose(in) ;

}

//PoiskCountry_End________________________________________________________

//Sort_name_Begin_________________________________________________________

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

void sort_name(char *fname)

{int i ;

int fl ;

trip ppp, excur ;

FILE *baza ;

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

do{rewind(baza) ;

fl = 0 ;

for(i =0; fread(&excur, sizeof(excur), 1, baza) > 0; i += sizeof(excur), fseek(baza, i, SEEK_SET)) //позиция i от НАЧАЛА файла

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

{if(strncmp(excur.name, ppp.name, 15) > 0)

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

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

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

fl = 1 ;

}

}

}

}

while(fl) ;

fclose(baza) ;

}

//Sort_name_End___________________________________________________________

//Sort_cena_Begin_________________________________________________________

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

void sort_voz_cena(char *fname)

{int i ;

int fl ;

trip ppp, excur ;

FILE *baza ;

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

do{rewind(baza) ;

fl = 0 ;

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

fseek(baza, i, SEEK_SET))

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

{if(excur.cena > ppp.cena)

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

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

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

fl = 1 ;

}

}

}

}

while(fl) ;

fclose(baza) ;

}

//Sort_cena_End___________________________________________________________

//proverka_file_Begin_____________________________________________________

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

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

{

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

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

return(0) ;

return(1) ;

}

//proverka_file_End_______________________________________________________

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]