|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
if a < b then. while n < > 0 do begin. write ( 2*(n mod 10)+1);a: = 40; b: = 10; b: = - a / 2 * b; if a < b then c: = b - a else c: = a - 2 * b; Решение: 1) для решения нужно использовать «ручную прокрутку» программы 2) выполним начальные присваивания:
3) самый сложный оператор, содержащий «подводный камень»: b: = - a / 2 * b; не забываем, что умножение и деление имеют равный приоритет, и в такой цепочке сначала выполнится деление, а потом умножение 4) результат: b: = - (40 / 2) * 10 = - 20 * 10 = - 200
5) очевидно, что теперь условие « a < b » ложно, поэтому выполняется оператор, стоящий после слова else: c: = a-2*b = 40 – 2*(-200) = 440. 6) Ответ: 440.
Еще пример задания: В результате выполнения фрагмента программы while n < > 0 do begin write ( 2*(n mod 10)+1); n: = n div 10; end; на экран выведено число 13717. Укажите все числа, которые могли находиться в переменной n до выполнения этого цикла. Решение (вариант 1, аналитический): 1) прежде всего, заметим, что для вывода используется оператор write, который не переходит на следующую строку; поэтому числа в цикле будут выводиться в одной строке «вплотную» друг к другу, без промежутков 2) вспомним, что n mod 10 – остаток от деления числа на 10 – это последняя цифра числа в десятичной системе счисления; 3) операция n div 10 (деление нацело на 10) равносильна отбрасыванию последней цифры в десятичной системе счисления 4) эти две операции выполняются пока значение переменной n не станет равно нулю 5) анализируя алгоритм, можно придти выводу, что этот фрагмент программы выводит на экран числа , где – это -ая цифра с конца числа 6) подумаем, в каком интервале находится значение , если – это цифра от 0 до 9: получаем интервал от до 7) поэтому разбить цепочку 13717 на части можно следующими способами: 1 – 3 – 7 – 17 1 – 3 – 7 – 1 – 7 13 – 7 – 17 13 – 7 – 1 – 7 8) в любом варианте разбиения каждое число получено по формуле , поэтому можно сразу определить цифры соответствующих чисел по формуле : 1 – 3 – 7 – 17 0 – 1 – 3 – 8 1 – 3 – 7 – 1 – 7 0 – 1 – 3 – 0 – 3 13 – 7 – 17 6 – 3 – 8 13 – 7 – 1 – 7 6 – 3 – 0 – 3 9) вспоминаем, что цифры числа в цикле обрабатываются, начиная с последней, поэтому в ответе нужно перечислить числа 836, 3036, 8310 и 30310. 10) таким образом, правильный ответ – 836, 3036, 8310, 30310.
Решение (вариант 2, перебор, М. Н. Мамчур, УГАТУ): 1) для вывода используется оператор write, который не переходит на следующую строку; поэтому числа в цикле будут выводиться в одной строке «вплотную» друг к другу, без промежутков 2) вспомним, что n mod 10 – остаток от деления числа на 10 – это последняя цифра числа в десятичной системе счисления; 3) операция n div 10 (деление нацело на 10) равносильна отбрасыванию последней цифры в десятичной системе счисления 4) эти две операции выполняются пока значение переменной n не станет равно нулю 5) составим таблицу, в которой представим все возможные для вывода числа (последний столбец):
6) на основе таблицы, разобьем нашу цепочку 13717 на все возможные комбинации: 1 – 3 – 7 – 1 – 7 1 – 3 – 7 – 17 13 – 7 – 17 13 – 7 – 1 – 7 7) из этой же таблицы видим, что каждому числу в этой цепочке соответствует исходная цифра (первый столбец); таким образом, преобразуем полученные комбинации в наборы исходных цифр: 0 – 1 – 3 – 0 – 3 0 – 1 – 3 – 8 6 – 3 – 8 6 – 3 – 0 – 3 8) 5) во фрагменте программы цифры числа обрабатываются в обратном порядке, начиная с последней, поэтому в ответе нужно перечислить числа, записанные в обратном порядке, т. е. 30310, 8310, 836, 3036. 9) таким образом, правильный ответ – 30310, 8310, 836, 3036. Задачи для тренировки [2]: 1) Определите значение целочисленных переменных a и b после выполнения фрагмента программы:
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|