#include<stdlib.h>
#include<stdio.h>
#include<dos.h>
#include<conio.h>
#include<io.h>
#include<string.h>
#define FILENAME "bse.db"
typedef struct{
long offs;
char brand[13];
char coun[15];
char mile[9];
char engn[10];
char body[15];
char year[5];
char price[10];
char flag;
}Tbase;
Tbase b;
Tbase base[24];
int n2,w,find[40],n=0,def=0,n1,l=0;
FILE *f;
void b_null(Tbase *b)
{b->brand[0]=NULL;
b->coun[0]=NULL;
b->mile[0]=NULL;
b->engn[0]=NULL;
b->body[0]=NULL;
b->year[0]=NULL;
b->price[0]=NULL;
}
/*Funkcija prjachet kursor*/
void hide_cur()
{
union REGS r;
r.h.ah=0x1;
r.h.cl=0x0;
r.h.ch=0x20;
int86(0x10,&r,&r);
}
/*Funkcija pokazyvaet kursor*/
void show_cur()
{
union REGS r;
r.h.ah=0x1;
r.h.cl=0x7;
r.h.ch=0x6;
int86(0x10,&r,&r);
}
/*Funkcija dlja vvoda straki v opredelennom meste jekrana*/
char enterstr(int xx,int y,int len,char *str)
{int z,x=0,i;
unsigned char ch;
z=strlen(str);
gotoxy(xx+x,y);
cprintf("%s",&str[0]);
do
{gotoxy(xx+x,y);
ch=getch();
if (ch==27) return ch;
if (ch==0) {ch=getch();
if ((ch==75)&&(x>0)) x--;
if ((ch==77)&&(x<z)) x++;
if (ch==79) x=z;
if (ch==71) x=0;
if ((ch==0x83)&&(x<z))
{for (i=x;i<=z;i++) str[i]=str[i+1];
str[z-1]=0;
z--;
}
ch=0;
}
if ((ch==8)&&(x>0)) {for (i=x;i<=z;i++) str[i-1]=str[i];
str[z-1]=0;
x--;z--;
}
if ((ch>31)&&(z<len)){if (x==z) {str[x]=ch;
str[x+1]=0;
}
if (x<z) {for (i=z+1;i>=x;i--) str[i+1]=str[i];
str[x]=ch;
}
x++;z++;
}
for (i=0;i<=strlen(str);i++)
{gotoxy(xx+i,y);
cprintf(" ");
}
if (z>0)
{
gotoxy(xx,y);
cprintf("%s",&str[0]);
}
}while(ch!=13);
if (z>0) return '0'; &str[0];
str[0]=NULL;
return NULL;
}
/*Funkcija dlja ochistki polej formy dlja vvoda zapisej*/
void clear()
{int i;
textcolor(15);
textbackground(0);
for (i=4;i<26;i+=2)
{gotoxy(55,i);
cprintf(" ");
}
}
/*Funkcija dlja vyvoda polja-podskazki*/
void www()
{textcolor(0);
textbackground(3);
gotoxy(10,1);
cprintf("\xc2");
gotoxy(10,8);
cprintf("\xb4");
gotoxy(1,8);
cprintf("\xc3");
gotoxy(10,25);
cprintf("\xc1");
textcolor(7);
textbackground(0);
gotoxy(2,9);
textcolor(15);
cprintf("del F8");
gotoxy(2,10);
cprintf("edit F4");
}
/*Funkcija dlja prorisovki okon*/
void win(int x,int y,int xw,int yw,char*str)
{int i,j;
textcolor(0);
textbackground(3);
gotoxy(x,y);
cprintf("|");
gotoxy(x+xw,y);
cprintf("|");
gotoxy(x,y+yw-1);
cprintf("|");
gotoxy(x+xw,y+yw-1);
cprintf("|");
for(j=0;j<yw;j++)
{
if ((j!=0)&&(j!=yw-1))
{gotoxy(x,y+j);
cprintf("|");
gotoxy(x+xw,y+j);
cprintf("|");
}
if ((j==0)||(j==yw-1))
{
for(i=1;i<xw;i++)
{gotoxy(x+i,y+j);
cprintf("|");
}
}
}
x=x+(xw-strlen(str))/2+1;
textcolor(0);
textbackground(7);
gotoxy(x,y);
cprintf(str);
textcolor(7);
textbackground(0);
}
/*Funkcija dlja vyvoda soobshhenij*/
void warning(char*str)
{int i,j;
win(25,10,30,10," Information ");
for (i=26;i<55;i++)
for (j=11;j<19;j++)
{gotoxy(i,j);
cprintf(" ");
}
gotoxy(26+(30-strlen(str))/2,12);
printf(str);
getch();
}
void show()
{char *inf[8]={"Car brand ",
"Country producer ",
"Mileage ",
"Engine type ",
"Body type ",
"Year ",
"Price "};
int i;
clrscr();
win(1,1,9,8," Menu ");
win(1,8,9,18,"");
win(10,1,19,25," Car brand ");
www();
win(30,1,16,25," Year ");
win(47,1,5,25,"Price$ ");
win(53,1,26,25," Information ");
textbackground(7);
textcolor(15);
textbackground(0);
for(i=0;i<12;i++)
{ gotoxy(55,3+i*2);
cprintf(inf[i]);
}
}
/*Funkcija dlja zagruzki tekushhih knig*/
void load_books()
{f=fopen(FILENAME,"rb");
w=0;n=0;
fseek(f,0,0);
while (!feof(f))
{if ((def<=n)&&(w<=23)&&(w+def<=n))
{fread(&base[w],sizeof(Tbase),1,f);
if (base[w].flag==1) w++;
}
else fread(&b,sizeof(Tbase),1,f);
n++;
}n--;if (w>n) w--;
fclose(f);
}
/*Funkcija vyvoda spiska zapisej*/
void view_books()
{int i;
textbackground(0);
for (i=0;i<w;i++)
{
gotoxy(11,2+i);
cprintf(" ");
gotoxy(11,2+i);
cprintf(base[i].brand);
gotoxy(31,2+i);
cprintf(" ");
gotoxy(31,2+i);
cprintf(base[i].year);
gotoxy(48,2+i);
cprintf(" ");
gotoxy(48,2+i);
cprintf(base[i].price);
}
}
/*Funkcija vyvoda polnoj informacii potekushhej zapisi*/
void show_one(int i)
{gotoxy(55,4);
cprintf(base[i].brand);
gotoxy(55,6);
cprintf(base[i].coun);
gotoxy(55,8);
cprintf(base[i].mile);
gotoxy(55,10);
cprintf(base[i].engn);
gotoxy(55,12);
cprintf(base[i].body);
gotoxy(55,14);
cprintf(base[i].year);
gotoxy(55,16);
cprintf(base[i].price);
}
/*Funkcija redaktirovanija zapisej*/
void edit(int i)
{ char ch;
int num=0;
f=fopen(FILENAME,"r+b");
fseek(f,i*sizeof(Tbase),0);
show_cur();
clear();
do{ switch(num)
{case 0: ch=enterstr(55,4,17,base[i].brand);break;
case 1: ch=enterstr(55,6,9,base[i].coun); break;
case 2: ch=enterstr(55,8,9,base[i].mile); break;
case 3: ch=enterstr(55,10,14,base[i].engn);break;
case 4: ch=enterstr(55,12,14,base[i].body);break;
case 5: ch=enterstr(55,14,14,base[i].year);break;
case 6: ch=enterstr(55,16,9,base[i].price); break;
}if (ch=='0') num++;
if (ch==0x1b) {hide_cur();
load_books();
view_books();
return;
}
} while(num!=7);
fwrite(&base[i],sizeof(Tbase),1,f);
fclose(f);
hide_cur();
load_books();
view_books();
}
/*Funkcija ochijatki polej spiska*/
void clean()
{int i;
for(i=2;i<25;i++)
{
gotoxy(11,i);
cprintf(" ");
gotoxy(31,i);
cprintf(" ");
gotoxy(48,i);
cprintf(" ");
}
}
/*Funkcija udalenija tekushhej zapisi*/
void del(int i)
{ Tbase b;
clear();
f=fopen(FILENAME,"r+b");
if (i+def!=n2-1)
{
fseek(f,(n2-1)*sizeof(Tbase),0);
fread(&b,sizeof(Tbase),1,f);
fseek(f,(base[i].offs),0);
b.offs=ftell(f);
fwrite(&b,sizeof(b),1,f);
}
fflush(f);
chsize(fileno(f),sizeof(Tbase)*(n2-1));
fclose(f);
clean();
load_books();
view_books();
n2--;
}
/*Funkcija dobavlenija zapisi*/
void add()
{int i,num=0;
char ch;
Tbase b;
if (n==32767)
{warning("Slizhkom mnogo zapisej");
show();
view_books();
return;
}
b_null(&base[i]);
show_cur();
f=fopen(FILENAME,"ab");
clear();
b_null(&b);
do{ switch(num)
{case 0: ch=enterstr(55,4,17,base[i].brand);break;
case 1: ch=enterstr(55,6,9,base[i].coun); break;
case 2: ch=enterstr(55,8,9,base[i].mile); break;
case 3: ch=enterstr(55,10,14,base[i].engn);break;
case 4: ch=enterstr(55,12,14,base[i].body);break;
case 5: ch=enterstr(55,14,14,base[i].year);break;
case 6: ch=enterstr(55,16,9,base[i].price); break;
}if (ch=='0') num++;
if (ch==0x1b) {hide_cur();
load_books();
view_books();
return;
}
} while (num!=7);
base[i].flag=1;
base[i].offs=n*sizeof(b);
n++;
n2++;
fwrite(&base[i],sizeof(Tbase),1,f);
fclose(f);
hide_cur();
load_books();
view_books();
}
/*Funkcija peredvizhenija kursora po spisku zapisej*/
void view()
{int i,m;
char ch;
if (n==0) return;
i=l;
textcolor(15);
do{
if (i+def>n) def=n;
clear();
show_one(i);
view_books();
textbackground(13);
gotoxy(11,2+i);
cprintf(base[i].brand);
gotoxy(31,2+i);
cprintf(base[i].year);
gotoxy(48,2+i);
cprintf(base[i].price);
fflush(stdin);
ch=getch();
if (ch==0) {textbackground(0);
gotoxy(11,2+i);
cprintf(base[i].brand);
gotoxy(31,2+i);
cprintf(base[i].year);
gotoxy(48,2+i);
cprintf(base[i].price);
ch=getch();
if (ch=='H'){if ((i==0)&&(def>0)) {def--;load_books();
view_books();}
if ((i>0)&&((def+i)>0)) i--;
}
if (ch=='P'){if ((i==22)&&(i+def<n-1)) {def++;load_books();
view_books();}
if ((i<22)&&((def+i)<n-1)&&(i<w-1)) i++;
}
if (ch==0x3e) edit(i+def);
if (ch==66) if (n!=0)
{
del(i);
if (i>0) i--;
clean();
view_books();
if (n==0) return;
load_books();
}
}
}while(ch!=0x1b);
l=i;
textbackground(0);
gotoxy(11,2+i);
cprintf(base[i].brand);
gotoxy(31,2+i);
cprintf(base[i].year);
gotoxy(48,2+i);
cprintf(base[i].price);
}
/*Funkcija poiska zapisej*/
void search()
{
Tbase b,ba;
int a,pol,i=0,q;
long year,y;
char ch,flag,*menu[1]={"Press Enter"};
struct date d;
win(31,10,15,5,"Poisk");
textcolor(15);
while(ch!=13&&ch!=27)
{
for(q=0;q<1;q++)
{
gotoxy(32,11+q);
if(i==q){textbackground(1);cprintf("%s",menu[q]);}
else{textattr(15);cprintf("%s",menu[q]);}
}
ch=getch();
if(ch==72)i--;
if(ch==80)i++;
if(i==3)i=0;
if(i==-1)i=2;
}
if(ch==27)i=0;
switch(i+1)
{case 1:
win(53,1,26,25," Poisk ");
clear();
show_cur();
b_null(&b);
enterstr(55,4,17,b.brand);
enterstr(55,6,9,b.coun);
enterstr(55,8,9,b.mile);
enterstr(55,10,14,b.engn);
enterstr(55,12,14,b.body);
enterstr(55,14,14,b.year);
enterstr(55,16,9,b.price);
f=fopen(FILENAME,"r+b");
n1=0;n=n2;
for(a=0;a<n;a++)
{flag=1;
fseek(f,a*sizeof(ba),0);
fread(&ba,sizeof(ba),1,f);
if (strstr(ba.brand,b.brand)==NULL) flag=0;
if (strstr(ba.coun,b.coun)==NULL) flag=0;
if (strstr(ba.mile,b.mile)==NULL) flag=0;
if (strstr(ba.engn,b.engn)==NULL) flag=0;
if (strstr(ba.body,b.body)==NULL) flag=0;
if (strstr(ba.year,b.year)==NULL) flag=0;
if (strstr(ba.price,b.price)==NULL) flag=0;
if (flag==1) n1++;
ba.flag=flag;
fseek(f,a*sizeof(ba),0);
fwrite(&ba,sizeof(ba),1,f);
}
clean();l=def=0;
w=n1;if (w>23) w=23;
load_books();
hide_cur();
w=n1;
n=n1;
break;
case 2:
getdate(&d);
f=fopen(FILENAME,"r+b");
n1=0;n=n2;
for(a=0;a<n;a++)
{flag=0;
fseek(f,a*sizeof(ba),0);
fread(&ba,sizeof(ba),1,f);
year=atol(ba.price);
y=d.da_year;
if (flag==1) n1++;
ba.flag=flag;
fseek(f,a*sizeof(ba),0);
fwrite(&ba,sizeof(ba),1,f);
}
clean();l=def=0;
show();
w=n1;if (w>23) w=23;
load_books();
hide_cur();
w=n1;
n=n1;
break;
case 3:
getdate(&d);
f=fopen(FILENAME,"r+b");
n1=0;n=n2;
for(a=0;a<n;a++)
{flag=0;
fseek(f,a*sizeof(ba),0);
fread(&ba,sizeof(ba),1,f);
year=atol(ba.price);
y=d.da_year;
pol=0;
if (flag==1) n1++;
ba.flag=flag;
fseek(f,a*sizeof(ba),0);
fwrite(&ba,sizeof(ba),1,f);
}
clean();l=def=0;
w=n1;if (w>23) w=23;
load_books();
hide_cur();
w=n1;
n=n1;
view_books();
break;
}
show();
view_books();
}
/*Funkcija vyvoda poioshhi*/
void help_w()
{int a=0,b=1;
char ch[2]={0,0};
FILE *hf;
win(2,5,77,15,"Help");
for(a=0;a<13;a++)
{gotoxy(3,6+a);
cprintf(" ") ;
}
a=1;
hf=fopen("help.txt","rb");
do
{
do
{fread(&ch,1,1,hf);
if (ch[0]==13) {a++;}
else if (ch[0]==10) b=1;
else {gotoxy(b+3,a+5);cprintf("%s",ch);}
b++;
if(b>74) {b=1;a++;}
}while((!(feof(hf)))&&(a<13));
a++;
}while((!(feof(hf)))||(a<13));
fclose(hf);
getch();
show();
www();
view_books();
}
/*Funkcija organizacii menju*/
int menu()
{char ch,*me[6]={" View "," Add "," Search "," Help "," Inform ",
" Exit "};
int i;
textcolor(15);
textbackground(1);
for(i=0;i<6;i++)
{gotoxy(2,2+i);
cprintf(me[i]);
}
i=0;
do
{
textbackground(13);
gotoxy(2,2+i);
cprintf(me[i]);
fflush(stdin);
ch=getch();
if (ch==0) {textbackground(1);
gotoxy(2,2+i);
cprintf(me[i]);
ch=getch();
if (ch=='H')
{i--;
if (i==-1) i=5;
}
if (ch=='P')
{i++;
if (i==6) i=0;
}
}
}while (ch!=13);
switch (i){
case 0:view();break;
case 1:add();break;
case 2:search();break;
case 3:help_w();break;
case 4:warning("\t\t\t\tInformation system \n\t\t\t\t 'Prkat avto'\n\t\t\t ");show();view_books() ;break;
}
return i;
}
void main()
{
hide_cur();
textcolor(15);
textbackground(0);
clrscr();
f=fopen(FILENAME,"rb");
if (f==NULL) {warning("Bazy ne obnaryzhenno");
warning("Cozdactsja novaja baza");
f=fopen(FILENAME,"w+b");
}
fclose(f);
show();
load_books();
view_books();
n1=n2=n;
while (menu()!=5);
show_cur();
}