Реферат: Электронная картотека планет солнечной системы
Текст программы:
#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?————————————————————
?n»); printf( «t| |
«); puts( «nt| К А Р Т О Т Е К А П Л А Н Е Т
|n»);
» t |tt С О Л Н Е Ч Н О Й С И С Т Е М Ы |
«); puts( «t?————————————————————?
«); puts(«ntt Главное меню :n»); puts(«tt 1- Рекомендации пользователю.»); puts(«tt 2- Ввод данных.»); puts(«tt 3- Вывод всех данных.»); puts(«tt 4- Просмотр, удаление, добавление.»); puts(«tt 5- Вывод данных по определенному признаку.»); puts(«tt 6- Сортировка.»); puts(«tt 7- Выход.»);
}
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) //Функция вывода на экран всех структур
{ int i=1; puts(«nttt В С Я К А Р Т О Т Е К А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»,»ПАРАМЕТРЫ ПЛАНЕТ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)
{ 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(«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(«| %5d | %18s | %12u | %15s | %11u | «,i,pla->namepl, pla->year,pla->people,pla->sputnik); l++;i++;
} pla=pla->prev;
} if((ayear)&&(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(«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