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

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

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

#include
#include
#include
#include
#include

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

{ char namepl[18]; int year; char people[15]; unsigned int sputnik;

PL *prev;

PL *next;

};

void menu1() //Функция главного меню
clrscr(); printf("nt?------------------------------------------------------------

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

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) //Функция вывода на экран всех структур
спутников

void spisok(PL* pla) //Функция для работы со списком
{ clrscr(); window(17,2,62,15); textbackground(4); textcolor(15); clrscr(); if (pla!=NULL)

{ cprintf("n"); cprintf("%30s","ПАРАМЕТРЫ ПЛАНЕТnn"); 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("nn Планеты с названием %s :n",s); printf("+------+-----------------+------------+---------------+---------
--+n"); printf("|Номер | Название | Когда | Кто открыл | Кол-во
|n"); printf("| стр. | планеты | открыли | планету | спутников
|n"); printf("+------+-----------------+------------+---------------+-----------
+n"); printf("+------+-----------------+------------+---------------+-----------
+n"); while (pla->prev)

{ if(strcmpi(pla->namepl,s)==0)

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

{ if((ayear)&&(b>=pla->year))

printf(" pla=pla->prev;

} if((ayear)&&(b>=pla->year))

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 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("ttt Рекомендации пользователю :nn"

"Эта программа- это подобие электронной базы данных. Программа работает, "

"nиспользуя массивы в памяти ЭВМ для хранения информации введенной пользователем."

"nДанные могут вводиться с клавиатуры или загружаться из файла."

"Также можно вывестина экран всю картотеку или же просматривать картотеку по карточкам,"

" с возмож- ностью добавления или удаления некоторых карточек по выбору."

" Программа имеет хороший интерфейс и показывает устойчивую работу."

" В программе имеется поиск элементов по заданным условиям, а также сортировка планет по названиям."

" В программе есть главное меню и подменю для поиска планет по некоторым признакам."

" Желательно, чтобы данные были точные, корректно записанные и касающиеся"

"n непосредственно темы данной лабораторной работы."); puts("nnnnnttДля перехода в главное меню нажмите любую клавишу..."); 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("nnЗаписать в файл (да-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("nnnnntt Запись данных закончена! Нажмите любую клавишу."); 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("nnnntt Идет сортировка по названию планеты."); while(i




2012 © Все права защищены
При использовании материалов активная ссылка на источник обязательна.