- •Программа решения задачи о ханойской башне
- •Алгоритм решения задачи:
- •Псевдослучайные числа. Функция, возвращающая значение и меняющая параметр
- •Процедура вычисления корней квадратного уравнения
- •Нахождение нод (наибольшего общего делителя) с помощью рекурсивной функции
- •Функции вычисления площади геометрических фигур
- •"Заем". Арифметические выражения, возведение в степеньАлгоритм решения задачи:
Псевдослучайные числа. Функция, возвращающая значение и меняющая параметр
Программа на языке Паскаль:
Рассмотрим такую программу:
var s, i: integer;
function next(var seed: integer): integer;
const
multiplier = 37;
increment = 3;
cycle = 64;
begin
next := seed;
seed := (multiplier * seed + increment) mod cycle
end;
begin
s := 16;
writeln(next(s));
writeln(next(s));
writeln(next(s));
writeln(next(s));
s := 16;
for i := 1 to 64 do
write(next(s):3);
readln
end.
Примечания:
Использование var в заголовке – необычный прием для функции.
Будучи вызвана с параметром s, содержащим число 16, эта функция возвращает число 16. Вместе с тем, возвращая 16, функция изменяет значение, хранящееся в переменной seed (или s), на 19. Если функцию вызвать снова, с полученным значением s, то она возвратит число 19 и изменит значение s на 2. Продолжая вызывать функцию next, получим определенную последовательность целых чисел, начинающуюся с исходного значения s (цикл for).
Замечательным свойством этой последовательности является то, что каждое значение от 0 до 63 встречается в ней один раз. Более того, шестьдесят пятый вызов функции next дает число 16 и начинается новый цикл. Другими словами, начиная с любого желаемого целого, функция генерирует фиксированную перестановку чисел от 0 до 63.
Такой прием используется преимущественно для генерации "случайных" чисел (правильнее их называть псевдослучайными – чтобы подчеркнуть их предсказуемость). Цикл из 64 чисел, конечно, слишком мал; Грогоно предлагает константы для генерации перестановки чисел от 0 до 65 535:
const multiplier = 25173; increment = 13849; cycle = 65536;
Подбор констант с нужными свойствами – нетривиальная задача.
Приведенная выше функция возвращает значение и изменяет значение параметра. Такой способ действий применяется нечасто. В большинстве функций нет необходимости изменять параметры, и, следовательно, нет смысла использовать слово var в заголовке.
Процедура вычисления корней квадратного уравнения
Алгоритм решения задачи:
Представленная ниже программа с процедурой вычисления корней квадратного уравнения не возвращает в основную программу ничего (просто выводит результат на экран). Однако можно написать такую процедуру, которая будет использовать глобальные переменные x1 и x2. В результате в основной ветке программы можно будет использовать полученные корни квадратного уравнения.
Программа на языке Паскаль:
var
a, b, c: real;
procedure sq (a,b,c: real);
var d, x1, x2: real;
begin
d := b * b - 4 * a * c;
if d >= 0 then begin
x1 := (-b + sqrt (d)) / (2 * a);
x2 := (-b - sqrt (d)) / (2 * a);
if x1 = x2 then
writeln ('x1 = ', x1:6:2)
else
writeln ('x1 = ', x1:6:2, '; x2 = ', x2:6:2)
end
else
writeln ('Корней нет!')
end;
begin
write ('a = '); readln (a);
write ('b = '); readln (b);
write ('c = '); readln (c);
writeln (a:6:2,'x*x + ',b:6:2,'x + ',c:6:2,' = 0');
sq (a, b, c);
readln
end.