
Схемы алгоритмов
Рисунок 1. Основное меню программы
Рисунок 2. Создание новой БД
Рисунок 3. Просмотр БД из файла
Рисунок 4. Редактирование БД
Рисунок 5. Добавление записи
Рисунок 6. Удаление записи
Рисунок 7. Просмотр БД
Рисунок 8. Сортировка записей
Рисунок 9. Сохранение БД
Листинг программного кода
#include <conio.h>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
//#include <alloc.h>
struct TStruct //основная структура
{
char time[10]; //время заказа
char adr[20]; //адрес заказчика
int kol; //количество пицц
int cost; //стоимость заказа
};
struct TPizza
{
TStruct *px; //указатель на массив записей
int n; //число строк в массиве
TPizza(){n=0;px=NULL;} //конструктор
~TPizza(){n=0;if(px!=NULL)free(px);} //деструктор
void loadFile(); //ввод БД из файла
void newBase(); //создание новой БД
void print(); //вывод БД на экран
void edit(); //редактирование БД
int choose(); //выбор нужной строки
void saveFile(); //сохранение БД в файл
void add(); //добавление новой записи
void del(); //удаление записи
void sort(); //сортировка записей
};
void TPizza::loadFile() //ввод БД из файла
{
FILE *fin;
int i; //рабочая переменная для подсч¸та
TStruct t; //рабочая переменная для подсч¸та записей в файле
char file[10]; //переменная для названия файла
if(px!=NULL){free(px);n=0;px=NULL;} //очистка рабочей области(массива)
printf("Imya vhodnogo faila: ");
scanf("%s",file);
fin = fopen(file,"r");
if(fin==NULL){printf("%s ne otkrit\n",file);getch();return;}
n=0;
//подсч¸т записей в файле
do{fscanf(fin,"%s%s%d%d",&t.time,t.adr,&t.kol,&t.cost);
n++;
} while(!feof(fin)); //пока файл не закончился
n--;
fclose(fin);
px=(TStruct *) malloc (sizeof(TStruct) * n); //выделение динамической памти
if(px==NULL){printf("Net pamyati\n");getch();return;}
fin = fopen(file,"r");
if(fin==NULL){printf("%s ne otkrit\n",file);getch();return;}
//ввод массива из файла
for(i=0;i<n;i++)
{fscanf(fin,"%s%s%d%d",&px[i].time,px[i].adr,&px[i].kol,&px[i].cost);
}
fclose(fin);
}
void TPizza::saveFile() //сохранение БД в файл
{
FILE *fout;
char file[20]; //переменная для названия файла
int i; //рабочая переменная для подсч¸та
if(px==NULL){printf("Massiv pust\n");getch();return;}
printf("Vvedite fail dlya sohraneniya: ");
scanf("%s",file);
fout = fopen(file,"w");
if(fout==NULL){printf("%s ne sozdan\n",file);getch();n=0;px=NULL;return;}
//запись БД в файл
for(i=0;i<n;i++)
{fprintf(fout,"%s %s %d %d\n",px[i].time,px[i].adr,px[i].kol,px[i].cost);
}
fclose(fout);
printf("Baza dannih sohranena\n");
getch();
}
void TPizza::newBase() //создание новой БД
{int i; //рабочая переменная для подсч¸та
printf("Kolichestvo zapisey = ");
scanf("%d",&n);
if(px!=NULL)free(px); //очистка рабочей области(массива)
px=(TStruct *) malloc (sizeof(TStruct) * n); //выделение динамической памяти
if(px==NULL){printf("Net pamyati\n");getch();n=0;return;}
//создание базы данных
for(i=0;i<n;i++)
{
printf("Vremja zakaza: "); scanf("%s",&px[i].time);
printf("Adres zakaz4ika: ");scanf("%s",&px[i].adr);
printf("Koli4estvo pizz: ");scanf("%d",&px[i].kol);
printf("Stoimost` zakaza: ");scanf("%d",&px[i].cost);
printf("\n");
}
printf("Baza dannih sozdana\n");
getch();
}
void TPizza::print() //вывод БД на экран
{int i; //переменная для подсч¸та
if(px==NULL){printf("Massiv pust\n");getch();return;}
system("cls");
printf("\n -----ZAKAZI NA DOSTAVKU PIZZI NA DOM-----\n\n");
printf("%3s%10s%20s%8s%10s\n","N","Vremja","Adres","pizz","Cena");
//вывод БД на экран
for(i=0;i<n;i++)
{
printf("%3d%10s%20s%8d%10d\n",i+1,px[i].time,px[i].adr,px[i].kol,px[i].cost);
};
getch();
}
int TPizza::choose() //выбор нужной строки
{int k; //рабочая переменная для выбора строки
print(); //вызывается функция вывода БД на экран
printf("Vuiberite stroku: ");scanf("%d",&k);
k--;
if(k<0|| k>=n){printf("Net takoi stroki\n");getch();}
return k;
}
void TPizza::edit() //редактирование БД
{int j, //рабочая переменная для выбора пункта
N; //рабочая переменная для вызова функции
if(px==NULL){printf("Massiv pust\n");getch();return;}
N=choose(); //вызывается функция выбора строки
if ((N<0) || (N>=n)) return;
while(1)
{
system("cls"); //очистка экрана
printf("%3s%10s%20s%8s%10s\n","N","Vremja","Adres","pizz","Cena");
printf("%3d%10s%20s%8d%10d\n",N+1,px[N].time,px[N].adr,px[N].kol,px[N].cost);
printf("1.Vremja zakaza\n2.Adres zakaz4ika\n3.Koli4estvo pizz\n4.Stoimost` zakaza\n5.menu\nVash vibor ");
scanf("%d",&j);
//выбор редактируемого поля
switch(j)
{
case 1:printf("Vremja zakaza: ");scanf("%s",&px[N].time);break;
case 2:printf("Adres zakaz4ika:");scanf("%s",&px[N].adr);
case 3:printf("Koli4estvo pizz: ");scanf("%d",&px[N].kol);break;
case 4:printf("Stoimost` zakaza: ");scanf("%d",&px[N].cost);break;
case 5:return;
default :printf("Neverniy vibor\n povtorite\n");getch();
}
}
}
void TPizza::add()
{int i;
TStruct t,
*p;
if(px==NULL){printf("massiv pyst\n");getch();return;}
printf("Vremja zakaza: "); scanf("%s",&t.time);
printf("Adres zakaz4ika: ");fflush(stdin); gets(t.adr);
printf("Koli4estvo pizz: ");scanf("%d",&t.kol);
printf("Stoimost` zakaza: ");scanf("%d",&t.cost);
p=px;
px=(TStruct *) malloc (sizeof(TStruct) * (n+1)); //выделение динамической памяти
if(px==NULL){printf("Net pamyati.\n");getch();return;}
for(i=0;i<n;i++)
px[i]=p[i];
px[n]=t;
n++;
free(p);
printf("Zapis dobavlena\n");getch();
}
void TPizza::del()
{int i,N;
TStruct *t;
if(px==NULL){printf("Zakazov net\n");getch();return;}
t=(TStruct *) malloc (sizeof(TStruct) * (n-1)); //выделение динамической памяти
if(t==NULL){printf("Net pamyati\n");getch();n=0;return;}
if(n==1){free(px);px=NULL;}
else {N=choose();
if ((N<0) || (N>=n)) return;
for(i=0;i<N;i++)
t[i]=px[i];
for(i=N+1;i<n;i++)
t[i-1]=px[i];
free(px);
px=t;
}
n--;printf("zapis udalena\n");getch();
}
void TPizza::sort()
{
TStruct tmp;
int i,j,min;
for (i=0; i<n-1; i++)
{
min=i;
for (j=i+1; j<n; j++)
if (px[j].cost<px[min].cost) min=j;
tmp=px[i];
px[i]=px[min];
px[min]=tmp;
}
printf("Zapisi otsortirovani\n");
getch();
}
void main ()
{TPizza a;
int j;
while (1)
{
system("cls");
printf("%30s%s"," ","1.Novaya baza dannih\n");
printf("%30s%s"," ","2.Prosmotr bazi dannih iz faila\n");
printf("%30s%s"," ","3.Redaktirovanie bazi dannih\n");
printf("%30s%s"," ","4.Dobavlenie novoi zapisi\n");
printf("%30s%s"," ","5.Udalenie zapisi\n");
printf("%30s%s"," ","6.Prosmotr bazi dannih\n");
printf("%30s%s"," ","7.Sortirovka bazi dannih po stoimasti zakaza\n");
printf("%30s%s"," ","8.Sohranenie bazi dannih v fajl\n");
printf("%30s%s"," ","0.Vihod\n");
printf("Vash vibor: ") ;scanf("%d",&j);
switch(j)
{
case 1:a.newBase();break;
case 2:a.loadFile();a.print();break;
case 3:a.edit();break;
case 4:a.add();break;
case 5:a.del();break;
case 6:a.print();break;
case 7:a.sort();break;
case 8:a.saveFile();break;
case 0:printf("Poka");getch ();return;
default :printf("Neverniy vibor\n povtorite\n");getch();
}
}
}