TURBO PASCAL |
Новости |
ПРИЛОЖЕНИЕ 1пример выполнения контрольной работы № 5ЛИСТИНГ ПРОГРАММЫ Work5.pasProgram Work5; {Построение графика любой функции y=F(x)} Uses CRT; Const H=79; {Максимальное число столбцов на символьном экране дисплея} Type Position=1..H;
ArrayA=array [Position] of char;
Func=Function (x:Real):Real; Var
Y0, M :
integer;
k, N, j
: Position;
Ymin, Ymax, A, B,
dx, x, y, My : Real; Ar : ArrayA; {Массив символов, выдаваемых на экран} ch : char; {Выдача на экран k символов} Procedure Grafic (A :
ArrayA; k : Position); Var
i : Position; Begin
for i:=1 to k do
Write(A[i]);
Writeln; End; {$I funct}
{Загрузка конкретной
функции из другого
файла funct.pas} {Нахождение минимума Ymin и максимума Ymax функции F на интервале[A, B], а также выдача на экран всех возможных ее корней x0} Procedure MinMax (F :
Func; dx, A, B : Real; Var Ymin, Ymax : Real); Var
Fx,F1x:Real; Begin
x:=A;
Ymin:=F(x);
Ymax:=Ymin;
F1x:=YMin;
While x<=B do
Begin
x:=x+dx;
Fx:=F(x); { Вариант нахождения корней функции F: Fx - последующее значение функции F1X- предыдущее значение функции} if Fx*F1x<0 then {функция изменила знак, получаем корень x0}
Writeln('x0=',x-dx/2);
F1x:=Fx;
if Fx>Ymax then Ymax:=Fx;
if Fx<Ymin then Ymin:=Fx;
End End;
{MinMax} {Главная программа} Begin
Repeat
For j:=1 to H do Ar[j]:=' ';
{Очистка массива Ar} ClrScr; Write('Введите количество точек ==========>'); Readln(M); Write('Введите интервал [A..B]=====>');
Readln(A,B);
dx:=(B-A)/(M-1); Writeln('Cписок корней на интервале');
MinMax(F,dx,A,B,Ymin,Ymax);
Writeln('--------- Нажмите ENTER --------- ');
Readln;
My:=75/(Ymax-Ymin); {Масштаб
по оси
Y} Y0:=trunc(2-My*Ymin); {Положение Y0 на экране дисплея} { Собственно график} x:=A;
While x<=B do
Begin
y:=F(x);
if Y0 in [1..H] then Ar[Y0]:='|';
{Символ оси X}
N:=Round(My*y)+Y0;
if N<Y0 then k:=Y0
else k:=N;
if x=0 then
Begin
{ Получаем ось
------------------------->Y}
For j:=1 to H-3 do Ar[j]:='-';
Ar[H-2]:='>';
Ar[H-1]:='Y';
k:=H;
End; Ar[N]:='@'; {Символ точки на графике}
Grafic(Ar,k);
For j:=1 to H do Ar[j]:=' ';
{Очистка массива Ar}
x:=x+dx
End;
if Y0 in [1..H-1] then
{Окончание оси
X}
Begin
Ar[Y0]:='V';
Ar[Y0+1]:='X';
Grafic(Ar,Y0+1);
End;
Writeln('Повторить?
(y/n)');
ch:=ReadKey;
Until (ch='n') or (ch='N'); end. ЛИСТИНГ ВНЕШНЕГО ФАЙЛА Funct.pasКонкретная
функция (определена на всем интервале
действительных чисел):
X {$F+} {Данная директива нужна для ПЭВМ типа Pentium и выше} Function F(x : Real)
: Real; Begin
F:=exp(-x)*sin(2*Pi*x) End; Рассмотрим поэтапное выполнение контрольной работы № 5. Цель работы. Задав конкретную функцию F(x) = X, построить на символьном экране дисплея ее график и найти все возможные решения (т.е. значения корней X0, при которых значение функции F(x0) равно 0) , не применяя никаких численных методов. На графике это точки пересечения функции F(x) с осью Х. График функции F(x) рисуется построчно, оси координат повернуты на –90 градусов (ось X расположена вертикально, ось Y - горизонтально). Такая модель построения графика функции Y=F(X) предполагает экранное ограничение только для значений Y [1.. 80].
В зависимости от интервала [A, B] и значения функции F(x) та или иная ось (или обе) могут быть НЕ видны. Загрузка функции происходит из файла funct.pas, который записан на диске в вашей рабочей (текущей) директории – директива {$I funct}. Имя программы – Work5, имя файла листинга
– Work5.pas. v В фигурных скобках написаны комментарии. v Далее после зарезервированного слова Uses написано имя стандартного модуля среды Turbo Pascal - CRT. v Затем описана константа H=79 (максимальное количество позиций для вывода графика по горизонтали). v Далее идут описания типов данных: Ø Position - описывает количество позиций для вывода графика. Ø Массив ArrayA описывает вектор символов для вывода графика на экран символьного дисплея. Ø Func - конкретная функция F(x). v В поле описания Var описаны необходимые переменные. v Далее идут описания процедур Grafic и MinMax. v
Затем следует загрузка конкретной
функции F(x)
из другого файла funct.pas
- {$I funct}. v Записана главная программа, которая вызывает нужные процедуры и функции, согласно алгоритму решения задачи. Алгоритм выполнения процедуры GraficØ В цикле по i выводится значение элемента массива A[i] в виде символа на экран дисплея. Ø Выводится пустая строка – переход на следующую строку графика. Алгоритм выполнения процедуры MinMaxØ Устанавливаются начальные значения переменных: x, Ymin, Ymax, F1x. Ø В цикле While x<=B производятся следующие действия: 1) Вычисляется текущее значение x:=x+dx. 2) Вычисляется предыдущее значение функции F1X и ее последующее значение FX . 3) Если произведение предыдущего значения функции на последующее меняет знак, значит график функции F(x) пересекает ось x, на экран выводится значение корня, равное: x -dx/2; 4) Определяется минимальное и максимальное значение функции: Ymax, Ymin. Алгоритм выполнения главной программыØ В цикле по j очищается массив Ar[j]. Ø Вводится количество точек M графика функции F(x) и интервал [A..B], на котором исследуется изменение этой функции. Ø Определяется приращение (дискрета) по X, равное dx:=(B-A)/(M-1). Ø Находится минимальное и максимальное значения функции F(x) и корни на интервале [A..B] – обращение к процедуре MinMax. Ø После вывода корней, если они есть на заданном интервале, нажимаем на клавишу Enter; Ø Определяется масштабный множитель My:=75/(Ymax-Ymin). Ø
Далее определяется номер
позиции Y0, через
которую проходит ось Х:
Ø
Y0:=trunc(2-My*Ymin)
Примечание. My и Y0 определяются из системы уравнений:
77=Y0+My*Ymax
2=Y0+ My*Ymin, где 77 и 2 – соответственно максимальный и минимальный номер позиции по горизонтали (во избежание вывода символа за экран при вычислениях экранных дискрет с учетом ошибок округления и отсечения). Ø Вычисляется исходное значение x:=A. Ø Затем в цикле While x<=B производятся следующие действия: 1) вычисляется значение функции в точке Х; 2) проверяется, нужно ли рисовать ось X (номер позиции Y0 входит в заданное количество позиций 1..H); 3) если да, то значение массива Ar[y0] в этой позиции равно ‘I’ (рисуем вертикальную линию); 4) номер экранной позиции N определяется как Round(My*y)+Y0; 5) вычисляется количество выводимых на дисплей символов k; 6) если Х=0, то формируется ось Y; 7) в позиции вывода символа графика N элементу массива Ar[N] присваивается значение выводимого символа ‘@’; 8) выводится строка графика – обращение к функции Grafic(Ar,k); 9) после этого массив Ar[j] в цикле по j очищается; 10) значение X увеличивается на приращение dx, т.е. x:=x+dx и управление передается на начало цикла. Ø Затем проверяется, нужно ли рисовать ось X (номер позиции Y0 входит в заданное число позиций), если да, то заканчивается формирование оси Х: значение массива Ar[y0] в этой позиции равно ‘V’, а A[y0+1]=’X’ и выводится последняя строка графика – обращение к функции Grafic(Ar,Y0+1). Ø После вывода результата на экране дисплея появляется сообщение - Опять? (y/n), переменной ch присваивается значение нажатой клавиши (оператор ReadKey читает символ с клавиатуры - N или Y). Если вы нажали N, выполнение программы заканчивается, если нажали клавишу Y (или любую другую), - управление передается на начало цикла, и вы можете повторить вычисление с новыми значениями переменных M, A, B. Ø
При описании конкретной функции используется директива {$F+}, которая применяется при дальней модели вызова – она является обязательной для 32-разрядных ПЭВМ для правильной связи адресов. В данной реализации не учтены следующие особые случаи: Ø не контролируется правильность ввода пользователем интервала, а именно A<B; Ø функция может быть не всюду определена. Например, функция F(x) = 3*x - 4*ln x - 5 (вар. 12) определена только для x > 0; Ø из-за ошибок округления ось Y не всегда рисуется на экране. Эти и другие возможные в каждом конкретном случае ситуации должен увидеть и разрешить сам студент. |
(с) Все права защищены. По всем интересующим вопросам прошу писать электронный адрес |