45837 (665181), страница 2
Текст из файла (страница 2)
Список литературы
1.Бьярн Страуструп. Язык программирования С++.в двух частях. Пер. с англ. Киев:"ДиаСофт",1993.-296 с.,ил.
2.Корриган Джон Компьютерная графика: Секреты и решения: Пер с англ. -М.:Энтроп, 1995. - 352 с., ил.
ПРИЛОЖЕНИЕ 1
Распечатка программы
#include
#include
#include
#include
#include
#include
// Драйвер - 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 ((MinX0))
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 } // Процедура обработки вертикального меню // Параметры: меню, координата 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 // Выделение цветом выбранного пункта и неактивных поселдних пунктов 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 // Выделение цветом 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; } } } Для подготовки данной работы были использованы материалы с сайта http://kurslab.chat.ru/