Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
3 проги на си ОАИП 2 сем 2009 вмсис / отчёт УЧЕБНАЯ ПРАКТИКА.doc
Скачиваний:
17
Добавлен:
15.06.2014
Размер:
1.59 Mб
Скачать

15 Код программы

#include<stdio.h>

#include<stdlib.h>

#include<string.h>

#include<conio.h>

#include<locale.h>

#include<io.h>

struct R

{

int p; // кол-во мест

int f_p; // кол-во свободных мест

char name[15]; // название стоянки

};

struct RING

{

R rr;

struct LINE *h,*t;

RING *l, *r;

};

struct L

{

char fio[30]; // фио владельца

char num[10]; // номер машины

};

struct LINE

{

L ll;

LINE *next;

};

RING* from_file(RING *); //запись информации из файла в оперативную память

int add_car(RING *, int); //добавление машины

void del_car(RING *); //удаление машины

RING* add_park(RING *); //добавление стоянки

RING* del_park(RING *); //удаление стоянки

void out(RING *); //вывод информации

void out_park(RING *); //вывод информации

void to_file(RING *); //запись информации из оперативн памят в файл

void free_mem(RING **);

void main()

{

RING *s = NULL, *cur;

int k = 1; //флаг окончания ввода стоянок и машин

int kk = 0; //флаг поиска стоянки (равен 0, если нет стоянки)

char in[15]; //буфер для ввода

setlocale(LC_ALL,".ACP");

s=from_file(s); //запись информации из файла в оперативную память

while(1)

{

puts("\nНажмите:");

puts("'1' - добавить машину на стоянку");

puts("'2' - удалить машину со стоянки");

puts("'3' - добавить стоянку");

puts("'4' - удалить стоянку");

puts("'5' - просмотреть информацию о всех стоянках");

puts("'6' - просмотреть информацию о выбранной стоянке");

puts("'q' - выход");

fflush(stdin);

switch(getch())

{

case '1':

if(!s)

{

puts("\nНет стоянок!");

getch();

break;

}

puts("\n\n******************** Добавление машины на стоянку ********************");

printf("\nВведите название стоянки --> ");

gets(in);

cur=s;

kk=0; //стоянка не найдена

k=0;

do //просмотр кольца стоянок

{

if(!strcmp(cur->rr.name,in))

{

kk=1; //стоянка найдена

break;

}

cur=cur->l;

}

while(cur != s);

if(kk == 1) //если стоянка найдена

while(k != -1) //пока нужно вводить

k=add_car(cur,k); //ввод машин

else

{

puts("\nТакой стоянки нет");

getch();

}

break;

case '2':

if(!s)

{

puts("\nНет стоянок!");

getch();

break;

}

puts("\n\n******************** Удаление машины со стоянки ********************");

printf("\nВведите название стоянки --> ");

gets(in);

cur=s;

kk=0; //стоянка не найдена

do //просмотр кольца стоянок

{

if(!strcmp(cur->rr.name,in))

{

kk=1; //стоянка найдена

break;

}

cur=cur->l;

}

while(cur != s);

if(kk == 1) //если стоянка найдена

del_car(cur); //ввод машины

else

{

puts("\nТакой стоянки нет");

getch();

}

break;

case '3':

puts("\n\n******************** Добавление стоянки ********************");

s=add_park(s);

break;

case '4':

if(!s)

{

puts("\nНет стоянок!");

getch();

break;

}

puts("\n\n******************** Удаление стоянки ********************");

s=del_park(s);

break;

case '5':

if(!s)

{

puts("\nНет стоянок!");

getch();

break;

}

puts("\n\n ******************** Просмотр информации о стоянках ********************");

out(s);

printf("\n для продолжения нажмите любую кнопку . . .");

getch();

break;

case '6':

if(!s)

{

puts("\nНет стоянок!");

getch();

break;

}

puts("\n\n****************** Просмотр информации о выбранной стоянке *****************");

printf("Введите название стоянки --> ");

gets(in);

cur=s;

kk=0; //стоянка не найдена

do //просмотр кольца стоянок

{

if(!strcmp(cur->rr.name,in))

{

kk=1; //стоянка найдена

break;

}

cur=cur->l;

}

while(cur != s);

if(kk == 1) //если стоянка найдена

out_park(cur); //ввод машины

else

{

puts("\nТакой стоянки нет");

getch();

}

printf("\n для продолжения нажмите любую кнопку . . .");

getch();

break;

case 'q':

to_file(s);

free_mem(&s);

return;

}

}

setlocale(LC_ALL,".OCP");

}

RING* from_file(RING *s)

{

FILE *f,*g;

int fd; //дескриптор файла f

int gd; //дескриптор файла g

long l; //длина файла f

long gl; //длина файла g

int kk = 0; //счётчик числа структур f

int gkk = 0; //счётчик числа структур g

char buffer[10]; //имя файла

LINE *cur;

RING *s1, *s2;

if(!(f = fopen("parking.dat","rb")))

{

puts("\nОшибка открытия файла!");

getch();

return 0;

}

fd=fileno(f); //переход от указателя на файл к дескриптору

if(!(l=filelength(fd))) //если файл пуст то return

return 0;

if(!s)

{

if(!(s=(RING*)calloc(1,sizeof(RING))))

{

printf("No memory!\n");

getch();

}

fread(&(s->rr),sizeof(R),1,f); //чтения блока кольца

s->h=0; //обнуление указателей

s->t=0;

s->l=s;

s->r=s;

s1=s;

itoa(i,buffer,10); //создать имя файла

strcat(buffer,"_f.dat");

if(!(g = fopen(buffer,"rb")))

{

puts("\nОшибка открытия файла!");

getch();

return 0;

}

for(int a=0; a<1; a++) //выполнить один раз

{

gd=fileno(g); //переход от указателя на файл к дескриптору

if(!(gl=filelength(gd))) //если файл пуст

break;

}

do

{

if(!(cur=(LINE*)calloc(1,sizeof(LINE))))

{

printf("No memory!\n");

getch();

}

fread(&(cur->ll),sizeof(L),1,g); //чтения блока очереди

if(!s->h)

(s->t)=(s->h)=cur;

else

{

(s->t)->next=cur;

(s->t)=cur;

}

gkk++;

}

while(gl > gkk*sizeof(L)); //пока не кончились блоки очереди в файле

fclose(g);

kk++;

}

else s1=s->r; //кольцо уже существует

if(l <= sizeof(R)) //если больше нет блоков кольца в файле

return s;

do

{

if(!(s2=(RING*)calloc(1,sizeof(RING))))

{

printf("No memory!\n");

getch();

}

fread(&(s2->rr),sizeof(R),1,f); //чтения блока кольца

s2->h=0; //обнуление указателей

s2->t=0;

s1->l=s2;

s2->r=s1;

s1=s2;

itoa(i,buffer,10);

strcat(buffer,"_f.dat");

if(!(g = fopen(buffer,"rb")))

{

puts("\nОшибка открытия файла!");

getch();

return 0;

}

for(int a=0; a<1; a++) //выполнить один раз

{

gd=fileno(g); //переход от указателя на файл к дескриптору

if(!(gl=filelength(gd))) //если файл пуст

break;

}

gkk = 0;

do

{

if(!(cur=(LINE*)calloc(1,sizeof(LINE))))

{

printf("No memory!\n");

getch();

}

fread(&(cur->ll),sizeof(L),1,g);

if(!s2->h)

(s2->t)=(s2->h)=cur;

else

{

(s2->t)->next=cur;

(s2->t)=cur;

}

gkk++;

}

while(gl > gkk*sizeof(L)); //пока не кончились блоки очереди в файле

fclose(g);

kk++;

}

while(l > kk*sizeof(R)); //пока не кончились блоки кольца в файле

s2->l=s;

s->r=s2; //кольцо замкнулось

fclose(f);

return s;

}

int add_car(RING *s, int k)

{

LINE *cur;

if(!(cur=(LINE*)calloc(1,sizeof(LINE))))

{

printf("No memory!\n");

getch();

}

printf("\nВведите номер машины --> ");

fflush(stdin);

gets(cur->ll.num);

if(cur->ll.num[0] == '\0') //если нужно прекратить ввод

{

free(cur);

return -1;

}

printf("Введите ФИО владельца --> ");

fflush(stdin);

gets(cur->ll.fio);

if(s->rr.f_p != 0)

s->rr.f_p = s->rr.f_p - 1; //свободные места

if(!(s->h) || !s->h->ll.fio[0]) //создаётся очередь

(s->t)=(s->h)=cur;

else

{

(s->t)->next=cur;

(s->t)=cur;

}

k++;

return k;

}

void del_car(RING *cur)

{

LINE *p,*pr;

char in[10];

if (!(cur->h))

{

puts("\nНа этой стоянке нет машин");

getch();

return;

}

printf("\nВведите номер машины --> ");

gets(in);

if (cur->h == cur->t && !strcmp(((cur->h))->ll.num,in)) // в очереди только один элемент

{

free((cur->h));

(cur->h)=(cur->t)=NULL; //очередь пуста

cur->rr.f_p = cur->rr.f_p + 1; //свободные места

return;

}

p=pr=(cur->h);

do

{

if (!strcmp(pr->ll.num,in)) // найдена машина

{

if (pr == (cur->h))

{

(cur->h)=pr->next;

free(pr);

p=pr=(cur->h);

cur->rr.f_p = cur->rr.f_p + 1; //свободные места

return;

}

else

{

p->next=pr->next; // обходим элемент pr

free(pr); // удаляем элемент pr очереди

pr=p->next; // выбор следующего элемента очереди pr

cur->rr.f_p = cur->rr.f_p + 1; //свободные места

return;

}

}

else // переход к следующему элементу

{

p=pr;

pr=pr->next;

}

}

while(pr);

}

RING* add_park(RING *s)

{

RING *s1, *s2;

int z;

if(!s) //кольцо ещё не создано

{

if(!(s=(RING*)calloc(1,sizeof(RING))))

{

printf("No memory!\n");

getch();

}

printf("\nВведите название стоянки --> ");

fflush(stdin);

gets(s->rr.name);

do

{

fflush(stdin);

printf("Введите кол-во мест --> ");

z=scanf("%d",&(s->rr.p));

s->rr.f_p=s->rr.p;

}

while(z != 1);

s->l=s;

s->r=s;

s1=s;

}

else s1=s->r; //кольцо уже существует

if(!(s2=(RING*)calloc(1,sizeof(RING))))

{

printf("No memory!\n");

getch();

}

printf("\nВведите название стоянки --> ");

fflush(stdin);

gets(s2->rr.name);

do

{

fflush(stdin);

printf("Введите кол-во мест --> ");

z=scanf("%d",&(s2->rr.p));

s2->rr.f_p=s2->rr.p;

}

while(z != 1);

s1->l=s2;

s2->r=s1;

s1=s2;

s2->l=s;

s->r=s2; //кольцо замкнулось

return s;

}

RING* del_park(RING *s)

{

RING *cur = s;

char in[15];

if(!s)

{

puts("\nНет стоянок!");

getch();

return s;

}

printf("\nВведите название стоянки --> ");

gets(in);

do

{

if(strcmp(cur->rr.name,in)) //если не найдена стоянка

cur=cur->r;

else //если найдена стоянка

{

if(cur->r == cur) //элемент в кольце один

{

free(s);

return 0;

}

if(cur == s)

s=s->r;

cur->l->r=cur->r; //обход удаляемого элемента

cur->r->l=cur->l;

free(cur);

puts("\nСтоянка удалена");

return s;

}

}

while(cur != s);

puts("\nТакой стоянки нет");

}

void out(RING *s)

{

RING *cur=s;

LINE *temp;

int k; //номер места

do

{

k=1;

printf("\n\n\n");

printf(" ______________________________________________________________________________ ");

printf("| |");

printf("| СТОЯНКА %15s |",cur->rr.name);

printf("|______________________________________________________________________________|");

printf("| | |");

printf("| КОЛИЧЕСТВО МЕСТ - %3d | КОЛИЧЕСТВО СВОБОДНЫХ МЕСТ - %3d |",cur->rr.p,cur->rr.f_p);

printf("|_____________________________________|________________________________________|");

printf("| | | |");

printf("| МЕСТО | НОМЕР МАШИНЫ | ФИО ВЛАДЕЛЬЦА |");

printf("|_________|________________|___________________________________________________|");

temp=cur->h;

while(temp != NULL || k <= cur->rr.p) //пока есть машины или не кончились места

{

printf("| | | |");

if(temp == NULL)

{

printf("| %3d | | |",k);

printf("|_________|________________|___________________________________________________|");

k++;

continue;

}

printf("| %3d | %10s | %30s |",k,temp->ll.num,temp->ll.fio);

printf("|_________|________________|___________________________________________________|");

if(temp == cur->t)

{

k++;

while(k <= cur->rr.p)

{

printf("| | | |");

printf("| %3d | | |",k++);

printf("|_________|________________|___________________________________________________|");

}

break;

}

if(k == cur->rr.p) //если все места заняты

{

printf("\n");

printf("**************** ****************");

printf("**************** СЛЕДУЮЩИЕ МАШИНЫ В ОЧЕРЕДИ ****************");

printf("**************** ****************");

printf(" ______________________________________________________________________________ ");

}

temp=temp->next;

k++;

}

cur=cur->l;

printf("|_________|________________|___________________________________________________|");

}

while(cur != s);

}

void out_park(RING *cur)

{

LINE *temp = cur->h;

int k = 1; //номер места

printf("\n\n\n");

printf(" ______________________________________________________________________________ ");

printf("| |");

printf("| СТОЯНКА %15s |",cur->rr.name);

printf("|______________________________________________________________________________|");

printf("| | |");

printf("| КОЛИЧЕСТВО МЕСТ - %3d | КОЛИЧЕСТВО СВОБОДНЫХ МЕСТ - %3d |",cur->rr.p,cur->rr.f_p);

printf("|_____________________________________|________________________________________|");

printf("| | | |");

printf("| МЕСТО | НОМЕР МАШИНЫ | ФИО ВЛАДЕЛЬЦА |");

printf("|_________|________________|___________________________________________________|");

while(temp != NULL || k <= cur->rr.p) //пока есть машины или не кончились места

{

printf("| | | |");

if(temp == NULL)

{

printf("| %3d | | |",k);

printf("|_________|________________|___________________________________________________|");

k++;

continue;

}

printf("| %3d | %10s | %30s |",k,temp->ll.num,temp->ll.fio);

printf("|_________|________________|___________________________________________________|");

if(temp == cur->t)

{

k++;

while(k <= cur->rr.p)

{

printf("| | | |");

printf("| %3d | | |",k++);

printf("|_________|________________|___________________________________________________|");

}

break;

}

if(k == cur->rr.p) //если все места заняты

{

printf("\n");

printf("**************** ****************");

printf("**************** СЛЕДУЮЩИЕ МАШИНЫ В ОЧЕРЕДИ ****************");

printf("**************** ****************");

printf(" ______________________________________________________________________________ ");

}

temp=temp->next;

k++;

}

printf("|_________|________________|___________________________________________________|");

}

void to_file(RING *s)

{

FILE *f,*g;

RING *cur=s;

LINE *temp;

char buffer[10]; //имя файла

if(!(f = fopen("parking.dat","w+b")))

{

puts("\nОшибка открытия файла!");

getch();

return;

}

if(!s) //если нет стоянок то закрыть файл

{

fclose(f);

return;

}

do

{

temp=cur->h;

fwrite(&(cur->rr),sizeof(R),1,f); //запись в файл элемента кольца

itoa(i,buffer,10); //создание имени файла

strcat(buffer,"_f.dat");

if(!(g = fopen(buffer,"w+b")))

{

puts("\nОшибка открытия файла!");

getch();

return;

}

while(temp) //проход очереди

{

fwrite(&(temp->ll),sizeof(L),1,g); //запись в файл элемента очереди

temp=temp->next;

}

fclose(g);

cur=cur->l;

}

while(cur != s);

fclose(f);

}

void free_mem(RING **s)

{

RING *cur, *head=*s;

LINE *temp;

while(*s)

{

cur=*s;

while((*s)->h)

{

temp=(*s)->h;

(*s)->h=(*s)->h->next;

free(temp);

}

*s=(*s)->r;

free(cur);

if(*s == head)

return;

}

}