Сведения о клиенте, программа не работает - C (СИ)
Формулировка задачи:
Это моя зачетная работа по "Технологии Программирования", которая не работает!
Вы спросите: "Что должна делать эта программа?"
А я вам отвечу:
1.Ввод Сведений о новом клиенте
2.Удаление сведений о клиенте
3.Печать содержимого базы данных
4.Сохранение базы данных в файле
5.Загрузка базы данных из файла
6.Инициализация базы данных
7.Окончание работы
#include <stdio.h>
#include <string.h>
struct person
{
char name[20];
int zavtrak[3];
int nomer[5];
int datazaezda[20];
int dataviezda[20];
struct person *prior;
struct person *next;
} st[100];
const int M=100;
struct control
{
int nb;
int nf;
struct person *bbeg;
struct person *bend;
struct person *fbeg;
struct person *fend;
struct person *ptf;
} ctrl;
int init(void);
int input(void);
int delete(void);
struct person *find(char *nam);
int fr(struct person *ptr);
int print(void);
int save(void);
int load(void);
void main(void)
{
char numb[10]; //?
while (1)
{
printf("1.Ввод Сведений о новом клиенте \n");
printf("2.Удаление сведений о клиенте \n");
printf("3.Печать содержимого базы данных \n");
printf("4.Сохранение базы данных в файле \n");
printf("5.Загрузка базы данных из файла \n");
printf("6.Инициализация базы данных \n");
printf("7.Окончание работы \n");
printf("\n\n Введите номер пункта меню\n");
scanf("%s", numb );
switch( numb[0] )
{
case '1':
input( );
break;
case '2':
delete( );
break;
case '3':
print( );
break;
case '4':
save( );
break;
case '5':
load( );
break;
case '6':
init( );
break;
case '7':
return;
default:
printf("Неверно указан номер пункта меню\n");
}
}
}
int init(void)
{
struct person *point=st;
int i;
ctrl.nb=0;
ctrl.nf=0;
ctrl.bbeg=NULL;
ctrl.bend=NULL;
ctrl.fbeg=st;
ctrl.fend=st;
point=st;
printf("\n\n Инициализация массива. \n");
for (i=0; i<M-1; i++)
{
if (ctrl.nf!=0)
{
point->prior=point-1;
point->next=point+1;
}
else
{
point->prior=NULL;
point->next=point+1;
}
point++;
ctrl.nf++;
ctrl.fend++;
}
ctrl.nf++;
point->prior=point-1;
point->next=NULL;
return 0;
}
int delete(void)
{
char nam[20];
int i;
struct person *ptr;
printf("\n\n Функция удаления элемента \n");
if(ctrl.nb==0)
{
printf("Список занятых элементов пуст \n");
return -1;
}
printf("Введите: Ф.И.О \n");
scanf("%s", nam);
if ((ptr=find(nam))==0)
{
printf("Фамилия не найдена \n");
return -1;
}
if (ptr==ctrl.bbeg)
{
if (ctrl.nb==1)
{
ctrl.bend=NULL;
fr(ptr);
return 0;
}
else
{
ctrl.bbeg=ptr->next;
ctrl.bbeg->prior=NULL;
fr(ptr);
return 0;
}
}
else
{
if (ptr==ctrl.bend)
{
ptr->prior->next=NULL;
ctrl.bend=ptr->prior;
fr(ptr);
return 0;
}
else
{
ptr->prior->next=ptr->next;
ptr->next->prior=ptr->prior;
fr(ptr);
return 0;
}
}
}
struct person *find(char *nam)
{
int i;
struct person *ptf;
ctrl.ptf=bbeg;//ptf
for (i=0; i<ctrl.nb; i++)
{
if ((strcmp(nam, ptf->name))==0)//ptf
return ptf;//ptf
ptf=ptf->next;//ptf
}
return NULL;
}
int fr(struct person *ptr)
{
if(ctrl.nb==M)
{
ptr->prior=NULL;
ptr->next=NULL;
ctrl.fbeg->prior=ptr;
ctrl.fbeg=ptr;
}
else
{
ptr->prior=NULL;
ptr->next=ctrl.fbeg;
ctrl.fbeg->prior=ptr;
ctrl.fbeg=ptr;
}
ctrl.nb--;
ctrl.nf++;
return 0;
}
int input(void)
{
struct person *ptr;
printf("\n\n Функция вставки элемента \n");
if (ctrl.nf==0)
{
printf("\n\n Свободных элементов нет\n");
return -1;
}
printf("Введите: Ф.И.О. \n");
scanf("%s", &ptr->name);
printf("Завтрак? \n");
printf("1-да\n 2-нет\n");
scanf("%d", ptr->zavtrak);
printf("Введите дату заселения\n");
printf("по формату ЧЧ/ММ/ДД/ММ/ГГ без<</>>");
scanf("%d", &ptr->datazaezda);
printf("Введите дату выселения\n");
printf("по формату ЧЧ/ММ/ДД/ММ/ГГ без<</>>");
scanf("%d", ptr->dataviezda);
printf("Введите номер комнаты\n");
scanf("%d", &ptr->nomer);
if (ctrl.nf==1)
{
ctrl.fbeg=NULL;
ptr->next=NULL;
ptr->prior=ctrl.bend;
ctrl.bend->next=ptr;
ctrl.bend=ptr;
ctrl.fend=NULL;
}
else
{
if(ctrl.nb==0)
ctrl.bbeg=ptr;
ctrl.fbeg=ptr->next;
ptr->next=NULL;
ptr->prior=ctrl.bend;
ctrl.bend->next=ptr;
ctrl.bend=ptr;
ctrl.fbeg->prior=NULL;
}
}
int save(void)
{
int i,k;
struct person *ptr;
char *c;
int *pti;
FILE *fp;
if((fp=fopen("bd.dat","w"))==NULL)
{
perror("bd.dat");
return -1;
}
if(ctrl.nb==0)
{
puts("База данных пуста \n");
puts("Запись на диск не производиться \n");
return -1;
}
else
{
puts("Производиться запись базы данных в файл\n");
ptr=st;
pti=&ctrl.nb;
c=(char *)pti;
for (i=0; i<sizeof(ctrl); i++)
putc(*c++, fp);
c=(char *)ptr;
for(k=0; k<sizeof(st); k++)
putc(*c++, fp);
fclose(fp);
return 0;
}
}
int load(void)
{
int i;
struct person *ptr;
int *pti;
char *c, d;
FILE *fp;
if ((fp=fopen("bd.dat","r"))==NULL)
{
perror("bd.dat");
return -1;
}
if(ctrl.nb==0)
puts("База данных пуста\n");
if(ctrl.nb!=0)
{
puts("База в основной памяти не пуста\n");
puts("Произвести загрузку [y,n]");
d=getchar();
if(d=='N'||d=='n')
{
puts("Запрос на загрузку базы данных отменен\n");
return 1;
}
}
puts("Производиться загрузка базы данных\n");
pti=&ctrl.nb;
c=(char *)pti;
for(i=0; i<sizeof(ctrl); i++)
*c++=getc(fp);
ptr=st;
c=(char *)ptr;
for(i=0; i<sizeof(st); i++)
{
if((*c=getc(fp)) !=EOF)
c++;
else
{
fclose(fp);
return 0;
}
}
return 0;
}
int print(void)
{
int i;
struct person *ptr;
ptr=ctrl.bbeg;
printf("База данных \"Клиенты\" \n\n\n");
if (ctrl.nb==0)
{
printf("База данных пуста \n");
return -1;
}
for(i=0; i<ctrl.nb; i++)
{
printf("%d Фамилия: %s\n", i, ptr->name);
printf("Завтрак: %d\n", ptr->zavtrak);
printf("Дата заселения: %d\n", ptr->datazaezda);
printf("Дата выселения: %d\n", ptr->dataviezda);
printf("Комната: %d\n", ptr->nomer);
ptr=ptr->next;
}
printf("\n\n Общее число записей =%d\n",i);
return 0;
}Решение задачи: «Сведения о клиенте, программа не работает»
textual
Листинг программы
#include "stdafx.h"
#include <stdio.h>
#include <string.h>
struct person
{
char name[20];
int zavtrak[3];
int nomer[5];
int datazaezda[20];
int dataviezda[20];
struct person* prior;
struct person* next;
} st[100];
const int M = 100;
struct control
{
int nb;
int nf;
struct person* bbeg;
struct person* bend;
struct person* fbeg;
struct person* fend;
struct person* ptf;
} ctrl;
int init()
{
struct person* point = st;
int i = 0;
ctrl.nb = 0;
ctrl.nf = 0;
ctrl.bbeg = NULL;
ctrl.bend = NULL;
ctrl.fbeg = st;
ctrl.fend = st;
point = st;
printf("\n\n Инициализация массива. \n");
for (i = 0; i < M - 1; i++)
{
if (ctrl.nf)
{
point->prior = point - 1;
point->next = point + 1;
}
else
{
point->prior = NULL;
point->next = point + 1;
}
point++;
ctrl.nf++;
ctrl.fend++;
}
ctrl.nf++;
point->prior = point - 1;
point->next = NULL;
return 0;
}
struct person* find(char* nam)
{
int i = 0;
struct person* ptf = NULL;
ctrl.ptf = ctrl.bbeg; // ptf
for (i = 0; i < ctrl.nb; i++)
{
if (!strcmp(nam,ptf->name)) // ptf
{
return ptf;
}//ptf
ptf = ptf->next; // ptf
}
return NULL;
}
int fr(struct person* ptr)
{
if (ctrl.nb == M)
{
ptr->prior = NULL;
ptr->next = NULL;
ctrl.fbeg->prior = ptr;
ctrl.fbeg = ptr;
}
else
{
ptr->prior = NULL;
ptr->next = ctrl.fbeg;
ctrl.fbeg->prior = ptr;
ctrl.fbeg = ptr;
}
ctrl.nb--;
ctrl.nf++;
return 0;
}
int Delete()
{
char nam[20];
// int i = 0;
struct person* ptr;
printf("\n\nФункция удаления элемента\n");
if (!ctrl.nb)
{
printf("Список занятых элементов пуст\n");
return -1;
}
printf("Введите: Ф.И.О\n");
scanf("%s",nam);
ptr = find(nam);
if (!ptr)
{
printf("Фамилия не найдена\n");
return -1;
}
if (ptr == ctrl.bbeg)
{
if (ctrl.nb == 1)
{
ctrl.bend = NULL;
fr(ptr);
return 0;
}
else
{
ctrl.bbeg = ptr->next;
ctrl.bbeg->prior = NULL;
fr(ptr);
return 0;
}
}
else
{
if (ptr == ctrl.bend)
{
ptr->prior->next = NULL;
ctrl.bend = ptr->prior;
fr(ptr);
return 0;
}
else
{
ptr->prior->next = ptr->next;
ptr->next->prior = ptr->prior;
fr(ptr);
return 0;
}
}
}
int input()
{
struct person* ptr = NULL;
printf("\n\nФункция вставки элемента\n");
if (!ctrl.nf)
{
printf("\n\nСвободных элементов нет\n");
return -1;
}
printf("Введите: Ф.И.О. \n");
scanf("%s",&ptr->name);
printf("Завтрак?\n");
printf("1-да\n 2-нет\n");
scanf("%d",ptr->zavtrak);
printf("Введите дату заселения\n");
printf("по формату ЧЧ/ММ/ДД/ММ/ГГ без<</>>");
scanf("%d",&ptr->datazaezda);
printf("Введите дату выселения\n");
printf("по формату ЧЧ/ММ/ДД/ММ/ГГ без<</>>");
scanf("%d",ptr->dataviezda);
printf("Введите номер комнаты\n");
scanf("%d",&ptr->nomer);
if (ctrl.nf == 1)
{
ctrl.fbeg = NULL;
ptr->next = NULL;
ptr->prior = ctrl.bend;
ctrl.bend->next = ptr;
ctrl.bend = ptr;
ctrl.fend = NULL;
}
else
{
if (!ctrl.nb)
{
ctrl.bbeg = ptr;
}
ctrl.fbeg = ptr->next;
ptr->next = NULL;
ptr->prior = ctrl.bend;
ctrl.bend->next = ptr;
ctrl.bend = ptr;
ctrl.fbeg->prior = NULL;
}
return 0;
}
int save()
{
int i, k;
struct person* ptr;
char* c;
int* pti;
FILE* fp = fopen("bd.dat","w");
if (!fp)
{
perror("bd.dat");
return -1;
}
if (!ctrl.nb)
{
puts("База данных пуста\n");
puts("Запись на диск не производится\n");
return -1;
}
else
{
puts("Производиться запись базы данных в файл\n");
ptr = st;
pti = &ctrl.nb;
c = (char*)pti;
for (i = 0; i < sizeof(ctrl); i++)
{
putc(*c++,fp);
}
c = (char*)ptr;
for (k = 0; k < sizeof(st); k++)
{
putc(*c++,fp);
}
fclose(fp);
return 0;
}
}
int load()
{
int i;
struct person* ptr;
int* pti;
char* c, d;
FILE* fp = fopen("bd.dat","r");
if (!fp)
{
perror("bd.dat");
return -1;
}
if (!ctrl.nb)
{
puts("База данных пуста\n");
}
if (ctrl.nb)
{
puts("База в основной памяти не пуста\n");
puts("Произвести загрузку [y,n]");
d = (char)getchar();
if (d == 'N' || d == 'n')
{
puts("Запрос на загрузку базы данных отменен\n");
return 1;
}
}
puts("Производится загрузка базы данных\n");
pti = &ctrl.nb;
c = (char*) pti;
for (i = 0; i < sizeof(ctrl); i++)
{
*c++ = (char)getc(fp);
}
ptr = st;
c = (char*)ptr;
for (i = 0; i < sizeof(st); i++)
{
*c = (char)getc(fp);
if (*c != EOF)
{
c++;
}
else
{
fclose(fp);
return 0;
}
}
return 0;
}
int print()
{
int i = 0;
struct person* ptr;
ptr = ctrl.bbeg;
printf("База данных \"Клиенты\"\n\n\n");
if (!ctrl.nb)
{
printf("База данных пуста\n");
return -1;
}
for (i = 0; i < ctrl.nb; i++)
{
printf("%d Фамилия: %s\n",i,ptr->name);
printf("Завтрак: %d\n",ptr->zavtrak);
printf("Дата заселения: %d\n",ptr->datazaezda);
printf("Дата выселения: %d\n",ptr->dataviezda);
printf("Комната: %d\n",ptr->nomer);
ptr = ptr->next;
}
printf("\n\nОбщее число записей =%d\n",i);
return 0;
}
int main(int argc,char** argv)
{
char numb[10]; //?
while (true)
{
printf("1.Ввод сведений о новом клиенте\n");
printf("2.Удаление сведений о клиенте\n");
printf("3.Печать содержимого базы данных\n");
printf("4.Сохранение базы данных в файле\n");
printf("5.Загрузка базы данных из файла\n");
printf("6.Инициализация базы данных\n");
printf("7.Окончание работы\n");
printf("\n\n Введите номер пункта меню\n");
scanf("%s",numb);
switch (numb[0])
{
case '1':
{
input();
break;
}
case '2':
{
Delete();
break;
}
case '3':
{
print();
break;
}
case '4':
{
save();
break;
}
case '5':
{
load();
break;
}
case '6':
{
init();
break;
}
case '7':
{
return 0;
}
default:
{
printf("Неверно указан номер пункта меню\n");
}
}
}
return 0;
}