Расчётная «Построение графика функции» по Информатике (Попов Д. И.)

Кирилл Николоев ср, 16.03.2016 23:11

Задача построения графика функции. Написать процедуру DrawUserFunc (x1,x2,y1,y2:Real; Func: FuncToDraw), которая с помощью стандартной процедуры вывода Write выводит экран консоли размером MX=80 символов и MY=25 строк график функции Func на интервале [x1,x2] со значениями в диапазоне [y1,y2]. Для вычисления произвольной функции определить пользовательский тип FuncToDraw.

Решение. Анализ требований и формальная постановка задачи. Нужно построить график функции Func(x) и отобразить его на экране консоли. Для этого нужно пересчитать координаты исходной функции в заданном диапазоне в целочисленные координаты позиций на экране.

Для отображения графика на экране консоли будем пользоваться следующим символами: 1. Символ ‘*‘ – если в этой позиции экрана y = f(x). 2. Символ ‘-‘ – если в этой позиции экрана y ≠ f(x) и y=0 (ось абсцисс).

3. Символ ‘|’ – если в этой позиции экрана y ≠ f(x) и x=0 (ось ординат). 4. Символ ‘ ‘ (пробел) – во всех остальных случаях. Выбор и разработка математической модели. Определимся с преобразованием координат. По условию функцию нужно отобразить в прямоугольнике со следующими координатами: (x1,y1) – (x2,y2) – система координат К1.

На текстовой консоли имеется прямоугольник размером MX на MY символов. Т.е. мы имеем прямоугольник с координатами (1,1) – (MX, MY) – система координат К2. Причем значения координат – целые числа в диапазонах 1 MX по оси Х и 1MY по оси Y.

Согласно правилам преобразования координат, чтобы найти координату Xс системы К1 на основе соответствующей ей координаты Xэ (Х на экране) в системе К2 нужно составить пропорции по размерам соответствующих систем координат, и из этой пропорции найти зависимость. В нашем случае пропорция следующая:

Откуда , (1) или (2) Аналогично составляем пропорцию для пересчета по оси ординат координаты Yc системы К1 в координату Yэ (Y на экране) системы К2. Заметим, что в координатной системе К2 отсчет идет из левого верхнего угла экрана, т.е. координата левой верхней точки экрана равна (1,1). А правой нижней – (MX, MY). Получаем пропорцию

откуда (3) Для определения позиций осей ординат и абсцисс в выражении (2) нужно положить XC = 0, а в выражении (3) – YC = 0. Получаем следующие уравнения для осей: Для оси ординат (4) Для оси абсцисс (5)

Разработка алгоритма Составим словесное описание алгоритма 1. Выбираем каждую позицию на экране, начиная с левого верхнего угла, и двигаемся сначала по строке вправо, потом переходим к следующей строке.

2. Для текущей позиции делаем преобразование из К2 в К1 и вычисляем значение функции. 3. Проверяем текущую позицию на экране на условия: a. Если в этой позиции y = f(x), то выводим ‘*‘ b. Если в этой позиции y ≠ f(x) и y=0 (ось абсцисс), то выводим ‘-‘

c. Если в этой позиции y ≠ f(x) и x=0 (ось ординат), то выводим ‘|’ d. Во всех остальных случаях выводим ‘ ‘ (пробел) 4. Переходим к следующей позиции на экране. Разработаем блок-схему алгоритма

Напишем программу program DrawFunc; {$APPTYPE CONSOLE} uses SysUtils, Math; const MAX_X=80; MAX_Y=25; type FuncToDraw = function (x:real):real; function func1(x:real):real; begin func1:=(sin(x)); end;

function func2(x:real):real; begin func2:=arctan(x); end; function func3(x:real):real; begin func3:=x*x; end; procedure DrawUserFunc(x1,x2,y1,y2:real; Func: FuncToDraw); var x,y:integer; f,xcur :real;

begin for y:=1 to MAX_Y do begin for x:=1 to MAX_X do begin //вычислить текущую координату по ф-ле (1) xcur:=x1+(x-1)*(x2-x1)/(MAX_X-1); f:= Func(xcur); //вычислить значение функции в текущей позиции

Скачать файлы

Похожие документы