Главная Случайная страница


Полезное:

Как сделать разговор полезным и приятным Как сделать объемную звезду своими руками Как сделать то, что делать не хочется? Как сделать погремушку Как сделать так чтобы женщины сами знакомились с вами Как сделать идею коммерческой Как сделать хорошую растяжку ног? Как сделать наш разум здоровым? Как сделать, чтобы люди обманывали меньше Вопрос 4. Как сделать так, чтобы вас уважали и ценили? Как сделать лучше себе и другим людям Как сделать свидание интересным?


Категории:

АрхитектураАстрономияБиологияГеографияГеологияИнформатикаИскусствоИсторияКулинарияКультураМаркетингМатематикаМедицинаМенеджментОхрана трудаПравоПроизводствоПсихологияРелигияСоциологияСпортТехникаФизикаФилософияХимияЭкологияЭкономикаЭлектроника






Формальное исполнение программы





Рассмотрим процесс выполнения программы fsin.

0) До начала выполнения программы производится статическое

распределение памяти(рис. 17.2).

  ОП  
Х ? Под хранение данного типа REAL
Е ? Под хранение данного типа REAL

Рис. 17.2. – Распределение ОП

Содержимое выделенных участков памяти - неопределенное;

1) выполняется обращение к процедуре вывода:

writeln('Введите точность вычисления');

На экране, начиная с текущего положения курсора, появляется сообщение:

Введите точность вычисления

, и курсор переводится в начало следующей строки экрана дисплея;

2) выполняется обращение к процедуре ввода:

readln(E);

Программа ожидает получения информации в виде одного вещественного числа с клавиатуры ПЭВМ. Человек набирает эту информацию, например, 1e-10 и нажимает клавишу ввод (Return или Enter). Значение 1e-10 поступает в память под именем E (рис.17.3);

3) выполняется обращение к процедуре вывода:

writeln('Введите аргумент для функции sin');

На экране, начиная с текущего положения курсора, появляется сообщение:

Введите аргумент для функции sin

, и курсор переводится в начало следующей строки экрана дисплея;

4) выполняется обращение к процедуре ввода:

readln(x);

Программа ожидает получения информации в виде одного вещественного числа с клавиатуры ПЭВМ. Человек набирает эту информацию, например, 0.1 и нажимает клавишу ввод (Return или Enter). Значение 0.1 поступает в память под именем x. (рис. 17.3);

  ОП  
Х 0.1 Под хранение данного типа REAL
Е 1.0Е-10 Под хранение данного типа REAL

Рис. 17.3. – Содержимое ОП после ввода

5) выполняется обращение к процедуре вывода:

writeln('sin(',x,')=',z6(E,x,znsin));

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

Значение первого параметра - строка символов sin. (

Значение второго параметра - вещественное число 1.0E-01.

Значение третьего параметра - строка символов).

Значение четвертого параметра - вещественное число, представляющее собой результат вычисления функции z6.

Остановимся подробно на выполнении функции z6. При обращении к функции возникает динамический экземпляр функции, который с точки зрения пользователя представляет собой динамический экземпляр данных и измененный машинный код функции.

Динамический экземпляр данных (рис. 17.4) включает в себя

- переменную, совпадающую с именем функции, под результат работы функции (z6);

- переменные, являющиеся параметрами-значениями (eps, a1);

- локальные переменные (i, ap, at, sum).

z6 ? real
eps ? Real
al ? Real
i ? Integer
ap ? Real
at ? Real
sum ? Real

Рис.17.4. – Динамический экземпляр данных

После возникновения динамического экземпляра осуществляется передача фактических параметров (при этом формируются значения параметров-значений в динамическом экземпляре данных и модифицируется код подпрограммы). Вспомним заголовок подпрограммы z6:

function z6(eps{точность}:real;

a1{значение первого элемента ряда}:real;

q{функция, вычисляющая значение знаменателя

геометрической прогрессии в зависимости от

порядкового номера }:tf):real;

и сопоставим его с обращением к функции z6:

z6(E,x,znsin).

Первый и второй параметры - параметры-значения, поэтому в динамический экземпляр передаются значения фактических параметров (1.0E-10 eps, 0.1 a1). Третий параметр - параметр-переменная подпрограммного типа, поэтому происходит модификация кода функции z6. При модификации в разделе операторов функции на место формального имени q подставляется имя фактической функции znsin. Обратите внимание - заголовок функции znsin соответствует объявлению типа tf.

z6 ? real
eps 1.0Е-10 Real
al 0.1 Real
i ? Integer
ap ? Real
at ? Real
sum ? Real

Рис.17.5. – Динамический экземпляр данных
после передачи фактических параметров

Содержимое динамического экземпляра данных приведено на рис. 17.5 и модифицированный код:

begin

ap:=a1;

sum:=ap;

at:=ap*znsin(1);

i:=2;

while abs(at-ap)>eps do begin

sum:=sum+at;

ap:=at;

at:=ap*znsin(i);

i:=i+1

end;{while}

z6:=sum

end;

Начинается исполнение операторов функции z6:

1) выполняется оператор присваивания

ap:=a1;

в результате ap:=0.1;

2) выполняется оператор присваивания

sum:=ap;

в результате sum:=0.1;

3) выполняется оператор присваивания

at:=ap*znsin(1);

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

Znsin ? Real
I   Integer

Рис. 17.6. – Динамический экземпляр данных функции znsin

Программный код при этом не модифицируется, т.к. отсутствуют параметры-переменные и параметры-подпрограммы. После этого начинается выполнение программного кода функции znsin. Выполняется оператор присваивания

znsin:=-sqr(x)/((2*i)*(2*i+1));

Для вычисления выражения формируется стек, в который поступают операнды и знаки операций. При вычислении числителя дроби вычисляется функция возведения в квадрат значения переменной x. Эта переменная не принадлежит динамическому экземпляру функции znsin, поэтому переменную x необходимо искать в описании блока, в который вложена функция znsin, т.е. в программе fsin. В результате вычисления выражения -sqr(0.1)/((2*1)*(2*1+1)) получаем значение -1.667Е-03, это значение поступает в стек для вычисления выражения, определяющего значение at. Вычисляя, получаем at:=-1.667E-04;

4)выполняется оператор i:=2;

5)начинается исполнение оператора

while abs(at-ap)>eps do begin

sum:=sum+at;

ap:=at;

at:=ap*znsin(i);

i:=i+1

end;

Вычисляется условие abs(-1.667E-04 - 1.0E-01) > 1.0E-10 (получаем значение TRUE);

6) начинается исполнение тела цикла, выполняется оператор присваивания

sum:=sum+at;

получаем sum:=9.983E-02;

7) выполняется оператор присваивания

ap:=at;

получаем ap:=-1.667E-04;

8) выполняется оператор присваивания

at:=ap*znsin(i);

при вычислении выражения появляется динамический экземпляр данных функции znsin и передаются параметры (рис. 17.7)

Znsin ? Real
i   Integer

Рис. 17.7. – Динамический экземпляр данных функции znsin

После этого начинается выполнение программного кода функции znsin.

Выполняется оператор присваивания

znsin:=-sqr(x)/((2*i)*(2*i+1));

вычисляем znsin:=-sqr(0.1)/((2*2)*(2*2+1)) (получаем -5.0Е-04);

функция znsin отработала; динамический экземпляр исчезает, а результат функции записывается в стек для вычисления at (at:=8.33E-8);

9) выполняется оператор присваивания

i:=i+1;

в результате чего i:=3;

10) вычисляется условие повторения цикла

abs(at-ap)>eps:

abs(8.33E-8 + 1.667E-4)>1.0E-10 (результат TRUE);

11) выполняется оператор присваивания sum:=sum+at:

sum:=9.983E-02 + 8.33E-08 (9.983E-02);

12) выполняется оператор присваивания ap:=at (ap:=8.33E-08);

13) выполняется оператор присваивания at:=ap*znsin(i):

at:=8.33E-08 * znsin(3) (at:=8.33E-08 * -2.381E-04 = =- 1.984E-11);

14) выполняется оператор присваивания i:=i+1: i:=3+1(4);

15) вычисляется условие повторения цикла

abs(at-ap)>eps:

abs(-1.984E-11 - 8.33E-08)>1.0E-10 (результат TRUE);

16) выполняется оператор присваивания sum:=sum+at:

sum:=9.983E-02 - 1.984E-11 (9.983E-02);

17) выполняется оператор присваивания ap:=at (ap:=-1.984E-11);

18) выполняется оператор присваивания at:=ap*znsin(i):

at:=-1.984E-11 * znsin(4) (at:=-1.984E-11 * -1.389E-04 = =2.756E-15);

19) выполняется оператор присваивания i:=i+1: i:=4+1(5);

20) вычисляется условие повторения цикла

abs(at-ap)>eps:

abs(2.756E-15 + 1.984E-11)>1.0E-10 (результат FALSE);

оператор цикла прекращает выполнение;

21) выполняется оператор присваивания z6:=sum;

в результате переменная z6 получает значение 9.9833416647E-02.

Функция z6 выполнилась, динамический экземпляр функции исчезает.

Таким образом, значение 9.9833416647E-02 выступает четвертым параметром при обращении к процедуре вывода:

writeln('sin(',x,')=',z6(E,x,znsin)).

В результате выполнения на экране имеем текст:

sin(1.0000000000E-01)=9.9833416647E-02

Программа fsin выполнилась за 5 шагов.

Date: 2016-07-05; view: 348; Нарушение авторских прав; Помощь в написании работы --> СЮДА...



mydocx.ru - 2015-2024 year. (0.006 sec.) Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав - Пожаловаться на публикацию