|
Фокус "Отгадывание мыслей"В № 123 нашей газеты (“Информатика” № 5/2009) было предложено ознакомиться с фокусом, в котором происходит… отгадывание мыслей :), и, конечно, многие читатели сделали это3. В этом фокусе вам нужно загадать двузначное число, вычесть из него сумму его цифр и полученную разность найти в табличке, после чего следует запомнить символ рядом с этой разностью. Затем нужно щелкнуть на прямоугольной кнопочке и… — впрочем, вы все видели (или увидите) сами. А не хотите разработать собственную программу, демонстрирующую этот фокус? Если да, то эта статья — для вас. “В открытую” секрет фокуса мы раскрывать не будем4, а приведем программу на школьном языке программирования (“КуМир”), которая демонстрирует такой фокус. В ней использован двумерный массив строкового типа из 9 строк и 20 столбцов с именем т. В каждом нечетном столбце запишем числа от 5 до 94 (в порядке их возрастания, расположив эти числа по строкам), а в каждом нечетном — символы (выбрав их случайным образом по кодам символов). Другие особенности программы описаны в комментариях. алг Отгадыватель_мыслей нач лит таб т[1:9, 1:20], цел i, j, кодсим, сим свой, лог успех 5· Очистка_Экрана · |Выводим на экран информацию о порядке действий · вывод нс, "Задумайте двузначное число." · вывод нс, "Вычтите из него сумму его цифр. Разность запомните." · вывод нс, "Если вы готовы - нажмите любую клавишу и найдите эту разность " · вывод "в появившейся таблице и запомните символ справа от нее." · |Приостановка программы до нажатия любой клавиши · нц · · · кц_при клав <> 0 · |Заполняем массив т · |Записываем в него числа, · нц для i от 1 до 9 · · нц для j от 1 до 10 · · · т[i, 2 * j - 1]:= цел_в_лит(10 * (i - 1) + (j - 1) + 5) · · кц · кц · |а затем символы · нц для i от 1 до 9 · · нц для j от 1 до 10 · · · |Рассчитываем код символа · · · кодсим := 150 + rnd(105) · · · |Записываем соответствующий символ · · · т[i, 2 * j] := символ(кодсим) · · кц · кц · |Определяем (случайным образом) "свой" символ и записываем его в массив на "соответствующие" места · кодсим := 150 + rnd(105) · свой := символ(кодсим) · нц для i от 1 до 9 · · нц для j от 1 до 10 · · · если mod(лит_в_цел(т[i, 2 * j - 1], успех), 9) = 0 · · · · то · · · · · т[i, 2 * j] := свой · · · все · · кц · кц · |Выводим весь массив т · Очистка_Экрана · нц для i от 1 до 9 · · вывод нс · · нц для j от 1 до 20 · · · вывод т[i, j], " " · · кц · кц · вывод нс, "Если вы нашли 'свой' символ," · вывод нс, "нажмите любую клавишу" · |Приостановка программы до нажатия любой клавиши · нц · · · кц_при клав <> 0 · Очистка_Экрана · вывод нс, "Вы нашли символ ", свой, " - Невероятно!" кон Примечания 1. Очистка_Экрана — процедура очистки экрана. 2. Функция цел_в_лит возвращает строковое представление числа — ее аргумента, функция символ — символ, код которого равен числу, указанному в качестве ее аргумента, функция лит_в_цел — числовое представление строки цифр — ее первого аргумента. Аналоги этих функций в языках программирования Паскаль и Бейсик приведены в таблице. Напомним также, что в языке Бейсик нумерация строк и столбцов двумерного массива начинается с нуля. Задание для самостоятельной работы 1. Разработайте программу (на языке программирования, который вы изучаете), иллюстрирующую описанный фокус. 2. Опишите “секрет” фокуса (почему происходит “отгадывание” запомненного играющим символа?). 3 См. сайт http://chess-school2008.narod.ru, раздел “Разное”, второй пункт.4 Желающие могут раскрыть его, проанализировав приведенную далее программу.5 Величина успех определяет, успешно ли проведено преобразование строки цифр в число (см. далее о функции лит_в_цел >). |