Переменные, выражения, присваивания
1.1. Задачи без массивов
1.1.1. Даны две целые переменные a, b. Составить фрагмент программы, после исполнения которого значения переменных поменялись бы местами (новое значение a равно старому значению b и наоборот).
Решение. Введем дополнительную целую переменную t.
t := a; a := b; b := t;
Попытка обойтись без дополнительной переменной, написав
a := b; b := a;
не приводит к цели (безвозвратно утрачивается начальное значение переменной a ).
1.1.2. Решить предыдущую задачу, не используя дополнительных переменных (и предполагая, что значениями целых переменных могут быть произвольные целые числа).
Решение.Начальные значения a и b обозначим a0, b0.
a := a + b; {a = a0 + b0, b = b0} b := a - b; {a = a0 + b0, b = a0} a := a - b; {a = b0, b = a0}
1.1.3.
Дано целое число а и натуральное (целое
неотрицательное) число n. Вычислить .
Другими словами, необходимо составить программу, при
исполнении которой значения переменных а и n не
меняются, а значение некоторой другой переменной
(например, b ) становится равным
.
(При этом разрешается использовать и другие переменные.)
Решение. Введем целую переменную k, которая меняется
от 0 до n, причем поддерживается такое свойство: ).
k := 0; b := 1; {b = a в степени k} while k <> n do begin | k := k + 1; | b := b * a; end;
Другое решение той же задачи:
k := n; b := 1; {a в степени n = b * (a в степени k)} while k <> 0 do begin | k := k - 1; | b := b * a; end;
1.1.4.Решить предыдущую задачу, если требуется, чтобы число
действий (выполняемых операторов присваивания) было порядка (то есть не превосходило бы
для некоторой константы
;
- это степень,
в которую нужно возвести
, чтобы получить
).
Решение. Внесем некоторые изменения во второе из предложенных решений предыдущей задачи:
k := n; b := 1; c:=a; {a в степени n = b * (c в степени k)} while k <> 0 do begin | if k mod 2 = 0 then begin | | k:= k div 2; | | c:= c*c; | end else begin | | k := k - 1; | | b := b * c; | end; end;
Каждый второй раз (не реже) будет выполняться первый вариант оператора выбора (если k нечетно, то после вычитания единицы становится четным), так что за два цикла величина k уменьшается по крайней мере вдвое.
1.1.5.Даны натуральные числа а, b. Вычислить произведение , используя в программе лишь
операции +, -, =, <>.
Решение.
k := 0; c := 0; {инвариант: c = a * k} while k <> b do begin | k := k + 1; | c := c + a; end; {c = a * k и k = b, следовательно, c = a * b}
1.1.6.
Даны натуральные числа а и b. Вычислить их сумму . Использовать операторы присваивания лишь
вида

Решение.
... {инвариант: c = a + k} ...