
- •Введение
- •2 Условие задачи №1
- •3 Структура входных/выходных данных
- •4 Блок-схемы алгоритмов и алгоритмы по шагам
- •5 Код программы
- •6 Результаты работы программы
- •7 Условие задачи №2
- •8 Структура входных/выходных данных
- •9 Блок-схемы алгоритмов и алгоритмы по шагам
- •10 Код программы
- •11 Результаты работы программы
- •12 Условие задачи №3
- •13 Структура входных/выходных данных
- •14 Блок-схемы алгоритмов и алгоритмы по шагам
- •15 Код программы
- •16 Результаты работы программы
- •17 Заключение
- •18 Литература
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;
}
}