Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Программа решения задачи о ханойской башне.docx
Скачиваний:
1
Добавлен:
13.07.2019
Размер:
114.53 Кб
Скачать

Псевдослучайные числа. Функция, возвращающая значение и меняющая параметр

Программа на языке Паскаль: 

Рассмотрим такую программу:

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.