Главная | Обратная связь | Поможем написать вашу работу!
МегаЛекции

Struct PL                //Задание структурных переменных

{

char namepl[18];

int year;

char people[15];

unsigned int sputnik;

PL *prev;

PL *next;

};

void menu1()                //Функция главного меню

{

 clrscr();

p rintf("\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');}

Поделиться:





Воспользуйтесь поиском по сайту:



©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...