Сведения о клиенте, программа не работает - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Это моя зачетная работа по "Технологии Программирования", которая не работает!
#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;
}
Вы спросите: "Что должна делать эта программа?" А я вам отвечу: 1.Ввод Сведений о новом клиенте 2.Удаление сведений о клиенте 3.Печать содержимого базы данных 4.Сохранение базы данных в файле 5.Загрузка базы данных из файла 6.Инициализация базы данных 7.Окончание работы

Решение задачи: «Сведения о клиенте, программа не работает»

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;
}

Оцени полезность:

7   голосов , оценка 4 из 5
Похожие ответы