3.9 Блок-схема функции SortMenu():
int choice-переменная соответствующая полю меню
int l-переменная взята для цикла
3.10 Блок-схема функции swap():
3.11 Блок-схема функции SortBD():
3.12 Блок-схема функции Prosm():
3.13 Блок-схемы функции Viborzapus():
int choice-переменная соответствующая полю меню
int loop-переменная для цикла
int n-кол-во записей в базе данных
3.14 Блок-схема функции Izmzapis():
int c-переменная для определения вибранной записи
3.15 Блок-схема функции Tdzapis():
int c-переменная для определения выбранной записи
3.16 Блок-схема функции Sozd():
3.17 Блок-схема функции Soxr():
3.18 Блок-схема функции Prosm():
3.19 Блок-схема функции Pr():
4.Листинг программы
#include <stdio.h>
#include <conio.h>
#include <string.h>
#include <iostream.h>
const int dlinna = 15;
struct record
{
char naimenovanie[15];
long int ploshad;
long int etagnost;
long int god_soor;
long int stoimost;
};
int Vot();
void Prosm();
void Sozd();
void Novzapis();
void Zagr();
void Soxr();
int Viborzapis();
void Izmzapis();
void Ydzapis();
void Pzapis();
void Sort();
int Exit();
long int Pr(long int min, long int max);
//Globals
static record * records = 0;
static long int nrecords = 0;
const int menup = 10;
static char menu[menup][20] = {"prosmotret bazy",
"sozdat zapis",
"sozdat bazy",
"otkrit bazy",
"soranit bazy",
"redactirovat bazy",
"ydalit zapisi",
"sortirovat bazy",
"naiti zapis",
"vixod"
};
const int sort = 6;
static char sortmenu[sort][22] = {"Sort naimenovanie",
"Sort ploshad",
"Sort etagnosr",
"Sort god_soo",
"Sort stoimos",
"v meny"
};
//**********************************PodtverghdeniE*************************
int Podt()
{
printf("\n<Enter> - da, <Esc> - net");
int c;
do
c = getch();
while(c != 13 && c != 27);
return c;
}
//*********************************Menu**********************************
int Menu()
{
int choice = 0;
int loop = 1;
while(loop == 1)
{
clrscr();
for(int i=0;i<menup;i++)
{
if(i == choice)
cout<<"\n "<<"*&"<<menu[i]<<"&*";
else
cout<<"\n "<<menu[i];
}
printf("\n\nispolzy' knopki vniz verx dla peredvigenia");
int c = getch();
switch(c)
{
case 72: --choice;break;
case 80: ++choice;break;
case 13: loop = 0;break;
default:break;
}
if(choice < 0) choice = menup - 1;
if(choice >= menup) choice = 0;
}
return choice;
}
//******************************Vot*******************************
int Vot()
{
clrscr();
printf("\n soorygenie aeraporta");
printf("\n dly vixoda nagmite <Esc> ");
return getch();
}
//************************************EXIT*********************************
int Exit()
{
clrscr();
printf("\nvi to4no xotit viti ?");
return Podt();
}
//***********************************MAIN***********************************
void main()
{int i,k,p;
if (Vot() != 27)
{
int l=1;
while(l == 1)
{
int p = Menu();
switch(p)
{
case 0: Prosm(); break;
case 1: Novzapis(); break;
case 2: Sozd(); break;
case 3: Zagr(); break;
case 4: Soxr(); break;
case 5: Izmzapis(); break;
case 6: Ydzapis(); break;
case 7: Sort(); break;
case 8: Pzapis(); break;
case 9: if(Exit() != 27) l = 0; break;
}
}
}
}
//*********************imyFile********************************
static char filename[32];
char * FileDialog()
{
clrscr();
printf("vvedit im faila:");
scanf("%s", filename);
return filename;
}
//******************************Vvod Zapisi*********************************
void Vvodzapis(record & rec)
{
clrscr();
int c;
rec.naimenovanie[0] = 0;
printf("\nvvdite naimenovanie:");
while(rec.naimenovanie[0] == 0)gets(rec.naimenovanie);
printf("\nvvedita ploshad :");
rec.ploshad =Pr(1, 99999);
printf("\nvvedite etagnost :");
rec.etagnost = Pr(1, 99999);
printf("\nvvedite god soor :");
rec.god_soor = Pr(1, 99999);
printf("\nvvedite stoimost :");
rec.stoimost = Pr(1, 90000);
}
//***********************************Nov Zapisi****************************
void Novzapis(const record & r)
{
++nrecords;
record * newrecords = new record[nrecords];
if(records)
memcpy(newrecords, records, (nrecords - 1) * sizeof(record));
delete[] records;
records = newrecords;
records[nrecords - 1] = r;
}
void Novzapis()
{
record r;
Vvodzapis(r);
Novzapis(r);
}
//************************************Vozmoghn VVod************************
int Sravnenie(const record & a,const record & b)
{
int result = 0;
if(b.naimenovanie[0] != '-' && b.naimenovanie[0] != 0 && strcmp(a.naimenovanie, b.naimenovanie) == 0)result = 1;
if(b.ploshad != -1 && a.ploshad == b.ploshad)result = 1;
if(b.etagnost != -1 && a.etagnost == b.etagnost)result = 1;
if(b.god_soor != -1 && a.god_soor == b.god_soor)result = 1;
if(b.stoimost != -1 && a.stoimost == b.stoimost)result = 1;
return result;
}
void Pzapis()
{
if(!records)
{
clrscr();
printf("\nzapis ne verna");
getch();
}
else
{
clrscr();
record rec;
rec.naimenovanie[0] = 0;
printf("vvedite pole po kotoromy proizvoditsa poisk\n");
printf("\nvvedite naimenovanie,\nprint \"-\" esli vi ne xoyite iskat po etomy poly:");
while(rec.naimenovanie[0] == 0)gets(rec.naimenovanie);
printf("\nvvedite ploshad:(1..99999),\nprint -1 esli vi ne xoyite iskat po etomy poly:");
rec.ploshad = Pr(1, 99999);
printf("\nInput catalog number:(1..99999),\nprint -1 esli vi ne xoyite iskat po etomy poly:");
rec.etagnost = Pr(1, 99999);
printf("\nInput catalog number:(1..99999),\nprint -1 esli vi ne xoyite iskat po etomy poly:");
rec.god_soor = Pr(1, 99999);
printf("\nInput price (1r..90000r),\nprint -1 esli vi ne xoyite iskat po etomy poly:");
rec.stoimost = Pr(1, 90000);
record * oldrecords = records;
int oldnrecords = nrecords;
records = 0;
nrecords = 0;
int n = 0;
for(int i=0;i<oldnrecords;++i)
{
if(Sravnenie(oldrecords[i], rec) == 1)
{
Novzapis(oldrecords[i]);
++n;
}
}
if(n>0)
{
printf("\n%d zapisi naideni nagmite s.", n);
getch();
Prosm();
}
else
{
printf("ni4go ne naideno");
getch();
}
if(records)delete[] records;
records = oldrecords;
nrecords = oldnrecords;
}
}
//*********************************Vivod Zapisi***************************
void Vivnaekr(record & rec)
{
printf("\nnaimenovanie ploshad etagnost god_soor stoimost \n");
printf("%9s %16ld %19ld %16ld %11ld\n", rec.naimenovanie, rec.ploshad, rec.etagnost, rec.god_soor, rec.stoimost);
}
//*************************Meny Sortirovki*********************************
int SortMenu()
{
int choice = 0;
int loop = 1;
while(loop == 1)
{
clrscr();
for(int i=0;i<sort;++i)
{
if(i == choice)
printf("\n->%s<-", sortmenu[i]);
else
printf("\n %s", sortmenu[i]);
}
printf("\n\nnagimaite knopki dla vibora");
int c = getch();
switch(c)
{
case 72: --choice;break;
case 80: ++choice;break;
case 13: loop = 0;break;
default:break;
}
if(choice < 0) choice = sort - 1;
if(choice >= sort) choice = 0;
}
return choice;
}
//********************************Sort*******************************
void swap(record & a, record & b)
{
record c;
c = a;
a = b;
b = c;
}
void Sort()
{
if(records==0)
{
clrscr();
printf("\n4eta nepravilno nagali");
getch();
}
else
{
int c = SortMenu();
switch(c)
{
case 0:
{
for(int i=0;i<nrecords-1;i++)
for(int k=i+1;k<nrecords;k++)
if(strcmp(records[i].naimenovanie, records[k].naimenovanie) >0)swap(records[i], records[k]);
break;
}
case 1:
{
for(int i=0;i<nrecords-1;i++)
for(int k=i+1;k<nrecords;k++)
if(records[i].ploshad > records[k].ploshad)swap(records[i], records[k]);
break;
}
case 2:
{
for(int i=0;i<nrecords-1;i++)
for(int k=i+1;k<nrecords;k++)
if(records[i].etagnost > records[k].etagnost)swap(records[i], records[k]);
break;
}
case 3:
{
for(int i=0;i<nrecords-1;i++)
for(int k=i+1;k<nrecords;k++)
if(records[i].god_soor > records[k].god_soor)swap(records[i], records[k]);
break;
}
case 4:
{
for(int i=0;i<nrecords-1;i++)
for(int k=i+1;k<nrecords;k++)
if(records[i].stoimost > records[k].stoimost)swap(records[i], records[k]);
break;
}
}
}
}
//*********************************Prosmotr*********************
void Prosm()
{
if(!records)
{
clrscr();
printf("\nNo records, press any key");
getch();
}
else
{
int loop = 1;
int n = 0;
while(loop == 1)
{
clrscr();
printf("\n%d)", n + 1);
Vivnaekr(records[n]);
printf("\n\nnagmite <Esc> dla vixoda v menu.");
int c = getch();
switch(c)
{
case 72: --n;break;
case 80: ++n;break;
case 27: loop = 0;break;
default:break;
}
if(n < 0) n = nrecords - 1;
if(n >= nrecords) n = 0;
}
}
}
//*********************************Vibor Zapisi**************************
int Viborzapis()
{
int choice = -1;
if(!records)
{
clrscr();
printf("\n4eta nepravilno nagali");
getch();
}
else
{
int loop = 1;
int n = 0;
while(loop == 1)
{
clrscr();
printf("\n%d)", n + 1);
Vivnaekr(records[n]);
printf("\n\nnagmite <Esc> dla vixoda v menu, <Enter> hg.");
int c = getch();
switch(c)
{
case 72: --n;break;
case 80: ++n;break;
case 27: loop = 0;break;
case 13: loop = 0;choice = n;break;
default:break;
}
if(n < 0) n = nrecords - 1;
if(n >= nrecords) n = 0;
}
}
return choice;
}
//***************************************Izmenenie Zapisi*******************
void Izmzapis()
{
int c = Viborzapis();
if(c>=0 && c<nrecords)
{
//clrscr();
printf("\n\nvi to4no xotite izmenit zapisi?");
if(Podt() == 13)
Vvodzapis(records[c]);
}
}
//**********************************Ydalenie Zapisi*************************
void Ydzapis()
{
int c = Viborzapis();
if(c>=0 && c<nrecords)
{
//clrscr();
printf("\n\nvi to4no xotite ydalit zapisi?");
if(Podt() == 13)
{
--nrecords;
if(nrecords <= 0)
{
delete[] records;
records = 0;
}
else
{
record * newrecords = new record[nrecords];
int k = 0;
for(int i=0;i<nrecords+1;++i)
if(i!=c)
{
newrecords[k] = records[i];
++k;
}
delete[] records;
records = newrecords;
}
}
}
}
//********************************Sozd*****************************
void Sozd()
{
if(records)
{
clrscr();
printf("vi xotiti soxranit?");
if(Podt() == 13) Soxr();
delete[] records;
}
do
{
printf("vvediti novy zapis:\n");
Novzapis();
printf("\n\nxotiti prodolgit?");
}
while(Podt() !=27);
}
//***********************************Soxr******************************
void Soxr()
{
if(!records)
{
clrscr();
printf("\nsoxranit bd");
getch();
return;
}
FILE * m_fp=fopen(FileDialog(), "wb");
if(m_fp)
{
//Header
fwrite("DATA_BASE",1,9,m_fp);
//Number of records
fwrite(&nrecords, 1, sizeof(long int), m_fp);
//Records
record * r = records;
for(int i=0;i<nrecords;++i)
{
fwrite(&(r->naimenovanie), 1, dlinna - 1, m_fp);
fwrite(&(r->ploshad), 1, sizeof(long int), m_fp);
fwrite(&(r->etagnost), 1, sizeof(long int), m_fp);
fwrite(&(r->god_soor), 1, sizeof(long int), m_fp);
fwrite(&(r->stoimost), 1, sizeof(long int), m_fp);
++r;
}
fclose(m_fp);
}
else
{
printf("\nCannot create the file!");
getch();
}
}
//**********************************Zagryzka*****************************
void Zagr()
{if(records)
{
clrscr();
printf("vi xotiti soxranit?");
if(Podt() == 13) Soxr();
delete[] records;
}
FILE * m_fp=fopen(FileDialog(), "rb");
if(m_fp)
{
// fseek(m_fp, 0, SEEK_SET);
//Header
char header[10];
fread(header,1,9,m_fp);
header[9] = 0;
char true_header[] = "DATA_BASE";
if(memcmp(header,true_header,9) != 0)
{
printf("");
getch();
return;
}
//Number of records
fread(&nrecords, 1, sizeof(long int), m_fp);
if(nrecords<0)nrecords = 0;
records = new record[nrecords];
//Records
record * r = records;
for(int i=0;i<nrecords;++i)
{
fread(&(r->naimenovanie), 1, dlinna - 1, m_fp);
fread(&(r->ploshad), 1, sizeof( int), m_fp);
fread(&(r->etagnost), 1, sizeof(int), m_fp);
fread(&(r->god_soor), 1, sizeof( int), m_fp);
fread(&(r->stoimost), 1, sizeof( int), m_fp);
++r;
}
fclose(m_fp);
}
else
{
printf("\nFile not found");
getch();
}
}
//-------------------------------------Pr-------------------------------------
long int Pr(long int min, long int max)
{
long int i = 0;
scanf("%ld", &i);
fflush(stdin);
while ((i==0)||(i>max)||(i<min))
{
gotoxy(1,wherey());
printf("neverno napisali (%ld - %ld): ", min,max);
scanf( "%ld", &i);
fflush(stdin);
}
return i;
}