Данному образовательному сайту пришлось несколько раз менять свое имя. С 2022 года доступ к нему обеспечивается по URL
emc.km.ru (2001-2007) ==> educomp.org.ru (2007-2011) ==> educomp.runnet.ru (2011-2021) ==> emc.orgfree.com (2022-...)
Более подробно об истории сайта можно прочитать здесь.
|
Программа "Календарь" (определение числа дней в месяце) рассматривает ячейку 01 как номер месяца и определяет количество дней в этом месяце. Приводится два варианта решения. Первый - более простой - хранит количество дней в месяце в виде массива (последовательности чисел 31, 28, 31, 30, ...), и программа просто извлекает его элемент с нужным номером. Второй - логический - более сложный, но зато более короткий. Если к программе применимо понятие красоты (а по-моему, это так), то второй вариант несомненно красивее! Вариант 1. В памяти, начиная с ячейки 03 хранится 12 чисел, соответствующих количеству дней в каждом месяце. Программа к исходному номеру месяца прибавляет число на единицу меньше, т.е. 2 (дело в том, что месяцы нумеруются с 1, поэтому без этой коррекции для января получалось бы 3 + 1 = 4, для февраля 3 + 2 = 5 и т.д., т.е со сдвигом как раз на 1!) Полученное число записывается "внутрь" программы в качестве команды. Поскольку нулевому коду операции соответствует извлечение содержимого ячейки на сумматор, то сформированная команда достанет нужный элемент массива. Например, для заданного в таблице случая n = 6 (июнь), получим 002 + 006 = 008, т.е. фактически команду 0 (первая цифра) извлечения из памяти содежимого ячейки 08 (две последние цифры). Проверьте и убедитесь, что в этой ячейке лежит информация именно для июня.
Вариант 2. Посмотрим внимательно на подготовленную ниже таблицу, в которой для каждого месяца выписан его двоичный номер и количество дней:
Если не обращать внимания на февраль, то можно заметить четкую связь между количеством дней в месяце и состоянием старшего (3-го) и младшего (0-го) битов его номера, а именно: в месяце 31 день, если эти биты различны и 30 - если одинаковы! (Проверьте, что это так.) Воспользуемся этим фактом при написании программы. Прежде всего отметим, что для сравнения битов существует специальная логическая операция, которая называется исключающее ИЛИ. К сожалению, у "Малютки" она отсутствует, поэтому придется ее заменить на сложение битов с игнорированием возникающего переноса (чтобы сделать это, достаточно в результате суммирования стирать все биты, кроме 0-го), т.е.:
Таким образом, остается вычислить по указанным правилам сумму 3-го и 0-го битов и к результату просто прибавить 30! Разумеется для февраля придется количество дней рассчитывать отдельно. Если бы не это "досадное исключение", программа была бы еще короче!
Я надеюсь, что при реализации второго варианта Вы, как и я, получили определенное интеллектуальное удовлетворение от подтверждения на практике довольно абстрактных рассуждений о битах! © Е.А.Еремин, 2001 |