#include<iostream.h>
#include<stdlib.h>
#include<string.h>
#include<ctype.h>
#include<conio.h>
#include<math.h>
#include<stdio.h>
#include<iomanip.h>
FILE *fp;
FILE *fs;
FILE *os;
	 struct tovari
	 { char nazv[15];
	   float zena;
	   }tov;
void bz_t();
void pr_t();
void dob_t();
void ud_t();
void ubz_t();
void per();
int main()
{char p,z,x;
 do
   {
    clrscr();
   puts("1. Меню товарiв");
   puts("0. Завершення роботи");
   puts("виберiть пункт");
   cin>>p;
   switch (p)
    {
	    
     case '1':
	    {do
	     {
	      clrscr();
	     puts("\n1. Створення новои бази");
	     puts("2. перегляд товарiв");
	     puts("3. додавання товарiв");
	     puts("4. видалення товару з списку");
	     puts("5. видалення базы ");
	     puts("0 вихiд в главное меню");
	     puts("Виберiть пункт меню");
	     cin>>z;
	     switch(z)
	     {
	     case '1':
		     {bz_t();
		     break;
		     }
	     case '2':
		     {pr_t();
		     break;
		     }

	     case '3':
		     {dob_t();
		     break;
		     }
	       case '4':
		     {ud_t();
		     break;
		     }
		case '5':
		     {ubz_t();
		     break;
		     }
	     }
	    }
	    while(z!='0');
	    break;
	    }
   }
   }
   while(p!='0');
   return 0;
}
void bz_t()
{char o;
FILE *fb;
clrscr();
cout<<endl<<"створення базы данных";
if((fb=fopen("tov.dat","rb"))==NULL)
{fb=fopen("tov.dat","wb");
fclose(fb);
cout<<endl<<"додати запис??(y/Y,д/Д)";
cin>>o;
 if((o=='y')||(o=='Y')||(o=='д')||(o=='Д')||(o=='у')||(o=='У')) dob_t();
}
else
{fclose(fb);
cout<<endl<<"база iснуе якщо ви продовжите стара база буде стерта"<<endl<<"Ви впевненi ?(y/Y,д/Д)";
cin>>o;
 if((o=='y')||(o=='Y')||(o=='д')||(o=='Д')||(o=='у')||(o=='У'))
 {
fb=fopen("tov.dat","wb");
fclose(fb);
cout<<endl<<"додати запис?(y/Y,д/Д)";
cin>>o;
 if((o=='y')||(o=='Y')||(o=='д')||(o=='Д')||(o=='у')||(o=='У')) dob_t();
  }
}
}
void pr_t()
{  FILE *ft;
   cout<<endl<<"╔═══════════════╦════════════╗ ";
   cout<<endl<<"║назва    товару║  цiна      ║ ";
   cout<<endl<<"╠═══════════════╬════════════╣ ";
    ft=fopen("tov.dat","rb");
 fread(&tov,sizeof(tov),1,ft);
 while(!feof(ft))
 {
 cout<<endl<<"║"<<setw(15)<<tov.nazv<<"║"<<setw(12)<<tov.zena<<"║";
 fread(&tov,sizeof(tov),1,ft);
 if (!feof(ft)) cout<<endl<<"╠═══════════════╬════════════╣";
 else           cout<<endl<<"╚═══════════════╩════════════╩";
 }
 cout<<endl<<"Для продовження натиснiть любу кнопку";
 fclose(ft);
getch();
}
void dob_t()
{ int flag,flag1;
   char y;
   char buf[256];
   clrscr();
   fs=fopen("tov.dat","a+b");
    do
    {  system("CLS");
      cout<<endl<<"ввести назву";
      gets(buf);
    buf[16]='\0';
    strcpy(tov.nazv,buf);
    cout<<endl<<"ввести цiну";
    cin>>tov.zena;
     fwrite(&tov,sizeof(tov),1,fs);
     cout<<endl<<"додати ще запис? у=продовжить ";
     cin>>y;
   }
     while ((y=='y')||(y=='Y'));
     fclose(fs);


}
void ud_t()
{char x;
 int n,kol,v=0;
 FILE *fp,*fb;
 clrscr();
 if((fp=fopen("tov.dat","r+b"))==NULL) {cout<<endl<<"база вiдсутня"; getch();}
 else
 {fclose(fp);
 fp=fopen("tov.dat","a+b");
 fread(&tov,sizeof(tov),1,fp); kol=0;
 if(!feof(fp))
 {while(!feof(fp))
   {kol++;fread(&tov,sizeof(tov),1,fp);
   }
 struct tovari sav;
   pr_t();
   cout<<endl<<"Виберiть номер запису для видалення"<<endl;
   cin>>n;
   if((n<=0)||(n>kol)) {cout<<endl<<"такого запису нема"<<endl<<"натиснiть любу клавiшу"; getch();}
   if((n>0)&&(n<=kol))
   {cout<<endl<<"ви впевненi що хочете видалити  "<<n<<"-й запис?";
   cin>>x;
   if((x=='y')||(x=='Y')||(x=='д')||(x=='Д'))
   {fb=fopen("t.dat","a+b");
   kol=1;
   rewind(fp);

   fread(&tov,sizeof(tov),1,fp);
   while(!feof(fp))
   {if(kol!=n) {sav=tov;fwrite(&sav,sizeof(sav),1,fb);v++;}
    kol++;fread(&tov,sizeof(tov),1,fp);
   }
   fclose(fp);
   if(v!=0)
   {
   remove("tov.dat");
   rewind(fb);
   fread(&sav,sizeof(sav),1,fb);
   fp=fopen("tov.dat","a+b");
   while(!feof(fb))
   {tov=sav;
   fwrite(&tov,sizeof(tov),1,fp);
   fread(&sav,sizeof(sav),1,fb);
   }
   fclose(fb);
   fclose(fp);
   remove("t.dat");
   pr_t();
   }
   else{remove("t.dat");fp=fopen("tov.dat","wb");fclose(fp);}
   }
   else {cout<<endl<<"Процедура зупинена"<<endl<<"натиснiть любу клавiшу";fclose(fp);getch();}
  }
  }
  else {cout<<endl<<"База пуста"<<endl<<" натиснiть любу клавiшу ";getch();}

 }
}
void ubz_t()
{ char y;
FILE *f;
clrscr();
if((f=fopen("tov.dat","rb"))==NULL){cout<<endl<<"База вiдсутня"<<endl<<" натиснiть любу клавiшу ";getch();}
else
{
cout<<endl<<"ви впевненi що хочете видалити базу?(y/Y,д/Д)";
cin>>y;
 if((y=='y')||(y=='Y')||(y=='д')||(y=='Д')||(y=='у')||(y=='У')) remove("tov.dat");
}
}
void per()
{FILE *f  = fopen( "tov.dat", "r+b" ),
	*fs = fopen( "t.dat",    "a+b" );
  int kol=1, i=0;//краще все ж писати sizeof(struct tovari) всюди, бо пот?м ще шукати, чим то k є...
  struct tovari s;
  while(!feof(f))
  {
    fwrite(&tov, sizeof(struct tovari), 1, fs);
    fread (&tov, sizeof(struct tovari), 1, f);
  }
  rewind(f);
  rewind(fs);

  while(!feof(f))
  {
    //переходимо на 1-й елемент fs, не 0-й, а 1-й - так ? треба?
    fseek(fs, kol++*sizeof(struct tovari), SEEK_SET);
    fread(&s, sizeof(struct tovari), 1, fs);
    if(strcmp(tov.nazv,s.nazv)>0)
      tov=s;//значення s нам б?льше не знадобиться, нащо ми його збер?гаємо?
    fseek(f, i++*sizeof(struct tovari), SEEK_SET);
    fwrite(&tov, sizeof(struct tovari), 1, f);
    fread( &tov, sizeof(struct tovari), 1, f);
  }
  fclose(fs);
  remove("t.dat");
  fclose(f);
  pr_t();
}

