Скачиваний:
51
Добавлен:
02.05.2014
Размер:
16.02 Кб
Скачать
 #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;
}
Соседние файлы в папке Курсовая работа - Создание и работа с базой данных "Плата за телефон"