Текст программы:
#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("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)<-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("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((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));
<
имя файла: 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<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.
Заключение:
В ходе проделанной работы мной были освоены структурные типы данных. Я
научился работать с файлами, т.е. делать такме вещи как открытие, закрытие
файла, запись в файл данных. Также была освоена работа со списками. Это такие
операции как ввод элементов, удаление какого- нибудь элемента из списка или
добавление элементов в связанный список.
Содержание: