© А. Козлов, 2006-2015 8-1 Анализ программ с независимыми переменными. Тренажеры для самостоятельных тренировок по данной теме: http://somit.ru/8_2015.html Тема: Анализ программы. Что нужно знать: основные конструкции языка программирования: o объявление переменных o оператор присваивания o оператор вывода o циклы Что нужно уметь: выполнять ручную прокрутку программы выделять переменную цикла - W, изменение которой влияет на количество шагов цикла определять количество шагов цикла: N = (W - w0)/ dw определять переменную, которая выводится с помощью команды вывода на экран write() Пример: Определите, что будет напечатано в результате работы следующего фрагмента программы: n := 24; s := 0; while n <= 28 do begin s := s + 20; n := n + 2 end; write(s) В задачах с независимыми переменными, при решении можно пользоваться двумя способами: 1. прокрутка программы 2. математический Решение задачи прокруткой n<=28 + + + s 20 40 60 n 26 28 Таким образом, видим, что s = 60. Математический способ Для визуального различия переменные формулы выделим различными цветами. N = (W - w0)/ dw , где W – максимально возможное значение переменной цикла w0 – ее начальное значение dw – ее приращение (изменение) http://somit.ru © А. Козлов, 2006-2015 Исходя из выше сказанного, выделим рассмотренные нами переменные в указанной программе соответствующим цветом begin n := 24; s := 0; while n <= 28 do begin s := s + 20; n := n + 2 end; write(s) end. 1) N = (28 – 24)/2 = 2 Надо понимать, что после двух шагов цикла, значение переменной n станет равно 28, но 28 = 28, т.е. условие цикла выполнилось, следовательно, входим в цикл еще раз. Отсюда следует правило: Правило 1 Если полученное значение N - целое число, а в условии кроме знака «<» есть знак «=», то к найденному значению необходимо добавить единицу Если полученное значение N - дробное, а в условии кроме знака «<» есть знак «=», то найденное значение округляем до наибольшего целого. Согласно правилу 1 получаем, что N = (28 – 24)/2 = 2 + 1 = 3 По условию на печать необходимо вывести s. Строка s := s + 20; говорит о том, что при каждом шаге цикла, значение s увеличивается на 20, следовательно за три прокрутки 20 х 3 = 60, благо начальное значение s = 0, в противном случаем нужно будет еще добавить и его. Итого: S = 60 Разберем еще один пример Определите, что будет напечатано в результате работы следующего фрагмента программы: begin n := 27; s := 0; while n <= 280 do begin s := s + 5; n := n + 3 end; write(s) end. 1. N = (280-27)/3 = 84,3 Правило 2 если полученное значение N - дробное число, то в независимости от того есть ли в условии знак «=» или его нет, найденное значение округляем до наибольшего целого, __________________________________________________________________________________________ http://somit.ru © А. Козлов, 2006-2015 1. Согласно правилу два N = (280-27)/3 = 84,3 = 85 2. s = 85 х 5 = 425 Разберем еще один пример Определите, что будет напечатано в результате работы следующего фрагмента программы: begin n := 24; s := 0; while n <= 2800 do begin s := s + 20; n := n + 2 end; write(s+n) end. 1) 2) 3) 4) N = (2800-24)/2 = 1388 = 1388 + 1 = 1389 s = 1389 х 20 = 27780 n = 1389 х 2 + 24 = 2802 и окончательно, s + n = 27780 + 2802 = 30582 Задачи для самостоятельного решения Задача 1 Определите, что будет напечатано в результате работы следующего фрагмента программы: begin n := 24; s := 0; while n < 28 do begin s := s + 20; n := n + 2 end; write(s) write(n) end. Задача 2 Определите, что будет напечатано в результате работы следующего фрагмента программы: var n, s: integer; begin n := 23; s := 0; while n <= 28 do begin s := s + 5; __________________________________________________________________________________________ http://somit.ru © А. Козлов, 2006-2015 n := n + 2 end; write(s) write(n) end. Задача 3 Определите, что будет напечатано в результате работы следующего фрагмента программы: var n, s: integer; begin n := 12; s := 512; while s >= 0 do begin s := s - 20; n := n + 5 end; write(n) end. Задача 4 Определите, что будет напечатано в результате работы следующего фрагмента программы: var n, s: integer; begin n := 120; s := 1120; while s >= 0 do begin s := s - 20; n := n + 3 end; write(n) end. __________________________________________________________________________________________ http://somit.ru © А. Козлов, 2006-2015 Ответы к задачам с кратким решением Решение 1 N = (28-24)/2 = 2 S = 20*2 = 40 n = 2*2+24 = 28 Решение 2 N = (28-23)/2 = 2,5 = (округляем в большую сторону) = 3! S = 5*3 = 15 n = 3*2+23 = 29 Решение 3 N = 512/20 = 25,6 = 26 n = 26 * 5 + 12 = 142 Решение 4 N = 1120/20 = 56 (если ответ круглый, а в условии N = 56+1 = 57 n = 57 * 3 + 120 = 291 >= то N = N+1) __________________________________________________________________________________________ http://somit.ru