Реферат: Программа исследования функций
Название: Программа исследования функций Раздел: Рефераты по информатике Тип: реферат | ||||||||||||||||||||||||||||
Программа исследования функций Пояснительная записка к курсовой работе по дисциплине “Основы алгоритмизации и программирования” Выполнил : студент гр. 96ВВ3 Гаврищенко О.Н. Пензенский государственный технический университет, Кафедра “Вычислительная Техника” 1997 Введение В настоящее время индустрия производства компьютеров и программного обеспечения для них является одной из наиболее важных сфер экономики развитых стран. Ежегодно в мире продаются десятки миллионов компьютеров. Только в США объем продаж компьютеров составляет десятки миллионов долларов и постоянно продолжает расти. В чем же причины такого стремительного роста индустрии персональных компьютеров и их сравнительная выгодность для многих деловых применений? 1. Простота использования, обеспеченная с помощью диалогового способа взаимодействия с компьютером. 2. Относительно высокие возможности по переработке информации, наличие программного обеспечения, а так же мощных систем для разработки нового программного обеспечения. Имеются и другие причины. Язык С++ - универсальный язык общего назначения, область приложений которого - программирование систем в самом широком смысле. Кроме этого, С++ успешно используется как во многих приложениях, так и в мощных операционных системах. Реализация С++ осуществлена для машин в диапазоне от самых простых персональных компьютеров до самых мощных суперкомпьютеров и для всех операционных систем. 1 Постановка задачи Задача курсовой работы состоит в разработки системы , позволяющей исследовать некоторые функций: y = sin(x); y = cos(x); Cистема должна обеспечивать выполнение следующих функций: Выбор из предложенного списка исследуемой функции; Задание диапазона (диапазонов) изменения параметров; Вывод значений функции на экран и при необходимости в файл , имя которого задаётся пользователем; Вывод на экран графика функции. 2 Описание программы 2.1 Общие сведения Данная программа предназначена для исследования математических функций (см. пункт 1). Программа do.cpp разработана на алгоритмическом языке Turbo C++ v.3.0. , и предназначена для использования на персональном компьютере IBM PC/XT или совместимым с ним. 2.2 Краткое описание метода решения задачи Работа с программой организована в графическом режиме 640х480 точек , 16 цветов через меню, по пунктам которого можно передвигать цветовой курсор с помощью клавиш управления курсором. Основное меню описано при помощи массива структур menu_ на 5 элементов , который заначительно упрощает работу программы при обращении к этому меню. Каждый пункт основного меню (кроме "Выход") содержит в себе подменю , каждый пункт которого вызывает какие-либо действия программы. Главное меню состоит из следующих пунктов: "Функция" - выбор исследуемой функции; "Диапазон" - задание минимального и максимального значения Х для отображения графика функции и занесения значений в таблицу; "Масштаб" - задание масштаба по оси X; "Таблица" - вывод значений функции на экран или в файл (имя файла задаётся пользователем) , изменение числа выволимых значений; "Выход" - завершение работы программы. Программа разбита на функциональные модули , работой которых управляет основная программа. Опрос клавиатуры организован с помощью оператора getch() , который возвращает код нажатой клавиши , который затем анализируется программой. В зависимости от нажатой пользователем клавиши программа анализирует её код и производит выбор того или иного действия , выбор очередного пункта меню или подменю , выход из программы. 2.3 Функциональное назначение Программа позволяет исследовать определённые заданием функции , построить их графики на любом отрезке их значений , занести значения функций в таблицу и вывести их на экран или в файл , программа также позволяет изменять масштаб отображаемой функции , изменять диапазон её значений. 2.4 Описание данных Структура , массив которых образует меню , состоит из 3 полей: 1. num - поле целого типа (int) - содержит количество пунктов меню; 2. onum - поле целого типа (int) - содержит количество опрашиваемых пунктов меню; 3. capt - массив символов (по 20 символов на элемент) из 6 элементов - содержит имена пунктов меню. Глобальные переменные,которые использует программа:
2.5 Структура программы Данная программа разработана на алгоритмическом языке С++ и состоит из следующих функциональных модулей: 1. Функция fun - Возвращает 0 , если невозможно вычислить значение функции при заданном значении Х, иначе вычисляет значение Y и возвращает 1; 2. Функция output - Осуществляет вывод графика функции на экран с учётом всех параметров; 3. Функция use_scroll - Осуществляет обработку вертикального меню; 4. Функция use_menu - Осуществляет обработку главного меню; 5. Функция InputFloat - Осуществляет ввод вещественного числа в графическом режиме; 6. Функция InputString - Осуществляет ввод строки символов в графическом режиме; 7. Функция prttabl - Осуществляет вывод таблицы в файл или на экран; 8. Основная программа Main - Заполняет массив меню , организует взаимодействие всех функциональных модулей. 2.6 Спецификация на функциональные модули 2.6.1 Функция fun Назначение: Возвращает 0 , если невозможно вычислить значение функции при заданном значении Х, иначе вычисляет значение Y и возвращает 1; Входные данные: x - значение переменной х , *y - имя функции. Выходные данные: fun. Не вызывает никаких функций. Вызывается из output: rt=fun(x,&y); prttabl: if (fun(x,&y)) fprintf (f,"Fun(%f)=%f\n\f",x,y); 2.6.2 Функция output Назначение: Осуществляет вывод графика функции на экран с учётом всех параметров. Входные данные: нет. Выходные данные: нет. Вызывает функцию fun. Вызывается из основной программы: output(); В пункте 2.11 приведён алгоритм работы данной функции. 2.6.3 Функция use_scroll Назначение: Осуществляет обработку вертикального меню - опрос клавиатуры , отображение пунктов подменю , передвижение курсора , при нажатии клавиши Enter возврвщает код выбранного пункта меню , при нажатии клавиши ESC возвращает -1. Входные данные: menu_m - название массива меню , х-координата х вывода меню. Выходные данные: use_scroll. Не вызывает никаких функций. Вызывается из основной программы: CF=use_scroll(fun,0); switch (se_scroll(dia,105)) switch (se_scroll(mas,205)) switch (se_scroll(tabl,305)) 2.6.4 Функция use_menu Назначение: Осуществляет обработку главного меню - вывод пунктов меню на экран , отображение цветового курсора , при нажатии клавиши Enter возврвщает код выбранного пункта меню , при нажатии клавиши ESC возвращает -1. Входные данные: menu_m - название массива меню. Выходные данные: use_menu. Не вызывает никаких функций. Вызывается из основной программы: switch (use_menu(m1)) 2.6.5 Функция InputFloat Назначение: Осуществляет ввод и редактирование вещественного числа в графическом режиме , возвращает введённое число. Входные данные: x1,y1,x2,y2 - координаты окна редактирования , last - текущее значение данного параметра. Выходные данные:InputFloat. Не вызывает никаких функций. Вызывается из основной программы:MinX=InputFloat(210,30,310,45,MinX); MaxX=InputFloat(210,50,310,65,MaxX); MY=InputFloat(310,30,410,55,MY); 2.6.6 Функция InputString Назначение: Осуществляет ввод и редактирование строки символов в графическом режиме , возвращает указатель на введённую строку. Входные данные: x1,y1,x2,y2 - координаты окна редактирования ,* last - указатель на строку. Выходные данные: *InputString. Не вызывает никаких функций. Вызывается из основной программы: prttabl(Inputstring(410,30,510,45,"Prn")); 2.6.7 Функция PrtTabl Назначение: Осуществляет вывод таблицы в файл или на экран. Входные данные: *fname - указатель на имя файла , если имя файла "con" то вывод осуществляется на экран в текстовом режиме. Выходные данные: нет. Вызывает функцию fun. Вызывается из основной программы: prttabl("con\x0"); prttabl(Inputstring(410,30,510,45,"Prn")); 2.7 Описание работы основной программы Основная программа осуществляет следующие действия: Заполнеие массива меню. Установку начальных пунктов меню. Установку графического режима , очистку экрана. Вызов функции оформления экрана. Опрос меню , вызов функций , соответствующих каждому из выбраннх пунктов. Выход из программы. Основная программа использует следующие функции: output , use_scroll , use_menu , InputFloat , Inputstring , prttabl. Далее в пункте 2.10 приведён подробный алгоритм работы основной программы. 2.8 Схема взаимодействия функциональных модулей 2.9 Описание алгоритма основной программы и функции Output В нижеприведённом алгоритме работы основной программы отображены следующие блоки: Блоки 0,30 - Начало программы , функции; Блоки 11,12,14,15,18,19,23,26,40,41 - Операции ввода,вывода; Блоки 1,2,3,5,13,21,28,32,33,38 - Операции действия , вычисления , присваивания. Блоки 6,8,16,20 - Операция ветвления. Блоки 31,37,39,44 - Условная операция. Блоки 4,7,8,17,22,24,25,36 - Вызов функции. Блоки 29,45 - Конец программы,функции. 2.10 Алгоритм работы основной программы 2.11 Алгоритм работы функции output 3 План отладки программы При написании данной программы был выбран метод нисходящего программирования, поскольку все функции, используемые для вводаданных, могут быть написаны и проверены поочередно. Примерный порядок написания программы следующий: 1. Пишется и отлаживается функция fun. 2. Пишется и отлаживается функция use_menu. 3. Пишется и отлаживается функция use_scroll. 4. Пишется основная программа с заглушками. 5. Пишется и отлаживается функция output. 6. Пишется и отлаживается функция inputfloat. 7. Пишется и отлаживается функция inputstring. 8. Пишется и отлаживается функция prttabl. 9. Отлаживается основная программа без заглушек. 4.Руководство пользователя Для запуска данной программы необходимо наличие персонального компьютера IBM PC/XT c операционной системой MS-DOS. Необходимый объем оперативной памяти - от 640 КБайт и выше. Для работы программы необходимо наличие видеокарты VGA , для обеспечения установки графического режима 640х480 точек 16 цветов. Дла запуска программы необходимо сделать текущем каталог с программой do.exe и вызвать её на выполнение. В этом же каталоге должен находиться файл графической библиотеки egavga.bgi. Выбор необходимого пункта меню осуществляется при помощи клавиш управления курсором. Для активизации нужно нажать ENTER. Выход из программы - клавиша ESC или выбор пункта "Выход". Заключение В курсовой работе решена задача исследования математических функций. Разработан алгоритм решения поставленной задачи. По этому алгоритму на языке Turbo C++ составлена и отлажена программа, анализ работы которой показал, что поставленная задача успешно решается. Список литературы 1.Бьярн Страуструп. Язык программирования С++.в двух частях. Пер. с англ. Киев:"ДиаСофт",1993.-296 с.,ил. 2.Корриган Джон Компьютерная графика: Секреты и решения: Пер с англ. -М.:Энтроп, 1995. - 352 с., ил. ПРИЛОЖЕНИЕ 1 Распечатка программы #include <stdio.h> #include <conio.h> #include <stdlib.h> #include <graphics.h> #include <string.h> #include <math.h> // Драйвер - VGA, Режим - 640x480x16 int drv=VGA,mode=VGAHI; // Структура, описывающая меню struct menu_ { int num; // Количество пунктов int onum; // Количество опрашиваемых пунктов char capt[6][20];// Имена пунктов }; // Глобальные переменные float MinX=-4; // Начальное значение X float MaxX=4; // Конечное значение X float MX=80; // Масштаб по X float MY=80; // Масштаб по Y int CF=0; // Номер функции int SC=20; // Число строк в таблице // Возвращает 0, если невозможно подсчитать функцию при данном X, // иначе изменяет Y и возвращает 1 int fun(float x,float * y) { switch(CF) { case(0): *y=sin(x); return 1; case(1): *y=cos(x); return 1; case(2): *y=x*x; return 1; case(3): if (x<0) return 0; *y=sqrt(x); return 1; case(4): if (fabs(x)<0.0000001) return 0; *y=1/fabs(x); return 1; case(5): if (fabs(x)<0.0000001) return 0; *y=2*sin(x*x)/x; return 1; } return 0; } // Вывод графика функции на экран void output() { float x; // Очередная точка float y; // графика float stp; // Шаг изменения X float px,py; // Предыдущая точка int rp=0; // 1 - если предыдущая точка существует int rt=0; // 1 - если текущая точка существует // Выход при неправильно заданном диапазоне if ((MaxX-MinX)<=0) return; // Установка начальных значений x=MinX; stp=(MaxX-MinX)/320; // Вывод линий setcolor(12); line(0,240,639,240); if ((MinX<0)&&(MaxX>0)) line((0-MinX)*MX,0,(0-MinX)*MX,480); setcolor(15); // Вывод функции do { // Нахождение очередной точки rt=fun(x,&y); if (rt==0) { // Если точки нет - сброс значения предыдущей rp=0; } else { // Иначе - проверка: if (rp==0) { // Если предыдущей нет, ставим точку putpixel((x-MinX)*MX,(240-y*MY),15); rp=1; } else { // Иначе рисуем линию line((px-MinX)*MX,(240-py*MY),(x-MinX)*MX,(240-y*MY)); } // Новые значения предыдущей точки px=x; py=y; } // Новое значение X x+=stp; } while (x<MaxX); } // Процедура обработки вертикального меню // Параметры: меню, координата X вывода меню int use_scroll(menu_ m,int x) { int n; // Счетчик int vp=0; // Выбранный пункт char c; // Считанный с клавиатуры символ // Очистка места под меню setfillstyle(1,8); settextjustify(1,1); bar(x,0,x+105,479); do { // Выводпунктовменю for (n=0;n<m.num;n++) { // Выделение цветом выбранного пункта и неактивных поселдних пунктов if (n==vp) { setfillstyle(1,4); setcolor(15); } else { if (n>(m.onum-1)) { setfillstyle(1,8); setcolor(10); } else { setfillstyle(1,1); setcolor(14); } } // Выводпункта bar(x+5,5+30*n,x+100,25+30*n); rectangle(x+6,6+30*n,x+99,24+30*n); outtextxy(x+55,15+30*n,m.capt[n]); } // Опрос клавитауры do { c=getch(); if (c==0) c=getch(); // КлавишаВниз if (c==72) { vp--; if (vp<0) vp=m.onum-1; } // КлавишаВверх if (c==80) { vp++; if (vp>=m.onum) vp=0; } } while ((c!=72)&&(c!=80)&&(c!=13)&&(c!=27)); } while ((c==72)||(c==80)); // Возврат выбраннго пункта if (c==13) return vp; // Возврат -1 при ESC return -1; } // Процедура обработки горизонтального меню int use_menu(menu_ m) { int n; // Счетчик int vp=0; // Выбранный пункт char c; // Символ // Очистка места под меню setfillstyle(1,0); settextjustify(1,1); bar(0,0,639,25); do { // Выводпунктовменю for (n=0;n<m.num;n++) { // Выделение цветом if (n==vp) { setfillstyle(1,4); setcolor(15); } else { if (n>(m.onum-1)) { setfillstyle(1,8); setcolor(10); } else { setfillstyle(1,1); setcolor(14); } } // Выводпункта bar(10+100*n,5,105+100*n,25); rectangle(11+100*n,6,104+100*n,24); outtextxy(60+100*n,15,m.capt[n]); } // Опрос клавиатуры do { c=getch(); if (c==0) c=getch(); if (c==75) { // Влево vp--; if (vp<0) vp=m.onum-1; } if (c==77) { // Вправо vp++; if (vp>=m.onum) vp=0; } } while ((c!=75)&&(c!=77)&&(c!=13)&&(c!=27)); } while ((c==75)||(c==77)); if (c==13) return vp; return -1; } // Ввод числа // Параметры: координаты прямоугольной рамочки и значение по умолчанию float InputFloat(int x1,int y1,int x2,int y2,float last) { char s[100]; // Строка char s1[100]; // Промежуточная строка char c; // Символ // Вывод рамочки setfillstyle(1,2); setcolor(14); bar(x1,y1,x2,y2); rectangle(x1+1,y1+1,x2-1,y2-1); sprintf(s,"%2.3f",last); settextjustify(0,1); // Опрос клавиатуры do { // Вывод строки и курсора bar(x1+2,y1+2,x2-2,y2-2); strcpy(s1,s); strcat(s1,"_"); outtextxy(x1+5,y1+10,s1); c=getch(); if (((c>='0')&&(c<='9'))||(c=='.')||(c=='-')) { // Нажат разрешенный символ - добавление s[strlen(s)+1]=0; s[strlen(s)]=c; } // Нажат BackSpace if ((c==8)&&(strlen(s)>0)) s[strlen(s)-1]=0; } while ((c!=13)&&(c!=27)); // Если не ESC - перевод нового значения из строки в число if (c!=27) sscanf(s,"%f",&last); return last; } // Ввод строки // Параметры: координаты прямоугольной рамочки и значение по умолчанию char * InputString(int x1,int y1,int x2,int y2,char * last) { char s[100]; char s1[100]; char c; // Выводрамочки setfillstyle(1,2); setcolor(14); bar(x1,y1,x2,y2); rectangle(x1+1,y1+1,x2-1,y2-1); strcpy(s,last); settextjustify(0,1); // Опросклавиатуры do { // Вывод строки и курсора bar(x1+2,y1+2,x2-2,y2-2); strcpy(s1,s); strcat(s1,"_"); outtextxy(x1+5,y1+10,s1); c=getch(); if ((c!=13)&&(c!=27)&&(c!=8)) { // Нажат разрешенный символ - добавление s[strlen(s)+1]=0; s[strlen(s)]=c; } if ((c==8)&&(strlen(s)>0)) s[strlen(s)-1]=0; } while ((c!=13)&&(c!=27)); // Если ESC - возвращаем старое значение if (c==27) return last; return s; } // Выводтаблицывфайл void prttabl(char * fname) { FILE * f; // Указатель на файл float stp; // Шаг изменения функции float x; // Текущая float y; // точка // Выход при неправильно заданном диапазоне if ((MaxX-MinX)==0) return; // Открываем файл на запись f=fopen(fname,"wb"); // Начальные значения x=MinX; stp=(MaxX-MinX)/SC; do { // Если значение функции верно - вывод в файл if (fun(x,&y)) fprintf(f,"Fun( %f )= %f \n\r",x,y); x+=stp; } while (x<=MaxX); // Закрываем файл fclose(f); } // Основная программа void main() { char s[30]; // Описаниеменю menu_ m1; menu_ fun; menu_ dia; menu_ mas; menu_ tabl; strcpy(m1.capt[0],"Функция\x0"); strcpy(m1.capt[1],"Диапазон\x0"); strcpy(m1.capt[2],"Масштаб\x0"); strcpy(m1.capt[3],"Таблица\x0"); strcpy(m1.capt[4],"Выход \x0"); m1.num=6; m1.onum=5; strcpy(fun.capt[0],"Sin(X)\x0"); strcpy(fun.capt[1],"Cos(X)\x0"); strcpy(fun.capt[2],"X^2\x0"); strcpy(fun.capt[3],"Sqrt(X)\x0"); strcpy(fun.capt[4],"1/|X|\x0"); strcpy(fun.capt[5],"2Sin(X^2)/X\x0"); fun.num=6; fun.onum=6; strcpy(dia.capt[0],"Диапазон\x0"); strcpy(dia.capt[1],"Min:\x0"); strcpy(dia.capt[2],"Max:\x0"); dia.num=3; dia.onum=3; strcpy(mas.capt[0],"Масштаб\x0"); strcpy(mas.capt[1],"Y:\x0"); strcpy(mas.capt[2],"X:\x0"); mas.num=3; mas.onum=2; strcpy(tabl.capt[0],"Таблица\x0"); strcpy(tabl.capt[1],"Наэкран\x0"); strcpy(tabl.capt[2],"Вфайл\x0"); strcpy(tabl.capt[3],"Число строк\x0"); tabl.num=4; tabl.onum=4; // Инициализация графики initgraph(&drv,&mode,""); for (;;) { // Вывод графика функции cleardevice(); output(); strcpy(m1.capt[5],fun.capt[CF]); // Опросменю switch(use_menu(m1)) { case 0: CF=use_scroll(fun,0); break; case 1: switch(use_scroll(dia,105)) { case 1: MinX=InputFloat(210,30,310,45,MinX); break; case 2: MaxX=InputFloat(210,50,310,65,MaxX); break; } sprintf(dia.capt[1],"Min: %2.3f",MinX); sprintf(dia.capt[2],"Max: %2.3f",MaxX); MY=MX=(640/(MaxX-MinX)); sprintf(mas.capt[1],"Y: %2.1f",MY); sprintf(mas.capt[2],"X: %2.1f",MX); break; case 2: switch(use_scroll(mas,205)) { case 1: MY=InputFloat(310,30,410,45,MY); break; } sprintf(mas.capt[1],"Y: %2.1f",MY); sprintf(mas.capt[2],"X: %2.1f",MX); break; case 3: switch(use_scroll(tabl,305)) { case(1): cleardevice(); prttabl("con\x0"); // Вкачествефайла - консоль getch(); break; case(2): prttabl(InputString(410,30,510,45,"Prn")); break; case(3): SC=InputFloat(410,30,510,45,SC); break; } sprintf(tabl.capt[3],"Строк: %d",SC); break; case -1: case 4: return; } } } |