Пример программы
//Программа работы с базой данных "Экскурсии"
//Создание базы
//Просмотр базы
//Поиск по названию страны с созданием файла выборки
//Сортировка по наименованию экскурсии в алфавитном порядке
//Сортировка в порядке возрастания стоимости путевки
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <string.h>
#include <iostream.h>;
#define FNAME1 "A:\\bd1.dat" //имя файла с исходной базой
#define FNAME2 "A:\\bd2.dat" //имя файла с результатами поиска
void wind(int x1,int y1,int x2,int y2,int colf,int colb);
void dobavka();
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);
struct trip{unsigned char name[15]; //наименование экскурсии
unsigned char country[15]; //страна
unsigned int cena; //стоимость путевки
unsigned int time; //продолжительность
unsigned char trans[10]; //транспорт
};
FILE *baza1;
trip excur;
char otv;
int main()
{int var;
textbackground(BLACK);
clrscr();
wind(1, 1, 80, 25, 1, 15);
if((baza1 = fopen(FNAME1, "r+")) != NULL)
{printf(" База данных экскурсий была создана раньше.\n");
printf(" Добавлять новые записи в базу зкскурсий? [Y/N]");
while(otv = getchar() == '\n');
if(otv == 'Y' || otv == 'y' || otv == 'Н' || otv == 'н')
if((baza1 = fopen(FNAME1, "a")) == NULL)
{printf("\n Ошибка открытия базы данных для добавления\n");
abort();
}
else{printf("\n Добавляем новые записи\n");
dobavka();
fclose(baza1);
}
}
else if((baza1 = fopen(FNAME1, "w+")) == NULL)
{printf("\n Ошибка открытия пустой базы данных для чтения и записи\n");
abort();
}
else{printf(" Создаем новую базу\n");
dobavka();
fclose(baza1);
}
if((baza1 = fopen(FNAME1, "r+")) == NULL)
{printf("\n Ошибка открытия базы данных для чтения и записи\n");
abort();
}
else printf("\n База данных успешно создана\n");
printf("\n Для продолжения нажмите Enter->");
getchar();
for( ; ;) //меню программы
{wind(1, 1, 80, 25, 0, 15);
wind(20, 1, 60, 9, 1, 15);
//Выбор вида действия
cprintf( "\n Вид действия:\n\r");
cprintf(" 1 - сортировка по наименованию\n\r");
cprintf(" 2 - сортировка по цене путевки\n\r");
cprintf(" 3 - поиск по стране\n\r");
cprintf(" 4 - просмотр базы данных\n\r");
cprintf(" 5 - просмотр базы данных поиска\n\r");
cprintf(" 6 - завершение задачи\n\r");
cprintf(" Введите вид действия ->");
cin >> var;
if(var == 6) break;
switch(var)
{case 1: wind(1, 10, 80, 15, 4, 15);
sort_name(FNAME1);
printf("\n Сортировка закончена.");
printf("\n Для продолжения нажмите Enter->");
getchar();
break;
case 2: wind(1, 10, 80, 15, 2, 15);
sort_voz_cena(FNAME1);
printf("\n Сортировка закончена.");
printf("\n Для продолжения нажмите Enter->");
getchar();
break;
case 3: wind(1, 10, 80, 25, 2, 15);
poiskcountry(FNAME1, FNAME2);
printf("\n Поиск по стране закончен.");
printf("\n Для продолжения нажмите Enter->");
getchar();
break;
case 4: wind(1, 10, 80, 25, 2, 15);
prosmotrbd1(FNAME1);
printf("\n Для продолжения нажмите Enter->");
getchar();
break;
case 5: wind(1, 10, 80, 25, 2, 15);
prosmotrbd2(FNAME2);
printf("\n Для продолжения нажмите Enter->");
getchar();
}
}
return 0;
}
//Вывод окна на экран
void wind(int x1,int y1,int x2,int y2,int colf,int colb)
{window(x1,y1,x2,y2);
textbackground(colf);
textcolor(colb);
clrscr();
}
//Добавление новых элементов в базу данных
void dobavka()
{do
{printf("\nНаименование экскурсии? ");
scanf("%s", &excur.name);
printf("\nСтрана? ");
scanf("%s", &excur.country);
printf("\nСтоимость путевки? ");
scanf("%u", &excur.cena);
printf("\nПродолжительность? ");
scanf("%u", &excur.time);
printf("\nТранспорт? ");
scanf("%s", &excur.trans);
fwrite(&excur, sizeof(excur), 1, baza1);
printf("\nПродолжать?[Y/N]");
while((otv = getchar()) == '\n');
}
while(otv == 'Y' || otv == 'y' || otv == 'Н' || otv == 'н');
}
//Вывод заголовка при просмотре исходного файла
void zag1()
{int i ;
printf("\n");
for(i = 1; i <= 65; i++)
printf("-");
printf("\n|%15s|%15s|%10s|%10s|%10s\n",
"Наименование","Страна","Стоимость","Продолжит.","Транспорт");
for(i = 1; i <= 65; i++)
printf("-");
}
//Вывод заголовка при просмотре файла поиска
void zag2()
{int i ;
printf("\n");
for(i = 1; i <= 65; i++)
printf("-");
printf("\n|%15s|%15s|%10s|%10s|%10s\n",
"Страна","Наименование","Стоимость","Продолжит.","Транспорт");
for(i = 1; i <= 65; i++)
printf("-");
}
//Просмотр базы данных экскурсий
void prosmotrbd1(char *fname)
{int i ;
FILE *baza1;
if((baza1 = fopen(fname, "r+")) == NULL)
{printf("\n Ошибка открытия базы данных\n");
abort();
}
printf("\n База данных экскурсий");
zag1();
rewind(baza1);
while(fread(&excur, sizeof(excur), 1, baza1) > 0)
{printf("\n|%15s|%15s|%10u|%10u|%10s",
excur.name, excur.country, excur.cena, excur.time, excur.trans);
}
printf("\n");
for(i = 1; i <= 65; i++)
printf("-");
}
//Просмотр базы данных поиска экскурсий по стране пребывания
void prosmotrbd2(char *fname)
{int i;
FILE *baza2;
if((baza2 = fopen(fname, "r+")) == NULL)
{printf("\n Ошибка открытия базы данных\n");
abort();
}
printf("\n База данных поиска экскурсий по стране");
zag2();
rewind(baza2);
while(fread(&excur, sizeof(excur), 1, baza2) > 0)
{printf("\n|%15s|%15s|%10u|%10u|%10s",
excur.country, excur.name, excur.cena, excur.time, excur.trans);
}
printf("\n") ;
for(i = 1; i <= 65; i++)
printf("-");
}
//Поиск по стране пребывания
void poiskcountry(char *fname1, char *fname2)
{unsigned char country[15];
FILE *baza1,
*baza2;
if((baza2=fopen(fname2, "w+")) == NULL)
{printf("\n Ошибка открытия пустой базы данных для записи\n");
abort();
}
if((baza1 = fopen(fname1, "r+")) == NULL)
{printf("\n Ошибка открытия базы данных для чтения и записи\n");
abort();
}
printf("\n Название страны для поиска? ");
scanf("%s", &country);
rewind(baza1);
while(fread(&excur, sizeof(excur), 1, baza1) > 0)
if(strncmp(excur.country, country, 15) == 0)
{fwrite(&excur, sizeof(excur), 1, baza2);
}
fclose(baza2);
fclose(baza1);
getchar();
}
//Сортировка по наименованию экскурсии по алфавиту
void sort_name(char *fname)
{int i;
int fl;
trip ppp;
FILE *baza1;
if((baza1 = fopen(fname, "r+")) == NULL)
{printf("\n Ошибка открытия базы данных для чтения и записи\n");
abort();
}
fl=0;
do{rewind(baza1);
fl=0;
for(i=0; fread(&excur, sizeof(excur), 1, baza1) > 0; i += sizeof(excur),
fseek(baza1, i, SEEK_SET)) //позиция i от НАЧАЛА файла
{if(fread(&ppp, sizeof(excur), 1, baza1) > 0)
{if(strncmp(excur.name, ppp.name, 15) > 0)
{fseek(baza1, i, SEEK_SET); //позиция i от НАЧАЛА файла
fwrite(&ppp, sizeof(excur), 1, baza1);
fwrite(&excur, sizeof(excur), 1, baza1);
fl = 1;
}
}
}
}
while(fl);
fclose(baza1);
}
//Сортировка по убыванию стоимости путевки
void sort_voz_cena(char *fname)
{int i;
int fl;
trip ppp;
FILE *baza1;
if((baza1 = fopen(fname, "r+")) == NULL)
{printf("\n Ошибка открытия базы данных для чтения и записи\n");
abort();
}
fl = 0;
do{rewind(baza1);
fl = 0;
for(i=0; fread(&excur, sizeof(excur), 1, baza1) > 0; i += sizeof(excur),
fseek(baza1, i, SEEK_SET))
{if(fread(&ppp, sizeof(excur), 1, baza1) > 0)
{if(excur.cena > ppp.cena)
{fseek(baza1, i, SEEK_SET); //позиция i от НАЧАЛА файла
fwrite(&ppp, sizeof(excur), 1, baza1);
fwrite(&excur, sizeof(excur), 1, baza1);
fl = 1;
}
}
}
}
while(fl);
fclose(baza1);
}