Решение 50 типовых задач по программированию на языке Pascal Дата размещения сборника в сети
n . Проверим корректность обработки граничных значений (в частности, когда n = 0, 1, 2
Download 1.52 Mb. Pdf ko'rish
|
Задачи на 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: |
Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©fayllar.org 2024
ma'muriyatiga murojaat qiling
ma'muriyatiga murojaat qiling