Главная страница «Первого сентября»Главная страница журнала «Информатика»Содержание №22/2009


В мир информатики
Games.exe

Фокус "Отгадывание мыслей"

В № 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 Величина успех определяет, успешно ли проведено преобразование строки цифр в число (см. далее о функции лит_в_цел >).

TopList