Смекни!
smekni.com

Программа исследования функций (стр. 2 из 2)

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 &bsol;n&bsol;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],"Функция&bsol;x0");

strcpy(m1.capt[1],"Диапазон&bsol;x0");

strcpy(m1.capt[2],"Масштаб&bsol;x0");

strcpy(m1.capt[3],"Таблица&bsol;x0");

strcpy(m1.capt[4],"Выход &bsol;x0");

m1.num=6;

m1.onum=5;

strcpy(fun.capt[0],"Sin(X)&bsol;x0");

strcpy(fun.capt[1],"Cos(X)&bsol;x0");

strcpy(fun.capt[2],"X^2&bsol;x0");

strcpy(fun.capt[3],"Sqrt(X)&bsol;x0");

strcpy(fun.capt[4],"1/|X|&bsol;x0");

strcpy(fun.capt[5],"2Sin(X^2)/X&bsol;x0");

fun.num=6;

fun.onum=6;

strcpy(dia.capt[0],"Диапазон&bsol;x0");

strcpy(dia.capt[1],"Min:&bsol;x0");

strcpy(dia.capt[2],"Max:&bsol;x0");

dia.num=3;

dia.onum=3;

strcpy(mas.capt[0],"Масштаб&bsol;x0");

strcpy(mas.capt[1],"Y:&bsol;x0");

strcpy(mas.capt[2],"X:&bsol;x0");

mas.num=3;

mas.onum=2;

strcpy(tabl.capt[0],"Таблица&bsol;x0");

strcpy(tabl.capt[1],"Наэкран&bsol;x0");

strcpy(tabl.capt[2],"Вфайл&bsol;x0");

strcpy(tabl.capt[3],"Число строк&bsol;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&bsol;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;

}

}

}