GVA SUPPORT

Відповідь на запитання № 1338401374
Text:
	ФІО = Горбаченко В.А.

 Запитання:/*
Пародия на БД. Borland С++ Builder 6. Borland C++ 3.0 (DOS).
Найпростіша база даних на C++. 
Простая база данных на C++. Методы fopen fseek
"Норме участка", "месяц", "наименование продукта", "росход по норме", "фактический расход", "недорасход и перерасход".
*/
//---------------------------------------------------------------------------

#pragma hdrstop

//---------------------------------------------------------------------------

#pragma argsused
#include <iostream.h>
#include <stdio.h>
#include <dos.h>
#include <conio.h>
#include <string.h>
#include <stdlib.h>
#define DBFN "base.db" // imya bazi danih
#define MAXSTR 80	// MAXIMALNA DOVJUNA SRTOKI
struct TDataType{	// tup zapusyemuh danyh
	int nomerdilyanki;
	char mesac[MAXSTR];
	char naimenovanie[MAXSTR];
	double vutratazanornoy;
	double fakti4nivutratu;
	double raznica;                
};
long FileGetCount(){
// metod rahue kilkist elementiv v baza danyh
	FILE *file ;
        if ((file = fopen(DBFN,"rb"))==NULL)
        {
                return 0;
        }
	fseek (file , 0 , SEEK_END);
	long Size = ftell (file) / sizeof(TDataType);
//	rewind (file);
	fclose(file);
	return Size;
}

long EnterN(long max=0)
{
// programa prosut vvesty 4uslo NUMBER = [0;MAX]
	if (max == -1) return -1;
	long a;
	cout<<endl;
	do
	{
		cout<<" Enter # [ 0 - "<<max<<" ] : ";
		cin>>a;
	} while (a<0 && a>max);

	return a;
}
TDataType FileShowByIndex(long index)
{
	// povertae strukturu danuh pid miscem index v basi danuh (napramy)
	long count = FileGetCount();
	TDataType temp,temp0;
	FILE *file = fopen(DBFN,"rb");
	rewind(file);
	long i = 0;
	fseek(file, sizeof(TDataType)*index, 0);
//	for (i = 0 ; i < count ; i++)
	{
		fread(&temp,sizeof(TDataType),1,file);
//		if ( index == i )
		 temp0=temp;
	}

	fclose(file);

	return temp0;

}
void FileEditByIndex(long index,TDataType a)
{
// zapusye struktury v BD v index pozuciy
	TDataType temp;
	FILE *file = fopen(DBFN,"r+b");
	rewind(file);
	fseek(file, sizeof(TDataType)*index, 0);
	fwrite(&a,sizeof(TDataType),1,file);
	fclose(file);
	return ;
}

void ShowInfoDlg(TDataType &a)
{
	// VUVODUT stdukturu v zrozymilomy formati dla korustuvacha
	clrscr();
	cout<<"\n";

	cout<<" nomer dilyanki   : "<<a.nomerdilyanki<<endl;

	cout<<" mesac            : "<<a.mesac<<endl;

	cout<<" naimenovanie     : "<<a.naimenovanie<<endl;

	cout<<" vutratazanornoy  : "<<a.vutratazanornoy<<endl;

	cout<<" fakti4nivutratu  : "<<a.fakti4nivutratu<<endl;        

	cout<<" raznica          : "<<a.raznica<<endl;

	return ;
}

void FileAdd(TDataType temp)
{
	// DODAE V KINEC FAILU strukruty danuh
	FILE *file = fopen(DBFN,"a+b");
	fwrite(&temp,sizeof(temp),1,file);
	fclose(file);
	return ;
}
void FileShowAll()
{
	long count = FileGetCount();
	TDataType temp;
	FILE *file = fopen(DBFN,"rb");
	rewind(file);
	long i = 0;
	if (count == 0) return ;
	for (i = 0 ; i < count ; i++)
	{
		fread(&temp,sizeof(TDataType),1,file);
		ShowInfoDlg(temp);
		cout<<"\n\r\n\r     REC# "<<i<<" OF "<<count-1<<endl<<endl;
		system("PAUSE");
	}

	fclose(file);
	return ;
}

int ConfirmYN(char *str)
{
	// prosut korustyvacha natusnuty Y 4u N
	int z;
	cout<<str<<" [Y/N] ? ";
	do
	{
		z = getch();
	} while ( z != 'n' && z != 'N' && z != 'y' && z != 'Y');
	cout<<endl;
	if (z == 'y' || z == 'Y')  return 1;
	return 0;

}
int AddInfoDlg(TDataType &a)
{
	// dialog dodavanna struktury
	// !!!!!!!! ATENTION STR PISAT ODNIM SLOVOM!!!! CPU_CELERON ulu 12.12.12
	clrscr();
	cout<<"\n";

      	cout<<" Enter 'nomer dilyanki'  [ INT ] : ";
	cin>>a.nomerdilyanki;
        fflush(stdin);
	cout<<" Enter 'mesac'           [ STR ] : ";
        cin.getline(a.mesac,MAXSTR);
        fflush(stdin);
        cout<<" Enter 'naimenovanie'    [ STR ] : ";
        cin.getline(a.naimenovanie,MAXSTR);

	cout<<" Enter 'vutratazanornoy' [ DBL ] : ";
	cin>>a.vutratazanornoy;

	cout<<" Enter 'fakti4nivutratu' [ DBL ] : ";
	cin>>a.fakti4nivutratu;

        a.raznica =  a.vutratazanornoy - a.fakti4nivutratu;
	cout<<"      'raznica'          [ DBL ] : "<<a.raznica<<endl;

	return ConfirmYN(" Applay changes");
}

int main()
{
	int key;
	do
	{
		clrscr();
		cout<<" PROGRAM MAIN MENU:\n\n   1  ) Add new record\n   2  ) Edit record in database\n   3  ) Show record by indnex\n   4  ) Show all records \n   0  ) Destroy database\n\n   ESC) exit \n\n";
		cout<<" RECORD(S) : "<<FileGetCount()<<endl;
		key=getch();
		if (key == '1')
		{
			TDataType temp;
			if (AddInfoDlg(temp)==1)
			{
				FileAdd(temp);
			}
		}
		else
		if (key == '2' && FileGetCount())
		{
			long n = EnterN(FileGetCount()-1);
			ShowInfoDlg(FileShowByIndex(n));

			TDataType temp;

			if (ConfirmYN(" Change this record")==1)
			{
				if (AddInfoDlg(temp)==1)
				{
					FileEditByIndex(n,temp);
				}
			}
		}
		else
		if (key == '3' && FileGetCount()!=0)
		{
			ShowInfoDlg(FileShowByIndex(EnterN(FileGetCount()-1)));
			cout<<endl;
			system("pause");
		}
		else
		if (key == '4' && FileGetCount()!=0)
		{
			FileShowAll();
			cout<<endl<<" DONE."<<endl;

			system("pause");
		}
		else

		if (key == '0' && FileGetCount())
		{
			if (ConfirmYN(" Delete DATABASE") == 1)remove(DBFN);
		}


	} while (key!=27);
	return 0;
}

====================================	
Ваша відповідь