Электронная картотека планет солнечной системы

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



#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, все остальные пункты, кроме 1 и 7, будут не активными. Поэтому заходим в пункт №2.

	Здесь сразу же появляется запрос: «Это будет новая картотека?» Если да, то создается новая картотека, или можно загрузить ее из файла. 

	Наконец данные введены и можно переходить к другим пунктам.

	Чтобы просмотреть все, что было введено воспользуемся пунктом №3. Для выхода в главное меню нужно нажать любую клавишу.

	С помощью пункта №4 мы можем пролистать всю нашу картотеку. Плюс к этому мы можем добавлять или удалять элементы из списка. А делать это довольно просто, если следовать подсказкам, появляющимся в нижней части экрана.

	Щелкнув цифру 5, открываем подменю поиска элементов.

Поиск по названию планеты.

Поиск по годам открытия.



Если хотим найти например планету Венера, то выбираем пункт №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.    







































Заключение:



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





































































































Содержание: