![]() |
Главная Случайная страница Контакты | Мы поможем в написании вашей работы! | |
|
Тождественность типов требуется только для переменных фактических и формальных параметров-переменных при вызове процедур и функций.
Две переменных, Т1 и Т2, имеют тождественный тип, если выполняется одно из следующих условий:
Т1 и Т2 описаны совместно;
при описании Т1 и Т2 используется один и тот же идентификатор типа;
Примеры тождественных и нетождественных описаний:
type
Mass = array [1..10] of real;
var
T1, T2: array [1..10] of integer;
M1: array [1..10] of integer;
M2: array [1..10] of integer;
A1:Mass; A2:Mass;
В примере переменные Т1 и Т2 тождественны, т. к. описаны совместно; переменные А1 и А2 тождественны, т. к. используют для описания один и тот же идентификатор Mass; переменные М1 и М2 нетождественны, т. к. конструкция array [1..10] of integer является описанием типа.
В качестве примера рассмотрим следующую задачу: Задано три числа: n, m, k. Необходимо вычислить три значения:
и поменять полученные значения так, чтобы в переменной a оказалось наибольшее из трёх, в b – среднее и в c – наименьшее, т.е. выстроить их в порядке убывания.
Алгоритм основной программы достаточно прост (рис. 25). После ввода исходных значений (блок 2) производятся вычисления значений a, b, c по заданным выражениям (блоки 3, 4, 5). Далее следует алгоритм сортировки массива из трёх значений. Блоки 6, 7, 8 и 9 предназначены для нахождения максимального из трёх значений. Если переменная b содержит максимальное из трёх значений (блок 6), то первая переменная (а) обменивается значением с переменной b (блок 7). Если максимальное значение находиться в переменной c (блок 8), то первая переменная (а) обменивается значением с переменной с (блок 9). Если максимальное значение находиться в переменной а, то блоки 7 и 8 останутся не выполненными.
Рисунок 25 – Блок-схема алгоритма упорядочивания значений трёх элементов по убыванию
Таким образом, перед выполнением блока 10 максимальное из трёх значений будет находиться в переменной а.
Осталось поместить наибольшее из значений в переменных b и c в переменную b (блоки 10, 11).
Алгоритм функции Fkt(f), предназначенной для вычисления факториала заданного значения, по сути, является алгоритмом вычисления произведения целых чисел от 1 до f. Формальный параметр f является параметром-значением, т. е. при вызове функции в переменную f до начала работы подпрограммы будет записано значение фактического параметра – значения, указанного в вызове функции из основной программы.
Процедура Swap(s1, s2) выполняет перестановку значений двух переменных. Формальные параметры s1 и s2 являются параметрами-переменными. При вызове процедуры swap в качестве фактических параметров должны использоваться переменные. Любые изменения в значении переменных s1 и s2 в подпрограмме отражаются на переменных, переданных в качестве фактического параметра при вызове процедуры.
Рассмотрим подробнее, каким образом передаются параметры в вызываемые подпрограммы (табл. 13).
После запуска программы пользователь ввёл три значения: 2, 1, 2, которые были записаны соответственно в переменные n, m, k (строка 1).
Первый вызов функции Fkt (строка 2):
В основной программе (рис. 25, блок 3) при вызове функции передаётся значение переменной n (n = 2). Функция присваивает это значение параметру f. Таким образом, в начале работы алгоритма функции в переменной f находится значение 2.
По окончании работы функция возвращает основной программе значение факториала числа 2 (строка 10). Оператор в блоке 3 на рисунке 24 получает вычисленное значение факториала и записывает его в переменную а.
Второй вызов функции Fkt (строка 11):
Блок 4 (рис. 25) основной программы во второй раз вызывает функцию Fkt, но в этот раз передаёт в неё значение выражения m+2, равное трём. Полученное значение снова присваивается параметру f и снова исполняется алгоритм функции, который на этот раз возвращает значение 6 (факториал числа 3).
Оператор в блоке 4 на рисунке 24 получает это значение, заканчивает вычисление выражения 6*3 и записывает полученное значение 18 в переменную b (строка 21).
Третий и четвёртый вызовы функции Fkt (строки 22-31):
Первой из выражения Fkt(Fkt(k)+1)оператора в блоке 5 (рис. 25) вызывается вложенная функция Fkt(k). Фактический параметр, передаваемый в функцию – k (k = 2). Переменная f получает значение 2 (строка 22).
После окончания работы Функция возвращает 2 (факториал числа 2). Оператор в блоке 5 на рисунке 25 получает это значение, заканчивает вычисление выражения 2 + 1 и снова вызывает функцию Fkt (строка 26). На этот раз осуществляется внешний вызов Fkt(Fkt(k)+1). Результат работы внутреннего вызова равен 2, выражение Fkt(k)+1 даёт значение 3, которое и передаётся в функцию Fkt при её четвёртом вызове из программы (строка 27).
После окончания работы Функция возвращает 6 (факториал числа 3). Оператор в блоке 5 на рисунке 24 получает вычисленное значение факториала, записывает его в переменную с и заканчивает свою работу.
Первый вызов процедуры Swap (строка 33):
Блок 7 (рис. 25) основной программы вызывает процедуру Swap для обмена значениями между переменными a и b. Эти переменные передаются в процедуру в качестве фактических параметров. Внутри процедуры переменные a и b становятся переменными s1 и s2. Любые изменения в значении s1 и s2 отражаются на переменных a и b соответственно (строки 35, 36).
Второй вызов процедуры Swap (строка 39):
Второй раз процедура Swap вызывается из блока 11 (рис. 25). В этот раз передаются в процедуру в качестве фактических параметров переменные b и с. Внутри процедуры переменная b становиться переменной s1, а переменная c – переменной s2. После окончания работы процедуры значения в переменных b и c поменяются местами.
Таблица 13 – Трассировка алгоритма упорядочивания значений трёх элементов по убыванию
№ п/п | № блока | n | m | k | a | b | c | Подпрограммы | |||
- | - | - | |||||||||
- | - | - | Fkt(n) -> f:=n | ||||||||
№ блока | f | P | i | ||||||||
- | - | - | - | ||||||||
- | - | - | |||||||||
- | - | - | |||||||||
- | - | - | |||||||||
- | - | - | |||||||||
- | - | - | |||||||||
- | - | - | |||||||||
- | - | P = 2 -> Fkt(n)= 2 | |||||||||
- | - | Fkt(m+2) -> f:=m+2 | |||||||||
№ блока | f | P | i | ||||||||
- | - | - | |||||||||
- | - | ||||||||||
- | - | ||||||||||
- | - | ||||||||||
- | - | ||||||||||
- | - |
Окончание таблицы 13
№ п/п | № блока | n | m | k | a | b | c | Подпрограммы | |||||
- | - | ||||||||||||
- | - | ||||||||||||
- | - | ||||||||||||
- | P = 6 -> Fkt(m+2)=6 | ||||||||||||
- | Fkt(k) -> f = k | ||||||||||||
№ блока | f | P | i | ||||||||||
- | - | ||||||||||||
- | ... | ||||||||||||
- | |||||||||||||
- | P = 2 -> Fkt(k)= 2 | ||||||||||||
- | Fkt(Fkt(k)+1) -> f:=3 | ||||||||||||
№ блока | f | P | i | ||||||||||
- | - | ||||||||||||
- | ... | ||||||||||||
- | |||||||||||||
P = 6 -> Fkt(Fkt(k)+1)=6 | |||||||||||||
Swap(a,b) -> s1 ≡ a s2 ≡ b | |||||||||||||
№ блока | s1(a) | s2(b) | tmp | ||||||||||
Swap(b,c) -> s1 ≡ b s2 ≡ c | |||||||||||||
№ блока | s1(b) | s2(c) | tmp | ||||||||||
Реализация алгоритма в программу выглядит следующим образом:
Дата публикования: 2014-11-26; Прочитано: 306 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!