Технические требования для использования
Для запуска данной программы необходимо наличие персонального компьютера IBM PC/XT c операционной системой MS-DOS. Необходимый объем оперативной памяти -640 Кбайт. Дла запуска программы необходимо сделать текущем каталог с программой kurs.exe и вызвать её на выполнение. Программа работает в текстовом режиме 80х25 символов , построение диаграммы осуществляется в графическом режиме 640х480 точек 16 цветов. Файл базы данных программы librarym.dat будет записываться и считываться из текущего каталога текущего диска. Управление программой осуществляется с клавиатуры. Руководство пользователя После своей загрузки программа осуществляет оформление экрана , вывод на экран списка книг , содержащийся в файле базы данных , по которым можно передвигать цветовой курсор. При нажатии клавиши Enter на одном из элементов списка , то на экран будет вызванно меню:
При выборе первого пункта меню моявится следующее подменю:
При нажатии пользователем клавиши Enter на выведенном списке книг появляется меню:
При нажатии на клавиши управления курсором (вверх , вниз) можно управлять курсором , если нажать клавишу Enter или клавишу с номером пункта меню , то произойдёт то или иное действие в соответствии с выбранным пунктом. Отсортированная последовательность выводится на экран в виде списка книг. При выборе пункта "Поиск по маске" программа запрашивает данные для поиска книги: Название , Автор , Стоимость , Порядковый номер , Количество , Тематика (Не влияет). После поиска , если такая книга имеется в списке , данные о найденной книги выводятся на экран. При выборе пункта "Выход из программы" программа завершает свою работу. Тестирование программы Для полной проверки работоспособности программы необходимо её протестировать. План тестирования программы учёта и выборки информации о странах состоит в следующем: 1) Загрузка программы 2) Ввод данных о книгах 3) Удаление книги из списка 4) Редактирование данных о книге 5) Сортировка 6) Поиск по маске 7) Построение диаграммы 8) Выход из программы Далее в пункте "Результаты работы программы" приводится распечатка тестирования программы по пунктам плана тестирования и результатов тестирования. 10 Результаты работы программы 2) Ввод данных о книгах 76 Автор2 Книга9 22 11.00р 11 Автор2 Книга8 28 21.00р 22 Автор65 Книга33 18 32.00р 55 Автор1 Книга3 12 22.00р 2 Автор2 Книга2 10 55.00р 1 Автор1 Книга 1 10 34.00р 3) Удаление книги из списка 76 Автор2 Книга9 22 11.00р 11 Автор2 Книга8 28 21.00р 22 Автор65 Книга33 18 32.00р 55 Автор1 Книга3 12 22.00р 2 Автор2 Книга2 10 55.00р 4) Редактирование данных о книге Название: Книга3 Автор: Автор1 Стоимость: 20.00 Порядковый номер: 55 Количество: 20 Тематика: Научная 5) Сортировка По автору: 22 Автор65 Книга33 18 32.00р 76 Автор2 Книга9 22 11.00р 2 Автор2 Книга2 10 55.00р 11 Автор2 Книга8 28 21.00р 55 Автор1 Книга3 20 20.00р По названию: 76 Автор2 Книга9 22 11.00р 11 Автор2 Книга8 28 21.00р 22 Автор65 Книга33 18 32.00р 55 Автор1 Книга3 20 20.00р 2 Автор2 Книга2 10 55.00р 7) Построение диаграммы Заключение В данной курсовой работе решена задача разработки программы обработки данных в библиотеке. По заданию к данной курсовой работе был разработан алгоритм , по которому на алгоритмическом языке С++ была разработанна программа , анализ результатов которой показал , что поставленная задача успешно решается. Список литературы 1.Бьярн Страуструп. Язык программирования С++.в двух частях. Пер. с англ. Киев:"ДиаСофт",1993.-296 с.,ил. 2.Корриган Джон Компьютерная графика: Секреты и решения: Пер с англ. -М.:Энтроп, 1995. - 352 с., ил. ПРИЛОЖЕНИЕ 1 Распечатка программы #include <stdio.h> #include <stdlib.h> #include <string.h> #include <graphics.h> #include <conio.h> // Структура - данные о одной книге struct books { char name[30] // Название char fio[30] // Автор int num // Количество float price // Стоимость long number // Порядковый номер // Расположение: 0-читальный зал, 1-абонемент, 2-хранилище int loc int tem // Тематика int nn,nf // Номер по названию, автору } // Массив - 500 книг и маска для поиска books cdt[501] // Массив данных о книгах int cnum // Количество книг // Сортировать по: 1-Названию, 2-автору char sort // Расположение char ftm const char location[3][15]={" Читальный зал\x0", " Абонемент\x0", " Хранилище\x0"} const char tema[5][15]={ "Художественная\x0", " Техническая\x0", " Научная\x0", " Справочник\x0", " _Не влияет_ \x0"} // ПРОТОТИПЫ ФУНКЦИЙ // Сравнение строки с маской int cmp(char * a,char * b) // Вывод списка на экран void output(int sv,int sk) // Обработка меню int menu(int x,int y,char * capt) // Ввод строки void SInput(char * s,int lng,int x,int y) // Ввод числа double DInput(int x,int y) // Индексирование массива void index() // Редактирование элемента void edit(int ed) // Вывод данных по маске void find() // Вывод графика void graph() // Обработка списка void scroll() // Чтение массива void load() // Запись массива void save() // ТЕЛА ФУНКЦИЙ // Сравнение строки с маской // a- строка, b- маска int cmp(char * a,char * b) { int k int n k=1 for (n=0 n<strlen(b) n++) if (a[n]!=b[n]) k=0 return k } // Вывод списка на экран void output(int sv,int sk) { int n int m int nd m=sv // Очистка экрана textcolor(15) textbackground(1) clrscr() // Вывод двадцати элементов for (n=1 n<20 n++) { // Если элемент выбран, изменение цветов if (n==sk) { textbackground(14) } else { textbackground(1) } if (m<(cnum+1)) { nd=0 // Поиск элемента с данным индексом switch (sort) { case(1): while (((cdt[nd].nn!=m)||(cdt[nd].loc!=ftm))&&(nd<cnum+1)) nd++ break case(2): while (((cdt[nd].nf!=m)||(cdt[nd].loc!=ftm))&&(nd<cnum+1)) nd++ break } switch (sort) { case(1): if ((cdt[nd].nn!=m)||(cdt[nd].loc!=ftm)) nd=-1 break case(2): if ((cdt[nd].nf!=m)||(cdt[nd].loc!=ftm)) nd=-1 break } m++ // Вывод данных о стране на экран gotoxy(1,m-sv) if (nd!=-1) cprintf("%4ld %30s %30s %4d %6.2fр",cdt[nd].number,cdt[nd].fio, cdt[nd].name,cdt[nd].num,cdt[nd].price) } } textbackground(1) } // Обработка меню int menu(int x,int y,char * capt) { int n,m // Счетчики int num // Количество пунктов int k // Выбранный пункт char * pt // Временный указатель на символ char c // Считанный с клавиатуры символ // Вычисляем количество пунктов num=strlen(capt)/20 // Курсор на нулевой элемент k=0 // Бесконечный цикл обработки for ( ) { // Вывод меню pt=capt for (n=0 n<num n++) { gotoxy(x,y+n) // Закраска пункта, на который указывает курсор if (n==k) { // Закраска textbackground(12) textcolor(14) } else { // Нормальный textbackground(3) textcolor(1) } cprintf("%d) ",n+1) for (m=0 m<20 m++) cprintf("%c",*(pt++)) } textbackground(3) textcolor(1) // Опрос клавиатуры c=getch() if (!c) c=getch() // Проверка, не нажата ли клавиша с цифрой if (((c-'1')>=0)&&((c-'1')<num)) { // Установка указателя в зависимости от нажатой цифры k=c-'1' // Запись в буфер клавиатуры символа ENTER ungetch(13) } else { // Анализ switch(c) { // Вверх case (72): if (k>0) k-- else k=num-1 break // Вниз case (80): if (k<(num-1)) k++ else k=0 break // Выход по ESC - возвращается -1 case (27): return -1 // Выход по ENTER - возвращается номер пункта case (13): return k } } } } // Ввод строки // s - указатель на строку // lng - Максимальная длинна // x,y - координаты void SInput(char * s,int lng,int x,int y) { lng-- char rs[100] // Временная строка strcpy(rs,s) // Копирование резерва строки int n // Счетчик char c // Символ _setcursortype(_NORMALCURSOR) // Вывод пустой строки textbackground(2) textcolor(15) gotoxy(x,y) for (n=0 n<lng n++) cprintf(" ") n=strlen(s) // Положение курсора do { // Вывод строки gotoxy(x,y) cprintf("%s ",s) gotoxy(x+n,y) c=getch() // Считывание символа с клавиатуры if ((c!=13)&&(c!=27)&&(c!=8)) { // Нажата символьная клавиша if (n<(lng-1)) { // Добавление символа s[n+1]=0 s[n]=c n++ } } else { if (c==8) { // Нажата клавиша BackSpace if (n>0) { n-- s[n]=0 } } } // Выход, если ESC или ENTER } while ((c!=27)&&(c!=13)) if(c==27) strcpy(s,rs) // Восстановление строки // Стирание строки textbackground(0) textcolor(7) gotoxy(x,y) for (n=0 n<lng+1 n++) cprintf(" ") _setcursortype(_NOCURSOR) } // Ввод числа // x,y - координаты double DInput(int x,int y) { char s[100] // Временная строка char *stpe double rz s[0]=0 int n // Счетчик char c // Символ // Вывод пустой строки _setcursortype(_NORMALCURSOR) textbackground(2) textcolor(15) gotoxy(x,y) for (n=0 n<15 n++) cprintf(" ") n=strlen(s) // Положение курсора do { // Вывод строки gotoxy(x,y) cprintf("%s ",s) gotoxy(x+n,y) c=getch() // Считывание символа с клавиатуры if ((c!=13)&&(c!=27)&&(c!=8)) { // Нажата символьная клавиша if (n<14) { // Добавление цифры или точки if ((c>='0')&&(c<='9')||(c=='.')) { s[n+1]=0 s[n]=c n++ } } } else { if (c==8) { // Нажата клавиша BackSpace if (n>0) { n-- s[n]=0 } } } // Выход, если ESC или ENTER } while ((c!=27)&&(c!=13)) if(c==27) return 0 // Стирание строки textbackground(0) textcolor(7) gotoxy(x,y) for (n=0 n<15 n++) cprintf(" ") rz=strtod(s,&stpe) _setcursortype(_NOCURSOR) return rz } // Индексирование массива - Назначение номеров элементов void index() { int tm // Перебор тем int n,m // Счетчики char mxc[100] // Значение наименьшей строки int nm // Номер очередного элемента // Стирание старых индексов for (n=0 n<cnum n++) { cdt[n].nn=0 cdt[n].nf=0 } // Перебор всех возможных мест хранения for (tm=0 tm<3 tm++) { // Индексация по автору for (m=0 m<cnum m++) { // Поиск наименьшего strcpy(mxc,"\x0") nm=-1 for (n=0 n<cnum n++) if ((cdt[n].nf==0)&&(cdt[n].loc==tm)) if (strcmp(cdt[n].fio,mxc)>0) { strcpy(mxc,cdt[n].fio) nm=n } if (nm!=-1) cdt[nm].nf=m+1 } // Индексация по названиям for (m=0 m<cnum m++) { // Поиск наименьшего strcpy(mxc,"\x0") nm=-1 for (n=0 n<cnum n++) if ((cdt[n].nn==0)&&(cdt[n].loc==tm)) if (strcmp(cdt[n].name,mxc)>0) { strcpy(mxc,cdt[n].name) nm=n } if (nm!=-1) cdt[nm].nn=m+1 } } } // Редактирование элемента массива void edit(int ed) { clrscr() // Обработка int n // Счетчик int en=0 // Редактируемое поле char c // Символ с клавиатуры for( ) { // Вывод данных for (n=0 n<6 n++) { // Изменение цвета если элемент выбран if (n==en) { textbackground(12) textcolor(15) } else { textbackground(1) textcolor(7) } gotoxy(15,6+2*n) // Вывод одного из полей структуры switch(n) { case 0: cprintf(" Название: %45s",cdt[ed].name) break case 1: cprintf(" Автор: %45s",cdt[ed].fio) break case 2: cprintf(" Стоимость: %45.2f",cdt[ed].price) break case 3: cprintf(" Порядковый номер: %45d",cdt[ed].number) break case 4: cprintf(" Количество: %45d",cdt[ed].num) break case 5: cprintf(" Тематика: %45s",tema[cdt[ed].tem]) } } // Опрос клавиатуры c=getch() if (!c) c=getch() switch(c){ // Вверх case (72): en-- if (en<0) en=5 break // Вниз case (80): en++ if (en>5) en=0 break // ENTER - Редактирование поля или выход case (13): // Выбор действия switch(en) { case 0: SInput(cdt[ed].name,30,35,6) break case 1: SInput(cdt[ed].fio,30,35,8) break case 2: cdt[ed].price=DInput(35,10) break case 3: cdt[ed].number=DInput(35,12) break case 4: cdt[ed].num=DInput(35,14) break case 5: // Изменение тематики cdt[ed].tem=(cdt[ed].tem+1)%4 break } break case(27): return } } } // Вывод по маске void find() { int n // Счетчик FILE * f // Файл вывода char name[50] // Имя файла strcpy(name,"CON") // Изначально - CON, т.е. экран // Ввод имени файла вывода textbackground(0) clrscr() gotoxy(1,23) cprintf(" Введитеимя файла: ") SInput(name,40,20,23) // Открывается файл на запись f=fopen(name,"wb") if (f==NULL) return fprintf(f,"\n\r Список книг, выбранных по маске \n\r") // Перебор всех элементов for (n=0 n<cnum n++) // Если удовлетворяет условию if (cmp(cdt[n].name,cdt[500].name)&& cmp(cdt[n].fio,cdt[500].fio)&& (cdt[n].price>=cdt[500].price)) { // Вывод в файл fprintf(f,"%4ld %30s %30s %4d %6.2fр\n\r",cdt[n].number,cdt[n].fio, cdt[n].name,cdt[n].num,cdt[n].price) } // Закрывается файл fclose(f) printf("\n\n Нажмите любую клавишу для продолжения") getch() } // Вывод графика void graph() { // Ингициализация графики int c // Цвет int drv,mode // Для инициализации графики int k1,k2,k3 // Количество книг int n // Счетчик int m // Масштаб drv=DETECT initgraph(&drv,&mode,"") // Подсчет количества книг k1=k2=k3=0 for (n=0 n<cnum n++) { switch(cdt[n].loc) { case (0): k1++ break case (1): k2++ break case (2): k3++ break } } // Определение максимального if (k1>k2) m=k1 else m=k2 if (m<k3) m=k3 // Определение масштаба m=400/m // Вывод столбчатой диаграммы line(0,470,640,470) line(10,0,10,480) outtextxy(100,20," Распределение книг ") // Рассчет цвета столбца - 12 - максимальное значение c=12 if (k2>k1) c-- if (k3>k1) c-- setfillstyle(9,c) bar3d(20,470-m*k1,120,470,10,1) // Рассчет цвета столбца - 12 - максимальное значение c=12 if (k1>k2) c-- if (k3>k2) c-- setfillstyle(9,c) bar3d(140,470-m*k2,240,470,10,1) // Рассчет цвета столбца - 12 - максимальное значение c=12 if (k1>k3) c-- if (k2>k3) c-- setfillstyle(9,c) bar3d(260,470-m*k3,360,470,10,1) // Вывод поясняющих надписей setcolor(14) outtextxy(30,450-m*k1,"Читальный зал") outtextxy(150,450-m*k2,"Абонемент") outtextxy(270,450-m*k3,"Хранилище") // Ожидание нажатия клавиши getch() closegraph() _setcursortype(_NOCURSOR) } // Обработка списка void scroll() { char c // Считанный с клавиатуры символ static int sv=1,sk=1 // Первый элемент на экране и положение курсора int st // Выбранный пункт меню int n // Счетчик // Цикл обработки do { // Вывод списка на экран output(sv,sk) // Ввод символа c=getch() if (!c) c=getch() // Обработка символа switch (c) { // Вверх case (72): if (sk>1) sk-- else if (sv>1) sv-- break // Вниз case (80): if (sk<7) { if (sk<(cnum-sv+1)) sk++ } else if (sv<(cnum-7)) sv++ break // Меню case (13): st=menu(30,5,"Добавить в список " "Удалить из списка " "Редактировать " "По Автору " "По Названию " "Выход в главное меню" "\x0") switch(st) { case (0): if (cnum<299) { cdt[cnum].name[0]=0 cdt[cnum].fio[0]=0 cdt[cnum].price=0 cdt[cnum].number=0 cdt[cnum].num=0 cdt[cnum].tem=0 cdt[cnum].loc=ftm cnum++ edit(cnum-1) } index() break case (1): // Удаление элемента if (cnum>1) { n=0 switch (sort) { case (1): while (((cdt[n].nn!=sk+sv-1)||(cdt[n].loc!=ftm))&&(n<cnum+1)) n++ break case (2): while (((cdt[n].nf!=sk+sv-1)||(cdt[n].loc!=ftm))&&(n<cnum+1)) n++ break } if (n!=(cnum+1)) { strcpy(cdt[n].name,cdt[cnum-1].name) strcpy(cdt[n].fio,cdt[cnum-1].fio) cdt[n].price=cdt[cnum-1].price cdt[n].num=cdt[cnum-1].num cdt[n].number=cdt[cnum-1].number cdt[n].loc=cdt[cnum-1].loc cdt[n].tem=cdt[cnum-1].tem cnum-- index() } } break // Редактирование элемента case (2): n=0 switch (sort) { case (1): while (((cdt[n].nn!=sk+sv-1)||(cdt[n].loc!=ftm))&&(n<cnum+1)) n++ break case (2): while (((cdt[n].nf!=sk+sv-1)||(cdt[n].loc!=ftm))&&(n<cnum+1)) n++ break } edit(n) index() break case (3): case (4): sort=5-st break case (5): // Выход в предыдущее меню return } break } } while(c!=27) } // Чтение массива void load() { // Открытие файла на чтение FILE * f f=fopen("librarym.dat","rb") if (f==NULL) return // Чтение количества книг fread(&cnum,1,2,f) // Чтение массива fread(cdt,cnum,sizeof(books),f) // Закрытие файла fclose(f) } // Запись файла void save() { // Открытие файла на запись FILE * f f=fopen("librarym.dat","wb") if (f==NULL) { printf(" !!! ОШИБКА ПРИ ЗАПИСИ БАЗЫ ДАННЫХ !!! \n") return } // Запись количества элементов в массив fwrite(&cnum,1,2,f) // Запись массива fwrite(cdt,cnum,sizeof(books),f) // Закрытие файла fclose(f) } // Основная программа void main() { int st // Установка начальных значений _setcursortype(_NOCURSOR) cnum=0 sort=1 ftm=0 // Чтение массива load() index() // Обработка do { // Основное меню textcolor(15) textbackground(0) clrscr() st=menu(30,5," Список книг " " Поиск по маске " " Количество книг " " Выход из программы " "\x0") switch(st) { case (0): // Подменю для вывода списка st=menu(40,6," Расположение: " " Читальный зал " " Абонемент " " Хранилище " "\x0") if (st!=0) { ftm=st-1 scroll() st=0 } break case (1): // Поиск cdt[500].name[0]=0 cdt[500].fio[0]=0 cdt[500].price=0 cdt[500].number=0 cdt[500].num=0 cdt[500].tem=4 edit(500) find() break case (2): // Вывод графика graph() break } } while (st!=3) // Выход из программы textcolor(7) textbackground(0) clrscr() // Запись массива save() _setcursortype(_NORMALCURSOR) }
Популярное: Организация как механизм и форма жизни коллектива: Организация не сможет достичь поставленных целей без соответствующей внутренней... Почему люди поддаются рекламе?: Только не надо искать ответы в качестве или количестве рекламы... ©2015-2024 megaobuchalka.ru Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. (173)
|
Почему 1285321 студент выбрали МегаОбучалку... Система поиска информации Мобильная версия сайта Удобная навигация Нет шокирующей рекламы |