Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Курсовые / Курсовые ЭТМО / 04 / OOP_Kurs_ETMo2hemp.DOC
Скачиваний:
17
Добавлен:
17.04.2013
Размер:
139.26 Кб
Скачать

1. Принцип решения задачи.

Используя графический пакет языка C++, мы выводим график функции на экран. Для этого, в диалоговом режиме запрашиваем значение постоянной «B», строим график заданной функции ФЧХ, по оси абсцисс прокладывая значения частот в сетке с шагом 400 сек-1, по оси ординат – сдвиг по фазе с шагом в 10 град.

2. Технические характеристики объекта исследования:

Диапазон значений в данной задаче ограничен значениями

частота меняется от 0 до 2000 сек-1

сдвиг по фазе от 0 град до -50 град

Эти ограничения введены для более наглядного решения задачи, и изменить их не с технической точки зрения не сложно.

3. Решение задачи.

Данная задача решена в среде Borland C++. Для решения потребовалось общую задачу разбить на несколько небольших задач (функций).

А именно отдельно ( в виде функций) были решены задачи :

1 - Инициализации графического пакета. initialization()

2 - Вывод масштабной сетки на экран. setka()

3 - Построение графика в зависимости от значения заданного параметра.

graphic()

4 - Считывание параметров в диалоговом режиме.

ask() и quest()

Рис 1.2. Схема алгоритма программы Рис 1.3 Схема алгоритма модуля по выводу графика на экран

4 Исходный код программы показан в приложении 1.

5 Использование программы.

Для использования данной программы необходима операционная среда MS DOS, файл egavga.bgi, и собственно сама скомпилированная программа rab.exe.

6 Тестовый пример показан в приложении 2.

7 Заключение.

Сопоставление результатов работы с требованием задания.

Сопоставляя результаты работы с требованием задания, можно сказать что задача решена в полной мере, за исключением, быть может общности относительно возможности расчета для других функций. Но решение более общей задачи представляется значительно более громоздким, и вообще является отдельной задачей. Поэтому автор не счел нужным разрабатывать алгоритм ввода многих функций и заострил внимание собственно на самой задаче – построении частотной характеристики для конкретного, данного в задании, случая.

Рекомендации по улучшению программы.

При разработке программы автор постарался устроить программу таким образом, чтобы ее можно было использовать и в других задачах, касающихся проблемы вывода ряда графиков на экран. Основные настройки легко меняются в разделе описания констант (см. приложение 1) .

Имеется одно недоразумение: программа не позволяет выводить график с значением коэффициента В, равным 0.8. Это легко устранить, изменив интервал возможных значений коэффициента в процедуре запроса.

При создании автор не стал уделять особое внимание обозначения выведенных характеристик, выводу формул, по которым они строятся, поскольку это может повлиять на отчетливость других характеристик. Это также несложно реализовать, если такая возможность действительно потребуется.

Приложение 1. Исходный код программы

#include <conio.h>

#include <dos.h>

#include <stdlib.h>

#include <stdio.h>

#include <graphics.h>

#include <math.h>

int centerX=40; Указание координат начала координат

int centerY=430;

float minxval=0; Диапазоны возможных значений

float maxxval=2000;

float minyval=0;

float maxyval=50;

float scaleX=400; Значение: количество единиц на деление (масштаб)

float scaleY=10;

Графика: количество точек на деление

int stepX=100; По оси ОХ

int stepY=75; По оси ОУ

int Del=10; Количество штрихов на 1 деление

int df=3; Длинна штриха

int pr=0; Отступ сетки от краев (в количестве делений)

int ot=5; Отступ осей от краев экрана

int sk=13; Отступ графической области от верха (для текста)

float t1=0.01; Значение параметра Т1(задаваемого условием задачи в секундах)

char *path="i:\\bgi"; Каталог нахождения файла egavga.bgi

int driver,mode,errorcode;

void setka();

void logo();

void graphic(float);

void initialization();

int ask();

float quest();

void main()

{

int i,t;

initialization(); Инициализация графики

logo();

setka(); Вывод масштабной сетки

t=ask(); Запрос о количестве графиков

for (i=1; i<=t; i++)

{setcolor(i+1); Установка цвета графика номер i

graphic(quest());} Вывод графика i

if (t>0) getch();

closegraph();

}

//------- Инициализация графического аппарата --------------------

void initialization()

{

driver=DETECT;

mode=0;

initgraph(&driver,&mode,path);

errorcode = graphresult();

if (errorcode != grOk) На случай ошибки

{

printf("Graphics error: %s\n", grapherrormsg(errorcode));

printf("Press any key....");

getch();

exit(1); Остановка выполнения программы

}

}

//------- Вывод сетки --------------------------------

void setka()

{

int ax,bx,ay,by,c;

int x,y;

int maxX=getmaxx(); Определение максимального количества пикселей

int maxY=getmaxy();

char *val;

bx=div(centerX,stepX).quot+div(maxX-centerX,stepX).quot;

Подсчет количества клеток

ax=div(centerX,stepX).rem;

Отступ от края до ячеек

by=div(centerY,stepY).quot+div(maxY-centerY,stepY).quot;

Подсчет количества клеток

ay=div(centerY,stepY).rem;

Отступ от края до ячеек

setcolor(LIGHTGREEN);

Вывод штрихов

for (x=Del*pr; x<=Del*(bx-pr) ; x++) Для оси ОХ

{

c=ax+x*stepX/Del;

line(c,centerY-df,c,centerY+df);

}

for (y=Del*pr; y<=Del*(by-pr) ; y++) Для оси ОУ

{

c=ay+y*stepY/Del;

line(centerX-df,c,centerX+df,c);

}

setcolor(LIGHTBLUE);

Вывод сетки

for (x=pr; x<=bx-pr ; x++) Горизонтальные линии

{

c=ax+x*stepX;

line(c,ay+pr*stepY,c,ay+(by-pr)*stepY);

moveto(c+3,centerY+5);

itoa(x*scaleX, val, 10);

outtext(val);

}

for (y=pr; y<=by-pr ; y++) Вертикальные линии

{

c=ay+y*stepY;

line(ax+pr*stepX,c,ax+(bx-pr)*stepX,c);

moveto(centerX+3,c+5);

itoa((by-pr-y)*scaleY, val, 10);

outtext(val);

}

setcolor(WHITE);

Оси с метками

line(ot,centerY,maxX-ot,centerY);

line(centerX,ot+sk,centerX,maxY-ot);

moveto(maxX-5-ot,centerY-3); Установка положения курсора в точки, где требуется простановка стрелок к координатным осям. Простановка стрелок

outtext(">");

moveto(centerX-3,ot+sk);

outtext("^");

moveto(maxX-8-ot,centerY+5);

outtext("w");

moveto(centerX+7,ot+2+sk);

outtext("F");

}

//--------- Запрос количества графиков ----------------

int ask()

{

int bg;

gotoxy(1,1);

printf("Введите количество графиков: ");

gotoxy(30,1);

scanf("%d",&bg);

gotoxy(1,1);

printf(" ");

gotoxy(30,1);

return(bg);

}

//--------- Запрос коэффициента В ----------------------

float quest()

{

float bg;

gotoxy(1,1);

printf("Введите значение «В» ");

gotoxy(30,1);

scanf("%f",&bg);

while ((bg>0.8)||(bg<0.2)) Проверка годности значения

{

gotoxy(1,1);

printf("Введите допустимое значение ");

gotoxy(30,1);

scanf("%f",&bg);

}

gotoxy(1,1);

printf(" ");

gotoxy(30,1);

return(bg); Возврат количества графиков

}

//---------- Вывод графика ---------------------------

void graphic(float kb)

{

int i;

float x,y,lx,ly;

int maxX=getmaxx();

lx=0;

ly=0;

for (i=0; i<maxX; i++)

{

x=i-centerX;

x=x/stepX;

x=x*scaleX; Вычисление значения Х от i

y=atan(x*t1)-atan(x*kb*t1);

y=180*y/3.141528; Вычисление значения У от Х

y=(y/scaleY);

y=y*stepY; Поиск координаты У от его знгачения

delay(Delay);

moveto(lx,ly); Установка первой точки отрезка

lx=i;

ly=centerY-y;

if (i>=1) lineto(lx,ly);

}

}

//---------- Заставка ---------------------------------------

void logo()

{

setfillstyle(SOLID_FILL,YELLOW);

bar(20,20,getmaxx()-20,100);

setcolor(0);

outtextxy(50,30," Курсовая работа по ООП");

outtextxy(50,50," Студента группы ЭТМО-24 Пасютина Антона");

outtextxy(50,70," На тему: «Фазочастотные характеристики»");

setfillstyle(SOLID_FILL,BLUE);

bar(20,120,getmaxx()-20,270);

setcolor(WHITE);

outtextxy(50,130," Техническое задание. ");

outtextxy(50,150," семейство кривых – фазочастотных характеристик ");

outtextxy(50,170," динаического звена по формуле F(w)=arctg(w*T1)-arctg(w*T2), ");

outtextxy(50,190,"gde T1=10mc, T2=B*T1, «В» вводится в диалоговом режиме 0.2<=B<=0.8");

outtextxy(50,210," Количество кривых задается также в диалоге ");

outtextxy(50,230," OX: 0..2000 c-1 шаг 400 c-1");

outtextxy(50,250," OY: 0..50 град. шаг 50 град.");

setfillstyle(SOLID_FILL,RED);

bar(20,290,getmaxx()-20,330);

setcolor(YELLOW);

outtextxy(50,305,"Нажмите любую клавишу для продолжения...");

getch();

setfillstyle(SOLID_FILL,BLACK);

bar(1,1,getmaxx(),getmaxy()) ;

}

Соседние файлы в папке 04