Решение 50 типовых задач по программированию на языке Pascal Дата размещения сборника в сети


n .  Проверим  корректность обработки граничных значений (в частности, когда n = 0, 1, 2


Download 1.52 Mb.
Pdf ko'rish
bet68/77
Sana03.02.2023
Hajmi1.52 Mb.
#1152062
TuriРешение
1   ...   64   65   66   67   68   69   70   71   ...   77
Bog'liq
Задачи на Pascal

n

Проверим 
корректность обработки граничных значений (в частности, когда n = 0, 1, 2): 
1) 
При n = 0 границы цикла будут в отрезке [1, 0 – 1]. При этом значение правой границы 
зависит от типа переменной i, так как компилятор, дабы избежать ошибок, при вычислении 
«расширяет» тип выражений, означающих границы цикла. 
Если i будет объявлено типа byte, то выражение 0 – 1 даст в результате 255 (так как все 
числовые типы в языке Pascal большинство компиляторов считает кольцевыми), что вызо-
вет длинную цепочку вычислений, а это неверно. Конечно, можно объявить i типа integer


Данил Душистов: «Решение 50 типовых задач по программированию на языке Pascal» 
61 
и тогда границы цикла будут в отрезке [1, –1] и вход не будет осуществлен, но мы поступим 
иначе, стараясь сохранить память для переменных. 
Так как при вычислении важно лишь количество повторений, мы можем сдвинуть отрезок 
[1, n – 1] 
на одну позицию правее на числовой прямой, и тогда цикл будет проходить от 2 
до n, что поможет отсеять вход в цикл при вводе 0 в качестве n, так как невозможен цикл 
по всем i от 2 до 0. 
Однако тогда мы столкнемся с другой проблемой: при вводе 0 будет выведено значение 
fib1
которой было присвоено число 1 при инициализации. Справиться с проблемой можно, 
присвоив fib1 значение 0, если n = 0
if n = 0 then fib1 := 0; 
2) 
При n = 1 (с учетом принятых в предыдущем пункте изменений) входа в цикл не будет, и 
на экран выведется неизменное значение fib1, равное 1; 
3) 
При n = 2 произойдет вход в цикл, где i будет изменяться от 2 до 2 (то есть, в этом случае 
будет выполнен единственный шаг), в котором будет вычислено значение fib = fib1 + fib0 
= 1 + 0 = 1, 
которое будет скопировано в fib1 и выведено на экран. Нетрудно понять, что 
дальнейшая подстановка значений не требуется, так как корректность циклической кон-
струкции мы уже доказали. 
Верхние значения мы не проверяем, так как не существует наибольшего номера в последова-
тельности чисел Фибоначчи (хотя понятно, что корректность вычислений ограничена «вместимо-
стью» типа integer, и при его превышении в вычислениях числа уже будут неправильными). 
Код: 
1.
program FibonacciNumbers; 
2.
3.
var 
4.
fib0, fib1, fib: integer; 
5.
i, n: byte; 
6.
7.
begin 
8.
readln(n); 
9.
fib0 := 0; 
10.
fib1 := 1; 
11.
for i := 2 to n do begin 
12.
fib := fib1 + fib0; 
13.
fib0 := fib1; 
14.
fib1 := fib 
15.
end; 
16.
if n = 0 then fib1 := 0; 
17.
writeln(fib1) 
18.
end. 

Download 1.52 Mb.

Do'stlaringiz bilan baham:
1   ...   64   65   66   67   68   69   70   71   ...   77




Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©fayllar.org 2024
ma'muriyatiga murojaat qiling