Программа исследования функций
Пояснительная записка к курсовой работе по дисциплине “Основы алгоритмизации и программирования”
Выполнил : студент гр. 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 элементов - содержит имена пунктов меню.
Глобальные переменные,которые использует программа:
Название | Тип | Начальное значение | Назначение |
MinX | float | -4 | Начальное значение Х |
MaxX | float | 4 | Начальное значение Y |
MX | float | 80 | Масштаб по оси Х |
MY | float | 80 | Масштаб по оси Y |
CF | int | 0 | Номер функции |
SC | int | 20 | Число строк в таблице |
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)=%fnf",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("conx0");
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 nr",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^2x0");
strcpy(fun.capt[3],"Sqrt(X)x0");
strcpy(fun.capt[4],"1/|X|x0");
strcpy(fun.capt[5],"2Sin(X^2)/Xx0");
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("conx0"); // Вкачествефайла - консоль
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;
}
}
}