Электронная картотека
	
	Электронная картотека
                              Текст программы: 
#include 
#include 
#include 
#include  
#include  
struct PL                     //Задание структурных переменных 
       { 
        char namepl[18]; 
        int year; 
        char people[15]; 
        unsigned int sputnik; 
        PL *prev; 
        PL *next; 
       }; 
void menu1()                    //Функция главного меню 
 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)year)>30000); 
    do 
      { 
       puts("Кто открыл планету :"); 
       fflush(stdin); 
       gets(pla->people); 
      } 
    while(strlen(pla->people)>15); 
    do 
      { 
       puts("Сколько спутников ?"); 
       scanf("%d",&(pla->sputnik)); 
      } 
    while(((pla->sputnik)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)         //Функция вывода на экран всех структур 
 puts("\n\t\t\t  В С Я    К А Р Т О Т Е К А\n"); 
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) 
        %11u  
       pla=pla->prev; 
      } 
    if (strcmpi(pla->namepl,s)==0) 
       %18s  
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((ayear)&&(b>=pla->year)) 
        %15s  
       pla=pla->prev; 
      } 
    if((ayear)&&(b>=pla->year)) 
                   pla->year,pla->people,pla->sputnik); 
    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) 
       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. 
                                 Заключение: 
      В ходе проделанной работы мной были освоены структурные типы данных. Я 
научился работать с файлами, т.е. делать такме вещи как открытие, закрытие 
файла, запись в файл данных. Также была освоена работа со списками. Это 
такие операции как ввод элементов, удаление какого- нибудь элемента из 
списка или добавление элементов в связанный список. 
                                 Содержание: 
	
	
					
							 |