Полезное:
Как сделать разговор полезным и приятным
Как сделать объемную звезду своими руками
Как сделать то, что делать не хочется?
Как сделать погремушку
Как сделать так чтобы женщины сами знакомились с вами
Как сделать идею коммерческой
Как сделать хорошую растяжку ног?
Как сделать наш разум здоровым?
Как сделать, чтобы люди обманывали меньше
Вопрос 4. Как сделать так, чтобы вас уважали и ценили?
Как сделать лучше себе и другим людям
Как сделать свидание интересным?
Категории:
АрхитектураАстрономияБиологияГеографияГеологияИнформатикаИскусствоИсторияКулинарияКультураМаркетингМатематикаМедицинаМенеджментОхрана трудаПравоПроизводствоПсихологияРелигияСоциологияСпортТехникаФизикаФилософияХимияЭкологияЭкономикаЭлектроника
|
Формальное исполнение программы ⇐ ПредыдущаяСтр 5 из 5 Рассмотрим процесс выполнения программы fsin. 0) До начала выполнения программы производится статическое распределение памяти(рис. 17.2).
Рис. 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);
Рис. 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).
Рис.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.
Рис.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).
Рис. 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)
Рис. 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 шагов.
|