Электронная картотека

Текст программы:

#include<alloc.h>
#include<conio.h>
#include<dos.h>
#include <stdio.h>
#include <string.h>

struct PL                     //Задание структурных переменных
       {
        char namepl[18];
        int year;
        char people[15];
        unsigned int sputnik;
        PL *prev;
        PL *next;
       };

void menu1()                    //Функция главного меню
{
 clrscr();
 printf("\n\t?------------------------------------------------------------
?\n");
 printf(  "\t|                                                            |
 ");
 puts(  "\n\t|     К А Р Т О Т Е К А   П Л А Н Е Т
|\n");
        " \t |\t\t               С О Л Н Е Ч Н О Й   С И С Т Е М Ы        |
 ");
 puts(    "\t?------------------------------------------------------------?
 ");
 puts("\n\t\t          Главное меню :\n");
 puts("\t\t  1- Рекомендации пользователю.");
 puts("\t\t  2- Ввод данных.");
 puts("\t\t  3- Вывод всех данных.");
 puts("\t\t  4- Просмотр, удаление, добавление.");
 puts("\t\t  5- Вывод данных по определенному признаку.");
 puts("\t\t  6- Сортировка.");
 puts("\t\t  7- Выход.");
}

void menu2()               //Меню поиска элементов
{
 puts("\n\n\n\n\t\t\t         Меню поиска:\n");
 puts("\t\t\t 1- Вывод по названию планеты.");
 puts("\t\t\t 2- Вывод по году  открытия.");
 puts("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\t      Для выхода в главное меню
нажмите любую клавишу.");
}


void sovet(char *s)         //Функция подсказки
{
 window(1,25,79,25);
 textcolor(GREEN+BLUE);
 textbackground(WHITE+YELLOW);

 clrscr();
 cprintf(" %s",s);
 textcolor(10);
 window(1,1,79,25);
 textbackground(0);
}

void vvod(PL *pla)             //Функция ввода структуры
{
 do
   {
    clrscr();
    puts("Введите имя планеты :");
    fflush(stdin);
    gets(pla->namepl);
   }
 while(strlen(pla->namepl)>18);
    do
      {
       puts("Год открытия планеты :");
       scanf("%d",&(pla->year));
      }
    while((pla->year)<-30000 || (pla->year)>30000);
    do
      {
       puts("Кто открыл планету :");
       fflush(stdin);
       gets(pla->people);
      }
    while(strlen(pla->people)>15);
    do
      {
       puts("Сколько спутников ?");
       scanf("%d",&(pla->sputnik));
      }
    while(((pla->sputnik)<0) || ((pla->sputnik)>999));
}

PL* vvodall()              //Функция ввода структур
{
 PL *playn, *pla;
 clrscr();
 sovet("Введите параметры планеты");
 pla=(PL*)malloc(sizeof(PL));
 vvod(pla);
 playn=pla;
 pla->next=NULL;
 sovet("Для дальнейщего ввода нажми y, иначе любую клавишу.");

 while (getch()=='y')
   {
    clrscr();
    sovet("Введите параметры планеты");
    pla=(PL*)malloc(sizeof(PL));
    vvod(pla);
    playn->prev=pla;
    pla->next=playn;
    playn=pla;
    sovet("Для дальнейщего ввода нажми y, иначе любую клавишу.");
   }
 pla->prev=NULL;
 while (pla->next)
 pla=pla->next;
 return(pla);
 }


void vivodall(PL *pla)         //Функция вывода на экран всех структур
{
 int i=1;
 puts("\n\t\t\t  В С Я    К А Р Т О Т Е К А\n");
 printf("+------+-----------------+------------+---------------+-----------
+\n");
printf("| Номер|   Название      |  Когда     |  Кто  открыл  |  Кол-во
|\n");
printf("| стр. |       планеты   |    открыли |   планету     | спутников
|\n");
printf("+------+-----------------+------------+---------------+-----------
+\n");
printf("+------+-----------------+------------+---------------+-----------
+\n");
 while (pla->prev)
   {
    printf("| %5d | %18s | %12u | %15s | %11u |   ",i,pla->namepl,
             pla->year,pla->people,pla->sputnik);
    pla=pla->prev;  i++;
   }
 printf("| %5d | %18s | %12u | %15s | %11u |   ",i,pla->namepl,
             pla->year,pla->people,pla->sputnik);
 printf("+------+-----------------+------------+---------------+-----------
+");
 gotoxy(22,24);
 puts("Вывод закончен, нажмите любую клавишу.");
 getch();
}

void spisok(PL* pla)           //Функция для работы со списком
{
 clrscr();
 window(17,2,62,15);
 textbackground(4);
 textcolor(15);
 clrscr();
 if (pla!=NULL)
   {
    cprintf("\n");
    cprintf("%30s","ПАРАМЕТРЫ ПЛАНЕТ\n\n");
    gotoxy(1,wherey()+2);
    cprintf("   Название:             %s",pla->namepl);
    gotoxy(1,wherey()+2);
    cprintf("   Год открытия:         %d",pla->year);
    gotoxy(1,wherey()+2);
    cprintf("   Кто открыл:           %s",pla->people);
    gotoxy(1,wherey()+2);
    cprintf("   Сколько спутников:    %d",pla->sputnik);
   }
 textbackground(2);
 sovet("Cледующая/Предыдущая планета(PgDn/PgUp)"
                 "Удаление(Del)""Добавление(Ins)""Выход(Esc)");
}

PL* vvodspisok(PL* pla)    //Функция ввода элементов списка
{
 PL* plr=pla;
 char c;
 sovet("Добавить элемент до / после текущего(Home/End)"
                                   "Отмена(Esc)");
 do
   {
    c=getch();
/*Esc*/ if (c==27) return(pla);
      if (c==71||c==79)
        {
         clrscr();
         sovet("Введите параметры планеты");
         plr=(PL*)malloc(sizeof(PL));
         vvod(plr);
         if (pla==NULL)
           {
            plr->next=NULL;
            plr->prev=NULL;
            return(plr);
           }
/*End*/ if (c==79)
        {
         plr->next=pla->next;
         plr->prev=pla;
         pla->next=plr;
         (plr->next)->prev=plr;
        }
/*Home*/if (c==71)
        {
         plr->next=pla;
         plr->prev=pla->prev;
         pla->prev=plr;
         (plr->prev)->next=plr;
        }
      return(plr);
       }
   }
 while(1);
}

PL* vozvr(PL* pla)    //Возвращает указатель
{                          //на начало списка pla
 if (pla==NULL)
   return(pla);
 while(pla->next!=NULL)
 pla=pla->next;
 return(pla);
}

PL* korrekt(PL *pla)      //Управляющие клавиши при работе со списком
{
 spisok(pla);
 PL* delit(PL*);
   do
     {
      switch(getch())
      {
/*PgUp*/ case 73:if(pla!=NULL)
         {
          if(pla->prev!=NULL)pla=pla->prev;spisok(pla);
         }
         break;
/*PgDn*/ case 81:if(pla!=NULL)
         {
          if(pla->next!=NULL)pla=pla->next;spisok(pla);
         }
         break;
 /*Del*/ case 83:if(pla!=NULL)
         {
          pla=delit(pla);
          spisok(pla);
         }
         break;
 /*Ins*/ case 82:pla=vvodspisok(pla); spisok(pla); break;
 /*Esc*/ case 27:pla=vozvr(pla); return(pla);
      }
   }

 while(1);
}

PL* delit(PL* pla)    //Функция удаления элементов из списка
{
 PL* plr=NULL;
 if(pla->prev!=NULL)
   {
    (pla->prev)->next=pla->next;
    plr=pla->prev;
   }
 if(pla->next!=NULL)

   {
    (pla->next)->prev=pla->prev;
    plr=pla->next;
   }
 free(pla);
 return(plr);
}

void poisk1(PL *pla)         //Функция поиска по названиям планет
{
 char s[15],ch;
 do
   {
    int i=1,l=0;
    clrscr();
    fflush(stdin);
    puts("Введите интерессующее вас название планеты :");
    gets(s);
    printf("\n\n Планеты с названием %s :\n",s);
    printf("+------+-----------------+------------+---------------+---------
--+\n");
printf("|Номер |  Название       |  Когда     |  Кто  открыл  |  Кол-во
|\n");
printf("| стр. |       планеты   |    открыли |   планету     | спутников
|\n");
printf("+------+-----------------+------------+---------------+-----------
+\n");
printf("+------+-----------------+------------+---------------+-----------
+\n");
    while (pla->prev)
      {
       if(strcmpi(pla->namepl,s)==0)
       {
        printf("| %5d | %18s | %12u | %15s | %11u |   ",i,pla->namepl,
             pla->year,pla->people,pla->sputnik);
        l++;i++;
       }
       pla=pla->prev;
      }
    if (strcmpi(pla->namepl,s)==0)
      {
       printf("| %5d | %18s | %12u | %15s | %11u |   ",i,pla->namepl,
             pla->year,pla->people,pla->sputnik);
       l++;i++;      }
puts("+------+-----------------+------------+-----------------+-------------
+");
    printf("\n Найдено %d планет.\n",l);
    puts(" Поиск по названиям планет завершен. Продолжить?(y- да)");
    fflush(stdin);
    ch=getch();
   }
 while(ch=='y');
}

void poisk2(PL *pla)      //Функция поиска по годам открытия
{
 char ch;
 do
   {
    int i=1,l=0,a,b;
    clrscr();
    fflush(stdin);
    puts("Введите интерессующее вас границы поиска (от чего- то до чего-
то) :");
    while(scanf("%d%d",&a,&b)!=2)
      {
       while (getchar()!='\n');
       printf("Все- таки стоит здесь что- нибудь ввести\n(от a до b)\n");
      }

    printf("\n\n Планеты открытые в таком диапозоне(с %d до %d
года):\n",a,b);
printf("+------+-----------------+------------+---------------+-----------
+\n");
printf("|Номер |  Название       | Когда      |  Кто  открыл  |  Кол-во
|\n");
printf("| стр. |       планеты   |    открыли |    планету    | спутников
|\n");
printf("+------+-----------------+------------+---------------+-----------
+\n");
printf("+------+-----------------+------------+---------------+-----------
+\n");
    while(pla->prev)

      {
       if((a<=pla->year)&&(b>=pla->year))
       {
        printf("| %5d | %18s | %12u | %15s | %11u |   ",i,pla->namepl,
             pla->year,pla->people,pla->sputnik);
        l++;i++;
       }
       pla=pla->prev;
      }
    if((a<=pla->year)&&(b>=pla->year))
      {
       printf("| %5d | %18s | %12u | %15s | %11u |   ",i,pla->namepl,
             pla->year,pla->people,pla->sputnik);
       l++;i++;
      }
    puts("+------+-----------------+------------+---------------+-----------
+");
    printf("\n Найдено %d планет.\n",l);
    puts(" Поиск по годам открытия планет завершен. Продолжить?(y- да)");
    fflush(stdin);
    ch=getch();
   }
 while(ch=='y');
}

void klear(PL* pla)    //Функция очистки памяти
{
 PL *plr;
 if (pla)
   {
    if (pla->prev)
      {
       plr=pla->prev;
       while (plr->prev)
       {
        free(plr->next);
        plr=plr->prev;
       }
      }
      else
      plr=pla;
    free(plr);
   }
}

char * fname()           //Функция ввода имени файла
{
 char *t;
 t=(char *)malloc(80*sizeof(char));
 cprintf("Введите имя файла: \n");
 fflush(stdin);
 scanf("%79s",t);
 return t;
 }

int save1(PL *pla,char *filename)  //Функция, сохраняющая данные
{
 FILE *fp;
 if((fp=fopen(filename,"w"))==NULL) return 0;
 while(pla)

   {
    fprintf(fp,"%s %d %s %d |",
             pla->namepl,pla->year,pla->people,pla->sputnik);
    pla=pla->prev;
   }
 fclose(fp);
 return 1;
}

int save(PL *pla)          //Функция для сохранения данных
{
 char * name;
 window(1,1,79,25);
 clrscr();
 name=fname();
 if (save1(pla,name)==1) return 1;
 cprintf("\nНевозможно произвести запись!!!");
 sovet("Ошибка!!!  Нажмите любую кнопку");
 getch();
 return 0;
}

PL *load(PL *pla)         //Функция загрузки данных из файла
{
 char c,*name;
 int i;

 PL *plan=NULL,*plane=NULL;
 FILE *fp;
 window(1,1,79,25);
 clrscr();
 name=fname();
 cprintf("Осуществлять чтение?  (y-Да , n-Нет)\n");
 do
   c=getch();
 while((c!='y')&&(c!='n'));
 if (c=='n') return (pla);
 if((fp=fopen(name,"rt"))==NULL)
   {
    klear(pla);
    cprintf("\nОшибка при открытии файла!!!");
    sovet("Ошибка!!!  Нажмите любую кнопку");
    getch();
    return (NULL);
   }
 plane=(PL*)malloc(sizeof(PL));
 while (fscanf(fp,"%s %d %s %d |",
        plane->namepl,&(plane->year),plane->people,&(plane->sputnik))==4)
   {
    plane->prev=NULL;
    plane->next=plan;
    if (plan!=NULL) plan->prev=plane;
    plan=plane;
    plane=(PL*)malloc(sizeof(PL));
   }
 free(plane);
 if (plan!=NULL)
   {
    while(plan->next)
      plan=plan->next;
   }
 fclose(fp);
 klear(pla);
 return (plan);
}

  /*Функция сортировки по алфавиту*/
  PL *sort(PL *pla)
   {
    PL *point,*tmp=NULL,*f,*s;
    int i,j,srav;

    //Указатель на начало
    f=pla;
    point=pla;

    while(f!=NULL)
     {
      s=f->next;
      while(s!=NULL)
      {
       if((strcmp(f->namepl,s->namepl)>0))
       { tmp=(PL*)malloc(sizeof(PL));
       strcpy(tmp->namepl,f->namepl);
       tmp->year=f->year;
       strcpy(tmp->people,f->people);
       tmp->sputnik,f->sputnik;
       //
       strcpy(f->namepl,s->namepl);
       f->year=s->year;
       strcpy(f->people,s->people);
       f->sputnik=s->sputnik;
       //
       strcpy(s->namepl,tmp->namepl);
       s->year=tmp->year;
       strcpy(s->people,tmp->people);
       s->sputnik=tmp->sputnik;
      free(tmp);
       }
      s=s->next;
       }
     strcpy(point->namepl,f->namepl);
     point->year=f->year;
     strcpy(point->people,f->people);
     point->sputnik=f->sputnik;
     point=point->next;
     f=f->next;
     }
  point=pla;
  return(point);
 }


void main()
{
 char ccc,hhh,ch;
 int i;
 PL* planet=NULL;
 planet->prev=planet->next=NULL;
 _setcursortype(_NOCURSOR);
 textcolor(10);
 menu1();
 do
   {
    do
      {
       fflush(stdin);
       switch(ccc=getch())
       {
        case '1':
             {
              clrscr();
              printf("\t\t\t  Рекомендации пользователю :\n\n"
                               "Эта программа- это подобие электронной базы
                 данных. Программа работает, "
                 "\nиспользуя массивы в памяти ЭВМ для хранения информации
                 введенной пользователем."
                 "\nДанные могут вводиться с клавиатуры или загружаться из
                 файла."
                 "Также можно вывестина экран всю картотеку или же
                 просматривать картотеку по карточкам,"
                 " с  возмож-   ностью добавления или удаления некоторых
                 карточек по выбору."
                 " Программа  имеет  хороший  интерфейс и показывает
                 устойчивую работу."
                 " В программе  имеется  поиск  элементов  по  заданным
                 условиям,  а  также сортировка планет по названиям."
                 " В  программе есть главное меню и подменю для поиска
                 планет по некоторым признакам."
                 " Желательно, чтобы данные были точные, корректно
                 записанные и касающиеся"
                 "\n              непосредственно темы данной лабораторной
                 работы.");
                 puts("\n\n\n\n\n\t\tДля перехода в главное меню нажмите
                 любую клавишу...");
              getch();

              menu1();
              break;
             }
        case '2':
             {
              free(planet);
              planet=NULL;
              planet->prev=planet->next=NULL;
              clrscr();
              puts("Это новая база данных?(да-y/ нет-n) ");
              do
               {
                fflush(stdin);scanf ("%c", &ch);

                          printf ("\tВведите символ(да- y / нет- n) ");
               }
              while (ch!='n' && ch!='y'&& ch!='Y'&& ch!='N');
              if (ch=='y'|| ch=='Y')
                {
                 clrscr();
                 planet=vvodall();
                 clrscr();
                 puts("\n\n\Записать в файл (да-y/нет-n)?");
                 do
                   {
                 fflush(stdin);
                 scanf ("%c", &ch);
                 printf ("Введите символ(да- y / нет- n)\n ");
                   }
                 while (ch!='n' && ch!='y'&& ch!='Y'&& ch!='N');
                 if (ch=='Y'|| ch=='y')
                   {
                 save(planet);
                                  puts("\n\n\n\n\n\t\t Запись данных
                 закончена! Нажмите любую клавишу.");
                 getch();
                   }
                }
             else
                 planet=load(planet);
                 menu1();
                 continue;
             }
        case '3':
             {
              if(planet!=NULL)
                {
                 clrscr();
                 vivodall(planet);
                 menu1();
                 continue;
                }
              break;
             }
        case '4':
             {
              free(planet);
              planet=korrekt(planet);
              menu1();
              break;
             }
        case '5':
             {
              if(planet!=NULL)
                {
                 clrscr();
                 menu2();
                 switch(hhh=getch())
                   {
                 case '1':
                      {
                       poisk1(planet);
                       menu1();
                       continue;
                      }
                 case '2':
                      {
                       poisk2(planet);
                       menu1();
                       continue;
                      }
                 default :  menu1();
                   }
                 menu1();
                 continue;
                }
              break;
             }
        case '6':
             {
              if(planet!=NULL)
                {
                 clrscr();
                 i=5;
                 puts("\n\n\n\n\t\t  Идет сортировка по названию
планеты.");
                 while(i<70)
                   {
                 gotoxy(i,10);
                 puts("*");
                 delay(60);
                 i++;
                   }
                 planet=sort(planet);
                 puts("Сортировка по названиям планет прошла успешно! ");
                 delay(2000);
                 clrscr();
                 vivodall(planet);
                 menu1();
                 continue;
                }
              break;
             }
        case '7':
             {
              free(planet);
              break;
             }
        default : ccc=0;
       }
      }
    while(!ccc);
   }
 while(ccc!='7');}



                         Министерство образования РФ
     Санкт- Петербургский государственный электротехнический университет
                                 Кафедра ВТ



                            Пояснительная записка
                       К курсовой работе по дисциплине
                 «Основы алгоритмизации и программирование»

                                 II семестр

                       Тема : «Электронная картотека»



                                                    Выполнил : Урывский Ю.В.
                                                             Факультет : КТИ
                                                                Группа :9371
                                                    Проверила :Сискович Т.И.



                              Санкт- Петербург
                                    2000
                                  Задание :


      Создание электронной картотеки, хранящейся на диске, и программы,
обеспечивающей взаимодействие с ней.
      Программа должна выполнять следующие действия:
      - занесение данных в электронную картотеку;
      - внесение изменений (добавление, исключение);
      - поиск данных по признаку, вывод их на экран.

      Выбор подлежащих выполнению действий должен быть реализован с помощью
меню и подменю.
      Задача должна быть структурирована и отдельные части должны быть
оформлены как функции.
      Исходные данные должны вводиться с клавиатуры.
      В процессе обработки картотека должна храниться в памяти ЭВМ в виде
связанного списка.
      Необходимо предусмотреть возможность сохранения выбранных записей в
файле, задаваемом пользователем.
      Программа должна иметь дружественный интерфейс и обеспечивать
устойчивую работу при случайном нажатии на клавишу.
      Все детали выполнения работы должны быть согласованы с преподавателем.



                            Контрольные примеры:



При запуске программы перед нами появляется меню, состоящее из 7 пунктов.

   1. Рекомендации пользователю.
   2. Ввод данных.
   3. Вывод всех данных.
   4. Просмотр, удаление, добавление.
   5. Поиск данных по определенному признаку.
   6. Сортировка.
   7. Выход.

   Чтобы познакомиться с программой нужно зайти в пункт №1. Здесь имеется
краткое описание того, что программа умеет делать.
   Пока мы не введем данные через пункт №2, все остальные пункты, кроме 1 и
7, будут не активными. Поэтому заходим в пункт №2.
      Здесь сразу же появляется запрос: «Это будет новая картотека?» Если
да, то создается новая картотека, или можно загрузить ее из файла.
      Наконец данные введены и можно переходить к другим пунктам.
      Чтобы просмотреть все, что было введено воспользуемся пунктом №3. Для
выхода в главное меню нужно нажать любую клавишу.
      С помощью пункта №4 мы можем пролистать всю нашу картотеку. Плюс к
этому мы можем добавлять или удалять элементы из списка. А делать это
довольно просто, если следовать подсказкам, появляющимся в нижней части
экрана.
      Щелкнув цифру 5, открываем подменю поиска элементов.
       1. Поиск по названию планеты.
       2. Поиск по годам открытия.

    Если хотим найти например планету Венера, то выбираем пункт №1, вводим
слово Венера и либо получаем информация о такой планете (если такая планета
есть в базе данных), либо не получаем информации о такой планете (если
такая планета не занесена в базу данных).
    В пункте №6 мы можем отсортировать картотеку по названиям планет.
    Выход из программы осуществляется через пункт №7.



                          Описание структур данных:

 struct PL                     //структура PL
       {
        char namepl[18];             //Названия планет
        int year;                    //Когда была открыта
        char people[15];             //Кем была открыта
        unsigned int sputnik;        //Сколько спутников имеет
        PL *prev;                    //Указатель на предыдущий  элемент
      списка
        PL *next;                    //Указатель на последующий элемент
      списка
       };



                            Спецификация функций:

      - Void menu1(); - функция главного меню

             Menu1();


      - Void menu2(); - функция подменю поиска
             Menu2();



      - void sovet(char *s)



      - void vvod(PL *pla)



      - PL* vvodall()



      - void vivodall(PL *pla)



      - void spisok(PL* pla)



      - PL* vvodspisok(PL* pla)



      - PL* vozvr(PL* pla)



      - PL* korrekt(PL *pla)



      - PL* delit(PL* pla)



      - void poisk1(PL *pla)



      - void poisk2(PL *pla)



      - void klear(PL* pla)


      - char * fname()



      - int save1(PL *pla,char *filename)



      - int save(PL *pla)



      - PL *load(PL *pla)



      - PL *sort(PL *pla)



                          Инструкция пользователю:

      Запускаете программу. Появляется меню перед вами. Если хотите немножко
ознакомиться с программой, то почитайте рекомендации (пункт №1). Вводите
данные через пункт №2. Здесь вы можете ввести данные либо с клавиатуры,
либо загрузить их из файла. Чтобы просмотреть все что вы ввели или
загрузили воспользуйтесь пунктом №3 главного меню. А если вы хотите
просмотреть все карточки по- порядку, то вам непременно нужно будет зайти в
пункт №4. Здесь вы сможете просмотреть все карточки, удалить какую- либо из
них (или все), а также добавить карточки, воспользовавшись вспомогательными
клавишами и следуя указаниям, появляющимся в нижней части экрана.
      Найти какую- нибудь карточку вам поможет пункт №5. В нем имеется два
вида поиска: по названиям планет, или по году открытия той или иной
планеты.
      В пункте №6 происходит сортировка карточек по названиям планет.
      Выход из программы осуществляется через пункт №7.



                                 Заключение:

      В ходе проделанной работы мной были освоены структурные типы данных. Я
научился работать с файлами, т.е. делать такме вещи как открытие, закрытие
файла, запись в файл данных. Также была освоена работа со списками. Это
такие операции как ввод элементов, удаление какого- нибудь элемента из
списка или добавление элементов в связанный список.



                                 Содержание: