|
||||||||||||
|
||||||||||||
|
|||||||||
МЕНЮ
|
БОЛЬШАЯ ЛЕНИНГРАДСКАЯ БИБЛИОТЕКА - РЕФЕРАТЫ - Электронная картотекаЭлектронная картотекаТекст программы: #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() //Функция главного меню "); 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) //Функция вывода на экран всех структур printf("+------+-----------------+------------+---------------+----------- 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) %5d pla=pla->prev; } if (strcmpi(pla->namepl,s)==0) 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)) pla=pla->prev; } if((a<=pla->year)&&(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->namepl,pla->year,pla->people,pla->sputnik); 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. Заключение: В ходе проделанной работы мной были освоены структурные типы данных. Я научился работать с файлами, т.е. делать такме вещи как открытие, закрытие файла, запись в файл данных. Также была освоена работа со списками. Это такие операции как ввод элементов, удаление какого- нибудь элемента из списка или добавление элементов в связанный список. Содержание: |
РЕКЛАМА
|
|||||||||||||||||
|
БОЛЬШАЯ ЛЕНИНГРАДСКАЯ БИБЛИОТЕКА | ||
© 2010 |