TURBO PASCAL

Новости       

Программы

Turbo Pascal

Игры

Документация

"Странности"

FAQ

Ссылки

Благодарности 

Гостевая книга

Спонсор

От автора

 

ПРИЛОЖЕНИЕ  1

пример выполнения контрольной работы № 5

ЛИСТИНГ ПРОГРАММЫ Work5.pas                                                                                                                                                           

Program 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 не всегда рисуется на экране.

Эти и другие возможные в каждом конкретном случае ситуации должен увидеть и разрешить сам студент.

 

На первую страницу

Rambler's Top100 PROext: Top 1000
Rambler's Top100

(с) Все права защищены.

По всем интересующим вопросам прошу писать электронный адрес

Hosted by uCoz