Добавил:
Studfiles2
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Программирование на C / C++ / Курсовая работа - Создание и работа с базой данных "Плата за телефон" / plata za telephone
.cpp #include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <dos.h>
#include <string.h>
#include <iostream.h>
#include <graphics.h>
#include <math.h>
#include <TIME.H>
#include <SYS\TYPES.H>
// Struct
const int STR_SIZE =20;
struct record
{
char imia[STR_SIZE];
char telefon[STR_SIZE];
int god_ystanovki;
int colich_abonentov;
int plata_telefon;
};
//function prototypes
int ZastBeg();
void ProsmotrBD();
void CreateBD();
void AddRecord();
void AddRecord(const record & r);
void LoadBD();
void SaveBD();
int ChooseRecord();
void EditRecord();
void DeleteRecord();
void FindRecord();
void SortBD();
int Exit();
void ZastEnd();
int Get(int min, long max);
//Globals
static record * records = 0;
static long int nrecords = 0;
const int menupuncts = 10;
static char menu[menupuncts][30] = {"Prosmotr bazi dannix",
"Dobavlenie zapisi",
"Create baze dannix",
"Load baza dannix",
"Save baze dannix",
"Edit record",
"Ydalenie zapisi",
"Sortirovka baze",
"Poisk zapisi",
"Exit"
};
const int sortmenupuncts = 6;
static char sortmenu[sortmenupuncts][30] = {"Sortirovka po imeni",
"Sortirovka po telefon",
"Sortirovka po god_ystanovki",
"Sortirovka po colich_abonentov",
"Sortirovka po plata_telefon",
"Return to main menu"
};
//MENU
int YesNoDialog()
{
printf("\n<Enter> - yes, <Esc> - no");
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<menupuncts;++i)
{
if(i == choice)
printf("\n >%s< ", menu[i]);
else
printf("\n %s", menu[i]);
}
printf("\n\nNazhmite vverx/vniz dlia peredvizhenia kursora, nazhmite <Enter> dlia vibora deistvia");
int c = getch();
switch(c)
{
case 72: --choice;break;
case 80: ++choice;break;
case 13: loop = 0;break;
default:break;
}
if(choice < 0) choice = menupuncts - 1;
if(choice >= menupuncts) choice = 0;
}
return choice;
}
//ZAST_BEG
int ZastBeg()
{
int gdriver = DETECT, gmode, errorcode;
int maxx, x1, x2, x3, y1, y2, y3, i, k, s;
/* initialize graphics and local variables */
initgraph(&gdriver, &gmode, "c:\\bor\\turbo5\\bgi");
errorcode = graphresult();
if (errorcode != grOk)
{
printf("Graphics error: %s\n", grapherrormsg(errorcode));
printf("Press any key to halt:");
getch();
exit(1);
}
maxx = getmaxx();
setbkcolor (2);
setlinestyle(DOTTED_LINE, 0, 3);
line(0,420, maxx, 420);
setfillstyle(1,15);
setlinestyle(0, 0, 2);
line(440,380, 560, 380);
line(440,100, 560, 100);
line(440,240, 560, 240);
line(570,110, 570, 370);
line(570,120, 570, 360);
line(430,110, 430, 370);
bar(439, 109, 561, 241);
line(470,105, 530, 105);
arc(440, 110, 90, 180, 10);
arc(560, 110, 0, 90, 10);
arc(440, 370, 180, 270, 10);
arc(560, 370, 270, 0, 10);
circle(460, 270, 12);
circle(460, 310, 12); //knopki :
circle(460, 350, 12);
circle(500, 270, 12);
circle(500, 270, 12);
circle(540, 270, 12);
circle(500, 310, 12);
circle(500, 350, 12);
circle(540, 310, 12);
circle(540, 350, 12);
settextstyle(4,0,14);
outtextxy(maxx/2-50, 30, "KURSOVAYA RABOTA");
setcolor(15);
settextstyle(1,0,2);
//settextstyle(TRIPLEX_FONT,HORIZ_DIR,4);
outtextxy(140,110,"Theme: PLATA ZA TELEPHON");
settextstyle(SANS_SERIF_FONT,0,1);
outtextxy(300,450,"Autor: Shikunov V.V., group:PC-118");
for(i=0; i<8; i++)
{
s=s+i;
for(k=0; k<50; k++)
{setcolor(15);
arc(560, 110, 0, 90, 15+k);
arc(560, 110, 0, 90, 25+k);
arc(560, 110, 0, 90, 35+k);
delay(50);
setcolor(0);
arc(560, 110, 0, 90, 15+k);
arc(560, 110, 0, 90, 25+k);
arc(560, 110, 0, 90, 35+k);
}
setfillstyle(2,17-i*2);
bar(440, 110, 560, 240);
setfillstyle(1,14-i);
floodfill(500, 350, 15);
floodfill(460, 350, 15);
floodfill(460, 270, 15);
floodfill(500, 270, 15);
floodfill(540, 350, 15);
floodfill(540, 270, 15);
floodfill(500, 310, 15);
floodfill(460, 310, 15);
floodfill(540, 310, 15);
}
closegraph();
int c = getch();
return c;
}
//ZastEnd
void ZastEnd()
{
clrscr();
printf("Dosvidania!");
getch();
}
//Vixod
int Exit()
{
clrscr();
printf("\n Vi yvereni chto xotite exit?");
return YesNoDialog();
}
//main
int main()
{
if(ZastBeg() != 27)
{
int loop = 1;
while(loop == 1)
{
int p = Menu();
switch(p)
{
case 0: ProsmotrBD(); break;
case 1: AddRecord(); break;
case 2: CreateBD(); break;
case 3: LoadBD(); break;
case 4: SaveBD(); break;
case 5: EditRecord(); break;
case 6: DeleteRecord(); break;
case 7: SortBD(); break;
case 8: FindRecord(); break;
case 9: if(Exit() != 27) loop = 0; break;
}
}
}
else ZastEnd();
return 0;
}
//FileDialog
static char filename[32];
char * FileDialog()
{
clrscr();
printf("Input imia file:");
fscanf(stdin, "%s", filename);
return filename;
}
//Vvod zapisi
void InputRecord(record & rec)
{
clrscr();
int c;
if(kbhit())getch ();
rec.imia[0] = 0;
rec.telefon[0] = 0;
do
{
printf("\nInput imia (15 simvolov):");
while(rec.imia[0] == 0)gets(rec.imia);
printf("\nInput telefon (6 cifr):");
while(rec.telefon[0] == 0)gets(rec.telefon);
printf("\nInput god_ystanovki (1..2010):");
rec.god_ystanovki = Get(1, 2010);
printf("\nInput colich_abonentov (1..999):");
rec.colich_abonentov = Get(1, 999);
printf("\nInput plata_telefon (1..9999r):");
rec.plata_telefon = Get(1, 9999);
printf("\nVi yvereni?");
c = YesNoDialog();
}while(c != 13);
}
//DobavlenieRecord
void AddRecord(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 AddRecord()
{
record r;
InputRecord(r);
AddRecord(r);
}
//poisk zapisi
int IsInString(const char *string, const char *search_for)
{
int maxpos=0;
while(search_for[++maxpos]!=0);
int len=0;
while(string[++len]!=0);
for (int i=0; i<len; i++)
{
int add=0;
while(string[i+add] == search_for[add])
{
if(add==maxpos-1)return 1;
++add;
}
}
return 0;
}
int RecordsSimilar(const record & a,const record & b)
{
int result = 1;
if(b.imia[0] != '-' && b.imia[1] != 0)if(IsInString(a.imia, b.imia) == 0)result = 0;
if(b.telefon[0] != '-' && b.telefon[1] != 0)if(IsInString(a.telefon, b.telefon) == 0)result = 0;
if(b.god_ystanovki != -1)if(a.god_ystanovki != b.god_ystanovki)result = 0;
if(b.colich_abonentov != -1)if(a.colich_abonentov != b.colich_abonentov)result = 0;
if(b.plata_telefon != -1)if(a.plata_telefon != b.plata_telefon)result = 0;
return result;
}
void FindRecord()
{
if(!records)
{
clrscr();
printf("\nNet zapisi, nazhmite lubyu klavishy.");
getch();
}
else
{
clrscr();
record rec;
if(kbhit())getch ();
rec.imia[0] = 0;
rec.telefon[0] = 0;
printf("Input nazvanie zagolovka zapisi,dlia poiska po\n");
printf("\nInput imia (15 simvolov),\nprint \"-\" if you don't want to search by this field:");
while(rec.imia[0] == 0)gets(rec.imia);
printf("\nInput telefon (6 cifr),\nprint \"-\" if you don't want to search by this field:");
while(rec.telefon[0] == 0)gets(rec.telefon);
printf("\nInput god_ystanovki (1..2010),\nprint -1 if you don't want to search by this field:");
rec.god_ystanovki = Get(-1, 2010);
printf("\nInput colich_abonentov (1..900),\nprint -1 if you don't want to search by this field:");
rec.colich_abonentov = Get(-1, 900);
printf("\nInput plata_telefon (1r..90000r),\nprint -1 if you don't want to search by this field:");
rec.plata_telefon = Get(-1, 90000);
record * oldrecords = records;
int oldnrecords = nrecords;
records = 0;
nrecords = 0;
int n = 0;
for(int i=0;i<oldnrecords;++i)
{
if(RecordsSimilar(oldrecords[i], rec) == 1)
{
AddRecord(oldrecords[i]);
++n;
}
}
if(n>0)
{
printf("\n%d Zapis naidena! Nazhmite ludyu klavishy dlia prosmotra.", n);
getch();
ProsmotrBD();
}
else
{
printf("Nichego ne naideno.");
getch();
}
if(records)delete[] records;
records = oldrecords;
nrecords = oldnrecords;
}
}
//Vivod zapisi
void OutputRecord(record & rec)
{
printf("%-17s%-17s%-12d%-12d%-10d", rec.imia, rec.telefon, rec.god_ystanovki, rec.colich_abonentov, rec.plata_telefon);
}
//Vivod tablici
void OutputTable(int start, int n)
{
if(!records)
{
clrscr();
printf("\nNet zapisi, nazhmite lubyu klavishy.");
getch();
}
else
{
if(start<0)start = 0;
if(start + n > nrecords) n = nrecords - start;
if(n>0)
{
printf("N: |imia |telefon |god_ystanovki|colich_abnentov|plata_telefon\n");
for(int i=start;i<start+n;++i)
{
printf("\n%-3d", (i % nrecords)+1);
OutputRecord(records[(i % nrecords)]);
}
}
}
}
//SortirovkaMenu
int SortMenu()
{
int choice = 0;
int loop = 1;
while(loop == 1)
{
clrscr();
for(int i=0;i<sortmenupuncts;++i)
{
if(i == choice)
printf("\n >%s< ", sortmenu[i]);
else
printf("\n %s", sortmenu[i]);
}
printf("\n\nNazhmite vverx/vniz dlia peredvizhenia kursora, nazhmite <Enter> dlia vibora deistvia.");
int c = getch();
switch(c)
{
case 72: --choice;break;
case 80: ++choice;break;
case 13: loop = 0;break;
default:break;
}
if(choice < 0) choice = sortmenupuncts - 1;
if(choice >= sortmenupuncts) choice = 0;
}
return choice;
}
//Sortirovka BD
static record c;
void swap(record & a, record & b)
{
c = a;
a = b;
b = c;
}
void SortBD()
{
if(!records)
{
clrscr();
printf("\nNet zapisi, nazhmite lubyu klavishy.");
getch();
}
else
{
int c = SortMenu();
switch(c)
{
case 0:
{
for(int i=0;i<nrecords;++i)
for(int k=0;k<nrecords-1;++k)
if(strcmp(records[k].imia, records[k+1].imia) > 0)swap(records[k], records[k+1]);
break;
}
case 1:
{
for(int i=0;i<nrecords;++i)
for(int k=0;k<nrecords-1;++k)
if(strcmp(records[k].telefon, records[k+1].telefon) > 0)swap(records[k], records[k+1]);
break;
}
case 2:
{
for(int i=0;i<nrecords;++i)
for(int k=0;k<nrecords-1;++k)
if(records[k].god_ystanovki > records[k+1].god_ystanovki)swap(records[k], records[k+1]);
break;
}
case 3:
{
for(int i=0;i<nrecords;++i)
for(int k=0;k<nrecords-1;++k)
if(records[k].colich_abonentov > records[k+1].colich_abonentov)swap(records[k], records[k+1]);
break;
}
case 4:
{
for(int i=0;i<nrecords;++i)
for(int k=0;k<nrecords-1;++k)
if(records[k].plata_telefon > records[k+1].plata_telefon)swap(records[k], records[k+1]);
break;
}
}
}
}
//ProsmotrBD
void ProsmotrBD()
{
if(!records)
{
clrscr();
printf("\nNet zapisi, nazhmite lubyu klavishy.");
getch();
}
else
{
int loop = 1;
int n = 0;
while(loop == 1)
{
clrscr();
OutputTable(n, 20);
printf("\n\nNazhmite vverx dlia peredvizhenie vverx, vniz dlia peredvizhenia vniz,\n <Esc> dlia vozvrata 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 = 0;
if(n >= nrecords - 10) n = nrecords - 10;
}
}
}
//ViborZapisi
int ChooseRecord()
{
int choice = -1;
if(!records)
{
clrscr();
printf("\nNet zapisi, nazhmite lubyu klavishy.");
getch();
}
else
{
int loop = 1;
int n = 0;
while(loop == 1)
{
clrscr();
printf("N: |imia |telefon |god_ystanovki |coloch_abonentov |plata_telefon\n");
printf("\n%d", n + 1);
OutputRecord(records[n]);
printf("\n\nNazmite vverx dlia prosmotra sledyushei zapisi, vniz dlia prosmotra predidyshei,\n<Esc> to return to menu, <Enter> to choose record.");
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;
}
//RedaktirovanieZapisi
void EditRecord()
{
int c = ChooseRecord();
if(c>=0 && c<nrecords)
{
//clrscr();
printf("\n\nVi yvereni shto xotite to reinput this zapis?");
if(YesNoDialog() == 13)
{
InputRecord(records[c]);
}
}
}
//Ydalenie zapisi
void DeleteRecord()
{
int c = ChooseRecord();
if(c>=0 && c<nrecords)
{
printf("\n\nVi yvereni?chto xotite ydalit ety zapis?");
if(YesNoDialog() == 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;
}
}
}
}
//SozdanieBD
void CreateBD()
{
if(records)
{
clrscr();
printf("Baza dannix ne soxranena!Xotite soxranit ee?");
if(YesNoDialog() == 13) SaveBD();
delete[] records;
}
do
{
printf("Input novyu zapis:\n");
AddRecord();
printf("\n\nXotite prodolzhit?");
}
while(YesNoDialog() !=27);
}
//SoxranenieBD
void SaveBD()
{
if(!records)
{
clrscr();
printf("\nNechego to save!!! ,nazhmite lubyu klavishy.");
getch();
return;
}
FILE * m_fp=fopen(FileDialog(), "wb");
if(m_fp)
{
//Header
fwrite("Baza_dann",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->imia), 1, STR_SIZE - 1, m_fp);
fwrite(&(r->telefon), 1,STR_SIZE - 1, m_fp);
fwrite(&(r->god_ystanovki), 1, sizeof(long int), m_fp);
fwrite(&(r->colich_abonentov), 1, sizeof(long int), m_fp);
fwrite(&(r->plata_telefon), 1, sizeof(long int), m_fp);
++r;
}
fclose(m_fp);
}
else
{
printf("\nNevozmozhno sozdat file!");
getch();
}
}
//ZagryzkaBD
void LoadBD()
{
if(records)
{
clrscr();
printf("Baza dannix ne soxranena!Xotite soxranit ee?");
if(YesNoDialog() == 13) SaveBD();
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[] = "Baza_dann";
if(memcmp(header,true_header,9) != 0)
{
printf("Wrong file format!!!");
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->imia), 1, STR_SIZE - 1, m_fp);
fread(&(r->telefon), 1, STR_SIZE - 1, m_fp);
fread(&(r->god_ystanovki), 1, sizeof(long int), m_fp);
fread(&(r->colich_abonentov), 1, sizeof(long int), m_fp);
fread(&(r->plata_telefon), 1, sizeof(long int), m_fp);
++r;
}
fclose(m_fp);
}
else
{
printf("\nFile ne naiden");
getch();
}
}
//GET
int Get(int min, long max)
{
int i = 0;
fscanf(stdin, "%d", &i);
fflush(stdin);
while ((i==0)||(i>max)||(i<min))
{
cprintf("Neverniy vvod, povtorite popitku (%d - %d): ", min,max);
fscanf(stdin, "%d", &i);
fflush(stdin);
}
return i;
}
Соседние файлы в папке Курсовая работа - Создание и работа с базой данных "Плата за телефон"