Скачиваний:
6
Добавлен:
01.04.2014
Размер:
14.36 Кб
Скачать
/*
Курсовая работа
студента ФЗВиДО  
специальности  Маркетинг

Программа написана в среде MS Visual Studio 2005
*/

#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <io.h>
#include <string.h>

const int MAX=21;//Длина текстовых полей структуры
const int MAXX=100;//Разумный максимум длины вводимой строки
typedef struct {
	int id;//код записи
	char marka[MAX];//марка авто
	char model[MAX];//модель авто
	int year;//год выпуска
	float engine;//объём двигателя
	int probeg;//пробег в км
	float price;//цена в долларах США
} data;
void interface();//Основное меню
void add();//Добавление записи
void del();//Удаление записи 
void edit();//Редактирование записи
void view();//Просмотр всех записей
void sort();//Сортировка записей
int find_max_num();//Поиск максимального ID в файле
int get_number();//Определение количества записей в файле
void create();//Создание файла
void open();//Открытие файла
int check(data);//Поиск в файле такой же записи
void ramka();//Вывод на экран рамки
void print_str(data);//Вывод на экран записи
void sost_skl();//Определение затрат рабочего времени
int file_empty();//Пуст ли файл
char *str_cut(char *,int);//Урезание вводимой строки 
char* fn; //Имя файла

void main()
{  int choice;
   fn=new char[MAXX];
   do
   {	printf("\n \r(1) Sozdat' novuju bazu dannih \n");
        printf("(2) Otkrit' bazu dannih \n");
       	printf("(7) Viyti iz programmi.\n");
        printf("Vvedite Vash vibor ");

fflush(stdin);
scanf("%d",&choice);
switch(choice)
     {
case 1: create();break;
case 2: open();break;
case 7:delete []fn; return;
default: printf("Vvedite 1,2 ili 7! \n");
      }
   }
while(choice !=7 );
}

void interface()
{	int choice;
    	do
    {  
		printf("\n \r(1) Smotret' vse zapisi'   \n");
        printf("(2) Udalit' zapis' \n");
        printf("(3) Redaktirovat' zapis' \n");
        printf("(4) Dobavit' zapis' \n");
        printf("(5) Sortirovat' zapisi \n");
        printf("(6) Ot4et o sostojanii sklada \n");
		printf("(7) Nazad \n");
        printf("Vvedite vash vibor: ");
		fflush(stdin);
		scanf("%d",&choice);
			switch(choice)  
			{
				case 1: view(); break;
				case 2: del(); break;
				case 3: edit(); break;
				case 4: add(); break;
				case 5: sort(); break;
				case 6: sost_skl(); break;
				case 7: return;
                default: printf("Vvedite 1-7!! \n"); 
			 }
	 }
while(choice !=7 );

}

void add()
{	FILE *fp;
	data st;
	char buf[MAXX];
	int s;
    int i;
	int n=0;
	float f;

		    st.id=find_max_num()+1; 
			printf("Marka:");
			fflush(stdin);
			gets(buf);
			s=strlen(buf);
			if (s>MAX)  strcpy(st.marka,str_cut(buf,s)) ;
				else strcpy(st.marka,buf);
           	printf("Model:");
			fflush(stdin);
			gets(buf);
			s=strlen(buf);
			if (s>MAX)  strcpy(st.model,str_cut(buf,s)) ;
				else strcpy(st.model,buf);
m11:        printf("God vipuska:");
			fflush(stdin);
			gets(buf);
			n=atoi(buf);
			if (n<=0) {printf("oshibka vvoda, vvedite polozhitel'noe chislo \n");
					   goto m11;}
			st.year=n;	          

m12:		printf("Objom dvigatelja v litrah:");
			fflush(stdin);
			scanf("%f",&f);
			if (f<=0){ printf("oshibka vvoda, vvedite polozhitel'noe chislo \n");
								goto m12;}
			else st.engine=f;
				
m1:         printf("Probeg, km:");
			fflush(stdin);
			gets(buf);
			n=atoi(buf);
			if (n<=0) {printf("oshibka vvoda, vvedite polozhitel'noe chislo \n");
					   goto m1;}
			st.probeg=n;	

m2:			printf("Cena v dollarah:");
			fflush(stdin);
			f=0;
			scanf("%f",&f);
			if (f<=0){ printf("oshibka vvoda, vvedite polozhitel'noe chislo \n");
								goto m2;}
			else st.price=f;

	
		if (!check(st))
        {
			if ((fp = fopen(fn,"ab+")) == NULL)  
			{
				printf("File could not be opened.\n");
				return;
			}
			fwrite(&st, sizeof(data),1,fp);
			fclose(fp);
			return;
		}
		else
		  	printf("Takaya zapis' uzhe est' - deistvie otmeneno");
				
}


void del()
{	FILE *fp,*temp;
	data st;
	char buf[MAXX];
	int number,key=0,pr=1;
	
	if (file_empty()==1) return;

m3:	printf("Vvedite kod zapisi dlya udaleniya ili ENTER, chtobi vernutsja v menu: ");
	fflush(stdin);
	gets(buf);
	if (strlen(buf)<1) return;
	number=atoi(buf);
	if (number<=0) {printf("oshibka vvoda, vvedite polozhitel'noe chislo \n");
				goto m3;}
	
	if ((fp=fopen(fn,"rb")) == NULL) 
	{
	printf("error.file does not exist.");
	return;
     }
	if ((temp=fopen("temp.$$$","wb")) == NULL)
                 {
			printf("error. temp file couldn't be created");
			return;
		          }
		while (fread(&st,sizeof(data),1,fp))
	                 {
			if (feof(fp))
				break;
			if (st.id != number)
				fwrite(&st,sizeof(data),1,temp);
			else
				pr=0;
					 }
                fclose(fp);
		        fclose(temp);

		if (remove(fn) == -1)
						{
			printf("error. file couldn't be deleted");
			return;
						}
		if (rename("temp.$$$",fn) == -1)
                {
			printf("error. file couldn't be renamed");
			return;
				}
		if (pr) 
		     {
		  printf("\r   Oshibka, net zapisi s takim kodom   \n ");
		  return;
		       }
printf("\r  Zapis' udalena   \n  ");
}

void edit()
{  	FILE *fp;
	data st,buf;
	char buff [MAXX];
	int number,size=sizeof(data),pr=1;
	int s,n=0;
	fpos_t filepos;
	float f;
	
	if (file_empty()==1) return;
	
m4:	printf("Vvedite kod zapisi dlya redaktirovaniya ili ENTER, chtobi vernutsja v menu: ");
    fflush(stdin);
	gets(buff);
	if (strlen(buff)<1) return;
	number=atoi(buff);
	if (number<=0) {printf("oshibka vvoda, vvedite polozhitel'noe chislo \n");
				goto m4;}
	if ((fp = fopen(fn,"rb+")) == NULL)
			{
				printf("File could not be opened.\n");
				return;
			}
			while(fread(&st,size,1,fp))
			{
				if (feof(fp)) break;
				if (st.id == number)
				{
					fseek(fp,-1*size,SEEK_CUR);
					fgetpos(fp,&filepos);
					pr=1;
					break;
				}
				else
					pr=0;
		    } 
			
			if (pr)
		 {
		printf("Ishodnaja zapis'\n");
		ramka();print_str(st);
printf("Nazhimayte ENTER v tekstovih polyah, esli izmeneniya" 
	   " v nih ne nuzhni\n");
			printf("Marka:");
			fflush(stdin);
			gets(buff);
			s=strlen(buff);
			if (s!=0)
				if (s>MAX)  strcpy(st.marka,str_cut(buff,s));
				else strcpy(st.marka,buff);
			
            printf("Model:");
			fflush(stdin);
			gets(buff);
			s=strlen(buff);
			if (s!=0)
				if (s>MAX)  strcpy(st.model,str_cut(buff,s));
				else strcpy(st.model,buff);

m15:       	printf("God vipuska:");
		    fflush(stdin);
			gets(buff);
			n=atoi(buff);
			if (n<=0) {printf("oshibka vvoda, vvedite polozhitel'noe chislo \n");
					   goto m15;}
			st.year=n;	

m16:        printf("Objom dvigatelja v litrah:");
			fflush(stdin);
			scanf("%f",&f);
			if (f<=0){ printf("oshibka vvoda, vvedite polozhitel'noe chislo \n");
								goto m16;}
			else st.engine=f;

m5:        	printf("Probeg v km:");
			fflush(stdin);
			gets(buff);
			n=atoi(buff);
			if (n<=0) {printf("oshibka vvoda, vvedite polozhitel'noe chislo \n");
					   goto m5;}
			else st.probeg=n;
			
m6:         printf("Cena v dollarah:");
			fflush(stdin);
			f=0;
			scanf("%f",&f);
			if (f<=0){ printf("oshibka vvoda, vvedite polozhitel'noe chislo \n");
								goto m6;}
			else st.price=f;

			
		if (!check(st))
				{
					fsetpos(fp,&filepos);
					fwrite(&st, sizeof(data),1,fp);
					printf("Izmenennaja zapis'\n");
					ramka();print_str(st);
		         }
					else 
					{
					    printf("Zapis' ne izmenilas' ili uzhe est' zapis', identi4naja ispravlennoy \n");
						printf("i poetomu izmeneniya otkloneni\n");
					}
		}
		else  printf("\r   Oshibka  - zapisi s takim kodom net\n");
 fclose(fp);
}

void view() 
{	FILE *fp;
	data st;
	
	if (file_empty()==1) return;

	if ((fp = fopen(fn,"rb")) == NULL)  
	{
		printf("File could not be opened.\n");
		return;
	}
    ramka();
	while (fread(&st,sizeof(data),1,fp))
	{
			if (feof(fp))
			break;
		else
				print_str(st);
		
	}
	printf("-----------------------------------"
	"---------------------------------------------");

	fclose(fp);
}
void sort()
{
	FILE *fp,*temp;
	data s1,s2,st,s3;
	data *s4;
	int size=sizeof(data),choice;
	int a,b;
	
	if (file_empty()==1) return;
	
	int n=get_number();
	s4=new data[n];
		
	printf("Sortirovat' po:\n");
                printf(" 1 - kodu zapisi  ");
		        printf(" 2 - marke  ");
		        printf(" 3 - modeli ");
				printf(" 4 - godu  \n");
		        printf(" 5 - objomu ");
				printf(" 6 - probegu  ");
		        printf(" 7 - cene  \n");
				printf(" 8 - Nazad \n ");
				

	if ((fp=fopen(fn,"rb")) == NULL)
	{
	printf("error.file does not exist.");
	return;
        }
  if ((temp=fopen("temp.$$$","wb")) == NULL)
                {
		printf("error. temp file couldn't be created");
		return;
                 }
    int i=0;
	while (fread(&st,sizeof(data),1,fp))
                    {
  		if (feof(fp))
			break;
		s4[i]=st;
		i++;
				     }
m8:	printf("Vvedite Vash vibor:  ");
	fflush(stdin);
    scanf("%d",&choice);
		switch(choice)  
	{
		
		case 1:     /*------------По коду записи -----------*/
					for(a=1; a<n; a++) for(b=n-1; b>=a; b--) 
			if ((s4[b-1].id)>(s4[b].id)) 
				{		
					s3 = s4[b-1];
					s4[b-1] = s4[b];
					s4[b] = s3;  
				}
		break;

		case 2:  /*-----------по марке--------------------*/
			for(a=1; a<n; a++) for(b=n-1; b>=a; b--) 
			if ( strcmp(s4[b-1].marka,s4[b].marka) >0 ) 
				{		
					s3 = s4[b-1];
					s4[b-1] = s4[b];
					s4[b] = s3;  
				}
						break;

		case 3:  /*-----------по модели--------------------*/
			for(a=1; a<n; a++) for(b=n-1; b>=a; b--) 
				if ( strcmp(s4[b-1].model,s4[b].model) >0 ) 
				{		
					s3 = s4[b-1];
					s4[b-1] = s4[b];
					s4[b] = s3;  
				}
						break;
		case 4:  /*-----------по году --------------------*/
			for(a=1; a<n; a++) for(b=n-1; b>=a; b--) 
			if ((s4[b-1].year)>(s4[b].year)) 
				{		
					s3 = s4[b-1];
					s4[b-1] = s4[b];
					s4[b] = s3;  
				}
			break;
		case 5:     /*----------По объёму---------------*/
		
			for(a=1; a<n; a++) for(b=n-1; b>=a; b--) 
			if ((s4[b-1].engine)>(s4[b].engine)) 
				{		
					s3 = s4[b-1];
					s4[b-1] = s4[b];
					s4[b] = s3;  
				}
			break;

		case 6:     /*----------По пробегу---------------*/
		
			for(a=1; a<n; a++) for(b=n-1; b>=a; b--) 
			if ((s4[b-1].probeg)>(s4[b].probeg)) 
				{		
					s3 = s4[b-1];
					s4[b-1] = s4[b];
					s4[b] = s3;  
				}
		break;

		case 7:     /*---------По цене----------------*/
						for(a=1; a<n; a++) for(b=n-1; b>=a; b--) 
			if ((s4[b-1].price)>(s4[b].price)) 
				{		
					s3 = s4[b-1];
					s4[b-1] = s4[b];
					s4[b] = s3;  
				}
		break;
			case 8: return;
			default: printf("Vvedite 1-8! \n");goto m8;
		}
 
		
		for (i=0; i<n; i++)
		fwrite(&s4[i],sizeof(data),1,temp);
	        
		fclose(temp);
		fclose(fp);
		if (remove(fn) == -1)
						{
			perror("remove");return;
						}
		if (rename("temp.$$$",fn) == -1)
        	        {
			perror("rename");	return;
					}
    	delete []s4;
}


void ramka()
{		printf("------------------------------------"
		"--------------------------------------------");
		printf("%-4s%-20s%-21s%-8s%-8s%-9s %-9s",
		"ID","Marka","Model","God","Objom","Probeg km","Cena $");
		printf("------------------------------------"
		"--------------------------------------------");

}

int find_max_num()
{
	FILE	*fp;
	data st;
	
	if ((fp = fopen(fn,"rb")) == NULL)  {
			printf("File could not be opened.\n");
			return -1;
		}
	int max=0;
	while (fread(&st,sizeof(data),1,fp)) {
		if (feof(fp))
			break;
		if (st.id>max)
			max=st.id;
	}
	fclose(fp);
	return(max);
}

int get_number()
{	FILE *fp;
	int fd,n=0;
	if ((fp = fopen(fn,"rb")) == NULL)
	{
		printf("File could not be opened.\n");
		return -1;
	}
	fd=fileno(fp);
	n=filelength(fd)/sizeof(data);
	fclose(fp);
	return(n);
}
void create()
{
	FILE *fp;
	printf("Vvedite imya fayla bez tochki i rasshireniya: ");
	fflush(stdin);
	gets(fn);
	strcat(fn,".dat");
	if ((fp=fopen(fn,"wb")) == NULL) {
		printf("Error creating file \n");
		getch();
		exit(10);
	}
	fclose(fp);
	interface();
}

void open()
{	FILE *fp;

		printf("Vvedite imya fayla bez tochki i rasshireniya: ");
		fflush(stdin);
		gets(fn);
		strcat(fn,".dat");
		if (!(fp=fopen(fn,"rb"))) 
		{
			printf("Error openinig file \n");
			getch();
			exit(10);
		}
		fclose(fp);
		interface();
}

int check(data st)
{
	FILE *fp;
	data temp;
	int pr=0;
	if ((fp = fopen(fn,"rb")) == NULL) {
		printf("File could not be opened.\n");
		return 0;
	}
	while ( fread( &temp, sizeof( data ), 1, fp)) 
	{
		if (feof(fp))
			break;
		if (!strcmp(st.marka,temp.marka)
		 && !strcmp(st.model,temp.model)
		 && (st.engine==temp.engine)
		 && (st.year==temp.year)
		 && (st.probeg==temp.probeg)
		 && (st.price == temp.price))  
				{
				pr=1;
				break;
				}
	} fclose(fp);
  return pr;
}

void print_str(data st)
{
printf("%-2d|%-20s|%-20s|%-8d|%-7.1f|%-7d"
	   "|%9.1f\n",st.id,st.marka,st.model,
	   st.year,st.engine,st.probeg,st.price);
}

void sost_skl()
{
	FILE *fp;
	data st;
	if (file_empty()==1) return;
	
	float sum=0;
	int k=0;
	if ((fp = fopen(fn,"rb")) == NULL)  
	{
		printf("File could not be opened.\n");
		return;
	}
   	while (fread(&st,sizeof(data),1,fp))
	{
			if (feof(fp))
			break;
		else
		sum=sum+st.price;
		k++;	
		
	}
	printf("\n------------------------------------"
		"--------------------------------------------");
	printf("Na sklade %d avto obs4ei stoimost'u %10.1f $ \n",k,sum );
	fclose(fp);
	printf("------------------------------------"
		"--------------------------------------------");
}

char *str_cut(char *buf,int s)
{char *buff;
buff=new char[s];
printf("urezaem do %d simvolov \n",MAX-1);
for (int i=0;i<MAX-1;i++) buff[i]=buf[i];
buff[MAX-1]=buf[s];
printf("%s \n",buff);
return(buff);
}


int file_empty()
{
if (get_number()<=0) {printf(" Oshibka! Fail pust. \n");
					return(1);}
else return(0);
}