11.07.2015 Views

Выпуск 1 - Российский государственный профессионально ...

Выпуск 1 - Российский государственный профессионально ...

Выпуск 1 - Российский государственный профессионально ...

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

На обложкев номереянварь 2012 / ИНФорматикаНа дискеАлгоритм Евклида длянахождения НОД — одиниз древнейших алгоритмов,дошедший до насв “документированном”виде. Алгоритм не былоткрыт Евклидом, упоминаниео нем имеется ещеу Аристотеля. В “Началах”алгоритм изложен (причемдважды) в геометрическойформе — для нахождения“общей меры”двух отрезков.Имеется удивительнаясвязь между алгоритмомЕвклида и числами Фибоначчи.Эта связь былаустановлена в XIX векефранцузским математикомГабриелем Ламе, которыйустановил, что наихудшимив смысле количествашагов алгоритмаисходными данными являютсяпоследовательныечисла Фибоначчи.3422384648Пара словПеред употреблениемознакомиться, илиС боем московских курантовПРОФИЛЬЭлементы теории алгоритмовБазовый курсИнформатика во взрослых играхи жизненных задачахСеминарDart, или Куда целится GoogleИнформацияПедагогический университет“Первое сентября”Московский педагогическиймарафон учебных предметовЗанимательныематериалы для пытливыхучеников и их талантливыхучителей“В мир информатики” № 172Электронные материалы:Интерпретаторы машин Постаи ТьюрингаЗадачи для машины Тьюрингаиз номеров “Информатики”прошлых летУчебные базы данныхКоды примеров к статье о языке DartПрезентации к публикациямраздела “В мир информатики”Материалы для подготовкик ЕГЭ по информатике (автор —Д.М. Златопольский)ВНИМАНИЮ ПОДПИСЧИКОВ!В номер вложена карточка с индивидуальным кодом доступаи инструкцией по его активации.Индивидуальный код доступа дает возможность:— пользоваться электронной версией журнала;— получить именной сертификат по ИКТ-компетентности.информатикhttp://inf.1september.ru Учебно-методический журналдля учителей информатикиОснован в 1995 г.Выходит один раз в месяцРедакция:гл. редактор С.Л. ОстровскийредакторыЕ.В. Андреева,Д.М. Златопольский(редактор вкладки“В мир информатики”)Дизайн макета И.Е. Лукьяновверстка Н.И. Пронскаякорректор Е.Л. Володинасекретарь Н.П. МедведеваФото: фотобанк ShutterstockЖурнал распространяетсяпо подпискеЦена свободнаяТираж 6300 экз.Тел. редакции: (499) 249-48-96E-mail: inf@1september.ruhttp://inf.1september.ruПодписные индексы: по каталогу “Роспечати”: 32291 (бумажная версия), 19179 (электронная версия);“Почта России”: 79066 (бумажная версия), 12684 (электронная версия)Издательский дом“Первое сентября”Главный редактор:Артем Соловейчик(генеральный директор)Коммерческая деятельность:Константин Шмарковский(финансовый директор)Развитие, ITи координация проектов:Сергей Островский(исполнительный директор)Реклама, конференциии техническое обеспечениеИздательского дома:Павел КузнецовПроизводство:Станислав СавельевАдминистративнохозяйственноеобеспечение:Андрей УшковГлавный художник:Иван ЛукьяновПедагогический университет:Валерия Арсланьян (ректор)газетАИздательского домаПервое сентября – Е.БирюковаЖурналыиздательского домаАнглийский язык – А.ГромушкинаБиблиотека в школе – О.ГромоваБиология – Н.ИвановаГеография – О.КоротоваДошкольноеобразование – М.АромштамЗдоровье детей – Н.СёминаИнформатика – С.ОстровскийИскусство – М.СартанИстория – А.СавельевКлассное руководствои воспитание школьников –О.ЛеонтьеваЛитература – С.ВолковМатематика – Л.РословаНачальная школа – М.СоловейчикНемецкий язык – М.БузоеваРусский язык – Л.ГончарСпорт в школе – О.ЛеонтьеваУправление школой – Е.РачевскийФизика – Н.КозловаФранцузский язык – Г.ЧесновицкаяХимия – О.БлохинаШкольный психолог – И.ВачковУчредитель:ООО “Чистые пруды”ЗарегистрированоПИ № ФС77-44341от 22.03.2011в Министерстве РФпо делам печатиПодписано в печать:по графику 12.12.2011,фактически 12.12.2011Заказ №отпечатано в ОАО “Чеховскийполиграфический комбинат”ул. Полиграфистов, д. 1,Московская область,г. Чехов, 142300Адрес издателя:ул. Киевская, д. 24,Москва, 121165Тел./факс: (499) 249-31-38Отдел рекламы:(499) 249-98-70http://1september.ruИЗДАТЕЛЬСКАЯ ПОДПИСКА:Телефон: (499) 249-47-58E-mail: podpiska@1september.ruДокументооборотИздательского дома“Первое сентября” защищенантивирусной программойDr.Web


ПрофильО чем это?Предлагаем вашемувниманию исчерпывающееи систематическоеизложение одной из самыхглубоких и интересныхтем профильного курсаинформатики. Что изэтого и в каком объемерассказывать детям,каждый решит сам, но,уверены, все получатудовольствие от ясныхи четких ответов насложные вопросы.И это все?!Нет! На дискеимеются авторскиеинтерпретаторы машинТьюринга и Поста, атакже электронныематериалы публикаций“Информатики” прошлыхлет, включающие, вчастности, цикл задач длямашины Тьюринга.4январь 2012 / ИНФорматикаАвторы благодарятд. ф.-м. н. М.А. Ройтбергаза детальноеобсуждение этогоматериала и критическиезамечания,которые помогли существенноулучшитьего содержание.К.Ю. Поляков,Е.А. ЕреминЭлементытеорииалгоритмовУточнение понятияалгоритмаЗачем нужно определениеалгоритма?Как вы знаете, алгоритмом называютточный набор инструкций для исполнителя,который приводит к решению задачиза конечное время.Особый интерес проявляли к алгоритмамматематики. Один из древнейшихизвестных алгоритмов — алгоритмЕвклида для вычисления наибольшегообщего делителя (НОД) двухнатуральных чисел. Само слово “алгоритм”(от имени узбекского математикаIX века аль-Хорезми, которогосчитают основателем алгебры) ввел внауку в XVII веке немецкий математикГ.В. Лейбниц.Долгое время считалось, что для любойматематической задачи можно найтиметод (алгоритм) решения, простодля ряда задач такие алгоритмы еще ненайдены. Эту идею высказал еще аль-Хорезми, такой же точки зрения придерживалисьи другие математики вплотьдо начала XX века.Однако, несмотря на все усилия, решитьнекоторые задачи не удавалось втечение столетий. Например, безуспешнозакончились многочисленные попыткинайти алгоритм доказательстваправильности любой теоремы на основезаданной системы аксиом.В 1931 году австрийский математикК.Гедель доказал теорему о неполноте,смысл которой состоит в том, что влюбой достаточно сложной формальнойсистеме, основанной на аксиомах(например, в арифметике, где введенынатуральные числа и операции сложенияи умножения), есть утверждение,которое невозможно ни доказать, ниопровергнуть в рамках этой системы.Поэтому было высказано предположениео том, что некоторые задачи алгоритмическинеразрешимы, то есть дляних в принципе не существует алгоритмарешения, и поэтому искать егобессмысленно. Чтобы строго доказатьили опровергнуть эту гипотезу, нужнобыло ввести математическое понятиеалгоритма.“Определение”, которое мы привелив начале статьи, часто называют интуитивным,потому что оно содержит такие


“нематематические” понятия, как “точный набор”,“инструкция”, “исполнитель”, “решение задачи”.Эти термины невозможно записать строго, используяязык математики и логики, поэтому для математическогодоказательства такое определение неподходит.Исследования в этой области, которые началиактивно проводиться в 30-х годах XX века, привелик возникновению теории алгоритмов, которая занимается• доказательством алгоритмической неразрешимостизадач;• анализом сложности алгоритмов;• сравнительной оценкой качества алгоритмов.Значительный вклад в развитие теории алгоритмоввнесли математики А.Тьюринг (Великобритания),Э.Пост (США), А.Чёрч (Великобритания),С.Клини (США) и А.А. Марков (СССР).Что такое алгоритм?Первые известные алгоритмы — это правилавыполнения арифметических действий с числами.В них четко определены объекты (числа в десятичнойзаписи) и элементарные шаги (сложить,вычесть, перемножить два однозначных числа —вспомните таблицы сложения и умножения). Постепенносложность задач, которые решались спомощью алгоритмов, увеличивалась, и понятие“шаг алгоритма” оказалось нечетким, размытым.Например, можно ли считать элементарным шагомразложение числа на простые множители или сложениемногозначных чисел?Со временем понятие алгоритма расширилось— сейчас мы говорим об алгоритмах дляисполнителей, которые работают с текстами идругими объектами реального мира. Однако оказалось,что все эти объекты можно тем или инымспособом закодировать в виде цепочек символов,так что любой алгоритм сводится к преобразованиюодной символьной строки в другую. Такимспособом можно представить и классические вычислительныеалгоритмы — операции с цифрами.В алгоритме шахматной игры объекты — это фигурына доске, но их расположение легко закодироватьв символьной форме (вспомните записьшахматных партий).Поэтому можно рассматривать только алгоритмыобработки символьных строк, а полученные результатыбудут применимы к любым алгоритмам.Как вы знаете, текст, записанный с помощью любогоалфавита, всегда можно перевести в двоичныйкод, поэтому, вообще говоря, достаточно рассматриватьтолько алгоритмы, работающие с двоичнымипоследовательностями.Итак, про любой алгоритм можно сказать следующее:• алгоритм получает на вход дискретный объект(например, слово);• алгоритм обрабатывает входной объект по шагам(дискретно), строя на каждом шаге промежуточныедискретные объекты; этот процесс можетзакончиться или не закончиться;• если выполнение алгоритма заканчивается, егорезультат — это объект, построенный на последнемшаге;• если выполнение алгоритма не заканчивается(алгоритм зацикливается), то результат его работыпри данном входе не определен.Любой алгоритм рассчитан на определенного исполнителя:он должен использовать только понятныеэтому исполнителю команды. Задание для исполнителя— это текст на специальном (формальном) языке,который обычно называют программой. Поэтомуможно определить алгоритм так:Алгоритм — это программа для некоторого исполнителя.Напомним, что с точки зрения теории алгоритмовдостаточно рассматривать только алгоритмы,работающие с цепочками символов, которые называютсловами.входноесловомухаалгоритмслонвыходноесловоРис. 1Каждый алгоритм задает (вычисляет) функцию,которая преобразует входное слово в результат (выходноеслово). Такая функция может быть не определенадля некоторых входных слов, если алгоритмзацикливается.Функция, заданная алгоритмом, может быть нигдене определена. Например, алгоритмнц пока дакцвыходит в бесконечный цикл при любом входномслове.Алгоритмы называются эквивалентными, еслиони задают одну и ту же функцию. То есть при любомвходном слове оба алгоритма должны приводитьк одному и тому же результату или зацикливаться(оба алгоритма не дают никакого результата).Например, следующие алгоритмы для выбораминимального из значений переменных a и b эквивалентны:если a < b тоM:= aиначеM:= bвсеM:= bесли a < b тоM:= aвсе5январь 2012 / ИНФорматика


ПРОФИЛЬУниверсальные исполнителиКак мы уже видели, понятие алгоритма оказывается“привязанным” к его исполнителю и некоторомуязыку программирования. Это не позволяетопределить алгоритм как математический объект.Поэтому возникла идея попытаться построить универсальногоисполнителя.Универсальный исполнитель — это исполнитель,для которого можно построить алгоритм,эквивалентный любому алгоритму для любогодругого исполнителя.Такого исполнителя можно было бы использоватьдля доказательства разрешимости или неразрешимостизадач. Если удается построить алгоритм решениязадачи для универсального исполнителя, то задачаразрешима. Если доказано, что алгоритма не существует,то задача неразрешима. Системакоманд такого исполнителя должна бытькак можно проще — так его будет легчеиспользовать в доказательствах.В середине XX века было предложено(разными учеными, независимо друг отдруга) несколько исполнителей, претендующихна роль универсальных(они будут рассмотрены далее), причемв теории алгоритмов доказано, что всеони эквивалентны друг другу, то естьалгоритм, который можно запрограммироватьдля одного универсальногоисполнителя, можно запрограммироватьтакже и для остальных.Как же связан универсальный исполнитель спроблемой строгого определения алгоритма?А.Тьюринг (1912–1956)(computerhistory.org)Рис. 2• способ ввода данных (чтения входного слова);• способ вывода слова-результата.Все универсальные исполнители эквивалентныпо определению. Это значит, что для любого алгоритмадля одного универсального исполнителяможно построить эквивалентный алгоритм длядругого универсального исполнителя. Поэтому последнееприведенное определение алгоритма фактическине зависит от конкретного исполнителя.Машина ТьюрингаПервым предложил универсального исполнителяанглийский математик А.Тьюринг. Придуманноеим воображаемое устройство состоит из трехчастей:• бесконечной ленты, разделенной на ячейки;• каретки (читающей и записывающей головки);• программируемого автомата.Программируемый автомат управляеткареткой, посылая ей команды всоответствии с заложенной в него сменяемойпрограммой. Лента выполняетроль внешней памяти компьютера,автомат — роль процессора, а кареткаслужит для ввода и вывода данных.Такое устройство называют машинойТьюринга. Теоретически лента в машинеТьюринга бесконечна, однако в каждыймомент работы машины временииспользуется лишь конечная ее часть.Каретка в любой момент временинаходится над одной ячейкой, автоматможет читать и изменять содержимоеэтой ячейки, которая называется текущей (рабочей)ячейкой.6январь 2012 / ИНФорматикаЛюбой алгоритм может быть представлен какпрограмма для универсального исполнителя.Это основная идея теории алгоритмов. Строгодоказать это утверждение невозможно, потому чтоздесь используется интуитивное понятие “алгоритм”.Как мы увидим, каждый универсальный исполнительописывается с помощью математическихтерминов, поэтому на его основе можно дать строгоеопределение алгоритма:Алгоритм — это программа для универсальногоисполнителя.Универсальный исполнитель — это некотораямодель вычислений, которая задает способ описанияалгоритмов и их выполнения. Модель вычислениядолжна содержать• “процессор”, задающий систему команд и способих выполнения;• “память”, определяющую способ хранения данных;• язык программирования (способ записи программ);бесконечная лента1 0 1 1Рис. 3кареткатекущая ячейкаВ каждую ячейку ленты можно записать одинлюбой символ, принадлежащий выбранному алфавиту.Любой алфавит обязательно содержитпробел (пустой символ, соответствующий “чистым”участкам ленты), который мы будем обозначатьзнаком “”. Алфавит обычно обозначаетсябуквой A, а его элементы — строчными буквами a синдексами: A = {a 1, a 2, …, a N}. Например, алфавитмашины Тьюринга, работающей с двоичными числами,задается в виде A = {0, 1, }.Непрерывную цепочку символов на ленте называютсловом. На рис. 3 лента содержит слово “1011”,которое можно воспринимать как двоичное число.Автоматом называют устройство, работающее безучастия человека. Автомат в машине Тьюринга имеетнесколько состояний и при определенных условияхпереходит из одного состояния в другое. Состояние


автомата определяет ту промежуточную задачу, которуюрешает автомат в данный момент. Это напоминаетсостояния человека: ночью он спит (состояние 1),утром встает и умывается (состояние 2), завтракает(состояние 3), идет на работу (состояние 4) и т.д.Множество всех состояний автомата обозначаетсябуквой Q, а его элементы — строчными буквамиq с индексами: Q = {q 1, q 2, …, q M}. Принято, что вначальный момент машина Тьюринга находится всостоянии q 1.Особое состояние q 0— это состояние останова.Если машина переходит в это состояние, выполнениепрограммы сразу останавливается.Автомат управляется программой. Во время каждогошага программы автомат выполняет последовательнотри действия:1) изменяет символ в рабочей ячейке на другой(или оставляет без изменений);2) перемещает каретку влево или вправо (илиоставляет на месте);3) переходит в другое состояние (или остается впрежнем состоянии).Поэтому при составлении программы для каждойпары (символ, состояние) нужно определитьтри параметра: символ a iиз выбранного алфавитаA, направление перемещения каретки (“←” — влево,“→” — вправо, “точка” — нет перемещения) иновое состояние автомата q k. Например, команда1 “←” q 2обозначает “заменить символ на 1, переместитькаретку влево на одну ячейку и перейтив состояние q 2”.Пример 1. На ленте записано число в двоичнойсистеме счисления. Каретка находится где-то надчислом. Требуется увеличить число на единицу.Для решения задач такого типа нужно:• определить алфавит машины Тьюринга A;• выделить простейшие подзадачи и определитьнабор возможных состояний Q; задать начальноесостояние q 1и конечное состояние q 0(в котороммашина останавливается);• составить программу, то есть для каждой пары(a i, q k) определить команду, которую должен выполнитьавтомат.Как мы уже выяснили, алфавит машины Тьюринга,работающей с двоичными числами, включаетсимволы 0, 1 и пробел: A = {0, 1, }. Определимвозможные состояния (разобьем задачу на элементарныеподзадачи):1) q 1— автомат ищет правый конец слова (числа)на ленте;2) q 2— автомат увеличивает число на 1, проходяего слева направо, и останавливается, закончивработу.Теперь займемся программой. На первом этапе,когда автомат ищет конец слова, его работа можетбыть описана так:1) если в рабочей ячейке записана цифра 0, переместитьсявправо;2) если в рабочей ячейке записана цифра 1, переместитьсявправо;3) если в рабочей ячейке пробел, переместитькаретку влево и перейти в состояние q 2.Тогда действия автомата в состоянии q 1можнопредставить в виде таблицы, где в заголовках строкзаписываются символы алфавита, а в заголовкахстолбцов — состояния:q 10 0 → q 11 1 → q 1 ← q 2Рис. 4Заметим, что во всех случаях символ под кареткойне меняется. Кроме того, состояние меняетсятолько в последней ячейке. Поэтому для упрощениязаписи не будем указывать в таблице то, чтоостается без изменений. Так, на наш взгляд, болеекратко и понятно:q 10 →1 → ← q 2Рис. 5Второй этап — увеличение двоичного числа наединицу. Это можно сделать следующим способом(вспомните тему “Системы счисления”):1) если в рабочей ячейке записана цифра 0, записатьв нее 1 и стоп;2) если в рабочей ячейке записана цифра 1, выполнитьперенос в старший разряд — записать вячейку 0 и переместиться влево;3) если в рабочей ячейке пробел, записать в нее1 и стоп.Для того чтобы остановить работу машины Тьюринга,нужно перевести ее в состояние останова q 0.Теперь можно добавить в таблицу столбец, соответствующийсостоянию q 2:q 1q 20 → 1 . q 01 → 0 ← ← q 21 . q 0Рис. 6Построенная полная таблица — это и есть программадля машины Тьюринга. Обратите внимание,что мы разбили исходную задачу на подзадачи,для каждой из них составили программу, а потомих соединили. Две подзадачи связаны через ячейку(,q 1), в которой состояние автомата изменяетсяна q 2. В данном простейшем случае в каждом издвух алгоритмов было использовано только односостояние, но это не обязательно — можно такимже способом соединять и более сложные алгоритмы.Если алгоритмы А и Б можно запрограммиро-7январь 2012 / ИНФорматика


ПРОФИЛЬ8январь 2012 / ИНФорматикавать на машине Тьюринга, то и любую их комбинациютоже можно запрограммировать.Тьюринг предположил, чтоЛюбой алгоритм (в интуитивном смысле этогослова) может быть представлен как программадля машины Тьюринга.Это утверждение в теории алгоритмовизвестно как тезис Чёрча — Тьюринга.Машина Тьюринга может быть строгозадана с точки зрения математики.Алфавит A и набор возможных состоянийQ могут быть записаны в виде множеств,а программа — в виде пятероквида (a i, q k, a j, d ik, q m), задающих команду“если машина находится в состоянииq kи в рабочей ячейке записан символ a i,то записать в рабочую ячейку символ a j,сместиться в направлении d ikи перейтив состояние q m”. Например, приведеннаявыше программа увеличения двоичногочисла на 1, записанная в видетаких пятерок, выглядит так:(0, q 1, 0, →, q 1), (1, q 1, 1, →, q 1), (, q 1, , ←, q 2),(0, q 2, 1, ., q 0), (1, q 2, 0, ←, q 2), (, q 2, 1, ., q 0)Эта машина — математический объект, и данноена ее основе определение алгоритма можетиспользоваться для доказательств. Едва ли можноприменить машину Тьюринга для решения практическихзадач, но эта простая модель алгоритмаочень удобна для проведения теоретических исследований.В отличие от “интуитивного” определенияалгоритма новое определение не содержиттаких неопределенных понятий, как “инструкция”,“исполнитель”, “решение задачи”. Такимобразом, удается дать формальное определениеслова “алгоритм” (по Тьюрингу):Алгоритм — это программа для машины Тьюринга.Машина ПостаПрактически одновременно с Тьюрингом (в томже 1936 году) и независимо от него американскийматематик Э.Л. Пост предложил еще более простогоуниверсального исполнителя, который позднееполучил название “машина Поста”.Лента в машине Поста (так же, как и в машинеТьюринга) бесконечна и разбита на ячейки. Каждаяячейка может содержать метку (быть отмечена)или не содержать ее (пустая ячейка).Таким образом, Пост сократил алфавит всего додвух цифр. Это допустимо, потому что любые данныеможно перекодировать в двоичный код, сопоставивкаждой букве исходного алфавита уникальнуюпоследовательность нулей и единиц.Э.Л. Пост (1897–1954)(ru.wikipedia.org)Рис. 7бесконечная лента• • • •Рис. 8кареткаКроме того, алгоритм работы машины Постазадается не в виде таблицы, а как программадля универсального исполнителя.Система команд машины Поста содержиттолько 6 команд:“←” — переместить каретку на однуячейку влево;“→” — переместить каретку на однуячейку вправо;“0” — стереть метку в рабочей ячейке(записать 0);“1” — поставить метку в рабочей ячейке(записать 1);“? n 0,n 1” — если в рабочей ячейкенет метки, перейти к строке n 0, иначеперейти к строке n 1;“стоп” — остановить машину.Попытка стереть метку там, где ее нет,или поставить метку повторно считается ошибкой,и машина аварийно останавливается.Все строки в программе нумеруются по порядку,это необходимо для работы команды ветвления(? n 0,n 1). С помощью этой команды можно такжестроить циклы, как с предусловием, так и с постусловием.Например, следующая программа перемещаеткаретку влево до первой отмеченной ячейки:1. ←2. ? 1,33. стопПосле команд “←”, “→”, “0” и “1” можно указатьномер строки, на которую нужно перейти сразу послевыполнения этой команды. Например, команда← 3означает “переместить каретку влево и перейти настроку 3”.При работе с машиной Поста числа обычно записываютв унарной (единичной) системе счисления,в виде непрерывной цепочки меток нужной длины(вспомните счетные палочки в младшей школе).Например, на ленте, показанной на рис. 8, записаночисло 4.Пост предположил, что любой алгоритм можетбыть записан как программа для машины Поста.В теории алгоритмов доказано, что машины Постаи Тьюринга одинаковы по своим возможностям.Это значит, что круг задач, который они решают,тоже одинаков.Нормальные алгорифмы Марковатекущая ячейкаСоветский математик А.А. Марков, который всередине XX века изучал разрешимость некоторых


задач алгебры, предложил новую модельвычислений, которую он назвалнормальными алгорифмами.Нормальные алгорифмы Маркова(НАМ) — это строгая математическаяформа записи алгоритмов обработкисимвольных строк, которую можно использоватьдля доказательства разрешимостиили неразрешимости различныхзадач. Марков предположил, что любойалгоритм можно записать как НАМ.В отличие от машин Тьюринга и ПостаНАМ — это “чистый” алгоритм, которыйне связан ни с каким “аппаратным обеспечением”(лентой, кареткой и т.п.).НАМ преобразует одно слово (цепочкусимволов некоторого алфавита) в другое и задаетсяалфавитом и системой подстановок. Заметьте,что в жизни мы нередко применяем такие замены.Например, при умножении в столбик мы не вычисляемкаждый раз произведение 7 × 8, а просто помним,что оно равно 56.Пусть алфавит НАМ — это русские буквы, и заданасистема подстановока → нух → лом → сПрименим эту систему подстановок к начальномуслову “муха”. Подстановки нужно просматриватьпо порядку, начиная с первой. Первая подстановкаозначает “если в слове есть буквы а, заменить первуюбукву а на букву н”. В слове муха есть буква “а”,поэтому заменяем ее на “н”. Получается “мухн”.Начинаем просмотр подстановок сначала. Букв“а” больше нет, поэтому переходим ко второй подстановке.Сочетание “ух” есть в слове “мухн”, поэтомувторая подстановка срабатывает, и мы заменяем“ух” на “ло”: получается “млон”.Теперь ни первая, ни вторая подстановки не применимы,а использование третьей дает в результатеслово “слон”. Больше ни одну подстановку сделатьнельзя, и НАМ заканчивает работу. Таким образом,приведенная система подстановок преобразуетслово “муха” в слово “слон”.При поиске образца рабочая цепочка символовпросматривается сначала. Если в строке словообразецвстречается несколько раз, то за один шагзаменяется только первое из них. Так как на следующемшаге просмотр опять начинается с началацепочки, после первой выполненной замены может“сработать” совсем другая подстановка.В записи подстановок слово-образец может бытьпустым, в этом случае слово-замена приписываетсяв начало рабочей строки:→ 0Такая подстановка всегда должна быть последнейв списке, иначе программа зациклится: в началослова будут постоянно дописываться все новыеи новые нули.А.А. Марков (1903–1979)(www.ras.ru)Рис. 9Если после слова-замены стоит точка,после выполнения такой подстановкиработа программы заканчивается.Например, если применить НАМа → о.к слову “карова”, то в результате получим“корова”, потому что после первогоже действия работа программы закончится,и последняя буква не будетзаменена.Пример 2. Построим НАМ для следующейзадачи: удалить из строки, состоящейиз букв a и b, первый символ. Например,строка abba должна быть преобразованав bba. Казалось бы, здесь нужноиспользовать систему подстановокa → .b → .Однако такой НАМ будет неправильно работатьдля слов, начинающихся с буквы b, например, дляслова bba, в котором будет удалена последняя буква,потому что первая подстановка выполнится раньше,чем вторая. Перестановка двух строк также не даетрешения — теперь алгоритм неправильно работаетдля слов, начинающихся с буквы a. Чтобы решить этузадачу, в алфавит НАМ добавляют еще один специальныйсимвол, например, символ “*”. Этим символомпомечают начало слова, используя подстановку→ *Полный алгоритм выглядит так:*a → .*b → .→ *Сначала срабатывает третья подстановка (ставим* в начало строки), затем, в зависимости отпервой буквы исходного слова, работает перваяили вторая подстановка, и алгоритм заканчиваетработу.Дополнительный символ похож на маркер в текстовомредакторе — он отмечает место в тексте, с которымпотом будут выполняться какие-то действия.Как показано в теории алгоритмов, любой алгоритмдля машин Тьюринга и Поста можно записатькак НАМ, и наоборот. Поэтому все три рассмотренныхподхода к строгому определению понятия “алгоритм”эквивалентны (равносильны).Контрольные вопросы1. Зачем понадобилось уточнять понятие “алгоритм”?2. Какие задачи рассматриваются в теории алгоритмов?3. Почему можно ограничиться алгоритмами обработкисимвольных строк? Можно ли рассматриватьтолько алгоритмы для преобразования двоичныхкодов?4. Как вы понимаете утверждение “алгоритм задаетнекоторую функцию”?9январь 2012 / ИНФорматика


ПРОФИЛЬ10январь 2012 / ИНФорматика5. Как связаны понятия “алгоритм” и “исполнитель”?6. Что такое программа?7. В каком случае говорят, что два алгоритма эквивалентны?8. Что такое универсальный исполнитель?9. Сравните интуитивное и строгое понятия алгоритма.10. Опишите устройство и систему программированиямашины Тьюринга.11. Что такое состояние машины Тьюринга?12. Сопоставьте устройство машины Тьюрингас устройством компьютера. Какие устройства машиныТьюринга выполняют те же функции, что ианалогичные устройства компьютера?13. В чем особенность состояний q 0и q 1машиныТьюринга?14. По какому принципу можно построить программудля машины Тьюринга, которая последовательновыполняет операции А и Б?15. Сформулируйте тезис Чёрча — Тьюринга.16. Сравните машины Тьюринга и Поста.17. Зачем нумеруются строки в программе длямашины Поста?18. Что такое нормальный алгорифм Маркова?19. Зачем используют специальные символы вНАМ?20. Что означает эквивалентность различныхуниверсальных исполнителей?Задачи1. Что делают следующие программы для машиныТьюринга:а) q 10 ←1 ← → q 0б) q 10 → q 01 → q 0←в) q 1q 2а q 2 ←б q 2 ← ← q 0Рис. 10В каких случаях эти программы зацикливаются?2. Предложите программу для машины Тьюрингаи начальное состояние ленты, при котором этапрограмма зацикливается.3. Составьте программу для машины Тьюринга,которая уменьшает двоичное число на 1.4. Составьте программы для машины Тьюринга,которые увеличивают и уменьшают на единицу число,записанное в десятичной системе счисления.5. Составьте программу для машины Тьюринга,которая складывает два числа в двоичной системе,разделенные на ленте знаком “+”.6. Составьте программы для машины Тьюринга,которые выполняют сложение и вычитание двухчисел в десятичной системе счисления.7. *Найдите в литературе или в Интернете информациюо разновидностях машины Тьюринга.8. Что делают следующие программы для машиныПоста:а) 1 1 б) 1 ← в) 1 ? 2,32 → 2 ? 3,4 2 1 43 → 1 3 1 1 3 → 14 стоп 4 стопРис. 11Как будет работать каждая из программ при различныхначальных состояниях ленты?9. Напишите программу для машины Поста, котораяувеличивает (уменьшает) число в единичнойсистеме счисления на единицу. Каретка расположенаслева от числа.10. Напишите программу для машины Поста,которая складывает два числа в единичной системесчисления. Каретка расположена над пробелом,разделяющим эти числа на ленте.11. Напишите программу для машины Поста,которая складывает два числа в единичной системесчисления. Каретка расположена над пробелом,разделяющим эти числа на ленте.12. Что делают следующие НАМ, если применитьих к символьной цепочке, состоящей из нулей иединиц:а) 0 → 001 → 11б) *0 → 0**1 → 1** → =.→ *в) *0 → 00**1 → 11** → .→ *Как будет работать каждая из программ при различныхначальных состояниях ленты?13. Напишите НАМ, который “сортирует” цифрыдвоичного числа так, чтобы сначала стояли всенули, а потом — все единицы.14. Дополните приведенный НАМ для удаленияпервого символа строки так, чтобы он не зацикливалсяна пустом слове.15. Напишите НАМ, который умножает двоичноечисло на 2, добавляя 0 в конец записи числа.Алгоритмически неразрешимыезадачиВычислимые и невычислимые функцииМы уже говорили, что любой алгоритм задаетнекоторую функцию, которая для каждого входногослова, к которому применим алгоритм, однозначно


задает результат — выходное слово. Такие функцииназываются вычислимыми.Вычислимая функция — это функция, для вычислениякоторой существует алгоритм.Любая вычислимая функция может задаватьсяразными алгоритмами (разными программами длявыбранного универсального исполнителя). Например,следующие два нормальных алгорифма Марковазаменяют во входном двоичном слове все буквы“a” на нули и все буквы “б” на единицы:а → 0 б → 1б → 1 а → 0Любая вычислимая функция может быть вычисленас помощью любого универсального исполнителя:машин Тьюринга и Поста, нормальных алгорифмовМаркова и др.Рассмотрим, например, такую функцию, определеннуюдля всех натуральных чисел:⎧1,если n — четноеf( n)= ⎨⎩ 0, если n — нечетноеПопробуем составить программу для машиныТьюринга, которая вычисляет эту функцию. Будемсчитать, что число записано в единичной системесчисления (в виде цепочки единиц), и каретка в начальныймомент стоит над самой левой единицей.Четное число мы должны заменить на одну единицу,а нечетное — на пустую ленту. Оказывается, такаяпрограмма действительно существует:q 1q 2q 3q 41 → q 2→ q 1← q 4 ← ← q 3← q 4q 0Рис. 12Как принято, в начальный момент машина находитсяв состоянии q 1. Затем она движется вправовдоль числа, поочередно переходя из состоянияq 1(пройдено четное число единиц) в состояние q 2(пройдено нечетное число единиц) и обратно. Такимобразом, если встречен пробел и машина находитсяв состоянии q 2, то число нечетное и нужнопросто стереть все единицы (состояние q 4). Еслимашина закончила просмотр в состоянии q 1, то числочетное; при этом нужно оставить одну единицу(состояние q 3) и перейти в состояние q 4(стеретьвсе остальные единицы). Обратите внимание, чтоячейка (, q 3) в таблице пустая — это невозможноесостояние (покажите это самостоятельно).Таким образом, рассмотренная функция вычислима,то есть ее можно вычислять с помощьюмашины Тьюринга, а значит, и с помощью любогоуниверсального исполнителя. Например, нормальныйалгорифм Маркова для алфавита A = {1} выглядиттак:11 → ""1 → .→ 1.В первой подстановке две соседние единицы удаляются(слово-замена здесь пустое, для ясности оновзято в кавычки, которыми можно ограничиватьслова в НАМ). Это происходит до тех пор, пока небудут удалены все пары, поскольку эта подстановкастоит первой. Если остается одна единица, онаудаляется с помощью второй подстановки, и работапрограммы заканчивается. Если все единицы удалены(число четное), то с помощью третьей подстановкимы ставим одну единицу и останавливаемавтомат.Существуют и невычислимые функции. Рассмотримпростой пример, предложенный В.А. Успенскимв книге “Машина Поста”. Известно, что математическаяпостоянная π — иррациональноечисло, его десятичная запись бесконечна и не периодична.Введем функцию h(n), которая для любогонатурального числа n равна 1, если в десятичнойзаписи числа π есть n стоящих подряд девяток,окруженных другими цифрами, и равна нулю, еслитакой цепочки девяток нет. Как вычислить значениеэтой функции при некотором заданном n? Конечно,можно вычислять друг за другом десятичныезнаки числа π (такие алгоритмы математикамизвестны!) и проверять, не нашлась ли в полученнойпоследовательности цифр цепочка из n девяток.С помощью такого “наивного” алгоритма можнонайти такие значения n, при которых h(n) = 1:обнаружив требуемую цепочку, алгоритм закончитработу. Например, анализ первых 800 знаков показывает,что h(n) = 1 при n = 0, 1, 2, 6. Но если длякакого-то n функция h(n) равна нулю, то наивныйалгоритм никогда не остановится. Более того, дляэтой функции вообще не существует алгоритма,который при любом n останавливается и выдаетзначение h(n) в качестве результата. Поэтому такаяфункция невычислима.Когда задача алгоритмически неразрешима?Как вы знаете, невозможно создать вечный двигатель,потому что это противоречит универсальнымфизическим законам сохранения. Точно так жев математике и информатике существуют задачи,для которых общее решение не только неизвестносейчас, но и вообще отсутствует. Поэтому искатьего бесполезно.Поскольку алгоритм работает только с дискретнымиобъектами, любая алгоритмическая задача— это функция, заданная на множестве дискретныхобъектов (входных слов). Пусть, например,требуется по шахматной позиции определить, ктовыигрывает при правильной игре — белые, черныеили будет ничья. Выберем способ кодирования, прикотором каждая позиция может быть закодированасловом (символьной строкой) ν в подходящемалфавите. Тогда приведенной задаче может соответствоватьфункция f(ν), заданная на множестветаких слов:11январь 2012 / ИНФорматика


ПРОФИЛЬ12январь 2012 / ИНФорматикаf( v)⎧⎪⎪⎪= ⎨⎪⎪⎪⎪⎩'Б', если ν — код позиции, в которойвыигрывают белые;'Ч', если ν — код позиции, в которойвыигрывают черные;'0', если ν — код позиции, в которойбудет ничья;'?', если ν — ошибочный код позиции.Если функция, соответствующая задаче, вычислима,то задача называется алгоритмически разрешимой— для ее вычисления можно построить алгоритм.Если определенная в задаче функция невычислима,то алгоритма для ее решения не существует.Алгоритмически неразрешимая задача — этозадача, соответствующая невычислимой функции.В 1900 году на Международном математическомконгрессе в Париже известный математик ДавидГильберт сформулировал 23 нерешенные математическиепроблемы 1 . В знаменитой “десятой проблемеГильберта” требуется найти метод, который позволяетопределить, имеет ли заданное алгебраическое уравнениес целыми коэффициентами решение в целыхчислах. Например, уравнение x 2 + y 3 + 2 = 0имеет два целочисленных решения, (5; –3) и(–5; –3). Сложность состояла в том, что требовалосьнайти единый метод (алгоритм),позволяющий решить задачу для любого такогоуравнения со многими неизвестными.В начале XX века была уверенность, чтотакой алгоритм есть, и поэтому его упорноискали. Однако в 1970 году советскому1Сейчас большинство из них решено полностьюили частично.2Тем не менее отдельные классы теорем компьютерспособен доказывать.Ю.В. Матиясевич(р. 1947)(ru.wikipedia.org)Рис. 13А.Чёрч (1903–1995)(ru.wikipedia.org)Рис. 14математику Ю.В. Матиясе вичу удалосьдоказать, что общего алгоритма решенияэтой задачи не существует.Немецкий математик Г.В. Лейбниц вXVII веке безуспешно пытался найти методпроверки правильности любых математическихутверждений. Как вы знаете, почти все математическиетеории основаны на использованииаксиом (положений, принимаемых без доказательства),из которых выводятся все остальные утверждения(теоремы). Задача заключалась в том, чтобыразработать алгоритм, позволяющий установить,можно ли вывести формулу Б из формулыА в рамках заданной системы аксиом(проблема распознавания выводимости).В 1936 году американский математикА.Чёрч доказал, что эта задача в общемвиде алгоритмически неразрешима,поэтому нельзя сформулировать универсальныйалгоритм, пригодный для доказательствалюбой теоремы 2 .Таким образом, уточненные определенияалгоритма, основанные на понятииуниверсальных исполнителей, сыграли в наукеочень важную роль — позволили получить отрицательныерезультаты, то есть доказать, что алгоритмоврешения некоторых задач в общем виде впринципе не существует.Для того чтобы доказать неразрешимость какойтоновой задачи, пытаются свести ее к уже известнымалгоритмически неразрешимым задачам. Еслиэто удается, значит, и новая задача алгоритмическинеразрешима 3 . Существуют также задачи, про которыенеизвестно, алгоритмически разрешимы ониили нет — решение не найдено, но алгоритмическаянеразрешимость не доказана.Алгоритмически неразрешимые задачи встречаютсяне только в математике, но и в информатике,например, при разработке программ. Оказывается,невозможно написать программу для машины Тьюринга(алгоритм), которая по тексту любой программыP и ее входным данным X определяет, завершаетсяли программа P при входе X за конечноечисло шагов или зацикливается. Это так называемаяпроблема останова. Ее неразрешимость означает,в частности, что нельзя полностью автоматизироватьтестирование любых программ, поручивэто компьютеру. Однако для некоторыхклассов алгоритмов проблему остановарешить можно. Например, линейная программа,не содержащая ветвлений и циклов,всегда завершится.Было доказано, что алгоритмически неразрешимапроблема эквивалентности:по двум заданным алгоритмам определить,будут ли они выдавать одинаковыерезультаты для любых допустимых исходныхданных. Следовательно, невозможнополностью автоматизировать решениемногих важных задач, связанных с разработкойпрограмм, например:• по заданному тексту программы определить,что она “делает”;• определить, “правильно” ли работает программапри любых допустимых исходных данных;• найти ошибку в программе, работающей “неправильно”.Поэтому при отладке программы большуюроль играет интуиция. Помогают (ноне решают проблему полностью!) стандартныеприемы, позволяющие найтиошибку:• сравнение результатов работы программыс результатами ручного счета;• эксперименты с программой приразличных исходных данных для того,чтобы выявить закономерность появленияошибок;3Допустим, что (1) задача А неразрешимаи (2) если мы можем построить алгоритм длярешения задачи Б, то с его помощью можно построитьалгоритм решения задачи А. Тогда задачаБ тоже неразрешима.


ПРОФИЛЬ14январь 2012 / ИНФорматикаПример 2. Вычислить сумму всех элементовмассива.В этой задаче уже не обойтись без цикла:S := A[1]нц для i от 2 до nS := S + A[i]кцЗдесь выполняется n – 1 операций сложения и nопераций записи в память 4 , поэтому его сложностьT(n) = 2n – 1 возрастает линейно с увеличениемдлины массива 5 .Пример 3. Отсортировать все элементы массивапо возрастанию методом выбора.Напомним, что метод выбора предполагает поискна каждом шаге минимального из оставшихсянеупорядоченных значений (здесь i, j, nMin и c —целочисленные переменные):нц для i от 1 до n-1nMin:= i;нц для j от i+1 до nесли A[i] < A[nMin] то nMin:= i всекцесли nMin i тоc:= A[i]; A[i]:= A[nMin]; A[nMin]:= cвсекцПодсчитаем отдельно количество сравнений иколичество перестановок. Количество сравненийне зависит от данных и определяется числом шаговвнутреннего цикла:n( n −1) 1 1= − + − + + + = = − .2 2 22Tc( n) ( n 1) ( n 2) ... 2 1n nЧисло перестановок зависит от данных. Например,если массив уже отсортирован в нужном порядке,перестановок не будет вообще. В худшемслучае на каждом шаге основного цикла происходитперестановка, всего их будет T p(n) = n – 1.Что такое асимптотическая сложность?Допустим, что нужно выбрать между несколькимиалгоритмами, которые имеют разную сложность. Какойиз них лучше (работает быстрее)? Оказывается,для этого необходимо знать размер массива данных,которые нужно обрабатывать. Сравним, например,три алгоритма, сложность которых T 1(n) = 10 000 ⋅ n,T 2(n) = 100 ⋅ n 2 и T 3(n) = n 3 .Построим эти зависимости на графике (см.рис. 15). При n ≤ 100 получаем T 3(n) < T 2(n) < T 1(n),при n = 100 количество операций для всех трехалгоритмов совпадает, а при больших n имеемT 3(n) > T 2(n) > T 1(n).4Здесь и далее для упрощения выводов мы не учитываемкоманды, необходимые для организации цикла, потому чтопри больших n время их выполнения очень мало в сравнениисо временем выполнения остальных операторов.5Предполагается, что сложение любых двух чисел выполняетсяодинаковое время.Обычно в теоретической информатике при сравненииалгоритмов используется их асимптотическаясложность, то есть скорость роста количестваопераций при больших значениях n. При этомзапись O(n) (читается “О большое от n”) обозначает,что, начиная с некоторого значения n = n 0, количествоопераций ограничено функцией c ⋅ n, где c —некоторая константа:T(n) ≤ c ⋅ n для n ≥ n 0.Такие алгоритмы имеют линейную сложность, тоесть при увеличении размера данных в 10 раз объемвычислений увеличивается тоже примерно в 10 раз.Пусть, например, T(n) = 2n – 1, как в алгоритмепоиска суммы элементов массива. Очевидно, чтопри этом T(n) ≤ 2n для всех n ≥ 1, поэтому алгоритмимеет линейную сложность.Многие известные алгоритмы имеют квадратичнуюсложность O(n 2 ). Это значит, что сложность алгоритмаограничена функцией c ⋅ n 2 :T(n) ≤ c ⋅ n 2 для n ≥ n 0.При этом если размер данных увеличивается в10 раз, то количество операций (и время выполнения)увеличивается примерно в 100 раз. Примертакого алгоритма — сортировка методом прямоговыбора, для которой число сравнений1 1 1Tc( n)n n n2 2 2Рис. 152 2= − ≤ для всех n ≥ 0.Алгоритм имеет асимптотическую сложностьO(f(n)), если найдется такая постоянная c, что,начиная с некоторого n = n 0, выполняется условиеT(n) ≤ c ⋅ f(n).Это значит, что график функции c ⋅ f(n) идетвыше, чем график функции T(n), по крайней мерепри n ≥ n 0(см. рис. 16).Если количество операций не зависит от размераданных, то говорят, что сложность алгоритма O(1),то есть количество операций меньше некоторойпостоянной при любых n.Существует также немало алгоритмов с кубичнойсложностью, O(n 3 ). При больших значениях nалгоритм с кубичной сложностью требует большегоколичества вычислений, чем алгоритм сосложностью O(n 2 ), а тот, в свою очередь, работаетдольше, чем алгоритм с линейной сложностью. За-


метьте, что при малых значениях n все может бытьнаоборот, это зависит от постоянной c для каждогоиз алгоритмов.Известны и алгоритмы, для которых количествоопераций растет быстрее, чем любой полином,например, как O(2 n ) или O(n!). Они встречаютсячаще всего в задачах оптимизации, которыерешаются только методом полного перебора. Самаяизвестная задача такого типа — это задачакоммивояжера (бродячего торговца), которыйдолжен посетить по одному разу каждый из указанныхгородов и вернуться в начальную точку.Для него нужно выбрать оптимальный маршрут,при котором стоимость поездки (или общая длинапути) будет минимальной.Еще один пример сложной задачи, которая решаетсятолько полным перебором всех вариантов —задача выполнимости. Дано логическое выражение,которое содержит только имена логическихпеременных, скобки, а также операции “И”, “ИЛИ”и “НЕ”. Требуется определить, существует ли наборзначений логических переменных, при котором заданноевыражение истинно.Алгоритмы поискаРис. 16Сравним вычислительную сложность двух наиболееизвестных алгоритмов поиска.Пример 4 (линейный поиск). Дан массив, вкотором элементы расположены в произвольномпорядке. Найти в нем заданное значение x или сообщить,что его нет.Решение этой задачи сводится к последовательномупросмотру всех элементов массива:nX:= 0нц для i от 1 до nесли A[i] = X тоnX:= iвыходвсекцесли nX > 0 товывод "A[", nX, "]=", Xиначевывод "Элемент не найден"всеВ этом алгоритме число сравнений (в худшемслучае) равно T(n) = n, поэтому он имеет линейнуюсложность.Пример 5 (двоичный поиск). Дан массив, вкотором элементы упорядочены по возрастанию.Найти в нем заданное значение x или сообщить,что его нет.В сравнении с предыдущей задачей элементымассива отсортированы, и это ускоряет решение,потому что можно применить метод двоичного поиска(дихотомии):L:= 1; R:= n + 1нц пока L + 1 < Rc:= div(L + R, 2) |или c:= L + div(R - L,2)если X < A[c] тоR:= cиначеL:= cвсекцесли A[L] = X товывод "A[", L, "]=", Xиначевывод "Элемент не найден"всеПопробуем определить, сколько раз выполняетсяосновной цикл при двоичном поиске. Сначалаширина интервала поиска — все n элементовмассива. На каждом шаге этот интервал делитсяна 2, процесс завершается, когда левая и праваяграницы интервала совпадут. Предположим, чточисло элементов — это целая степень двойки, тоесть n = 2 m . Тогда за m шагов ширина интерваласужается до 1, а на следующем шаге его границысовпадут и цикл закончится. Таким образом, количествошагов цикла равно m + 1. Из равенстваn = 2 m получаем m = log 2n, так чтоT(n) = log 2n + 1.Например, при n = 2 16 линейный поиск потребуетв худшем случае 2 16 = 65 536 сравнений, а двоичный— всего 16 + 1 = 17 сравнений.Таким образом, алгоритм двоичного поискаимеет асимптотическую сложность O(logn). Основаниелогарифма обычно не указывают, потому чтовыражения log an и log bn отличаются на постоянныймножитель (который можно включить в постояннуюc):1logan = ⋅ logbn.log aМожно ли сказать, что алгоритм двоичного поискалучше алгоритма линейного поиска? Нет!Ведь алгоритм линейного поиска применим клюбым массивам данных, а алгоритм двоичногопоиска — только к упорядоченным (отсортированным).А если мы сначала отсортируем массив,а потом применим к нему двоичный поиск, тообщее время работы будет больше, чем при линейномпоиске.b15январь 2012 / ИНФорматика


ПРОФИЛЬ16январь 2012 / ИНФорматикаСитуация меняется, если нам нужно многократновыполнять операцию поиска для одних и тех же данных(так, как правило, бывает при работе с базамиданных). Тогда имеет смысл заранее отсор тироватьмассив (применить “предварительную обработкуданных”), а затем, используя двоичный поиск, экономитьвремя при каждом новом поисковом запросе.Алгоритмы сортировкиРанее мы проанализировали один из простых методовсортировки массивов — метод прямого выбора,и выяснили, что его асимптотическая сложностьO(n 2 ). Повторим анализ для метода “пузырька”, которыйтакже изучался в 10-м классе:нц для i от 1 до n-1нц для j от n-1 до i шаг -1если A[j] > A[j+1] тоc:= A[j]; A[j]:= A[j+1]; A[j+1]:= c;всекцкцНа первом шаге основного цикла выполняетсяn – 1 шагов внутреннего цикла, то есть n – 1 сравнений.Далее количество сравнений уменьшаетсядо 1, так что общее количество сравнений равноT ( n) = ( n − 1) + ( n − 2) + ... + 2 + 1 =c( −1) 1 2 1n n ,n n= = −2 2 2так же, как и у алгоритма прямого выбора. В то жевремя в худшем случае при каждом сравнении выполняетсяперестановка, что требуетn( n −1) 3 32 2 22Tp( n) = 3⋅ = n − nопераций присваивания. Таким образом, этот алгоритмимеет асимптотическую сложность O(n 2 )как по числу сравнений, так и по числу присваиваний.Существуют ли более эффективные сортировки,имеющие, например, линейную сложность? Да, длянекоторых особых случаев существуют. Например,если известно, что все значения исходного массиванаходятся в интервале от 1 до некоторого значенияMAX, можно использовать сортировку подсчетом.Для этого выделяется дополнительный массив счетчиковцел C[1:MAX]который предварительно обнуляется:нц для i от 1 до MAXC[i]:= 0кцЗатем в цикле проходим весь массив с данными,и для каждого элемента A[i] увеличиваем счетчикC[A[i]]. Например, если A[i]=20, счетчик C[20]увеличивается на 1. После окончания цикла в каждомсчетчике C[i] находится количество значенийисходного массива, равных i.нц для i от 1 до nC[A[i]]:= C[A[i]] + 1кцТеперь остается расставить их в массиве A в нужномколичестве. Например. Если C[20]=5, а значений,меньших 20, нет, в массив A записывается последовательно5 значений, равных 20:k:= 1нц для i от 1 до MAXнц для j от 1 до C[i]A[k]:= ik:= k + 1кцкцПопробуем подсчитать количество операций дляэтого алгоритма. Заполнение массива C нулямитребует MAX присваиваний. Цикл подсчета элементовсодержит n сложений и присваиваний, то естьего сложность — линейная, O(n). Наконец, последнийвложенный цикл выполняет также n сложенийи присваиваний (по числу элементов массива A),поэтому алгоритм в целом имеет линейную сложностьпо n.Однако нужно учитывать, что принципиальноеускорение алгоритма в сравнении с предыдущимиполучено за счет того, что• все значения — целые числа в ограниченномдиапазоне;• есть возможность использовать дополнительныймассив размером MAX, который может значительнопревышать размер исходного массива.Здесь проявляется компромисс “скорость – память”,который присутствует во многих задачах:ускорение алгоритма возможно за счет использованиядополнительной памяти и наоборот, экономияпамяти приводит к замедлению работы алгоритма.Доказано, что в общем случае вычислительнаясложность сортировки, основанной только на использованииопераций “сравнить” и “переставить”,не может быть меньше, чем O(nlogn). Именно такуюсложность имеют, например, сортировка слиянием(англ. Merge sort) и пирамидальная сортировка(англ. Heap sort), которые применяются при работес большими наборами данных. Быстрая сортировка(англ. Quick sort), которая изучалась в 10-м классе,в среднем тоже имеет сложность O(n logn), однаков худшем случае (когда на каждом шаге массивделится на две части, одна из которых состоит изодного элемента) требуется O(n 2 ) обменов.Контрольные вопросы1. Какие критерии используются для оценки качестваалгоритмов?2. Почему скорость работы алгоритма оцениваетсяне временем выполнения, а количеством элементарныхопераций?3. Как учитывается размер данных при оценкескорости алгоритма?


4. Что означают записи O(1), O(n), O(n 2 ) и O(2 n )?5. В каких случаях алгоритм, имеющий асимптотическуюсложность O(n 2 ), может работать быстрее,чем алгоритм с асимптотической сложностьюO(n)?Задачи1. Оцените количество операций для алгоритмов:а) поиска всех делителей числа;б) нахождения минимального и максимальногоэлементов массива;в) определения количества положительных элементовмассива;г) проверки числа на простоту.В каждом случае опишите набор используемыхэлементарных операций. Определите асимптотическуюсложность этих алгоритмов.2. *Предложите алгоритм, позволяющий найти ивывести на экран те символы, которые встречаютсяв строке более одного раза. Оцените его асимптотическуюсложность.3. *Алфавит языка племени “тумба-юмба” содержитk символов. Предложите алгоритм построениявсех возможных слов этого языка длиной n символови оцените его асимптотическую сложность.Доказательство правильностипрограммКак доказать правильность программы?Как правило, программист разрабатывает программуна заказ, и от него требуется не только написатькод, но и убедиться, что он работает правильно,то есть в соответствии с требованиями заказчика.Очевидно, что если программа выдает неверныйрезультат хотя бы для одного варианта входныхданных, можно сразу сказать, что она некорректна,то есть содержит ошибки.Сложнее доказать правильность программы— убедиться, что она выдает верные результатыпри любых допустимых входных данных.Программисты-практики для решенияэтой задачи используют тестирование:проверяют работу программы с помощьюнабора тестовых данных, для которыхизвестен правильный результат.Если полученный результат не совпадаетс заданным, выполняется отладкапрограммы, то есть поиск и исправлениеошибок.Однако, как писал замечательныйнидерландский ученый, один из создателейсовременного программированияЭ.Дейкстра, “отладка может показатьлишь наличие ошибок и никогда их отсутствие”.В результате можно гарантироватьверную работу программы только приЭ.В. Дейкстра(р. 1930) (http://bwnw.cwi-incubator.nl)Рис. 17тех данных, которые использовались в контрольныхтестах. Кроме того, неясно, как определить, что всеошибки выявлены и нужно завершить отладку.Пример 1. Рассмотрим следующую программудля выбора максимального из трех значений, записанныхв переменных a, b и c:если a > b то M:= a иначе M:= b всеесли b > c то M:= b иначе M:= c всеПроверяя ее на тестах(a,b,c) = (1,2,3), (1,3,2), (2,1,3) и(2,3,1)мы во всех этих случаях получаем в переменной Mверный ответ 3. Однако это не означает, что программаправильная, так как существует контрпример(3,2,1): для этого набора входных данных впеременной M в результате оказывается число 2.Чтобы быть уверенным в том, что программа работаетправильно при любых допустимых исходныхданных, применяют методы доказательного программирования:для каждого блока программысоставляются требования к входным и выходнымданным, и строго доказывают, что программа всегдаработает верно.К сожалению, доказывать правильность программне так просто, и в таких доказательствахтоже возможны ошибки. Однако при этом автордолжен глубоко разобраться в алгоритме и его “подводныхкамнях”, и часто при этом обнаруживаютсяошибки, которые могли бы проявиться уже послевыпуска программы в свет.На практике редко доказывают правильностьвсей программы в целом. В то же время очень полезнодоказывать правильность отдельных блоков(циклов, процедур и функций) для уменьшенияколичества “необъяснимых” ошибок и сокращениявремени отладки.Покажем метод доказательства правильностипрограммы на простом примере.Пример 2. Доказать, что после выполнения следующейпрограммы значения переменных a и b меняютсяместами:b:= a + b | 1a:= b – a | 2b:= b – a | 3Предполагается, что сумма исход ныхчисел не приводит к переполнению разряднойсетки. Для удобства операторыпрограммы пронумерованы.Обозначим начальные значения переменныхa и b через a 0и b 0. После выполненияоператора 1 в переменной bбудет записано значение a 0+ b 0. Оператор2 записывает в переменную a значениеb – a = a 0+ b 0– a 0= b 0. В результатевыполнения оператора 3 получаемновое значение переменной b, равноеb – a = a 0+ b 0– b 0= a 0. Таким образом,в результате выполнения программыпеременные a и b будут равны b 0и a 0со-17январь 2012 / ИНФорматика


ПРОФИЛЬответственно, что и требовалось доказать. Поэтомуприведенная программа — правильная.Пример 3. Попробуем доказать или опровергнутьправильность уже встречавшейся ранее программыдля выбора максимального из трех значений,записанных в переменных a, b и c:если a > b то M:= a иначе M:= b все | 1если b > c то M:= b иначе M:= c все | 2Анализируя строку 2, выясняем, что в ней значениепеременной M всегда будет изменено, то есть результатработы первой строки программы стирается, и⎧b,b > cM = ⎨⎩ c , c ≥ bКонечно, эта величина не совпадает с определениеммаксимального значения из a, b и c. Такимобразом, программа неправильная: она выдает неверноезначение, если максимальное из трех чиселхранилось в переменной a. Контрпример мы ужеприводили: (3,2,1).что условие НОД(a, b) = НОД(m, n) по-прежнемувыполняется после каждого шага цикла.Поскольку остаток r с каждым шагом строгоуменьшается, в конце концов он станет равнымнулю и запишется в переменную b при выполнениистроки 4. Цикл сразу же закончится, поскольку нарушаетсяусловие его выполнения. После завершенияработы цикла условие НОД(a, b) = НОД(m, n)по-прежнему выполняется, но, кроме того, b = 0.Отсюда следует, что a = НОД(m, n).Инвариант циклаТаким образом, для алгоритма Евклида существуетусловие НОД(a, b) = НОД(m, n), которое остаетсясправедливым на протяжении всего выполненияалгоритма: перед началом цикла, после каждогошага цикла и после окончания работы цикла. Такоеусловие называется инвариантом цикла (англ.invariant — неизменный).18январь 2012 / ИНФорматикаАлгоритм ЕвклидаТеперь докажем, что один из древнейших известныхалгоритмов — алгоритм Евклида — действительновычисляет наибольший общий делитель(НОД) двух натуральных чисел (мы рассматривалиего в 10-м классе).Алгоритм Евклида. Пусть заданы два натуральныхчисла m и n, причем m > n. Для вычисленияНОД(m, n) следует многократно заменять большеечисло остатком от деления большего на меньшее дотех пор, пока меньшее число не станет равным нулю.Тогда оставшееся ненулевое число и есть НОД(m, n).Программа, основанная на алгоритме Евклида,может выглядеть, например, так (здесь a, b и r —целочисленные переменные):a:= m; b:= n | 1 НОД(a,b) = НОД(m,n)нц пока b 0 | 2r:= mod(a, b) | 3a:= b; b:= r | 4 НОД(a,b) = НОД(m,n)кц | 5вывод a | 6 НОД(a,b) = НОД(m,n), b = 0Докажем, что в результате этого алгоритма в переменнойa находится НОД(m, n).В строке 1 исходные значения копируются изпеременных m и n соответственно в переменныеa и b. Очевидно, что при этом выполнено условиеНОД(a, b) = НОД(m, n).На каждом шаге цикла (в строках 3–4) вычисляетсяостаток r от деления a на b, и пара (a, b) заменяетсяна пару (b, r). Какими свойствами обладаютполученные значения b и r?Поскольку r — это остаток от деления a наb, до выполнения строк 3–4 было справедливоравенство a = bp + r, где p — некоторое целоечисло. Тогда, если a и b имеют общий делитель,то такой же делитель имеет и r. Следовательно,НОД(b, r) = НОД(a, b) = НОД(m, n). Это значит,Инвариант цикла — это соотношение между значениямипеременных, которое остается справедливымпосле завершения любого шага цикла.Как мы увидели, выделение инварианта циклав явном виде очень важно для доказательстваправильности программы. Поэтому полезно задумыватьсяоб инварианте уже при разработке циклическихалгоритмов. Таким образом, мы делаемпервый шаг к доказательству их правильности иизбегаем многих возможных ошибок на начальнойстадии. Как писал академик А.П. Ершов, одиниз первых теоретиков программирования в СССР,“программиста бьют по рукам, если он посмеет написатьоператор цикла, не найдя перед этим егоинварианта”.Рассмотрим несколько примеров.Пример 1. Двое играют в следующую игру: передними лежат в ряд N + 1 камней, сначала N белых,и в конце цепочки — один черный. За один ходкаждый может взять от 1 до 3 камней. Проигрываеттот, кто берет черный (“несчастливый”) камень.Начнем анализ с простейших случаев. ЕслиN = 0, то первый игрок проиграл, он может взятьтолько черный камень. Если N = 1, 2, 3, то, наоборот,при правильной игре проигрывает второйигрок, потому что первый может забрать все камни,кроме черного. Вариант N = 4 снова приводит кпроигрышу первого, потому что забрать все белыекамни он не может, а после его хода второй оставиттолько черный камень. Также проигрышными будутпозиции при N = 8, 12, 16, …, то есть при любыхзначениях N, которые делятся на 4.Таким образом, для своего выигрыша игрок долженкаждым своим ходом восстанавливать инвариант:число оставшихся белых камней должно бытькратно 4. Если инвариант выполнен в начальнойпозиции, положение проигрышное и первый игрок


может надеяться только на ошибку соперника.Пример 2. Пусть задан массив A длиныn. Найдем инвариант цикла в программесуммирования элементов массива:S := 0нц для i от 1 до nS := S + A[i]кцЗдесь на каждом шаге к переменной Sдобавляется элемент массива A[i], такчто при любом i после окончания очередногошага цикла в S накоплена суммавсех элементов массива с номерами от 1 до i. Это иесть инвариант цикла. Поэтому сразу можно сделатьвывод о том, что после завершения цикла в переменнойS будет записана сумма всех элементов массива.Аналогично можно показать, что в алгоритмепоиска наименьшего значения в массивеmin := A[1]нц для i от 2 до nесли A[i] < min тоmin:= A[i]всекцинвариант формулируется так: после выполнениякаждого шага цикла в переменной min записан минимальныйиз первых i элементов. Отсюда сразу следует,что после завершения цикла (при i = n) в этойпеременной будет минимальный из всех элементов.Пример 3. Для того же массива найдем инвариантцикла в программе сортировки элементов массиваметодом “пузырька”:нц для i от 1 до n-1нц для j от n-1 до i шаг -1если A[j] > A[j+1] тоc:= A[j]; A[j]:= A[j+1]; A[j+1]:= c;всекцкцДо начала алгоритма элементы расположеныпроизвольно. На каждом шаге внешнего циклана свое место “всплывает” один элемент массива.Поэтому инвариант этого цикла можно сформулироватьтак: “после выполнения i-го шага цикла первыеi элементов массива отсортированы и установленына свои места”.Теперь построим инвариант внутреннего цикла.В этом цикле очередной “легкий” элемент поднимаетсявверх к началу массива. Перед первым шагомвнутреннего цикла элемент, который будет стоятьна i-м месте в отсортированном массиве, можетнаходиться в любой ячейке от A[i] до A[n]. Послекаждого шага его “зона нахождения” сужаетсяна одну позицию, так что инвариант внутреннегоцикла можно сформулировать так: “элемент, которыйбудет стоять на i-м месте в отсортированноммассиве, может находиться в любой ячейке от A[i]А.П. Ершов (1931–1988)(inf.1september.ru)Рис. 18до A[j]”. Очевидно, что когда в концеэтого цикла j = i, элемент A[i] встаетна свое место.В предыдущих примерах мы определялиинвариант готового цикла.Теперь покажем, как можно строитьцикл с помощью заранее выбранногоинварианта.Пример 4. Рассмотрим алгоритмбыстрого возведения в степень, основанныйна использовании операцийвозведения в квадрат и умножения. Ониспользует две очевидные формулы:(1) a k = a k–1 ⋅ a при нечетной степени kи (2) a k = (a 2 ) k/2 при нечетной степени k.Покажем, как работает алгоритм на примеревозведения числа a в степень 7:7 6 2 3 2 2 2a a a a a a a a= ⋅ [ ] = ( ) ⋅ [ ] = ( ) ⋅[ ⋅ ] == ⋅ ⋅ = ⋅ ⋅ ⋅ = ⋅ ⋅4 1 2 4 0 4 2 4 2( a ) [ a a] ( a ) [ a a a] [ a a a].Здесь поочередно применяются первая и втораяформулы. Заметим, что на каждом этапе выражениеa n можно представить в виде a n = b k ⋅ p, где через pобозначена часть, взятая выше в квадратные скобки.Если нам каким-то образом удастся уменьшить kдо нуля, сохранив это равенство, то мы получимa n = p, то есть задача будет решена, а результат будетнаходиться в переменной p.Таким образом, равенство a n = b k ⋅ p можно использоватькак инвариант цикла. Для того чтобыобеспечить выполнение этого равенства в начальныймомент, можно принять, например, b = a,k = n и p = 1. Далее в цикле применяются формулы(1) и (2) (в зависимости от четности k на данномшаге). Цикл заканчивается, когда k = 0. В результатеполучаем следующее решение:b:= a; k:= n; p:= 1нц пока k 0если mod(k,2) = 0 тоk:= div(k,2)b:= b*bиначеk:= k-1p:= b*pвсекцвывод pЗаметим, что инвариант цикла a n = b k ⋅ p выполняетсядо начала цикла, после каждого шага, атакже после завершения цикла. Таким образом, мынаписали код программы и одновременно доказалиправильность этого блока.Доказательное программированиеДля доказательства правильности программынеобходимо иметь спецификацию — точное описаниетого, что должно быть сделано в результатеработы программы.19январь 2012 / ИНФорматика


ПРОФИЛЬ20январь 2012 / ИНФорматикаСпецификация — точная и полная формулировказадачи, содержащая информацию, необходимуюдля построения алгоритма ее решения.На практике спецификации программ обычноформулируют на естественном языке, в которомслова могут иметь несколько разных значений. Длястрогого доказательства желательно, чтобы спецификациябыла задана в формальном виде, с помощьюформул или соотношений между величинами.По предложению английского ученого Ч.Хоара,спецификация записывается в форме {Q}S{R}, гдеQ — начальное условие (предусловие), S — программаи R — утверждения, описывающие конечныйрезультат (постусловие). Запись {Q}S{R} означаетследующее: “если выполнение программы S началосьв состоянии, удовлетворяющем Q, то гарантируется,что оно завершится через конечное время всостоянии, удовлетворяющем R”.Корректная программа — это программа, соответствующаяспецификации.Если для исходных данных не удовлетворяетсяпредусловие Q, программа должна сообщать обэтом пользователю и закончить работу. В этом случаепрограмму называют надежной.Надежная программа — это программа, котораякорректна и, кроме того, не завершаетсяаварийно при недопустимых входных данных.Например, для алгоритма Евклида условия Q и Rмогут выглядеть так:Q: m > n > 0, R: a = НОД(m, n)— а для программы суммирования элементов массиваA[1:n] так:Q: n > 0,R:n∑s = A[ i] = A[1] + A[2] + ... + A[ n]i=1Спецификации могут (и должны) быть составленыне только для программы в целом, но и дляее отдельных блоков (процедур, функций, циклови т.д.). Полезно вносить утверждения Q и R прямов текст программы. Построенная таким образоманнотированная программа — это еще один шаг кдоказательному программированию.Ч.Хоар разработал специальный аппарат, позволяющийдоказывать правильность программы наоснове спецификаций отдельных блоков. Приведемпростейшие правила преобразования:• если {Q}S{P} и P ⇒ R (из истинности P следуетистинность R), то {Q}S{R};• если {Q}S{P} и R ⇒ Q, то {R}S{P};• если программа S — это последовательное выполнениеблоков S 1и S 2, для которых выполняютсяспецификации {Q}S 1{P} и {P}S 2{R}, то выполняетсяспецификация {Q}S{R}.Доказательство правильности программ используютв двух ситуациях:• доказывают правильность готовых программ(верификация программ);• строят программы одновременно с доказательствомих правильности (синтез программ).Как правило, верификация — это очень трудоемкийи сложный процесс, и оказывается значительнопроще использовать доказательства правильностиво время разработки программы. При этомпрограммы получаются проще, эффективнее и значительнонадежнее.Контрольные вопросы1. Зачем нужно доказывать правильность программ?2. Расскажите о двух подходах к проверке правильностипрограмм.3. Почему с помощью тестирования сложно доказатьправильность программы? В каких случаяхэто все же можно сделать?4. Что изменится в доказательстве алгоритма Евклида,если m и n — это произвольные натуральныечисла (неравенство m > n может не выполняться)?5. Что такое инвариант цикла?6. Зачем нужно определять инвариант цикла?7. Что такое спецификация? Почему желательноформулировать ее в виде формальных утверждений,а не на естественном языке?8. Что такое предусловие и постусловие?9. Объясните запись {Q}S{R}.10. Какая программа называется корректной?11. В чем различие между надежной и корректнойпрограммами?12. Как вы думаете, можно ли назвать корректнойпрограмму, которая зависает при неверных исходныхданных? Обсудите этот вопрос в классе.13. Что такое верификация программы?14. Как вы думаете, что сложнее — доказыватьправильность готовой программы или сразу писатьпрограмму, доказывая правильность отдельныхблоков? Почему? Обсудите этот вопрос в классе.Задачи1. Докажите, что следующие операторы даютодинаковый результат при любых значениях L и R(рассмотрите четные и нечетные значения обеихпеременных):c:= div(L+R,2)c:= L + div(R-L,2)Какие достоинства и недостатки есть у каждогометода вычисления этой величины?2. Докажите, что в результате выполнения следующегофрагмента программы в переменной M не всегдабудет записано максимальное из трех чисел (a, b и c):


M:= aесли b > a то M:= b всеесли c > b то M:= с всеПриведите контрпример, то есть такие значенияa, b и c, при которых значение M будет отличатьсяот max(a, b, c). Как можно исправить эту программу,заменив в ней всего один символ?3. Докажите или опровергните правильностьпрограммы для выбора максимального из трех значений,записанных в переменных a, b и c:если a > b то M:= aиначе если b > c то M:= bиначе если c > a то M:= cвсе; все; всеЕсли это программа некорректная, приведитеконтрпример. Может ли быть, что при каких-товходных данных значение переменной M будет неопределенным?4. Докажите, что следующий фрагмент программыправильно сортирует значения в переменныхa, b и c по возрастанию, то есть всегдаполучается a ≤ b ≤ c:если a > b то поменять(a, b) всеесли b > c то поменять(b, c) всеесли a > b то поменять(a, b) всеАлгоритм поменять меняет местами значенияпеременных-параметров.5. В игре “ним” двое игроков по очереди беруткамни из двух кучек. За один ход можно взять любоененулевое количество камней, но только из однойкучки. Тот, кому не осталось камней, проигрывает.Как определить, кто выиграет при правильнойигре? Какой инвариант обеспечивает выигрыш?6. Определите инварианты для следующих циклов.Что будет вычислено в переменной b?а)k := 0; b := 1;while k < n do begink := k + 1;b := b * a;end;б)k := n; b := 1;while k > 0 do begink := k - 1;b := b * a;end;7. Определите предусловие и постусловие для алгоритмова) нахождения суммы всех делителей числа;б) проверки числа на простоту;в) определения количества слов в символьнойстроке;г) двоичного поиска элемента в отсортированноммассиве;д) перестановки элементов массива в обратномпорядке;е) преобразования числа из символьной записив значение целого типа.8. Предложите другие начальные значения переменныхb, k и p в алгоритме быстрого возведения встепень. Инвариант цикла должен сохраниться.9. Оцените сложность алгоритма быстрого возведенияв степень при n = 2 m .Самое важное• Интуитивное понятие алгоритма, которое мыиспользовали ранее, непригодно для математическогодоказательства неразрешимости задач.• Входные и выходные данные любого алгоритмаможно закодировать в виде последовательностейсимволов некоторого алфавита (и даже двоичногоалфавита).• Про любой алгоритм можно сказать следующее:o алгоритм получает на вход дискретный объект(например, слово);o алгоритм обрабатывает входной объект пошагам (дискретно), строя на каждом шаге промежуточныедискретные объекты; этот процессможет закончиться или не закончиться;o если выполнение алгоритма заканчивается,его результат — это объект, построенный напоследнем шаге;o если выполнение алгоритма не заканчивается(алгоритм зацикливается), то результат егоработы при данном входе не определен.• Алгоритм — это программа для некоторого исполнителя.• Универсальный исполнитель — это исполнитель,для которого можно построить алгоритм,эквивалентный любому алгоритму для любого другогоисполнителя. Все универсальные исполнителиэквивалентны между собой.• Каждый алгоритм задает (вычисляет) функцию,которая преобразует входное слово в результат (выходноеслово). Алгоритмы называются эквивалентными,если они задают одну и ту же функцию.• Вычислимая функция — это функция, для вычислениякоторой существует алгоритм. Любаявычислимая функция может задаваться разнымиалгоритмами.• Алгоритмически неразрешимая задача — этозадача, соответствующая невычислимой функции.• Говорят, что алгоритм имеет асимптотическуюсложность O(f(n)), если найдется такая постоянная c,что, начиная с некоторого n = n 0, выполняется условиеT(n) ≤ c ⋅ f(n).• Задачи оптимизации, которые решаются толькополным перебором вариантов, могут иметь,например, асимптотическую сложность O(2 n ) илиO(n!). Эти функции при больших n возрастают быстрее,чем многочлен любой степени.• Чтобы обеспечить надежность программы, используютметоды доказательного программирования:разработка программы ведется одновременнос доказательством ее правильности.• Инвариант цикла — это соотношение междувеличинами, которое остается справедливым послезавершения любого шага цикла.Список литературы1. Андреева Е.В., Босова Л.Л., Фалина И.Н. Математическиеосновы информатики. Учебное пособие.М.: Бином, 2005.2. Успенский В.А. Машина Поста. М.: Наука,1988.21январь 2012 / ИНФорматика


Базовый курсО чем это?К следующему учебномугоду в издательстве“Баласс” выйдут новыеучебники по базовомукурсу информатики(они уже прошли всенеобходимые формальныепроцедуры). О новыхучебниках рассказываетруководитель авторскогоколлектива.И это все?!Нет . В следующейстатье читайтефрагмент из новогоучебника для9-го класса – два первыхурока по теме“Базы данных”.22январь 2012 / ИНФорматикаА.В. Горячев,координаторнаправления“Информатика”в образовательнойсистеме“Школа 2100”,канд. пед. наукИнформатикаво взрослыхиграхи жизненныхзадачахМного воды утекло с начала 90-х, когдавышло первое, еще черно-белое издание“Информатики в играх и задачах”.За это время наша информатика обрелацвет, дополнительные элементы УМК(плакаты и новые учебники: “Логикаи алгоритмы” и “Мой инструмент —компьютер”), компьютерную поддержкув единой коллекции ЦОР, но самоеглавное наше обретение — это большоечисло учителей-единомышленников.И уже много лет наши учителя спрашиваютнас, когда же мы появимся восновной школе.Еще одно важное событие произошлос нами за эти годы — мы с нашими учебникамивлились в ряды Образовательнойсистемы “Школа 2100”. Вместе с авторамиучебников по другим предметам мы обсуждалинаши взгляды на цели образования,на технологии воплощения массового развивающегообразования, вместе разрабатывалиспособы диагностирования общихучебных умений и их отражение в новыхдневниках и других изданиях, вместе получалипремию правительства России вобласти образования в 2008 году. И ужемного лет наши коллеги — авторы учебниковпо другим предметам — спрашиваютнас, когда же мы появимся в основнойшколе.Когда мы уже начали уставать отводитьглаза и как бы незаметно менять темуразговора, появился новый ФГОС — Федеральныйгосударственный образовательныйстандарт. И тогда для нас слилисьвместе и идеи “Школы 2100”, и положениянового стандарта, и наши собственныевзгляды на обучение информатике. Мыразработали концепцию нового учебникаинформатики и наметили пути реализацииэтой концепции.Идеи образовательной системы“Школа 2100”Цель обучения в образовательной системе“Школа 2100” — вырастить функциональнограмотную личность. У насесть более полное определение, что этотакое — функционально грамотная личность,и упрощенное, “для родителей”.Это личность, которая способна исполь-


зовать все постоянно приобретаемые в течениежизни знания, умения и навыки для решениямаксимально широкого диапазона жизненныхзадач в различных сферах человеческой деятельности,общения и социальных отношений. Эточеловек, ориентирующийся в мире и действующийв соответствии с общественными ценностями,ожиданиями и интересами. И попроще: эточеловек, способный решать самые разные, возникающиев жизни задачи, оставаясь при этомдостойным человеком.В “Школе 2100” для каждого учебного предметаформулируются линии развития — качества личности,развиваемые средствами этого учебногопредмета. Как правило, это освоение каких-либообобщенных видов действий. Например, для математикиэто умение создавать математические модели,выполнять точные вычисления при конструированиии т.д. На первое место по значимостивыводятся умения выполнения действий, а знаниярассматриваются как необходимая основа для выполненияэтих действий.Каждый предмет вносит свой вклад в выращиваниефункционально грамотной личности.Информатика растит Homo Informaticus — человека,успешно действующего в условиях информационногообщества, умеющего применятьсредства ИКТ в качестве инструмента для достижениясвоих целей — от коммуникации домоделирования и автоматизации своей деятельности.Положения нового стандартаВ новом образовательном стандарте акцентысмещены с минимума содержания на требованияк результату образования. Предметные программырассматриваются только как составная частьосновной образовательной программы школы.При этом практически все системы учебников изфедерального комплекта предлагают свои примерныеосновные образовательные программы.Такую примерную образовательную программупредложила школам и образовательная система“Школа 2100”. Новые понятия из нового стандартапоявляются и в проекте нового закона об образовании(они же должны друг другу соответствовать).В этом проекте закона вы уже не найдете такоготермина из предыдущего стандарта, как “примернаяпрограмма по предмету”. На ее место встаютпримерные основные образовательные программы,включающие программы по предметам, причемтаких примерных основных образовательныхпрограмм может быть несколько.Результаты обучения, помимо традиционныхпредметных, дополнены личностными и метапредметными,среди которых мы видим получившиедальнейшее развитие три основных вида универсальныхучебных действий из стандарта для начальнойшколы: познавательные, регулятивные икоммуникативные.В самом стандарте информатика представленав новой предметной области “Математикаи инфор матика”. Но мы обращаем внимание ина отнесен ные в стандарте к метапредметнымрезультатам обучения формирование и развитиеИКТ-компетентности, включая владениеин формационно-коммуника цион ными технологиями,поиском, построением и передачейинформации, презентацией выполненных работ,основами информационной безопасности,умением безопасного использования средствинформационно-коммуникационных технологийи сети Интернет.Наши взгляды на обучение информатикеВо-первых, мы видим, что на уроках подругим учебным дисциплинам нет такогопротиворечия между общеобразовательными профильным (точнее, предпрофильным) содержанием.Предпрофильная физика, химия,биология, математика — это углуб ленная(а иногда и расширенная) базовая физика,химия, биология, математика. Во всех этихдисциплинах мы выступаем пользователямиэтого мира. Появление в школе предмета “Информатика”связано с изучением использованиярукотворного мира — мира компьютернойтехники, поэтому профильное обучениеинформатике — это не углубленное изучениеиспользования, а обучение созданию и развитиюэтого рукотворного мира. Конечно, можнопредставить профильный курс с углубленнымизучением информационных аспектоввсего мира (рукотворного и нерукотворного),но содержание профиля всегда определяетсяпрофильными вузами. Поэтому на уроках подругим дисциплинам и базовое, и профильноеобучение — это обучение жителей миравокруг нас (на разных уровнях), а на урокахинформатики базовый уровень — это обучениежителей компьютерного мира вокруг нас,а профильный уровень — это обучение егосоздателей. Обучение уверенного водителя иобучение конструктора автомобилей — этосовершенно разные вещи. При этом совершеннонелишне конструктору уметь водить, а разработчикутехники и программ уметь применятьсредства ИКТ в своей профессии и вне ее.Закрывать глаза на это противоречие, на нашвзгляд, неправильно. Так же как неправильно,копируя модели других предметов, считатьнаш базовый курс облегченным вариантомпрофильного. Это особенность предмета “Информатика”,и эту специфику надо спокойнопринимать и учитывать в своих рассужденияхи действиях.23январь 2012 / ИНФорматика


Базовый курс24январь 2012 / ИНФорматикаВо-вторых, мы рассматриваем известный тезисродоначальника школьной информатикиАнд рея Петровича Ершова “Программирование— вторая грамотность” как призыв к подготовкеширокого круга компьютерных пользователей,потому что в то время программированиебыло единственным способом использованиякомпьютера.В-третьих, после долгих расспросов учителейинформатики мы точно поняли, какая именноинформатика им нужна — разная. Причемне только разная для разных регионов и школ,но порою разная для 9-го “А” и 9-го “Б” в однойшколе. Мы поняли, что учитель информатикидолжен иметь свободу формирования учебногоплана, но при этом он же должен иметь возможностьиспользовать разработанные для негоучебно-методические материалы. Это противоречиеразрешимо.Спроектированный нашим авторским коллективомкомплект учебников для 7–9-х классовосновной школы обладает следующими характеристиками.Модульная структураУчебники состоят из отдельных взаимозаменяемыхмодулей. Для обеспечения их взаимозаменяемостивведен единый квант — восемьуроков. Большинство модулей включают восемьминимально необходимых уроков и восемь дополнительных.Конечно, для полноценного изучениятемы модуля лучше брать все шестнадцатьуроков.Компетентностная ориентацияи разноуровневое обучениеВсе модули нацелены на освоение какихлибоумений, причем умений диагностируемых.В каждых восьми уроках есть две диагностическиеработы: промежуточная на пятом уроке иитоговая на восьмом. Эти работы разделены работойнад ошибками и трехуровневым закреплениемосвоенных умений. Результат промежуточнойдиагностической работы задает уровень,начиная с которого ученик начинает работу надисправлением ошибок и закреплением освоенныхумений.Гибкое сочетание общеобразовательногои предпрофильного содержанияМодули разнесены на две группы, условноназывае мые нами “общеобразовательные” и“предпрофильные и профориентационные”.По нашим замыслам модули из первой группыпредназначены для освоения умений применятьсредства ИКТ в качестве инструмента при достижениисвоих целей. В первую очередь мы хотелибы ориентироваться на применение средств ИКТв универсальных действиях. Новый стандартподсказал нам структуру таких универсальныхдействий:• познавательные (например, поиск информации,моделирование, применение интеллекткарт),• коммуникативные (например, непосредственнаякоммуникация: общение в сети, публичныевыступления, и опосредованная коммуникация:создание печатных, мультимедийных и электронныхизданий),• регулятивные (например, управление личнымипроектами, тайм-менеджмент).Во вторую группу мы выделили модули, относящиесяк следующим темам:• теоретические основы информатики (системысчисления, мат. логика),• программирование (сквозная линия с 7-го по9-й класс),• основы профессионального мастерства(основы дизайна и печати изображений, основыиздательской деятельности, веб-конструирование).Жизненные задачи и проектыОни есть в каждом модуле. Жизненные задачи— это проблемы, с которыми школьники могутстолк нуться в жизни и для решения которых импонадобятся изучаемые знания и умения. Жизненныезадачи оформлены так:НазваниеСитуация. Условия, в которых возникла проблема.Роль. Человек, в роли которого ученики должнысебя представить, решая проблему.Результат. То, что нужно получить в итоге.Под проектами мы понимаем любое самостоятельноедело, которое предполагает оригинальныйзамысел (цель), выполнение работы заопределенный отрезок времени и конкретныйрезультат, представленный в итоге (предметы,сделанные своими руками, мероприя тия, решениепроблемы, результаты самостоятельных исследованийи др.).Мы полагаем, что учебники, разработанные поэтим принципам, будут отвечать положениям новогоФГОС, идеям образовательной системы “Школа2100” и дадут ответы на вопросы, которые ставитперед учителями современная информатика.Наш принцип: все, что вам надо, найдется в нашихучебниках, а если не найдется — скажите нам, имы добавим еще модуль.


Базовый курсО чем это?В статье приведеныматериалы двух первых(и, возможно, самыхсложных — начинатьвсегда сложно) уроковпо теме “Базы данных”.И это все?!Нет. На дискезаписаны базы данных,используемые на этихуроках. Все готово длятого, чтобы взятьматериалы и работать.Тема “Базыданных”: двапервых урокаМы ищем в web-интерфейсе своей электроннойпочты все письма от данного адресата.Результат появляется моментально.Какой вопрос у вас возникает? Как организовываюти хранят большие объемы цифровыхданных так, чтобы их можно было быстрообрабатывать?С.Л. Островский,МоскваПредлагаем вниманию коллег материалыдвух первых уроков по теме “Базы данных” в9-м классе. Отметим, что хотя эти материалысоответствуют параграфам нового учебника,они являются “самодостаточными”. Приведенныев них примеры (их даже можноназвать задачами и задачками — особенно,когда речь пойдет о ключах) можно использовать,по какому бы учебнику (или вообщебез оного ) вы ни работали.Урок 1. Базы данных и системыуправления базами данных.Табличные базы данныхПостановка проблемы урокаМы покупаем билеты на поезд или самолет.Кассир быстро подбирает нам удобныедаты, места, предлагает различные вариантыпересадок.Мы оплачиваем мобильный телефон. Платежныйтерминал сразу после ввода номераобязательно проверит, имеется ли такой номертелефона в принципе, не ошиб лись ли мы.Решение проблемыОрганизовывай и властвуй!Всем нам из жизненного опыта известно,что способ организации любых данных существенновлияет на производительностьих обработки. Если вы знаете, что тетрадкиу вас находятся в левом верхнем ящикестола, дневник там же, учебники — напервой полке книжного шкафа, ручки и карандаши— в пенале, а пенал всегда лежитв первом отделении рюкзачка, вы утромбыстро — за секунды — соберетесь в школу.А вот если минут пять искать нужнуютетрадку, потом еще минут пять дневник,потом… ну, ладно, сегодня не буду братьучебник… пенал, где мой пенал?! — нетвремени, возьму ручку у соседа…А, кстати, куда я задевал летние фотографии?..Эх, надо было сразу сделать папку“Летний поход-2011”… Так нет же, спешил,забросил все фотографии в папку “Мои документы”.И теперь там тысячи картинок сименами, похожими на IMG1234. Сиди часами— перебирай.25январь 2012 / ИНФорматика


Базовый курс26январь 2012 / ИНФорматикаОрганизовывать данные очень важно! Согласны?Как именно следует организовывать данные?А вот на этот вопрос мы не сможем дать однозначногоответа. В зависимости от вида самих данных,от задач, которые придется решать, могут бытьудобны различные способы организации.Например, структура папок на вашем компьютереобразует иерархию. Иерархическая структурадля хранения файлов изначально была придуманапрограммистами. Им просто было так удобно с техническойточки зрения. Это были времена, когдаобычные пользователи и близко не подходили ккомпьютерам — в лучшем случае им разрешалосьпотоптаться у дверей с табличкой “Вычислительныйцентр”. В дальнейшем чисто техническое решениеприспособили и для нужд пользователей.Например, у вас на компьютере имеются папки“Мои документы” и “Мои рисунки”. А в папке “Моирисунки” хорошо было бы сделать папку “Летнийпоход-2011”. Неужели так и сделали? Молодцы!Удобно ли хранить файлы в иерархической структуре?Большинству из нас удобно — мы привыкли кней и приспособились решать возникающие проблемыв ее рамках. А проблемы вполне могут быть.Допустим, у вас уже имеются папки для фотографий“Лето-2011” и “Походы”. И куда положить фотографиилетнего похода?Не стоит ломать над этим голову! Как привыкли— так и делайте. Но важно понимать, что любаяформа организации данных имеет некоторыеограничения, которые можно воспринимать и какнеудобства. Кстати, все эти неудобства/ограниченияобычно можно устранить. Но зачастую лишь засчет усложнения формы организации данных.Вы ведь, конечно, понимаете, что наиболее существеннымявляется именно сам способ организацииданных, а не его физическая реализация?С этой точки зрения нарисованная на листе бумагифайловая структура ничем не отличается от реальнойфайловой структуры вашего компьютера.Только вопрос “куда записать файл?” превратится ввопрос “куда вписать имя файла?”.Таблицы всюдуС представлением информации в табличной формемы имеем дело постоянно. В начальной школе,только изучая таблицу умножения, мы уже прекрасноумели пользоваться таблицей с расписанием уроков,и таблицей-календарем, и таблицей с автобуснымрасписанием. Таблицы всюду! Прежде чем идти дальше,давайте-ка немного “разомнемся”.• Представьте следующую информациюв таб личной форме.Задание 1. У Васи Иванова деньрождения 1 сентября, живет Вася вМоскве, позвонить ему можно по телефону8(495)123-45-67. В Екатеринбургеживет Маша Петрова. Ей можно позвонитьпо телефону 8(343)76-543-21. А 19 октября мы можемпоздравить Машу с днем рождения. По телефону8(846)109-87-65 можно позвонить Денису Сидорову.Судя по коду города в телефонном номере, онживет в Самаре. Когда у Дениса день рождения, мы,к сожалению, не знаем.Задание 2. 1 сентября в 12:00 в кинотеатре шелфильм “Олимпийский мишка”. В зале было всего10 человек. В тот же день после обеда в 16:45 показывали“Смешных ребят”. Народу было уже побольше— 55 человек. Вечернего сеанса 1 сентябряне было, зато он был на следующий день в 19:00.Зал был полон — на фильм “Таблица” пришло 205человек.Справились? Конечно, справились! Ничего сложного!Но все же давайте посмотрим, что у вас получилось.Сравните ваши таблицы и то, что получилосьу авторов учебника.Фами- Имя День Город ТелефонлиярожденияИванов Вася 1 сентября Москва 8(495)123-45-67Петрова Маша 19 октября Екатеринбург8(343)76-543-21Сидоров Денис Самара 8(846)109-87-65Дата Время Название Количествозрителей1 сентября 12:00 “Олимпийский 10мишка”1 сентября 16:45 “Смешные 55ребята”2 сентября 19:00 “Таблица” 205Укажем, на что важно обратить внимание. Во-первых,мы снабдили каждый столбец таблицы заголовком,в котором записали, какую именно информациюмы будем записывать в этот столбец. Далее мы “выуживали”из текста — в данном случае это было не сложно— объекты, о которых идет речь. В первом примереречь шла о людях, во втором — о сеансах в кинотеатре.Информацию о каждом объекте мы записали в однойстроке таблицы. Причем в каждой ячейке мы записывалиинформацию, соответствующую заголовку столбца.Отметим сразу, что нередко одни и те же данныеможно организовать посредством различных таблиц,каждая из которых будет выглядеть вполнеразумно. Например, в первой таблице, возможно,имеет смысл разместить коды городов в отдельномстолбце.Фамилия Имя День Город Код ТелефонрождениягородаИванов Вася 1 сентября Москва 495 123-45-67Петрова Маша 19 октября Екатеринбург 343 76-543-21Сидоров Денис Самара 846 109-87-65


Мы с вами начинаем заниматься изучением базданных. В этой области информатики есть своя терминология,с которой мы познакомимся, но в минимальнонеобходимом объеме. Сейчас как раз такой случай.Давайте запомним, что строки таблицы принято называтьзаписями, а столбцы — полями. Отметим, чтопоследний термин часто используют для обозначенияразличных объектов. Это не ведет к непониманию, новсе же необходимо прояснить этот вопрос.Мы сказали, что полем называют столбец таблицы.Фактически речь идет и о названии столбца, иобо всем столбце целиком, и о каждой конкретнойячейке — тогда говорят о поле конкретной записи.Если имеется риск неточного понимания, то предпочитаютупотреблять точные термины: “названиеполя” — о заголовке, “поле записи” — о ячейке.Если из контекста понятно, о чем идет речь, можнопросто употреблять слово “поле”.Мы начали с обсуждения вопроса о том, что способорганизации данных крайне важен для их эффективнойобработки. Поскольку сейчас мы говоримо таблицах, вы наверняка уже сделали вывод (правильный!),что мы будем рассматривать именно табличнуюорганизацию данных. Конкретнее — базыданных, в которых данные организованы в таблицы.В настоящее время именно табличные базы данныхнаиболее распространены. О самом термине “базаданных” мы поговорим далее в этом параграфе.Но это же не всегда может быть удобно, скажетевы. Согласимся — не всегда. Но опять же вспомнимто, о чем мы уже говорили, — всякая форма организацииданных имеет свои преимущества (удобства)и недостатки (неудобства). Таблицы — достаточноудобная и универсальная форма организации данных.С помощью таблиц можно представить данныедаже очень сложной структуры. Правда, иногдапридется хорошенько подумать — как именно.Но это ведь и интересно!Не все то таблица…Всякую ли таблицу, нарисованную от руки на листебумаги или даже расчерченную в текстовом редакторе,можно использовать для хранения информациив базе данных? Увы — нет. Имеется немалотребований к таблицам баз данных. Большую частьэтих требований мы рассмотрим на следующих уроках(эти материалы не вошли вжурнальную статью), а самыеосновные — прямо сейчас.Итак. Во-первых, все записидолжны состоять из одногои того же набора полей.Порядок следования полейтоже, разумеется, должен бытьединым. (Чувствуете, как мысразу перешли на использованиетерминологии — записи,поля. Привыкайте!)Может ли так случиться, чтоу какой-то записи нет того илииного поля? Ответ: нет, не может!Другое дело, что мы можемне знать значение в этом поле, иего придется оставить пустым. Но просто “выбросить”поле нельзя. В текстовом редакторе, например, можнотакже “объединить ячейки” в таблице, но такие таблицыне годятся в качестве таблиц баз данных.Во всех записях в одном и том же поле должнынаходиться данные одного и того же вида. Вы ведьуже изучали основы программирования? Тогдаскажем точнее: во всех записях в одном и том жеполе должны находиться данные одного и тогоже типа. Конкретный набор допустимых типовданных обычно определяется используемой системой— где-то больше, где-то меньше. Основныетипы — числа и строки символов имеются в любойсистеме. Практически в любой системе имеютсятакже специальные типы для хранения значенийдаты и времени.Поясним это требование примером того, какнельзя. Допустим, мы храним в поле “Оценка”…оценку, что же еще в нем хранить? Если мы хранимоценки в виде чисел, то всюду и надо использоватьименно числа.Фамилия Имя ОценкаИванов Вася 4Петрова Маша 5Сидоров Денис ПятьЕсли бы мы (хотя это жутко неудобно!) решилихранить оценки в виде слов (строк), то ошибочнымибыли бы, напротив, данные в первых двухстроках.К последнему требованию примыкает ещеодно — в каждом поле может быть записано неболее одного данного. В частности, две следующиетаблицы с этой точки зрения являются неправильными.Фамилия Имя ТелефонИванов Вася 123-45-67 (д.), 765-43-21 (м.)Дата Время Название1 сентября 12:00, 14:00 “Олимпийский мишка”• “Почините” несколько таблиц. Способ ремонтав каждом случае выбирайте сами — может быть,придется заводить новые поля.Фамилия Имя День рождения Город ТелефонИванов Вася 1 сентября Москва 8(495)123-45-67 (д.),8(926)007-07-07 (м.)Петрова Маша 19 октября Екатеринбург 8(343)76-543-21Сидоров Денис Не знаю Самара 8(846)109-87-65Дата Время Название Количество зрителей1 сентября 12:00, 16:00 “Олимпийскиймишка”Утром — совсем мало,человек 10, во второйполовине дня побольше — 301 сентября 16:45 “Смешныеребята”552 и 3сентября19:00 “Таблица” 205 и 200 человексоответственно27январь 2012 / ИНФорматика


Базовый курсПроверим на всякий случай, что получилось увас и авторов? Это интересно, поскольку решенияне являются однозначными!При починке первой таблицы понятно, что “Незнаю” надо просто убрать. А вот с телефонами невсе так просто. Можно предложить два варианта.Первый — очевидный.Второй вариант починки первой таблицы менееочевидный. Но многие специалисты сделали быименно так.Результат ремонта второй таблицы выглядит однозначно.интересуют — их может быть много, мало или небыть вообще.Для удобства и компактной записи структуру таблицынередко представляют в виде перечня полей.В частности, структуру последней рассмотреннойвыше починенной таблицы можно записать так:Фамилия Имя День Город Телефон Телефонрождениядомашний мобильныйИванов Вася 1 сентября Москва 8(495)123-45-67 8(926)007-07-07Петрова Маша 19 октября Екатеринбург 8(343)76-543-21Сидоров Денис Самара 8(846)109-87-65ДатаВремяНазваниеКоличествозрителейС системой управлениябазами данныхмы пока не работали,с ней мы познакомимсядалее. СУБД — компьютерная программа,предназначенная для того, чтобы базу данных можнобыло хранить и обрабатывать в компьютерномФамилия Имя День ГородТелефон Тип телефонарождениядомашнийИванов Вася 1 сентября Москва 8(495)123-45-67 ДомашнийИванов Вася 1 сентября Москва 8(926)007-07-07 МобильныйПетрова Маша 19 октября Екатеринбург 8(343)76-543-21 ДомашнийСидоров Денис Самара 8(846)109-87-65 Домашнийвиде.Одну и ту же базуданных можно представитьв компьютерномвиде припомощи различныхСУБД. Можно даже использоватьобычныйтекстовый документc таблицами. Тольков таком случае данныебудет не слишкомудобно обрабатывать. А именно удобство и скоростьобработки данных — важные функции СУБД.28январь 2012 / ИНФорматикаДата Время Название Количество зрителей1 сентября 12:00 “Олимпийский мишка” 101 сентября 16:00 “Олимпийский мишка” 301 сентября 16:45 “Смешные ребята” 552 сентября 19:00 “Таблица” 2053 сентября 19:00 “Таблица” 200БД и СУБДВы наверняка уже поняли — хотя бы прочитавназвание этого параграфа, что за аббревиатурами“БД” и “СУБД” скрываются термины база данных исистема управления базами данных. А вообще —различаются ли эти понятия? Ведь их так часто путают!Ответ: различаются.Давайте договоримся, что мы будем пониматьпод указанными понятиями. Базой данных мы будемназывать организованную совокупность цифровыхданных. В этом параграфе мы обсуждалиорганизацию данных в виде таблиц. Сами данныетакже, разумеется, включаются в базу данных, нонаиболее важным является именно сам способ ихорганизации. Нередко используют термин структура,под которым понимают именно способ организацииданных в чистом виде. Когда говорято структуре таблицы, то говорят, например, о названияхи типах полей, а сами записи при этом неИнформационныесистемы (ИС)Термин “информационныесистемы”широко распространен.Так часто называютразнообразныекомплексы программных, аппаратных и иных (например,организационных) средств, обеспечивающихобработку данных. Как соотносятся между собойбазы данных (БД), системы управления базамиданных (СУБД) и информационные системы (ИС)?В достаточно упрощенном виде схему их взаимодействияможно представлять следующим образом:ИССУБДБД


Для компьютерной реализации базы данныхтребуется система управления базами данных.И именно с этой системой взаимодействует информационнаясистема, которой требуется использоватьресурсы базы данных.Мы назвали схему достаточно упрощенной попричине того, что одна СУБД может управлять множествомбаз данных и одна информационная систематоже может использовать ресурсы несколькихбаз данных. Например, информационная системапо продаже авиабилетов может использоватьмножество баз данных авиакомпаний, каждая изкоторых может обслуживаться собственной СУБД.Но на принципиальном уровне эта схема отражаетсуть взаимодействия.Приведем более точную схему, отражающую отношениямежду понятиями ИС, СУБД и БД. В этойсхеме учтены указанные выше обстоятельства —ИИС может использовать ресурсы различных БД,каждая из которых может обслуживаться собственнойСУБД.СУБДБДБДБДИСБДБДБДСУБДПрименение ЗНАНИЙ• Представьте следующую информацию в табличнойформе. Позаботьтесь о том, чтобы таблицабыла правильной в рассмотренном выше смысле.Постарайтесь предложить несколько вариантовтаб личного представления данных.1 сентября Вася сходил на фильм “Новый учебныйгод”. Причем фильм так понравился Васе, что,посмотрев сеанс в 16:00, он сразу же пошел нафильм еще раз. Следующий сеанс был в 18:00. Наследующий день Миша по рекомендации Васи тожезахотел посмотреть “Новый учебный год”. Но билетовна сеанс 16:00 уже не оказалось. Миша сразу купилсебе билеты на сеанс в 18:00, а чтобы не терятьвремени даром, в 16:00 посмотрел фильм “Таблицавозвращается”. Оба фильма Мише понравились.4 сентября Вася по рекомендации Миши посмотрелфильм “Таблица возвращается”. Билеты были толькона сеанс 20:00. Может быть, оттого, что было ужепоздновато, но фильм Васе совсем не понравился.7 сентября товарищи пригласили одноклассницуМашу и втроем сходили на фильм “Абак”. Машеочень понравился фильм, а Васе с Мишей — нет.Урок 2. Ключевое понятие — ключПостановка проблемы урокаДопустим, у нас в классе учатся не просто однофамильцы,а полные тезки. Как учителя различаютих в журнале?Так ведь в журнале, помимо фамилии и имени,имеется номер ученика! Вот и договариваются,кто из них какой номер имеет. Так и различают.Решение проблемыСУБДОБОБЩЕНИЕ НОВЫХ ЗНАНИЙОрганизация данных существенно влияет напроизводительность их обработки. И эффект этотпроявляется тем сильнее, чем больше объемыданных. Мы будем заниматься знакомством с технологиямихранения и обработки больших объемовданных при помощи табличных баз данных.Строки таблиц называют записями, столбцы —полями. Не всякая таблица, которую можно нарисоватьна бумаге, может быть таблицей базы данных.В частности, необходимо, чтобы все запи сисостояли из одного и того же набора полей, чтобыв одном и том же поле в различных записях находилисьданные одного и того же типа, а в каждомполе было записано только одно данное. Системыуправления базами данных представляют собойкомпьютерные программы для работы с базамиданных.СУБД OpenOffice BaseПрошлый урок мы закончили на том, что пообещалиот “слов” — тетрадки — перейти к “делу” —компьютеру и познакомиться с системой управлениябазами данных. Начиная с этого урока, мыбудем решать задачи и выполнять упражнения вСУБД OpenOffice Base. Знакомиться с системой мыстанем постепенно. Сегодня — просто “поздороваемся”и поработаем с уже заготовленной заранеебазой данных, для того чтобы разобраться с важнейшим,ключевым понятием — ключом. Поэтомуи база данных, с которой мы будем работать, называется“Ключи”.Нет одинаковым строкам в таблицах!На прошлом уроке мы говорили о том, что невсякая таблица, которую можно нарисовать набумаге или набрать в текстовом редакторе, можетбыть таблицей базы данных. Это был разговор отом, “как нельзя”. На бумаге — можно, а в базе данных— нельзя. К сожалению, рассмотренными ра-29январь 2012 / ИНФорматика


Базовый курсВыделив имя таблицы, можно сразу в окне просмотраувидеть ее структуру. Вам требуется просмотретьтаблицы и для каждой решить: есть ли вней одно-единственное поле, значения в которомгарантированно будут различными, тот самый простойключ.Пожалуйста, вдумывайтесь каждый раз — “о чемэта таблица”, какие именно значения предполагаетсяв ней хранить. Обращайте внимание на названиятаблиц.Для удобства работы таблицы пронумерованы.По ходу просмотра таблиц, пожалуйста, оставляйтезаписи в тетрадке: таблица такая-то, простой ключтакой-то; таблица такая-то, простого ключа нети т.п. Не спешите, нет необходимости успеть просмотретьвсе таблицы.Справились? Давайте сравним ваши результатыи то, что получилось у авторов. Это интересно!Таблица “01 Список класса”Номер ученика Фамилия Имя Дата рождения30январь 2012 / ИНФорматиканее “нельзя” дело не ограничивается. В частности,есть еще одно важное ограничение: в таблицах базданных не может быть полностью одинаковыхстрок. Нам ничего не мешает напечатать такуютаб лицу в учебнике:Фамилия Имя Дата рожденияИванов Петя 1.09.1999Иванов Петя 1.09.1999Но в таблицу базы данных такие две одинаковыестроки записать нельзя!Почему? Посудите сами — как компьютер, системауправления базами данных будет различатьнаших Петь?Простой ключИтак, любые две строки в таблицах баз данныхобязательно отличаются, по крайней мере значениемкакого-то одного поля. Часто бывает так, чтоможно точно указать одно конкретное поле таблицы,значения в котором гарантированно различаютсядля всех записей. Такое поле называют простымключом. При этом не имеет значения, чтоименно сейчас содержится в таблице. Важно именно,что в принципе может в ней содержаться. Например,то, что у нас в данный момент в классе нетоднофамильцев, не значит, что их никогда не былои никогда не появится в будущем.• Поработаем с базой данных “Ключи”. В нейимеется несколько различных таблиц, между ниминет никаких связей — каждая таблица сама по себе.Это задание нам кажется простым. Мы ведь ужене раз подступались к нему на уроке. Номер ученикаи является тем самым простым ключом — именнов этом поле значения точно не могут повторяться.Обратите внимание: обнаружив простой ключ,мы его подчеркнули. Мы и далее будем так делать,но точный смысл подчеркивания поясним позже вэтом параграфе.Таблица“02 Минимумы и максимумы температур”ДатаМинимальнаятемператураМаксимальнаятемператураВ данном случае простым ключом является полеДата. Нет возражений?Таблица “03 Мои результаты”ДистанцияВремяАвторы склонны думать, что ни одно из полейэтой таблицы нельзя считать простым ключом.Действительно, одну и ту же дистанцию можно пробежатьнесколько раз, да и время одно и то же вполнеможно показать. Например, бегали вы раньше100 м за некоторое время, а потом хорошенько потренировалисьи стали за то же время бегать 110 м.Почему нет?Таблица “04 Мои лучшие результаты”ДистанцияВремяА вот тут ситуация иная! Ведь лучший результатточно только один для данной дистанции! Поэтомуполе Дистанция — простой ключ.Таблица “05 Мои расходы”Дата Назначение СуммаАвторы учебника считают, что в этой таблице поля,которое можно было назвать простым ключом, нет.Почему? Можем ли мы считать таковым поле Дата?


Нет — вполне можно несколько раз потратиться в течениедня. Поле Назначение? Тоже нет — ничего немешает нам купить, например, две ручки. Поле Сумма?И здесь ответ отрицательный — даже тетрадка имороженое могут стоить одинаково.Таблица “06 Регионы”Код регионаНазваниеКоды регионов России знают все — эти числаимеются, например, на автомобильных номерах.То, что сам по себе Код региона является простымключом, достаточно очевидно. А вот что можносказать о поле Название? Вполне возможно, чтокто-то отметил именно это поле. Правильно ли это?Оказывается, это зависит от того, как именно мысмотрим на таблицу “Регионы”. Если мы подумали,что речь идет только о регионах России, то и полеКод региона, и поле Название могут быть ключами!Если речь идет о перечислении регионов нашейстраны, то и в одном, и в другом поле содержатсяуникальные и не повторяющиеся значения.А вот если кто-то подумал, что речь идет о кодахрегионов на автомобильных номерах, ситуацияиная. Тогда Код региона по-прежнему простойключ, а вот Название — нет! Все ведь знают, что когдаавтомобильные номера в крупных регионах стализаканчиваться, этим регионам выдали дополнительныекоды для автомобильных номеров. Например, вМоскве это и 77, и 97, и 99, и 177, и 197, и 199.Это очень важно! Является то или иное полепростым ключом или нет, зависит от содержательнойсущности таблицы! Сами по себе значениямало что значат — важно, что мы знаем отом, какими они могут быть.Таблица “07 Номера машин”Три цифры Три буквы Код региона МаркаТе же рассуждения справедливы и для поляE-mail. Электронные адреса бывают разными —бывают адреса людей, а бывают адреса организаций.Если мы считаем, что каждый человек имеетсвой личный уникальный электронный адрес, то иполе E-mail можно считать простым ключом.Таблица “09 Книга”НомерстраницыКоличествосимволовКоличествословКоличествознаковпрепинанияЗдесь поле Номер страницы является простымключом, и обсуждать, пожалуй, нечего. Нет возражений?Таблица “10 Мои прогулы”ДатаНомер урокаВо-первых, прогуливать нехорошо! Можно дажесказать, что прогуливать нельзя! Но… со всеми бывает.Можно ли назвать простым ключом какое-то однополе в этой таблице? Увы, нет. И в один день можнонесколько уроков прогулять, и один и тот же урокможно прогулять в различные дни. Но это нехорошо!Таблица “11 Мои оценки”Дата Номер урока ОценкаНи одно из полей в этой таблице нельзя назватьпростым ключом. Согласны?Таблица “12 Наши учителя”Фамилия Имя Отчество ПредметИ в этой таблице ни одно из полей нельзя назватьпростым ключом. В каждом из них вполнемогут повторяться значения.Таблица “13 Футбольный турнир”Дата Команда 1 Команда 2 СчетНи одно из полей этой таблицы нельзя назватьпростым ключом. Согласны?Таблица “08 Мои друзья”Фамилия Имя Телефон E-mail Дата рожденияЭто очень интересное задание! Результаты еговыполнения в классе вполне могут оказаться различными.И каждый из этих результатов может оказатьсяправильным! Вот как!Давайте разберемся. С полями Фамилия, Имя,Дата рождения все понятно. Их нельзя назватьпростыми ключами. Понятно почему? А вот с полямиТелефон и E-mail не все так очевидно. В нашевремя мобильные телефоны есть практически укаждого. И когда мы звоним на мобильный, мызвоним именно конкретному человеку. То естьможно считать, что если мы имеем в виду номермобильного телефона, то он для каждого свой, идва разных человека не могут иметь один и тот женомер. Значит, поле Телефон можно будет считатьпростым ключом.Скорее всего простого ключа в этой таблице нет.По крайней мере авторы ни одно из полей таковымне считают. Хотя… надо бы поподробнее знать обособенностях данного турнира. Вдруг, допустим, в течениеодного дня может состояться только один матч.Тогда поле Дата будет простым ключом.Таблица “14 Температуры”Дата Время ТемператураМожет быть, кто-то подумал о собственных температурах?Авторы-то имели в виду, например, данныеметеостанции — измерения температуры воздуха.В любом случае ни одно из полей тут нельзясчитать простым ключом.Таблица “15 Шахматная партия”Номер ходаХодНу, наконец-то! А то в предыдущих примерахслишком долго мы не могли найти простой ключ.Здесь же все очевидно.Таблица “16 Шахматный турнир”Номер партии Номер хода Ход31январь 2012 / ИНФорматика


Базовый курс32январь 2012 / ИНФорматикаА вот опять простого ключа нет! Понятно, что иномера партий, и номера ходов, и сами ходы могутповторяться.При выполнении упражнения и в ходе обсужденияего результатов мы искали в таблицах одноединственноеполе, которое можно было назватьпростым ключом. Почему простым? Что, бываютсложные? Нет, сложных не бывает. Помните изматематики: бывают простые числа, а бывают…составные. Вот составными ключами мы далее изаймемся.Составной ключДо сих пор мы искали одно-единственное поле,значения в котором гарантированно не могут повторяться.И не всегда находили. Но можно не ограничиватьсялишь одним полем, а искать комбинациюполей, сочетание которых гарантированнобудет уникальным. Правда, здесь необходимы уточнения.Если, например, мы возьмем простой ключи добавим к нему любые поля, то получим ту самуюуникальную комбинацию. Понятно почему? Эточисто формальное и довольно бессмысленное действие.Интересно искать такие комбинации полей,из которых нельзя убрать ни одного поля без потериуникальности. Если такую комбинацию полейудается найти, ее называют составным ключом.• Давайте еще раз просмотрим таблицы базыданных “Ключи”. Те таблицы, в которых мы нашлипростые ключи, нас уже интересовать не будут.А вот для остальных таблиц мы попробуем найтисоставной ключ.Сверим результаты?Таблица “03 Мои результаты”ДистанцияВремяВ этой таблице два поля, и ранее мы не нашли вней простого ключа. Есть ли здесь составной? Авторыучебника, исходя из своих представлений отом, что именно может храниться в этой таблице,думают, что нет.Таблица “05 Мои расходы”Дата Назначение СуммаЕсли мы хотим найти составной ключ, надо посмотретьна пары полей и на все три поля вместе.Можно ли какую-то пару считать уникальной? Авторыучебника думают, что нет. А все три поля вместе?Тоже нет. В один и тот же жаркий день вполнеможно дважды купить одно и то же любимое мороженое.И, надеемся, стоить оно будет при этомодинаково.Таблица “07 Номера машин”Три цифры Три буквы Код региона МаркаВ данном случае ответ на вопрос, сформулированныйв задании, нам известен из жизни. Автомобильныеномера, представляющие собой комбинациюиз трех цифр, трех букв и кода региона, являютсяуникальными. И ни одно из указанных полейнельзя “выкинуть”. Значит, мы нашли составнойключ!Таблица “08 Мои друзья”Фамилия Имя Телефон E-mail Дата рожденияСитуацию с этой таблицей мы подробно обсудилипри разборе результатов выполнения второгозадания. Вполне вероятно, что при каких-то допущениях— знаниях о том, какие именно данныехранятся в таблице, какое-то одно из полей в нейможно считать простым ключом. Но если мы так несчитаем, то и комбинация полей нам не поможет.Таблица “10 Мои прогулы”ДатаНомер урокаНе знаем, как дважды войти в одну и ту жереку, — это вопрос не нашего предмета, но дваждыпрогулять один и тот же урок в один и тот же деньточно нельзя. Поэтому комбинация двух полей являетсясоставным ключом.Таблица “11 Мои оценки”Дата Номер урока ОценкаОчень интересное задание с точки зрения поискасоставного ключа! Есть он или нет, зависит от…инструкций Министерства образования. Вот как!Почему? Дело в том, что важным здесь является то,можно ли выставлять в одну клеточку журнала болееодной оценки. Если нет — комбинация полейДата+Номер урока является составным ключом.Если разрешается — не является! Честно говоря,четких инструкций на эту тему нет. Из жизни мызнаем, что на одном уроке вполне можно получитьнесколько оценок, а на некоторых предметах этовообще обычное дело. (На каких?) Если исходитьиз этого, комбинация Дата+Номер урока не являетсясоставным ключом.Таблица “12 Наши учителя”Фамилия Имя Отчество ПредметНу, нет здесь составного ключа, нет.Таблица “13 Футбольный турнир”Дата Команда 1 Команда 2 СчетЭта таблица — довольно любопытный случай.Можно ли считать комбинацию полей Дата + Команда1 + Команда 2 составным ключом, зависитот наших знаний о данном турнире. Могут ли двекоманды играть в день более одного матча? Здравыйсмысл подсказывает, что нет. А если могут, тоэто не составной ключ.Таблица “14 Температуры”Дата Время ТемператураКлассический пример составного ключа.Таблица “16 Шахматный турнир”Номер партии Номер хода Ход


И еще один столь же классический пример.Простые ключи, составные ключи, простоключиМы дважды прошлись по набору предложенныхтаблиц. В первый раз мы искали только простыеключи. Во второй раз — составные ключи. Вообщеговоря, большой разницы между ними нет, и частоиспользуют один термин ключ, под которым понимаюти простые, и составные ключи. Кстати, как выдумаете, может ли одна таблица иметь и простые, исоставные ключи?Ответ — может. Например, таблица“Граждане страны”ИНН Фамилия Имя Серия Номерпаспорта паспортаИмеет простой ключ ИНН — значение ИННуникально для каждого гражданина страны.Но в ней также имеется составной ключ Серияпаспорта+Номер паспорта — их комбинациятакже уникальна. И простой ключ, и составнойключ — ключи данной таблицы.В общем случае — и мы это видели на примерах— в таблице может быть несколько простыхключей и несколько составных ключей. То есть втаблице может быть несколько ключей.Ключей — много, золотой (первичный) —одинСреди всех возможных ключей таблицы обязательновыбирают один-единственный, который называютпервичным. Выбор первичного ключа — дело проектировщика.Именно про первичный ключ таблицыпроектировщик сообщает СУБД — о первичном ключезнает не только человек, но и компьютерная программа.Кстати, обычно СУБД “жестко требует”, чтобыв таблице был указан первичный ключ, и не даетсоздать таблицу без первичного ключа.Подчеркиванием, которое мы использоваливыше, принято обозначать именно первичныйключ. А поля, входящие в состав первичного ключа,часто называют ключевыми полями. Словосочетание“ключевое поле” широко используется, нообращаться с ним следует осторожно. Например,если мы говорим, что данное поле является ключевым,то этим утверждается, что поле входит всостав первичного ключа, но ничего не говоритсяо том, является данный ключ простым или составным— есть ли еще ключевые поля в таблице.Добавляем ключ. При необходимостиВо всех ли рассмотренных выше таблицах мы обнаружилиключи? Нет. А как быть с таблицами, вкоторых мы пока не нашли ни простого, ни составногоключа? Нет ли здесь противоречия? Ведь в таблицебазы не должно быть повторяющихся строк!Значит, уж комбинация всех полей-то должна бытьсоставным ключом. Что-то мы запутались!В этом месте любой специалист в области проектированиябаз данных с удовольствием пришел бынам на помощь. И сказал бы он примерно следующее.Проблема ваша (наша) в том, что вы искали втаблицах так называемые “естественные ключи” —те, наличие которых обусловлено смыслом хранимыхданных. А таких ключей может и не быть.Посмотрим на “проблемную” таблицу.Таблица “03 Мои результаты”ДистанцияВремяКогда мы смотрим на таблицу, в которой не получаетсявыделить ключ, вопрос, на который намнужно ответить: а могут ли строки в этой таблицеповторяться с содержательной точки зрения? В базуданных нам точно не удастся занести повторяющиесястроки, это мы уяснили. Но если бы мы использовалиту же таблицу практических целей длязаписей в тетрадке. Может ли возникнуть необходимостьзанести в нее одинаковые строчки?Применительно к этой таблице ответ: скорее —да. Действительно, вполне может быть так, что мыфиксируем свои результаты и несколько раз показываемодин и тот же результат. Что бы мы сделалив тетрадке? Скорее всего мы бы нумеровали записи.Даже если бы мы это не делали явно, сам порядокзаписей — уже нумерация. Но большинство быставило номера записей:1. 100 м 15 с2. 110 м 18 с3. 100 м 14,8 сЕсли с содержательной точки зрения в таблицемогут повторяться строки, то необходимо завестиспециальное поле, которое было бы ключом иобеспечивало уникальность записей. Ровно так,как мы сделали бы в тетрадке. То есть в рассматриваемуютаблицу надо добавить, например,поле Номер записи.Таблица “Мои результаты”Номер записи Дистанция ВремяРассмотрим оставшиеся таблицы.Таблица “05 Мои расходы”Дата Назначение СуммаИ снова надо добавить такое же поле.Таблица “Мои расходы”Номер записи Дата Назначение СуммаТаблица “08 Мои друзья”Фамилия Имя Телефон E-mail ДатарожденияИ снова то же решение! Смотрите, как часто оноиспользуется!Таблица “Мои друзья”НомерзаписиИмяФамилияТелефонE-mailТаблица “11 Мои оценки”Дата Номер урока ОценкаДатарождения33январь 2012 / ИНФорматика


Базовый курсЕсли мы исходим из того, что комбинация полейДата + Номер урока не является составнымключом, надо добавлять ключевое поле — вариантовнет.Таблица “Мои оценки”Номер записи Дата Номер урока ОценкаТаблица “12 Наши учителя”Фамилия Имя Отчество ПредметИ здесь тоже надо добавлять поле простого ключа.НомерзаписиТаблица “Наши учителя”Фамилия Имя Отчество Предметданных “Ключи”, которая рассматривалась выше,в базе “Ключи1” имеются не связанные между собойтаблицы. Дети должны в процессе обсуждения,исходя из знаний, здравого смысла, разумных допущений,возможно используя дополнительныеисточники информации, установить наличие илиотсутствие естественных ключей (простых из составных)в таблицах.Отметим, что ряд заданий достаточно сложны идаже не имеют однозначного ответа — в зависимостиот сделанных допущений, можно сделать различныевыводы.Вершины мираТаблица “13 Футбольный турнир”Дата Команда 1 Команда 2 СчетИ здесь. Хотя, конечно, два раза в день играть…Но если считать, что такое может случиться, надопредусмотреть и такой случай.НомерзаписиТаблица “Футбольный турнир”Дата Команда 1 Команда 2 СчетОбратите внимание, как часто нам пришлось добавлятьключи!Отметим в заключение, что нередко ключ добавляюти в таблицы, в которых ключи есть. Это чистотехнический вопрос, но мы кратко его обозначим.Если ключ составной и длинный, то для повышениябыстродействия обработки данных может быть целесообразнодобавить простой ключ.С точки зрения географа, парой широта и долготаможно однозначно определить гору, то естьих можно было бы сделать составным ключом,если бы не было особенностей представлениявещественных чисел. Особенность заключаетсяв том, что вещественные числа на различныхкомпьютерах представляются по-разному, с разнойстепенью точности. Поэтому, с точки зренияпроектировщика баз данных, в этой таблицеключей нет.Встречи34январь 2012 / ИНФорматикаОБОБЩЕНИЕ НОВЫХ ЗНАНИЙВ таблицах баз данных не может бытьповторяю щихся строк — любые две строки обязательнодолжны различаться значением хотя быодного поля. Поле или совокупность полей, которыедля любых двух строк таблицы гарантированноразличаются, называются ключом даннойтаблицы. Если ключ состоит из одного поля, егоназывают простым, если из нескольких полей —составным. В составном ключе не должно бытьполей, которые можно было бы исключить безпотери свойства уникальности. Среди всех ключейвыделяют один, о котором сообщают СУБД.Этот ключ называют первичным. Поля, входящиев состав первичного ключа, называют ключевыми.Если среди полей в таблице не удается обнаружитьестественного ключа, ключ приходитсядобавлять...Дополнительные задачи на выявлениеестественных ключейДля практики на уроках дополнительно предлагаетсябаза данных “Ключи1.odb”. Как и в базеКлючей нет, так как в один и тот же день, в однои то же время может быть назначена встреча с двумялюдьми с одинаковыми именами.ГолыКлючей нет, так как один игрок может в течениеминуты забить несколько голов. Если в таблицу добавитьполе секунды, то можно было бы получитьсоставной ключ из всех полей таблицы.


Ежедневникв одной области знаний двух ученых с одинаковымиименами. С этой точки зрения в таблиценет ключа.Планеты Солнечной системыКлючей нет, так как в один год, один месяц, одногочисла может делаться сразу несколько дел.Загруженность дорогНазвание каждой планеты уникально, поэтомуего можно выбрать в качестве простого ключа.Правильные многогранникиЭто задача по мотивам сервиса “Яндекс-пробки”.Если под баллом понимать среднюю загруженностьдорог в данный момент времени данного дня недели,то в этой таблице имеется составной ключ.Мобильные телефоныМодель+производитель может быть составнымключом.НебоскребыЭто очень нетривиальная математическая задача.Понятно, что название правильного многогранникауникально и может быть простымключом. Но простыми ключами также могутбыть число граней и число вершин. Подтверждениеэтому можно увидеть в любом справочникепо математике.СозвездияНазвание+страна+город может быть составнымключом.Нобелевские лауреатыПоиск ключей в этой таблице может потребоватьзнакомства с вопросом. В результате этогознакомства выяснится, что и русское, и латинскоеназвание, и сокращенное обозначение могут бытьпростыми ключами.Спутники планет Солнечной системы35Если подходить к вопросу формально, то возможнаситуация получения премии в один год,Названия двух спутников для разных планет могутсовпадать. Названия планет всегда уникальны,поэтому можно в качестве составного ключа взятьназвание+планета.январь 2012 / ИНФорматика


Базовый курсТаблица МенделееваЧаты службы поддержкиС содержательной точки зрения в качестве простогоключа можно выбрать любое из полей: обозначениеэлемента, атомная масса, номер элемента.Это следует из самого способа построениятаблицы. Из практических соображений дробныеатомные массы делать ключами неудобно.Строка+столбец также однозначно определяютэлемент, поэтому их можно выбрать в качестве составногоключа.ТрамплиныЭто весьма специфическая задача. Некоторыесайты имеют службу поддержки в виде on-line-чата.Обычно по завершении чата пользователь может оценитьработу специалиста. Ключа в этой таблице нет —специалист службы поддержки может общаться сразус несколькими клиентами в окне чата, поэтому возможносовпадение сразу трех полей. Следовательно,ни простых, ни составных ключей у таблицы нет.СловарьС формальной точки зрения возможно совпадениедвух записей по всем пяти полям, поэтому дажесоставной ключ найти невозможно. На практикетаких совпадений пока не случалось.В качестве составного ключа можно выбратьанглийское слово и его перевод. Если вам удастсяпривести контрпример, авторы будут вам благодарны(эта задачка часто бывает головоломной —многим кажется, что контрпример есть, но пока егоникто не привел).36январь 2012 / ИНФорматика


37январь 2012 / ИНФорматика


семинарО чем это?О! В двух словах описатьсложно . Вкратце:Google придумал новыйязык программирования,а наш автор Иван Сукиниз замечательного городапрограммистовПереславля-Залесскогопопробовал в немразобраться. У Иванатополучилось, нопредупреждаем сразу —в целом статья сложная.Однако ее можночитать, простопропуская все сугуботехнические места —все равно интересно.И это все?Нет. На диске имеютсяпримеры программы дляначального знакомствас языком Dart.38январь 2012 / ИНФорматикаИ.А. СукинDart, или Кудацелится GoogleО “зачинщиках” и их мотивахDart — это новый язык программирования,предложенный компанией Google дляупрощения веб-разработки и преодоленияфундаментальных недостатков существующих решений. В силу значительной известностии неординарности этой корпорациибыло бы просто неприлично оставитьописание этого языка без небольшойпредыстории.Немного историиАмериканская компания Google, известнаярядовому пользователю Интернета своейпоисковой системой, почтовым сервером,“ультрабыстрым” браузером и надоедливойконтекстной рекламой (а также, в последнеевремя, новой социальной сетью), популярнасреди программистов еще по несколькимпричинам. Google — корпорация, старающаясябыть на переднем крае инноваций,сама создающая их, следующая принципу,озвученному в свое время Аланом Кэем 1 :1По иронии судьбы Алан имеет косвенное, нозначительное отношение к предмету статьи.“Лучший способ предсказать будущее — изобрестиего самому”. Google не боится экспериментироватьи отбраковывать результатынеудачных экспериментов, среди сотрудниковкомпании подобное качество ценится,пожалуй, превыше всего. Эта статья об одномиз подобных экспериментов.В последние годы еще одним хоббиGoogle стало “коллекционирование” разработчикови дизайнеров языков программированияи операционных систем, техлюдей, которых в англоязычной литературеназывают емким словом “masterminds”.Среди них такие известные люди, как РобПайк, стоявший у истоков Unix и Plan 9, КенТомпсон, один из создателей такого известногоязыка, как Си, и Гвидо ван Россум, авторязыка Python, на котором основана значительнаячасть современных веб-сервисовGoogle. Засветился также Джеймс Гослинг,создавший в начале 90-х годов невероятнопопулярный сегодня язык Java. В дальнейшемя вернусь к этому хобби Google, потомучто с ним тесно связаны имена “виновниковторжества”.Поскольку речь пойдет о новом языкепрограммирования, а эта практика вGoogle имеет прецеденты, было бы нелишнесказать пару слов о предыдущемподобном опыте и попытаться экстраполироватьего на то, что мы имеем сейчас. ВышеупомянутомуРобу Пайку, являющемуся


одним из апологетов старой школы UNIX-систем,во время его работы в Google было предложеноразработать язык программирования, которыйсмог бы заменить Си в привычной для последнегонише — системном программировании, с учетомвсех современных принципов разработки вычислительныхсистем, главный из которых — мультипроцессорностьи многопоточность, параллелизация.Пайк уже пытался осуществить подобное, являясьчленом команды по проектированию языков Alefв Plan 9 и Limbo в операционной системе Inferno(причиной низкой популярности обоих языков отчастиявляется низкая популярность их программныхплатформ), поэтому задача была для негосравнительно простой. В команде с Робертом былтакже Кен Томпсон, один из авторов Си, как никтодругой знающий недостатки своего детища. Новыйязык, названный Go, увидел свет в 2009 году и имелдействительно серьезные возможности обставитьСи. Однако этого не произошло. Одним из главныхвиновников этого является консервативностьпрактической информатики, вытекающая из большихобъемов уже существующего кода, которыйникому не хочется переписывать (а потом еще иотлаживать) заново и на новом языке. Посколькукакой-либо другой серьезной цели, кроме заменыСи в качестве языка для системного программирования,у Go не было, он завис в воздухе, и в настоящеевремя его положение не совсем ясно.Возможно, причиной низкой популярности Go являетсяи то, что область проектирования операционныхсистем и среднеуровневых языков пока не слишкомблизка Google (а в 2007 году это было для них вообщев новинку), и “первый блин вышел комом”. Какбы то ни было, компания сильно не расстроилась ипродолжила экспериментировать. Здесь мы уже подходимк объекту нашей статьи — языку Dart.Обновленный вебВ 2011 году Google решила сконцентрироватьсвои экспериментаторские силы на привычномдля себя поприще — веб-разработке. Как известнолюдям, знакомым с этой областью не понаслышке,ключевой технологией разработки клиентских (тоесть работающих на компьютерах конечных пользователей)веб-приложений является Javascript(JS), объектно-ориентированный язык программирования,в наше время ставший уже укоренившимсястандартом в создании сайтов, порталов идаже пользовательских веб-интерфейсов для операционныхсистем. Именно на него и его недостатки,которые трудно устранить с помощью простойэволюции языка: динамическую типизацию, прототипнуюобъектную модель, низкую производительность,как следствие двух предыдущих минусов,сложность поддержки и разработки большихпроектов, — обратили свое внимание инженеры изGoogle. Ими были предложены две стратегии дальнейшихдействий в этом направлении:• Harmony — стратегия с маленькими рисками,но и маленькой отдачей — продолжать работунад улучшением Javascript. Это просто и безопасно,однако даже в лучшем случае это займет годыи все равно в конце концов упрется в фундаментальныенедостатки JS. Собственно говоря, этостратегия не столько Google, сколько консорциумаJavascript.• Dash (то, что мы сейчас знаем как Dart) —стратегия с большими рисками и большой отдачей— разработать новый язык программирования,который был бы пропитан динамическим духомJavascript, но имел бы значительно улучшеннуюпроизводительность и обеспечивал бы легкостьуправления крупными проектами. В будущем — закрепитьDash (Dart) в качестве открытого стандартавеб-программирования и обеспечить поддержкунового языка со стороны браузеров, а также реализоватьего транслятор в Javascript для браузеров,таковой поддержки не имеющих. Это крайне сложнои рискованно, поскольку потребуется убедить вправомерности и необходимости такого решениямножество программистов.Попытка применения только одной из этих стратегийзаранее обречена на провал. Если следоватьпути “обновления Javascript”, то веб может зависнутьв устаревшем состоянии и оказаться неспособнымконкурировать с более инновационными,но зачастую менее открытыми технологиями. Приизолированном применении второго пути в безнадежноустаревшем состоянии может оказаться самJavascript, а новый язык при этом будет еще слишком“сырым”, что приведет к “смутным временам”веб-программирования.Единственным верным решением в данном случаеявляется развитие двух этих стратегий одновременно:новый язык будет создаваться, однако вкачестве страховки в то время, когда он будет ещеслишком слаб (или если он все же не оправдает возложенныхна него ожиданий), будет эволюционироватьстарый добрый Javascript.В заключение этого обзора предпосылок для появлениянового языка веб-программирования ярассмотрю также некоторые другие родственныетехнологии от Google:• JSPrime — попытка объединить Javascript иGoogle Web Toolkit в единую систему, пригоднуюдля разработки больших высоконагруженных вебприложений(технологий, являющихся приоритетнымидля Google). В настоящее время все разработчикиJSPrime входят в команду по созданию Dart,в который была перенесена часть уже сделанныхнаработок;• JS++ — множество улучшений и нововведенийдля Javascript, которые в настоящее время являютсячастью первой стратегии, Harmony;• Joy — система шаблонных и Model-View-Controllerфреймворков, которые будут построены поверхDart.39январь 2012 / ИНФорматика


Семинар40январь 2012 / ИНФорматикаЧто же это за зверь?Настало время вплотную подойти к описаниюпредмета нашего разговора — второй стратегииразвития веба, языка программирования Dart.Как я уже говорил ранее, Google имеет страстьк “коллекционированию” лучших умов computerscience, используя их наработки в собственныхэкспериментах. Dart в этом плане не стал исключением:его проектированием занималасьбольшая команда специалистов, среди которыхдвое — Гилад Брача и Ларс Бэк — являются поистинемастерами в вопросах создания динамическихязыков программирования. Оба они связаныс сообществом Smalltalk — языка, положившегоосновы объектно ориентированного программированияв его современном виде. Создателемэтого языка и ключевой фигурой в этом сообществеявляется уже упомянутый мной Алан Кэй. Посвоей динамической природе Smalltalk являетсясравнительно медленным языком, что всегда считалосьодним из его ключевых минусов. ОднакоГилад и Ларс в свое время уже провели эксперимент,подобный описываемому мной, — экспериментпо устранению фундаментальных недостатковSmalltalk. Так родились два языка: Strongtalkи Self, — которые при дальнейшем развитиипредопределили появление высокопроизводительныхобъектно ориентированных технологий.Брача и Бэк сыграли в этом далеко не последнююроль. Уже в середине девяностых годов Бэк принималучастие в разработке очень быстрой Javaмашины— Hotspot, которая и по сей день являетсяосновной виртуальной машиной Java. Можносделать вывод, что Dart уже изначально был в хорошихруках.Каковы же основные принципы, лежащие в основеDart? Сами разработчики выделяют три ключевыхперспективы:• Производительность — Dart проектировалсяс оглядкой на скорость выполнения программ,столь низкую для всех современных реализацийJavascript. Виртуальные Dart-машины могут бытьочень быстрыми за счет таких особенностей языка,как, например, необязательная статическая типизация.• Удобство использования — Dart является языком,сравнимым по простоте с Javascript, посколькуусложнение языка могло бы оттолкнуть от негоначинающих и даже бывалых веб-разработчиковот области, традиционно считающейся простой.В этом также помогает необязательная статическаятипизация и динамическая природа языка вцелом.• Легкая поддержка дополнительных инструментов— таких, как “умные” среды разработкии многочисленные фреймворки. Плохая поддержкасо стороны IDE — один из важнейших минусовJavascript. Dart же был спроектирован таким образом,чтобы комплексные среды разработки моглиосуществлять такие действия, как простой рефакторингкода и поиск мест, откуда вызываются методы.В упрощении этого важную роль играет заменапрототипной объектной системы на классовую.Также выделяется пять основных целей разработкиDart:• Dart должен быть структурированным и в тоже время гибким языком программирования длявеба. Часто сильная структурированность и ортогональностьязыка мешают его гибкому использованию,однако можно найти золотую середину гдетона пути между статическими и динамическимиязыками. Как раз в этой нише находится Dart.• Dart должен быть особенно легким и естественнымязыком для людей, которые уже программировалидо этого на чем-либо. К сожалению, естественнеевсего он выглядит для C-, Java- и Javascriptпрограммистов.Люди же, предпочитающие языкисемейства Pascal или вообще функциональное программирование,сочтут это утверждение Googleголо словным.• Спроектировать Dart так, чтобы код на немвыполнялся быстро и время запуска приложениябыло минимальным. По поводу этого пункта покамало что можно сказать, поскольку единственнымспособом запуска Dart-кода является кросскомпиляцияв Javascript.• Создать возможность запуска приложенийна Dart на самых разных, в том числе мобильныхустройствах. Для поддержки устаревших илинеобычных устройств можно использовать кросскомпиляторв Javascript (правда, при этом Google неучитывает, что JS поддерживается тоже далеко невсеми устройствами. Возможно, с развитием Dartпоявятся его кросс-компиляторы в другие языки).• Разработать средства для запуска Dart во всехсовременных веб-браузерах. К сожалению, в этомнаправлении пока наблюдается самый незначительныйпрогресс — разработчики браузеров,кроме Chrome, не спешат поддерживать начинаниеконкурента. Разработчики браузера InternetExplorer от Microsoft даже напрямую высказалисьо своем неудовлетворении языком Dart и идеямиGoogle. Вероятно, на этом пути будет еще немалопрепятствий.Безопасность в Dart не является краеугольнымкамнем разработки, однако ей уделено достаточновнимания в тех местах, где это не входит в противоречиес тремя вышеупомянутыми принципами.Dart создавался как чрезвычайно гибкий и переносимыйязык, который мог бы работать не толькобок о бок или вместо Javascript, но и на стороне серверавместе с приложениями на Java, Python, Ruby,PHP. Планируется, что будет четыре основных вариантаисполнения кода, написанного на Dart:• Клиентская Dart-машина, встроенная в веббраузер.Специалисты Google надеются, что в ближайшембудущем разработчики наиболее популяр-


ных браузеров реализуют поддержку Dart в своихпродуктах.• Серверная виртуальная машина. Dart проектировалсякак язык, который может выполняться и настороне сервера, при этом серверная Dart-машинаможет быть масштабируемой. Судя по всему, Googleхочет использовать Dart в качестве основного серверногоязыка в своей сети.• Кросс-компилятор. В настоящее время, то естьна ранних этапах развития Dart (а версия Dartпока что — 0.0.5), это основной способ запуститьDart-программу. Программа транслируется в аналогичнуюпрограмму на Javascript, которая можетисполняться любым интерпретатором JS. После появленияв браузерах самостоятельных Dart-машинGoogle планирует использовать кросс-компилятордля поддержки устаревших платформ и систем.Также одной из целей стратегии Harmony являетсяразвитие этой Javascript-поддержки для Dart. Разумеется,что преимущества вроде улучшенной производительностипри таком способе исполнения небудут проявляться.• Образ системы. Этот способ выполнения Dartкодане является самостоятельным, это просто ещеодин вариант подачи кода в виртуальную машину.Вместе с Dart распространяются инструменты,позволяющие сделать образ приложения, выполняющегосяна Dart-машине, с оптимизированнымкодом (хотя бы потому, что он имеет двоичный, ане текстовый вид). В дальнейшем этот образ можетбыть запущен на любой виртуальной машине Dart.Идею образов язык позаимствовал у таких систем,как Smalltalk, Self и Forth.Оглядываясь на мой рассказ о Go и его слабойвозможности работать с уже имеющимся Си-кодом,справедливо задать подобный вопрос и о Dart: с помощьюкаких механизмов и насколько удобно реализованаподдержка существующих наработок наJavascript в нем? К сожалению, ответа на этот вопросне могут дать даже сами разработчики языка.Подробно описав и оценив основные принципыи идеи, которыми руководствовались разработчики,проектировавшие Dart, стоит перейти к болееприземленным материям и описать возможностисамого языка.Основные отличительные характеристики Dartтаковы:• Классовая объектно ориентированная модельс одиночным наследованием и интерфейсами. Существуютдва типа истинно (таких, в которых всеявляется объектом) объектно ориентированныхмоделей: классовые и прототипные. В первых центральнымпонятием является класс, к которомуприменимы действия инстанцирования (созданияобъекта класса) и наследования. При этом, еслинаследование одиночное, то между классами сохраняетсястрогая древовидная иерархия. Иногдадля гибкости наследование может быть множественным,однако в таком случае иерархия классовстановится графом общего вида, и работать сней и делать предположения для автоматическоговывода типов куда сложнее. В настоящее время вкачестве замены множественному наследованиюпредлагаются интерфейсы. В прототипных объектныхсистемах понятия класса нет и объекты существуютсами по себе, и к ним применима операцияклонирования. После клонирования клон можетбыть произвольно изменен. Прототипные объектныесистемы обеспечивают большую гибкость, чемклассовые ценой серьезного снижения производительности.Объектная модель Javascript — прототипная,и это одна из причин его медленной скоростии появления Dart.• Необязательная статическая типизация, такчасто упоминавшаяся мной ранее. Традиционныединамические языки вроде Javascript используютдинамическую типизацию, то есть типы всех выраженийи переменных в них известны лишь во времявыполнения программы, что сильно осложняетоптимизацию кода, однако статическая типизацияснижает гибкость программирования. В Dart использовануникальный подход, который пока неприменялся ни в одном из широко распространенныхязыков (кроме, пожалуй, Cython — языка написаниярасширений для Python): вы можете указатьтип переменной, а можете не указывать. Если выуказали тип, то будут применены соответствующиеоптимизации и, если необходимо, выведеныпредупреждения о несовместимости типов. Примечательно,что “тип” динамически типизированныхпеременных входит в иерархию типов Dart и называетсяDynamic.• Овеществленное обобщенное программирование.Под обобщенным программированием понимаютвозможность создания сложных типов данных(списков, массивов, таблиц, объектов) с параметрическизадаваемым элементарным типом.Читатели, знакомые с С++, имели дело с обобщеннымпрограммированием, используя шаблоны. Чтоже дает право обобщенному программированию вDart называться овеществленным? В языках вродеС++ отождествление контейнера с типом происходитна этапе компиляции / другой обработки кода.В Dart же элементарный тип сосуществует вместес контейнером во время выполнения, и операцияотождествления также производится во время выполнения.Это дает еще одну возможность выборамежду динамической и статической типизацией.• Действительно лексические области видимости.Многие динамические языки используют динамическиеобласти видимости переменных: этозначит, что переменная связывается с тем окружением,которое в данный момент является текущим.Dart же использует лексические области видимости:переменная в них связывается с тем окружением,в котором она была определена в коде программы.Это позволяет повысить производительность иизбежать сложнодиагностируемых ошибок.41январь 2012 / ИНФорматика


Семинар42январь 2012 / ИНФорматика• Однопоточность. Весь код на Dart исполняетсяв одном потоке, это позволяет избежать сложноотлаживаемыхошибок вроде гонок за ресурсы. Дляобеспечения конкурентности используется акторнаямодель, которую я опишу ниже.• Анонимные, или лямбда-функции. Эта возможность,широко распространившаяся в императивныхязыках и пришедшая из функциональных, позволяетопределять функции на ходу, не задаваядля них никакого имени. Это часто бывает полезно,когда используются функции, чьими аргументамитакже являются функции (например, разнообразныефункции поиска и сортировки).• Шаблонная подстановка на уровне строк.Востребованная и широко используемая в вебпрограммировании,позволяющая подставлятьзначения переменных и даже целых выражений встроковые литералы при создании последних. Приэтом стоит помнить, что Dart использует лексическиеобласти видимости переменных.Как вы могли заметить из описания мной некоторыхособенностей языка, Dart настолько сложен,насколько сложна ваша программа и насколькосложный язык вам нужен. Вы можете писать на Dartпростые динамические программы в Javascriptстилеили же можете писать сложные и высокопроизводительныесистемы, используя всю мощьстатической типизации и объектной системы Dart.Данная особенность является уникальной, я не смогупривести пример еще одного распространенногоязыка программирования, сложность которого могбы определять сам программист.Вы, вероятно, уже ждете от меня практическихпримеров программирования на Dart и пребываетев недоумении, почему я несколько тяну с ними.К сожалению, Dart пока лишь ненамного ушел отсостояния proof-of-concept и является активноменяющимся и нестабильным языком, многиеинструменты для него пока не созданы. Однаковозможность опробовать его у нас есть уже сейчас.Для этого можно использовать несколькоспособов: для простейших манипуляций с языкомможно использовать веб-интерфейс Dartboard поадресу http://try.dartlang.org, правда, примеры сдействительным веб-программированием (например,примеры, использующие canvas) не будуттам работать. Специально созданная среда дляпрограммирования на Dart — DartEditor в данныймомент находится в чрезвычайно “сыром” состоянии:периодически возникают серьезные недочеты,мешающие нормальному программированиюв ней. В целом DartEditor является довольноамбициозным проектом, в нем можно опробоватьвсе примеры Dart-кода, однако я хочу сказать, чточитатель должен его использовать только на свойстрах и риск. Третий вариант удобного написанияпрограмм на Dart — использование Dart-плагинадля Eclipse. К сожалению, этот плагин находитсяв еще более “сыром” состоянии, чем упомянутыймной ранее DartEditor. Самым сложным вариантомявляется ручное использование кросс-компилятораDart и создание веб-страниц с получившимисяскриптами на Javascript или запуск этих скриптовв отдельных интерпретаторах Javascript. Пока чтоэтот вариант является наиболее надежным длятех, кто хочет попробовать все существующие наданный момент возможности Dart, правда, стоитзаметить, что для этого читатель должен быть хотьнемного искушен в веб-программировании. Увы,кросс-компилятор пока тоже находится в состоянииальфа-тестирования, имеет некоторые недочеты, ани одного бинарного релиза его пока не было выпущено,поэтому я могу порекомендовать его только“экстремалам”-знатокам, умеющим и желающимсобирать кросс-компилятор из исходных кодов.Ввиду описанных мной проблем, я не могу заставитьчитателя использовать сложные способызапуска кода и на протяжении оставшейся частистатьи буду использовать Dartboard, также нескромнопредполагая, что у человека, интересующегосявеб-программированием, есть свободныйдоступ в Интернет. Для запуска сложных примеровчитателю придется либо окунуться во всепроблемы “сырого” программного обеспечения,либо дождаться выхода стабильных версий необходимыхинструментов.Все “вкусности” крупным планомИтак, мы переходим к непосредственной работес Dart и решили использовать для этой целиDartboard (для этого необходимо перейти в браузерена адрес http://try.dartlang.org). ИнтерфейсDartboard предельно прост — изначально этополе для ввода кода с подсветкой ключевых слови тремя-четырьмя кнопками в панели инструментовнад ним.Первая кнопка позволяет запустить введенныйкод, при этом внизу открывается окно вывода, в котороеперенаправляется текстовый вывод программы.Если при интерпретации кода обнаруженыошибки или спорные ситуации, строки, содержащиеих, будут подсвечены специальным маркером(желтым или красным). К сожалению, сообщенияоб ошибках пока либо не очень информативны,либо отсутствуют вовсе. Также при интерпретациивведенного вами кода в панели инструментов появляетсяссылка, с помощью которой вы можете делитьсявашими примерами с коллегами.Вторая кнопка (с флажком-чекбоксом) позволяетвключать проверку соответствия типов переменныхво время исполнения. Это полезно, есливы хотите написать корректную и стабильную программу,однако может привести к значительномузамедлению выполнения кода.Третья кнопка, появляющаяся только тогда, когдавы вносите в Dartboard какие-то изменения, по-


зволяет вернуться к первоначальному состоянию.Учтите, что при этом может потеряться весь код,введенный вами.Четвертая кнопка просто позволяет развернутьокошко Dartboard до границ веб-страницы вбраузере.Простые шагиНачнем наше рассмотрение с простейшего кода,который вы можете видеть в окне Dartboard:// Welcome to try.dartlang.org//// Here you can try out the Dart Language// from the comfort of your own// *modern* web browser. When you run the// code … it is submitted to AppEngine,// translated into the equivalent// JavaScript, and run right in your// browser window.//// Ok, your turn!main() {print('Give try.dartlang.org a try.');}Здесь вы можете видеть уже привычный в нашевремя C-подобный синтаксис: //-комментарии(также поддерживаются многострочные /* … */комментарии), фигурные скобки для отделенияблоков друг от друга и точку с запятой для разделениявыражений языка. Функция main имеет тот жесмысл, что и аналогичная функция в языке Си — вней происходят вычисления основного потока программы.Подобно Си Dart — язык, чувствительныйк регистру, имена “Test” и “test” в нем обозначаютразные сущности.Простые операторы и конструкции вроде операторовветвления if, switch и циклов позаимствованыиз С-подобных языков, поэтому я не буду уделятьим особое внимание.В Dart имеются все стандартные встроенныетипы — double, int, num — обобщение числовых типов,bool, String. Важное уточнение: не стоит забыватьинициализировать переменные — посколькувстроенные типы являются объектами, начальныезначения переменных равны null, а не, к примеру, 0.В отличие от многих других языков здесь встроенныетипы реализованы в виде интерфейсов, что позволяетбез проблем смешивать их свойства при созданиисобственных типов, наследуемых от базовых. Отмечутакже, что именно поддержка в Dart виртуальныхконструкторов на уровне интерфейсов позволила такгибко реализовать систему встроенных типов.Переменные в Dart определяются также просто иочевидно, особенно для тех, кто знаком с Javascript:либо с помощью слова “var”, либо с помощью указаниятипа (приведенные ниже определения вы можетевбивать в функцию main):some_value = 4; // неправильно!var some_value = 4; // правильноnt a = 4;double b = 4; // предупреждениеint c = 4.1; // также предупреждение,// тип динамически// приводится к doubleiDynamic a = 4.1; // нет предупрежденияa = "test"; // нет предупрежденияObject b = 4; // нет предупрежденияb = "test1"; // нет предупрежденияinsdfs a = 5; // предупреждение, тип а// динамически приводится// к DynamicКак вы видите, типизация в Dart — слабая, итипы переменных по необходимости приводятся,вызывая предупреждения при видимой несовместимости.Как и во всех других объектно ориентированныхязыках, приведение типа наследника ктипу-суперклассу (или к типу Dynamic) не вызываетпредупреждений. Типы изначально статическитипизированных переменных также приводятся кстатическим типам. Уникальной и в то же времяспорной возможностью является указание несуществующегоили неправильного имени типа. В этомслучае Dart-система выдает предупреждение и автоматическиприводит тип определяемой переменнойк Dynamic.Одной из самых простых и в то же время мощнейшихвозможностей Dart является подстановкашаблонов в строки. Похожие средства существуютво многих языках программирования, однако теязыки, в которых такие инструменты поставляются,что называется, “из коробки”, можно пересчитатьпо пальцам (например, Tcl), большинство предпочитаетреализовывать шаблонную подстановку ввиде отдельной библиотеки. Польза такого подходабыла очевидна раньше, в эпоху малых вычислительныхресурсов, когда нагружать интерпретатортакими механизмами было непозволительной роскошью.В настоящее же время, как мне кажется,существуют все предпосылки для включения шаблоннойподстановки в базовую систему языка, ия полностью поддерживаю Dart в этом. Рассмотримнесколько примеров (в примерах будет формироватьсястрока с некоторым именем, например, s;чтобы проверить результат, вы можете вывести еес помощью выражения print(s)):String s = "Test string ${2+3}";int a = 4;String s = "Test string ${a+3};int a = 4;double b = 5.1; // без предупрежденияString s = "Test string ${a+b};int a = 4;double b = 5.1;// будет подставлено только значение аString s = "Test string $a+b";43январь 2012 / ИНФорматика


Семинар44январь 2012 / ИНФорматикаint a = 4;double b = 5.1;String s = "Test string " + a + b;// значения a и b будут преобразованы// в строки и все три имеющиеся строки// будут склеены в однуКак видно, в Dart существуют три различных способавключения переменных и выражений в строки:от самого мощного с фигурными скобками допростейшей конкатенации строк с необходимымитиповыми преобразованиями переменных.В мире объектовЭтот подраздел будет посвящен объектно ориентированномупрограммированию на Dart. Если выимеете опыт программирования на Javascript, ноне имеете опыта работы с классово ориентированнымиязыками, некоторые понятия будут для васв новинку. Также вам придется не совсем просто,если вы вообще не имеете понятия об объектноориентированном программировании.Объектно ориентированное программированиетесно связано с имитационным моделированием иставит задачу не формального описания мира, а описанияего структурных и функциональных параметров.В связи с этим возникла модель мира как набораэлементарных “объектов”, обладающих сложнойиерархией взаимоотношений. Однако в свете двойственностихарактеристик этой модели — “структуры”и “функций”, она распалась на две подмодели:“структурный функционализм” классово ориентированногопрограммирования и “функциональныйструктурализм” прототипно ориентированного программирования.C прототипно ориентированнымпрограммированием знакомы все программисты наJavascript, однако не все из них знают, что появилосьоно значительно позднее классового варианта из-за серьезныхпроблем эффективной реализации. Я не будууглубляться в особенности этого подхода, посколькупредметом обсуждения являются не языки семействаECMAScript. Google созданием Dart, как я уже говорилранее, решил убрать прототипно ориентированноепрограммирование из веба, заменив его комплекснойклассовой системой с поддержкой интерфейсов,обеспечив нужную гибкость без обременительных затратна дополнительные вычисления.Классы в Dart создаются и описываются довольнопросто (определять классы нужно вне функцийи функции main в том числе):// вне функции mainclass TestMe {String name = "Test";test() {print("Here I am: ${name}");}}// в функции mainTestMe a = new TestMe();a.test();Из этого примера можно видеть, что синтаксическикласс в Dart — это просто блок кода, в которомопределяются поля-переменные и методыфункции.Определения полей и методов могут идтив любом порядке. Для читателей, знакомых толькос языками с ручным управлением памяти, такими,как С++ и Pascal, стоит сказать, что в Dart используетсяавтоматическая сборка мусора, и созданныеобъекты не нужно удалять вручную.Если вы любитель языков Object Pascal и C++, выможете спросить: где же определения областей видимостивроде public или private? Как и во многих другихдинамических по своей природе языках, в Dart подобногопонятия не существует, это наследие Smalltalk,и такой тон особенно ярко выражен в таких языках,как Python или Ruby. Все поля в классе по умолчаниюявляются public, кроме тех, что начинаются с символаподчеркивания, которые не определены как private,но считаются таковыми по соглашению. К примеру:// считаем, что класс TestMe уже определен// и объект а инициализирован// ошибки нет, name теперь равно// "Look at me!"a.name = "Look at me!";class TestMe {String _name = "Test";test() {print("Here I am: ${_name}");}}// в mainTestMe a = new TestMe();// также нет ошибки, однако это плохой тонa._name = "Look at me!";Как я уже сказал в комментарии к вышеприведенномукоду, изменение поля, чье имя начинаетсяс подчеркивания, — дурной тон. Более того,в настоящих ОО-языках дурным тоном считаетсяпрямое изменение любого поля объекта. Для этоговводятся так называемые “методы-аксессоры”,которые служат для управляемого доступа к полю.Они могут быть геттерами — методами, читающимизначение поля, и сеттерами — методами, записывающимив поле соответствующее значение.Подобная практика очень удобна, например, в техслучаях, когда необходимо производить проверкувводимых данных из текстового поля, и являетсядальнейшим развитием простой инкапсуляции.class TestMe {// private по соглашениюString _name = "Test";// геттерString get name() => _name;// здесь также используется// лямбда-выражение, обозначаемое как =>void set name(String value) {// void здесь можно опуститьif (value == null) value = "";_name = value;}


}test() {print("Here I am: ${name}");// можно использовать и _name}В примере выше сеттер используется для того, чтобызначение поля _name было правильной строкой,даже если ее пытаются сделать объектом-пустышкой.Сущность name, полученная с помощью методоваксессоров,называется свойством. В силу динамическойприроды языка все это является лишь соглашениямихорошего тона, например, никто не мешает явноустановить поле _name, однако это приведет лишь кзапутанному коду, который сложно поддерживать.Наследование в Dart очень просто реализуется спомощью ключевого слова “extends” (при этом, какя уже говорил, все поля и методы наследуются какpublic):// считаем, что класс TestMe уже// определен в предыдущем примереclass AnotherTester extends TestMe {set name(String value) {// переопределяем сеттерif (value == null) value = "";_name = value + ", ha-ha!";}test() { // переопределяем testsuper.test(); //вызываем родительский// метод testprint("Sure it's not me,it's: ${name}");}}Так куда же все-таки целитсяGoogle?Суммируя все вышесказанное, можно сделать вывод,что Dart является языком, занимающим промежуточноеместо между Java и Javascript. Это местоявляется промежуточным не только относительно динамичности/статичностиязыка, но и относительнообластей применения — клиентского и серверноговеб-программирования. Многие возможности, анонсированныев Dart, уже входят в существующие языки,но ни один из этих языков не реализует эти возможностивместе и с такой же гибкостью, как предметнашего обсуждения. Когда я только столкнулсяс Dart, он сильно напомнил мне Python, с которым язнаком уже довольно продолжительное время. Я вялопосматривал в сторону творения Google, говоря себе:“Ну что там может быть такого интересного, чегоя еще не видел в том же Python или в конце концовRuby?”. К счастью, в один прекрасный момент я всеже нашел в себе силы и попытался вникнуть в примерына Dart и спецификацию языка. Моему удивлениюпрактически не было предела: я увидел там почтивсе то, что мне хотелось бы видеть в Python, — необязательнуюстатическую типизацию, интерфейсы,акторы. С тех пор я посвятил изучению Dart большевремени, чем раньше. Мои знакомые программисты(не только на Python) испытали похожие чувства отзнакомства с новичком. Поэтому, резюмируя, можносказать, что Google нацелился не просто на вебпрограммирование,а на скриптовые языки в целом,и Dart является преодолением недостатков не толькои не столько Javascript, сколько всех распространенныхдинамических языков. Насколько успешнымибудут их начинания — войдет ли Dart в свою нишупобедоносно или же станет еще одним внутреннимязыком Google, подобно Go, — покажет время.Что же дальше?В рамках небольшой статьи нельзя многого сказатьо языке программирования, особенно таком неординарном,как Dart. Все также усугубляется тем,что язык вышел совсем недавно, имеет пока версию0.0.5, находится в стадии альфа-тестирования иактивно развивается. Многих инструментов и заявленныхвозможностей пока нет. При написанииэтой статьи я старался не сухо описать сам язык,как это сделано в спецификации, а выделить те моменты,благодаря которым он уже до выхода приобрелстатус чего-то “революционного”, основныеаспекты, ради которых он создавался, — такие, каксмешанная типизация и невероятная динамическаягибкость в разумном сочетании со статическойстрогостью, то новое, чего пока нет ни в одном израспространенных языков. При этом за бортомостались такие более сугубо технические моменты,как акторная модель изолятов, встраиваниеDart в веб-страницы, обобщенное программирование,классы-фабрики, работа в современных IDE,и многое другое. Часть из этих возможностей я постаралсяпоказать в примерах к статье, имеющихсяна диске, за остальными вам придется обращаться кспецификации, писать самим методом проб и ошибокили ждать, пока появится большое сообществоDart-программистов. Серьезной литературы по языкупока нет, поэтому основными источниками информацииявляются официальный сайт, форумы исписки рассылки. Несмотря ни на что, Dart выглядиточень многообещающим проектом, и кто знает, каковобудет его положение и как он будет выглядетько времени своего первого официального релиза.Использованные источникиинформации1. Официальный сайт языка Dart [Электронныйресурс], URL: http://www.dartlang.org.2. Bracha G. On the Interaction of Method Lookup andScope with Inheritance and Nesting, 3rd ECOOP Workshopon Dynamic Languages and Applications, 2007.3. Future of Javascript [Электронный ресурс],e-mail из внутренней рассылки Google, URL: http://markmail.org/message/uro3jtoitlmq6x7t.4. The Dart Programming Language Specification0.0.5 [Электронный ресурс], The Dart Team, URL:http://www.dartlang.org/docs/spec/dartLangSpec.html.45январь 2012 / ИНФорматика


Повышение квалификацииПедагогический университет «Первое сентября»описание курсов и подача заявок: edu.1september.ruПедагогический университет «Первое сентября» создан в 2003 г. На основании договорово сотрудничестве взаимодействует с факультетом педагогического образованияМГУ им. М.В. Ломоносова и Московским институтом открытого образования.Университет специализируется на проведении дистанционных (заочных) и очных краткосрочныхкурсов повышения квалификации для работников образовательных учреждений. Курсы ведутпризнанные специалисты в области образования: разработчики стандартов, программ, авторыучебников, опытные методисты.Дистанционные курсыУдостоверениеМодульные курсыОчные курсыЛицензия Департаментаобразования г. Москвы77 № 000349,рег. № 027477от 15.09.2010Для всех педагогов вне зависимости от места проживанияНормативный срок освоения курса: 72 часа.По окончании: УДОСТОВЕРЕНИЕ О ПОВЫШЕНИИ КВАЛИФИКАЦИИУСТАНОВЛЕННОГО ОБРАЗЦА.Объем предложения: более 120 курсов актуальной тематикипо 21 образовательно-педагогическому направлению.Учебный процесс организован в два потока.Второй поток 2011/12 учебного года:Прием заявок: до 15 января 2012 г.Выдача удостоверений: сентябрь 2012 г.Первый поток 2012/13 учебного года:Прием заявок: с 1 апреля до 30 сентября 2012 г.Выдача удостоверений: май 2013 г.Стоимость обучения с первого потока 2012/13 учебного года:2190 руб. (без видеоподдержки); 2390 руб. (с видеоподдержкой).Для всех педагогов вне зависимости от места проживания«Навыки личной эффективности» –цикл дистанционных модульных курсов.Нормативный срок освоения курса: 6 часов.По окончании: СЕРТИФИКАТ.Объем предложения: цикл из 7 дистанционных модульных курсовпо психологии, менеджменту и экономике.Учебный процесс: индивидуальный.График изучения модуля определяется слушателем.Минимальный срок обучения по одному модулю – 1 месяц.Итоговая работа: тест в режиме on-line.Прием заявок: круглогодично.Стоимость обучения с 1 марта 2012 года: 300 руб. за один модуль.Для жителей Москвы и Московской областиНормативный срок освоения курса: 72 часа.По окончании: УДОСТОВЕРЕНИЕ О ПОВЫШЕНИИ КВАЛИФИКАЦИИГОСУДАРСТВЕННОГО ОБРАЗЦА.Объем предложения: более 30 курсов актуальной тематикипо 10 образовательно-педагогическим направлениям.Учебный процесс организован в три потока.Второй поток 2011/12 учебного года:Прием заявок: до 31 января 2012 г.Расписание занятий: раз в неделю с февраля по апрель .Выдача удостоверений: май 2012 г.Интенсив 2011/12 учебного года:Прием заявок: до 31 мая 2012 г.Расписание занятий: ежедневно в первой половине июня 2012 г.Выдача удостоверений: сентябрь 2012 г.Первый поток 2012/13 учебного года: Прием заявок: с 1 апрелядо 30 сентября 2012 г. Расписание занятий: раз в неделю с октября по декабрь.Выдача удостоверений: февраль 2013 г.Стоимость обучения с первого потока 2012/13 учебного года: 5900 руб.


МММ О С К О В С К И ЙПЕДАГОГИЧЕСКИЙМАРАФОНУЧЕБНЫХ ПРЕДМЕТОВД Е П А Р Т А М Е Н Т О Б Р А З О В А Н И Я г . М О С К В ЫИ З Д А Т Е Л Ь С К И Й Д О М « П Е Р В О Е С Е Н Т Я Б Р Я »2012 20 МАРТА – 13 АПРЕЛЯРАСПИСАНИЕ ДНЕЙПЕДАГОГИЧЕСКОГО МАРАФОНА20 марта ОткрытиеДень классного руководителя21 марта День школьного психолога22 марта День здоровья детей, коррекционнойпедагогики, логопеда,инклюзивного образованияи лечебной физической культурыДень учителя технологии (ЦО № 293)23 марта День учителя начальной школы(день первый)24 марта День учителя начальной школы(день второй)25 марта День дошкольного образования27 марта День учителя географии28 марта День учителя химииДень учителя ОБЖ(Кадетская школа № 1784)29 марта День учителя биологии30 марта День учителя информатики31 марта День учителя физики1 апреля День учителя математики3 апреля День учителя истории4 апреля День учителя МХК, музыки и ИЗО5 апреля День школьногои детского библиотекаря6 апреля День учителя литературы7 апреля День учителя русского языка8 апреля День учителя английского языка10 апреля День учителя французского языка11 апреля День учителя немецкого языка12 апреля День учителя физической культуры13 апреля День школьной администрацииЗакрытиеmarathon.1september.ruОбязательная предварительная регистрация на все дни Марафона откроется20 февраля 2012 года на сайте marathon.1september.ru.Каждый участник Марафона, посетивший три мероприятия одного дня,получает официальный именной сертификат (6 часов)В дни Марафона ведущие издательства страны представляют книги для учителейНачало работы – 9.00. Завершение работы – 15.00УЧАСТИЕ БЕСПЛАТНОЕ. ВХОД ПО БИЛЕТАМРЕГИСТРИРУЙТЕСЬ, РАСПЕЧАТЫВАЙТЕ СВОЙ БИЛЕТ И ПРИХОДИТЕ!Место проведения Марафона: лицей № 1535, ул. Усачева, дом 50 (в 3 минутах ходьбы от станции метро «Спортивная»)Место проведения Дня учителя технологии: ЦО № 293, ул. Ярославская, д. 27 (ст. метро «ВДНХ»)Место проведения Дня учителя ОБЖ: Кадетская школа № 1784, ул. Скаковая, д. 20 (ст. метро «Динамо», «Белорусская»)По всем вопросам обращайтесь по телефону 8-499-249-3138 или по электронной почте: marathon@1september.ru


опыт Тема в мир информатики номера№ 172vmi@1september.ruДля пытливых ученикови их талантливых учителей48январь 2012 / ИНФорматикаMicrosoft PowerPoint углубленно“Спусковой крючок” анимацииА.И. Азевич, МоскваВстречалось ли вам когда-нибудь звучное слово“триггер”? На первый взгляд кажется, это что-тоиз области физики. Близко, да не совсем. А может,это остров, пока еще неизвестный даже заядлымпутешественникам? Нет, такого острова на картене найти. Впрочем, зачем гадать, заглянем лучшев энциклопедию. Она наверняка знает о триггеревсе. Вот что о нем написано в Большой СоветскойЭнциклопедии: “Триггер (англ. trigger) — спусковоеустройство (спусковая схема), которое можетсколь угодно долго находиться в одном из двух (режемногих) состояний устойчивого равновесия и скачкообразнопереключаться из одного состояния вдругое 1 ”. По свидетельству умной книги триггер —это что-то вроде спускового крючка…В программе Microsoft PowerPoint тоже встречаетсятриггер. Но подготовка компьютерных презентацийк переключателям и спусковым крючкам неимеет никакого отношения. Что же тогда тут делаеттриггер? Попробуем разобраться.В школе часто приходится готовить презентации.Мир растений, ареалы обитания животных,история вычислительной техники, великие географическиеоткрытия — великое множество увлекательныхвизуальных докладов! Они демонстрируютсяна уроках, конференциях, форумах. Одни презентациивыглядят живыми, содержательными иинтерактивными. Их хочется смотреть. Щелкаешьмышкой по слайду: цветы распускаются; зайчикипрыгают; пути мореплавателей светятся на картезамысловатой кривой, огибающей материки.Другие школьные презентации — непрерывноечередование скучного текста и статических картинок.Их создатели наверняка не имеют понятия о1Именно поэтому, очевидно, триггером называют электронноеустройство с двумя или более устойчивыми состояниями.— Прим. ред.триггере. Жаль, ведь с помощью “компьютерногощелчка” любое выступление будет смотреться кудаинтересней!Что же такое триггер? Триггер — это интерактивноесредство анимации, позволяющее задатьдействие выделенному элементу. Его можно применитьк любому объекту на слайде (это может бытьфрагмент текста, изображение или звук). Триггер,как и кнопка, срабатывает по щелчку левой кнопкимыши, при этом в момент наведения указателямыши на объект он (указатель) принимает видруки с отогнутым указательным пальцем.Чтобы не осталось никаких неясностей относительнотриггера, покажем все на примере.Предположим, что вам поручено подготовитьигру для младших школьников. Небольшое, но ответственноепоручение классного руководителя, ик нему стоит отнестись серьезно и ответственно.В игре дети должны выбрать из предложенногонабора ягоды (см. рис. 1). Овощи и грибы должныисчезнуть с экрана компьютера, как только к ним“прикоснется” мышь.Правила игры очень просты: при нажатии наягоду изменяется положение или размеры картинкии одновременно слышится одобрительный звук;как только касаемся любого другого объекта, он исчезаети раздается грустный возглас.Рис. 1


Создадим слайд презентации. Для этого предварительноподготовим необходимый материал:картинки ягод, овощей, грибов, а также звуковыефайлы (одобрительный — для верных ответов,грустный — для ошибочных). Соответствующиеграфические и звуковые файлы представлены надиске к данному номеру журнала.После создания слайда приступим к созданиюпервого триггера. А вообще их у нас будет столько,сколько изображений на слайде.Как сделать так, чтобы при нажатии на клубникуона завертелась, при нажатии на бруснику, черникуи арбуз 2 — они увеличились в размерах, а при щелчкена овощах и грибах соответствующие картинкимоментально пропадали? Кроме того, хотелось бы,чтобы одновременно с анимацией воспроизводилисьнужные звуки. Этим и займутся триггеры!Начнем с клубники. Выделяем картинку с этойягодой и задаем для нее эффект анимации. Порядокдействий следующий: Настройка анимации— Добавить эффект — Выделение — Вращение(рис. 2).файл. При этом стоит поместить значок звука заграницы слайда, чтобы его не было видно при показепрезентации.А дальше приступим к созданию триггера. Дляэтого щелкнем правой кнопкой мыши на панелианимации по названию файла — картинки клубникии в открывшемся контекстном меню выберемкоманду Время (рис. 3), а в диалоговом окне Вращение(рис. 4) — вкладку Время.Рис. 3Рис. 4Затем нажмем на кнопку Переключатели иактивируем радиокнопку Начать выполнениеэффекта при щелчке. Выбираем в списке пунктKLUBNIKA и нажимаем ОК.Рис. 2Можно установить параметры Начало, Степеньи Скорость, а также при необходимости посмотреть,как будет протекать эффект (кнопкаПросмотр). Обратим внимание, что имя эффектасовпадет с именем графического файла с изображениемклубники (в нашем случае — KLUBNIKA), стипом автофигуры и т.п.При нажатии на рисунок клубники компьютереще должен издать “одобрительный” звук. Такиезвуки есть в самой программе PowerPoint, их можноскачать из Интернета, предварительно набравв любом из поисковых сервисов “коллекция звуков”.Вставим в презентацию два звуковых файла:один — одобрительно-веселый (его имя VERNO),другой — пронзительно-грустный (NEVERNO). Длявставки звуков необходимо выполнить командыВставка — Звук из файла, после выбрать нужныйред.2Обратим внимание, что арбуз — это ягода. — Прим.Рис. 549январь 2012 / ИНФорматика


в мир информатики № 172Выполнив действия, заметим, что на панелиНастройка анимации появился триггер с именемKLUBNIKA (рис. 5), а на слайде около изображенияклубники — значок руки (это информацияо том, что с изображением связан триггер и пощелчку на нем начнутся эффекты анимации) —см. рис. 6.Рис. 6После этого добавим в триггер звук. Для этоговыделяем звуковой файл и на панели Настройкаанимации нажимаем последовательно Добавитьэффект — Действия со звуком — Воспроизведение.Перетаскиваем надпись Verno (звуковойфайл) вдоль панели так, чтобы она оказалась в нашемтриггере (рис. 5). Правой кнопкой мыши выделяемзвуковой файл и в контекстном меню выбираемпункт Запускать вместе с предыдущим.Это означает, что при демонстрации презентации,как только мы щелкнем по клубнике, компьютериздаст также одобрительный звук. Первый триггерготов!Аналогично подготовим триггеры для другихягод и овощей. При этом у всех изображений наслайде появится значок руки (рис. 7). А на панелиНастройка анимации будет целых семь триггеров(по числу рисунков). Конечно, триггеров можетбыть и больше, это зависит от характера заданий,которые они должны выполнить.Рис. 7Теперь запустим презентацию и посмотрим, каквсе работает. Убеждаемся, что объекты двигаются,пропадают, звучат то радостные, то грустные звуки.Ягоды остаются, овощи и грибы исчезают.Используя триггеры, несложно придумать самыеразнообразные игры. Незаменимы они в случае, еслинадо привлечь внимание слушателей к презентации.Пригодятся они для подготовки учебных тестов, проверочныхзаданий, викторин. Да что говорить — спомощью триггеров можно изобрести еще не такое!Тем, кто пока не умеет пользоваться этой интерактивнойфункцией программы PowerPoint, можно посоветоватьвнимательно и скрупулезно ее изучить.Как знать, когда настанет момент нажать “спусковойкрючок” в содержательной, интересной и живой презентации?“Выстрел” должен быть точным!От редакции. Создайте всю презентацию сигрой, описанной в статье. Триггеры, “привязанные”к другим (кроме клубники) изображениям,разработайте самостоятельно. Придумайте и создайтетакже собственные презентации, в которыхиспользуются триггеры. Результаты присылайте вредакцию. Авторы лучших работ будут награжденыдипломами.50январь 2012 / ИНФорматикаЗадачникОтветы, решения, разъясненияк заданиям, опубликованнымв газете “В мир информатики”№ 167 (“Информатика”№ 13/2011)1. Задача “Четыре сообщения”Напомним, что необходимо было из четырех полученныхсообщений:1) 110100000100110011;2) 111010000010010011;3) 110100001001100111;4) 110110000100110010определить единственное сообщение, которое прошлобез ошибки и которое может быть корректнодекодировано при следующей таблице кодировки:В К А Р Д000 11 01 001 10РешениеНачиная с первого символа, будем разбиватькаждое сообщение на части, соответствующие допустимымкодам:1) первое сообщение:11 01 000 001 001 10 011— получается недопустимый код (выделен красным);2) второе сообщение:11 10 10 000 01 001 001 1— последний код — недопустимый;3) третье сообщение:11 01 000 01 001 10 01 11— все коды — допустимые (соответствуют словуКАВАРДАК);


4) четвертое сообщение:11 01 10 000 10 01 10 01 0— последний код — недопустимый.Ответ — третье сообщение.а из второго:Саша Ваня КоляОтвет. Старший — Коля, средний — Ваня, младший— Саша.Правильные ответы прислали:— Андрющенко Александр и Свистунов Николай,Ставропольский край, Кочубеевский р-н,станица Барсуковская, школа № 6, учитель РябченкоН.Р.;— Базылев Юрий и Галушкова Карина, РеспубликаКарелия, поселок Надвоицы, школа № 1, учительБогданова Л.М.;— Батракова Полина, Бетхер Алексей, ДукачСветлана, Клименко Надежда, Максимова Ксения иФалалеева Надежда, г. Лесосибирск Красноярскогокрая, поселок Стрелка, школа № 8 им. КонстантинаФилиппова, учитель Лопатин М.А.;— Глазкова Екатерина и Семяшкин Иван, РеспубликаКоми, г. Сыктывкар, МОУ “Лицей народнойдипломатии”, учитель Гранаткина О.М.;— Демьянова Елена, Костюнин Александр и ХомяковаАнна, средняя школа деревни Муравьево,Вологодская обл., учитель Муравьева О.В.;— Долгополов Сергей, средняя школа поселкаОзеры Красноярского края, учитель ФилипченкоИ.С.;— Зайнакаев Вадим, Коробейникова Полина,Кузнецова Екатерина, Ожгихина Екатерина и СмагинСергей, Республика Башкортостан, Краснокамскийр-н, село Николо-Берёзовка, школа № 1, учительСитдикова А.Г.;— Кондратов Богдан, г. Ярославль, школа № 33,учитель Цикина Е.Н.;— Неофитова Елена, средняя школа села Янтиково,Чувашская Республика, учитель Неофитова Н.Н.;— Махмутов Роберт, Сухоруков Антанас и ФазлыевФанис, Республика Башкортостан, г. Стерлитамак,школа № 24, учитель Орлова Е.В.;— Холодилова Дарья и Чернова Ксения, РеспубликаКарелия, поселок Надвоицы, школа № 1, учительКаликина Т.В.;— Шейкин Александр, средняя школа села Ириновка,Новобурасский р-н Саратовской обл., учительБрунов А.С.Отметим ответ Александра Шейкина, приведшегоподробное обоснование ответа. Заметим также,что в ряде ответов недопустимые варианты исключалисьс точки зрения осмысленности сообщения.2. Задача “Три брата”Напомним, что необходимо было назвать именастаршего, среднего и младшего из трех братьев, еслиВаня был не старше Коли, а Саша не старше Вани.РешениеРасположим имена ребят в порядке возрастаниявозраста (при просмотре слева направо).Из первого факта следует, что этот порядок такой:Ваня КоляПравильные ответы представили:— Базылев Юрий и Галушкова Карина, РеспубликаКарелия, поселок Надвоицы, школа № 1, учительБогданова Л.М.;— Валуев Федор, средняя школа села ВосточноеНижегородской обл., учитель Долгова Г.А.;— Дукач Светлана и Клименко Надежда, г. ЛесосибирскКрасноярского края, поселок Стрелка,школа № 8 им. Константина Филиппова, учительЛопатин М.А.;— Зайнакаев Вадим, Коробейникова Полина,Кузнецова Екатерина, Ожгихина Екатерина и СмагинСергей, Республика Башкортостан, Краснокамскийр-н, село Николо-Берёзовка, школа № 1, учительСитдикова А.Г.;— Куценко Евгения и Парамонова Анастасия,Ставропольский край, Кочубеевский р-н, станицаБарсуковская, школа № 6, учитель Рябченко Н.Р.;— Сухоруков Антанас и Фазлыев Фанис, РеспубликаБашкортостан, г. Стерлитамак, школа № 24,учитель Орлова Е.В.;— Чернова Ксения, поселок Надвоицы, школа№ 1, учитель Каликина Л.М.3. Чайнворд “Соточка”Ответы. 1–11. Пиктограмма. 11–13. Ада. 13–21.Ассемблер. 21–26. Россия. 26–31. Ячейка. 31–35. Абзац.35–38. Цикл. 38–44. Лавлейс. 44–49. Спрайт.49–54. Трафик. 54–63. Клавиатура. 63–73. Архитектура.73–79. Адаптер. 79–83. Растр. 83–88. Разряд.88–93. Датчик. 93–97. Кобол. 97–100. Лисп (илиЛого).Правильные ответы прислали:— Базылев Юрий и Галушкова Карина, РеспубликаКарелия, поселок Надвоицы, школа № 1, учительБогданова Л.М.;— Демьянова Елена, Костюнин Александр, ЛомакинаЕлена и Хомякова Анна, средняя школа деревниМуравьево, Вологодская обл., учитель МуравьеваО.В.;— Дукач Светлана и Клименко Надежда, г. ЛесосибирскКрасноярского края, поселок Стрелка,школа № 8 им. Константина Филиппова, учительЛопатин М.А.;— Кондратов Богдан, г. Ярославль, школа № 33,учитель Цикина Е.Н.;— Махмутов Роберт, Республика Башкортостан,г. Стерлитамак, школа № 24, учитель Орлова Е.В.;— Неофитова Елена, средняя школа села Янтиково,Чувашская Республика, учитель Неофитова Н.Н.;— Шадрина Юлия, Чувашская Республика, г. Канаш,Канашский педагогический колледж, преподавательВоеводина Р.В.;51январь 2012 / ИНФорматика


в мир информатики № 172— Чернова Ксения, поселок Надвоицы, школа№ 1, учитель Каликина Л.М.;— Шейкин Александр, средняя школа села Ириновка,Новобурасский р-н Саратовской обл., учительБрунов А.С.;— Щукин Андрей, средняя школа села ВосточноеНижегородской обл., учитель Долгова Г.А.Проведем анализ варианта А = 5:× М 5М 5* Х 5* * УЭ М М 552январь 2012 / ИНФорматика4. Задача “Как проехать из A в B?”Ответ. Условие: “Минимальная стоимость проездаот станции А до станции B не больше 6” выполняетсядля таблицы 3. Маршрут движения А — C —E — B (стоимость равна 6).Правильные ответы представили:— Базылев Юрий и Галушкова Карина, РеспубликаКарелия, поселок Надвоицы, школа № 1, учительБогданова Л.М.;— Демьянова Елена, Костюнин Александр и ХомяковаАнна, средняя школа деревни Муравьево,Вологодская обл., учитель Муравьева О.В.;— Дукач Светлана и Клименко Надежда, г. ЛесосибирскКрасноярского края, поселок Стрелка,школа № 8 им. Константина Филиппова, учительЛопатин М.А.;— Зайнакаев Вадим, Коробейникова Полина,Кузнецова Екатерина, Ожгихина Екатерина и СмагинСергей, Республика Башкортостан, Краснокамскийр-н, село Николо-Берёзовка, школа № 1, учительСитдикова А.Г.;— Кондратов Богдан, г. Ярославль, школа № 33,учитель Цикина Е.Н.;— Сухоруков Антанас и Фазлыев Фанис, РеспубликаБашкортостан, г. Стерлитамак, школа № 24,учитель Орлова Е.В.;— Чернова Ксения, Республика Карелия, поселокНадвоицы, школа № 1, учитель Каликина Т.В.5. Числовой ребус с “ЭММОЙ”Напомним, что необходимо было решить числовойребусМА × МА = ЭММАРешениеЕсть только три цифры, которые, будучи умноженнымина саму себя, дают число, оканчивающеесяна эту же цифру: 0, 1, 5 и 6.Значение А = 0 не подходит явно (квадрат числа,оканчивающегося на 0, оканчивается на 00).Для анализа варианта А = 1 запишем ребус “встолбик” (символом “*” может быть любая цифра,кроме 0):М 1×М 1М 1* * МЭ М М 1Но М + М = М только при М = 0, что недопустимо.Можно сказать, что цифра Х равна 2 при четной Ми Х = 7 при нечетной М. А цифра У — соответственно,0 и 5. Это означает, что в любом случае цифра М врезультате равна 2. Но 25 2 — трехзначное число, т.е.вариант А = 5 не подходит. Итак, А = 6.Проверка остальных цифр М (М ≥ 3) показывает,что решением ребуса является: 76 × 76 = 5776.Правильные ответы прислали:— Андрющенко Александр, Ставропольскийкрай, Кочубеевский р-н, станица Барсуковская,школа № 6, учитель Рябченко Н.Р.;— Базылев Юрий и Галушкова Карина, РеспубликаКарелия, поселок Надвоицы, школа № 1, учительБогданова Л.М.;— Батракова Полина, Дукач Светлана, КлименкоНадежда и Максимова Ксения, г. Лесосибирск Красноярскогокрая, поселок Стрелка, школа № 8 им.Константина Филиппова, учитель Лопатин М.А.;— Глазкова Екатерина и Семяшкин Иван, РеспубликаКоми, г. Сыктывкар, МОУ “Лицей народнойдипломатии”, учитель Гранаткина О.М.;— Зайнакаев Вадим, Коробейникова Полина,Кузнецова Екатерина, Ожгихина Екатерина и СмагинСергей, Республика Башкортостан, Краснокамскийр-н, село Николо-Берёзовка, школа № 1, учительСитдикова А.Г.;— Кондратов Богдан, г. Ярославль, школа № 33,учитель Цикина Е.Н.;— Любимов Антон, г. Пенза, школа № 512, учительГаврилова М.И.;— Махмутов Роберт, Республика Башкортостан,г. Стерлитамак, школа № 24, учитель ОрловаЕ.В.;— Холодилова Дарья и Чернова Ксения, РеспубликаКарелия, поселок Надвоицы, школа № 1, учительКаликина Т.В.;— Шейкин Александр, средняя школа села Ириновка,Новобурасский р-н Саратовской обл., учительБрунов А.С.Свистунов Николай, Ставропольский край, Кочубеевскийр-н, станица Барсуковская, школа № 6,учитель Рябченко Н.Р., для решения задачи разработалпрограмму на языке Паскаль.6. Задача “Пять бусинок”Напомним, что необходимо было установить, какаяиз четырех цепочек бусинок, помеченных буквамиM, N, O, P, S:1) SMP; 3) SNO;2) MSO; 4) OSN,


— создана с соблюдением следующих правил:А) в середине цепочки стоит одна из бусин M, O, S;Б) на третьем месте должна быть любая гласная,если первая буква согласная, и любая согласная,если первая гласная;В) на первом месте стоит одна из бусин O, P, S, нестоящая в цепочке в середине,а также определить, сколько вариантов цепочек можносоставить согласно указанным требованиям.Решение первой задачиПроверим соответствие цепочек каждому требованию.Требованию А не соответствует цепочка 3.Требованию В не соответствует цепочка 2.Так как в цепочке 1 первая буква согласная, то натретьем месте должна стоять любая гласная, а этотребование не соблюдается.Итак, все три требования соблюдаются в цепочке 4.Решение второй задачиС соблюдением требования А возможны 3 варианта:MOSС учетом также требования В возможны 7 вариантов:OPSPSOPMOSС соблюдением требования Б варианты с первойсогласной (их 5) буквой дают один варианткаждый, с первой гласной буквой (их два) — даютчетыре варианта каждый. Итак, общее число допустимыхвариантов равно:5 × 1 + 2 × 4 = 13.Правильные ответы представили:— Базылев Юрий и Галушкова Карина, РеспубликаКарелия, поселок Надвоицы, школа № 1, учительБогданова Л.М.;— Глазкова Екатерина и Семяшкин Иван, РеспубликаКоми, г. Сыктывкар, МОУ “Лицей народнойдипломатии”, учитель Гранаткина О.М.;— Долгополов Сергей, средняя школа поселкаОзеры Красноярского края, учитель ФилипченкоИ.С.;— Зайнакаев Вадим, Коробейникова Полина,Кузнецова Екатерина, Ожгихина Екатерина и СмагинСергей, Республика Башкортостан, Краснокамскийр-н, село Николо-Берёзовка, школа № 1, учительСитдикова А.Г.;— Кондратов Богдан, г. Ярославль, школа № 33,учитель Цикина Е.Н.;— Любимов Антон, г. Пенза, школа № 512, учительГаврилова М.И.;— Харламов Виталий, средняя школа поселкаНовопетровский Московской обл., учитель АртамоноваВ.В.;— Чернова Ксения, Республика Карелия, поселокНадвоицы, школа № 1, учитель Каликина Т.В.Задача “Любительница мороженого”Напомним, что необходимо было определить, какое мороженое и с какими фруктами можно приготовитьИрине по ее вкусу, если из перечня:1) пломбир с орехами;2) пломбир с бананами;3) пломбир с черникой;4) шоколадное с черникой;5) шоколадное с клубникойв четырех вариантах ей не нравились или тип мороженого, или наполнитель, а в одном варианте — нимороженое, ни наполнитель.РешениеДопустим, что Ирина любит мороженое типа пломбир. Тогда она не любит наполнитель в виде орехов(это следует из пункта 1 перечня), бананов (пункт 2) и черники (пункт 3). Кроме того, раз она любит пломбир,то ей не нравится шоколадное мороженое (пункты 4 и 5 перечня). При этом против клубники онаничего не имеет (пункт 5 перечня является четвертым из тех, в которых девушке не нравились или типмороженого, или наполнитель, а пункт 4 — единственный, в котором ей не нравится ни мороженое, ни наполнитель).Итак, при сделанном допущении она не против съесть только пломбир с клубникой.Можно также составить таблицу:Вариант в перечне Тип Обоснование Наполнитель Обоснование1) пломбир с орехами; Нравится Из допущения Не нравится Из условия2) пломбир с бананами; Нравится Из допущения Не нравится Из условия3) пломбир с черникой; Нравится Из допущения Не нравится Из условия4) шоколадное с черникой; Не нравится Из допущения Не нравится См. выше5) шоколадное с клубникой Не нравится Из допущения Нравится Из условия53январь 2012 / ИНФорматика


в мир информатики № 172Допустим, что девушка любит шоколадное мороженое. Тогда она не любит наполнитель в виде черники(это следует из пункта 4 перечня) и клубники (пункт 5). Составим таблицу:Вариант в перечне Тип Обоснование Наполнитель Обоснование1) пломбир с орехами; Не нравится Из допущения2) пломбир с бананами; Не нравится Из допущения3) пломбир с черникой; Не нравится Из допущения Не нравится См. ниже4) шоколадное с черникой; Нравится Из допущения Не нравится Из условия5) шоколадное с клубникой Нравится Из допущения Не нравится Из условияИз нее следует, что орехи и бананы в мороженом она ест (пункты 1 и 2). Поскольку в условии речь шла онаполнителе — фрукте, то получается, что шоколадное мороженое с бананом ей можно приготовить.Ответ. Задача имеет два варианта решения: Ирине можно приготовить пломбир с клубникой или шоколадноемороженое с бананом.54январь 2012 / ИНФорматикаОтветы прислали:— Андрющенко Александр, Куценко Евгения,Парамонова Анастасия и Свистунов Николай, Ставропольскийкрай, Кочубеевский р-н, станица Барсуковская,школа № 6, учитель Рябченко Н.Р.;— Базылев Юрий и Галушкова Карина, РеспубликаКарелия, поселок Надвоицы, школа № 1, учительБогданова Л.М.;— Долгополов Сергей, средняя школа поселка ОзерыКрасноярского края, учитель Филипченко И.С.;— Зайнакаев Вадим, Коробейникова Полина,Кузнецова Екатерина, Ожгихина Екатерина и СмагинСергей, Республика Башкортостан, Краснокамскийр-н, село Николо-Берёзовка, школа № 1, учительСитдикова А.Г.;— Кондратов Богдан, г. Ярославль, школа № 33,учитель Цикина Е.Н.;— Любимов Антон, г. Пенза, школа № 512, учительГаврилова М.И.;— Харламов Виталий, средняя школа поселкаНовопетровский Московской обл., учитель АртамоноваВ.В.;— Чернова Ксения, Республика Карелия, поселокНадвоицы, школа № 1, учитель Каликина Т.В.Решение задачи “День рождения” и объяснениефокуса “Отгадывание задуманного двузначногочисла” представил Базылев Юрий, Республика Карелия,поселок Надвоицы, школа № 1, учитель БогдановаЛ.М.Компьютерные программы, моделирующие игру“крестики-нолики”, разработали:— Базылев Юрий, Республика Карелия, поселокНадвоицы, школа № 1, учитель Богданова Л.М.;— Журавлев Алексей, Лукина Полина и Пехов Андрей,г. Ярославль, школа № 33, учитель Ярцева О.В.;— Зуйков Денис, Владимирская обл., г. Струнино,школа № 11, учитель Волков Ю.П.;— Кузнецов Денис и Сосновцев Илья, средняяшкола села Ириновка, Новобурасский р-н Саратовскойобл., учитель Брунов А.С.Все перечисленные читатели будут награжденыдипломами. Отдельно отметим ответ Андрея Пехова,который разработал не только два вариантапрограммы, предложенные в статье (выбор ходакомпьютером “наугад” и “осмысленный” выборхода им), но и “промежуточный” вариант.Списки читателей, приславших ответы “обычной”почтой, будут опубликованы в следующем выпуске.Встреча друзейШесть друзей — Моисеев, Потапов, Ефимов,Дмитри ев, Алексеев и Осипов — закончили одинуниверситет. И вот однажды они снова встретилисьв санатории на берегу Черного моря и весь вечер,сидя за круглым сто лом, рассказывали о своей работе,о планах на будущее. Один из них стал виднымлитератором, другой — био логом, третий —инженером, четвертый — капитаном, пятый —юристом, шестой — физиком.За столом они расположились так: юрист селпротив Ефимова, литератор — против Осипова, которыйрасполо жился между капитаном и юристом,биолог — против Дмитриева, рядом с литератороми слева от Алексеева. Инженер оказался между капитаноми литератором. Моисеев поместился рядомс биологом, против физика.Попробуйте определить специальность каждогоиз друзей.Шахматный турнирВ шахматном турнире играли пять шахматистов.Турнир проводился в один круг. Известно, что игрокА набрал 3,5 очка, Б — 1,5, В — 2,5 и Д — тоже 2,5очка, причем последний не имел ни одного поражения.Результаты игрока Г неизвестны.Требуется заполнить турнирную таблицу, установив,как сыграл каждый шахматист со своимисоперниками, и определить результат игрока Г.ПокупкаЧетверо товарищей купили вместе одну вещь.Первый внес половину суммы, внесенной остальными,второй — треть суммы, внесенной остальными,третий — четверть суммы, внесенной остальными,


а четвертый внес 130 рублей. Сколько стоит вещь исколько внес каждый?Числа на доскеНа доске написано число 1. Каждую секунду кчислу на доске прибавляется сумма его цифр. Можетли через некоторое время на доске появитьсячисло 123456? Ответ получите путем рассужденийи/или разработав программу на языке программирования,который вы изучаете.Соревнования по гимнастикеВ соревнованиях по гимнастике участвовалиАлла, Валя, Сима, Даша. Были высказаны предположения:1) Сима будет первой, Валя — второй;2) Сима будет второй, Даша — третьей;3) Алла будет второй, Даша — четвертой.Оказалось, что в каждом предположении толькоодно высказывание верно. Какое место заняла каждаяиз девушек?СеминарКак в компьютере проводитсявычитание?В предыдущей публикации [1] было показано,что реле можно соединить проводами в болеесложные устройства — логические вентили и создатьиз них двоичный сумматор — устройство длясложения двух двоичных чисел. Возникает вопрос:“А как же вычитание?” Задавая его, не опасайтесьпрослыть занудой . На самом деле вы простоосмотрительны. Сложение и вычитание определеннымобразом дополняют друг друга, но механикадвух этих операций различна. Сложение выполняетсяпоследовательно от крайнего правого столбцацифр к крайнему левому. Перенос из каждогостолбца прибавляется к следующему столбцу. Привычитании мы не переносим, а заимствуем, и этоприводит к внутренне отличной последовательностидействий, усложненной своего рода движениемвперед и назад.Рассмотрим типичную задачу на вычитание,усложненную заимствованием:–2 5 31 7 6? ? ?Начнем с крайнего правого столбца. Очевидно,что 6 больше 3, поэтому приходится занять 1 у 5 ивычесть 6 из 13. Получается 7. Поскольку мы занялиу пятерки единицу, она превратилась в 4. Эта цифраменьше 7, и мы занимаем 1 у 2 и вычитаем 7 из 14.Получаем 7. Вспоминаем, что заняли 1 у 2, так чтовместо 2 имеем 1 и вычитаем 1 из 1. Получаем 0.Окончательный ответ 77.–2 5 31 7 67 7Как нам заставить набор вентилей разобраться встоль запутанной логике?На самом деле не стоит даже пробовать. Вместоэтого мы прибегнем к небольшой хитрости,которая позволит выполнять вычитание без заимствования.Подробное исследование этогоспособа вычитания полезно с теоретической точкизрения, так как он напрямую связан с методикойхранения двоичных отрицательных чисел вкомпьютерах.Для начала вспомним, что числа, участвующие ввычитании, называются уменьшаемым и вычитаемым.Вычитаемое вычитается из уменьшаемого, арезультат называется разностью.– УменьшаемоеВычитаемоеРазностьЧтобы обойтись в вычитании без заимствования,во-первых, вычтем вычитаемое не из уменьшаемого,а из 999:–9 9 91 7 68 2 3Здесь мы используем 999, поскольку вычитаемоеявляется трехзначным числом. Если бы оно былочетырехзначным, мы вычли бы его из 9999. Результатвычитания числа из строки девяток называетсядополнением до девяти. Дополнение до девяти числа176 есть 823. Верно и обратное: дополнение додевяти числа 823 есть 176. И, что приятно, — какимбы ни было вычитаемое, вычисление его дополнениядо девяти никогда не требует заимствования.Вычислив дополнение числа до девяти, прибавьтек нему уменьшаемое: +1 сейчас.+ 2 5 38 2 31 0 7 6Наконец, сложите результат с 1 и вычтите 1000:1 0 7 6+ 1– 1 0 0 07 7Готово! Мы получили тот же результат, что ираньше, без единого заимствования.Как это получилось? Исходная задача на вычитаниевыглядит так:253 – 17655январь 2012 / ИНФорматика


в мир информатики № 17256январь 2012 / ИНФорматикаК этому выражению можно прибавить и вычестьлюбое число — результат от этого не изменится.Прибавим и вычтем 1000.253 – 176 + 1000 – 1000Это выражение эквивалентно выражению:253 – 176 + 999 + 1 – 1000Числа можно перегруппировать:253 + (999 – 176) + 1 – 1000Это как раз и есть тот расчет, что мы провели,используя дополнение вычитаемого до девяти. Мызаменили одно вычитание двумя вычитаниями идвумя сложениями, попутно освободившись от всехзаимствований.А что делать, если вычитаемое больше уменьшаемого?Ведь задача на вычитание может выглядеть итак:–1 7 62 5 3? ? ?Первое, что приходит на ум: “Хм. Я вижу, что вычитаемоебольше уменьшаемого. Я меняю числаместами и произвожу вычитание, помня при этом,что результат будет отрицательным”. Ответ записываетсяследующим образом:–1 7 62 5 3– 7 7Чтобы выполнить такой расчет без заимствования,придется поступить несколько иначе, чем впредыдущем примере. Начинаем опять с вычислениядополнения вычитаемого (253) до девяти:–9 9 92 5 37 4 6Теперь складываем дополнение до девяти суменьшаемым:+ 1 7 67 4 69 2 2В предыдущей задаче на этом этапе нужно былоприбавить 1 и вычесть 1000, чтобы получить окончательныйответ. В данном случае эта стратегия несработает. Пришлось бы вычесть 1000 из 923, а этов реальности оборачивается вычитанием 923 из1000 и требует заимствований.На самом деле, вычисляя дополнение вычитаемогодо девяти, мы фактически прибавили к нему999, поэтому теперь будем вычитать 999:–9 2 29 9 9? ? ?Глядя на этот пример, мы понимаем, что ответбудет отрицательным. Поэтому числа нужно поменятьместами и вычесть 922 из 999. Это действиеснова не требует заимствования. Ответ, как мы иожидали, равен 77:–9 9 99 9 27 7При вычитании двоичных чисел используетсяточно такой же метод. Более того, он проще, чем вдесятичном случае. Посмотрим, как он работает.Вот как выглядит наша задача на вычитание:–2 5 31 7 67 7Записав эти числа в двоичном представлении,получаем задачу такого вида:– 1111110110110000????????Шаг 1. Вычтем вычитаемое из 11111111 (т.е. из255):– 111111111011000001001111Когда мы работали с десятичными числами,вычитаемое вычиталось из строки девяток, а результатназывался дополнением до девяти. Прирасчетах с двоичными числами вычитаемое вычитаетсяиз строки единиц, и результат называетсядополнением до единицы (по аналогии с дополнениемдо девяти). Но заметьте: чтобы получитьдополнение до единицы, вычитать на самом делене нужно! И вот почему: каждый 0 в исходномчисле становится 1 в дополнении, а каждая 1 превращаетсяв 0. Именно поэтому дополнение доединицы называют также обратным, или инвертированным,кодом [2].Шаг 2. Складываем обратный код вычитаемого суменьшаемым:11111101+01001111101001100Шаг 3. Прибавляем к результату 1:+ 101001100 1101001101Шаг 4. Вычитаем 100000000 (т.е. 256):101001101–1000000001001101Этот результат соответствует десятичному числу77.Теперь повторим последовательность действий,выполненных для тех же чисел, но с заменой вычитаемогона уменьшаемое. В десятичном виде этазадача записывалась так:–1 7 62 5 3? ? ?


а в двоичном она выглядит так:10110000–11111101????????Шаг 1. Вычитаем вычитаемое из 11111111, чтобыполучить его обратный код.Пульт управления сумматором выглядел примернотак:+101– 111111111111110100000010Шаг 2. Прибавляем обратный код к уменьшаемому.+ 101100000000001010110010Теперь из результата нужно вычесть 11111111.Когда вычитаемое было меньше уменьшаемого,эта задача решалась добавлением 1 и вычитанием100000000. Теперь сделать это без заимствованияне удастся, поэтому мы вычитаем полученный результатиз 11111111:– 111111111011001001001101Как и ранее, это действие эквивалентно инвертированию.В ответе получилось 77, но мы помним,что в действительности это –77.Теперь у нас есть все необходимые познания длямодернизации сумматора из предыдущей публикации,чтобы он выполнял не только сложение, но ивычитание. Чтобы не слишком усложнять задачу,наша новая суммирующая и вычитающая машинабудет выполнять вычитание, только когда вычитаемоеменьше уменьшаемого.Вспомним, что основой суммирующей машиныбыл 8-битовый сумматор, собранный из логическихвентилей:СОВыходдля переносаВход для числа А А 7…А 08-битовый сумматорS 7…S 0Выход для суммыВход для числа BB 7…B 0СlВходдля переносаРис. 1Как вы помните, входы с А 7по А 0и с В 7по В 0соединялисьс переключателями, задававшими два 8-битовыхслагаемых. Вход для переноса соединялся сземлей. Выходы с S 7по S 0соединялись с восемьюлампочками, отображавшими результат сложения.Поскольку результатом сложения могла быть 9-битоваявеличина, выход для переноса соединялся сдевятой лампочкой.0Рис. 2На рис. 2 переключатели установлены в положения,соответствующие сложению чисел 183 (10110111) и22 (00010110). Результат сложения, о чем свидетельствуютлампочки, равен 205 (11001101).Вид пульта управления для сложения или вычитаниядвух 8-битовых чисел слегка иной. На немпоявился дополнительный переключатель, с помощьюкоторого можно задать действие — вычитаниеили сложение (см. рис. 3).10Вычитание10СложениеПереполнениеИсчезновениеРис. 3Если этот переключатель разомкнут, производитсясложение, если замкнут — вычитание. Крометого, теперь для отображения результата используютсятолько правые 8 лампочек. Девятая лампочкаподписана “Переполнение/Исчезновение”. Онасигнализирует, что вычисленное число не можетбыть представлено только 8 лампочками. Это происходит,если сумма больше 255 (переполнениеразрядов) или если разность оказалась отрицательной(исчезновение разрядов).Основным новшеством в нашем сумматоре станетсхема, которая вычисляет дополнение 8-разрядногочисла до единицы. Как вы помните, этоэквивалентно инвертированию битов, так что длявычисления дополнения 8-разрядного числа до единицыможно использовать просто 8 инверторов:ВходыВыходыРис. 4Но эта схема всегда инвертирует биты, поступающиена ее входы, в нашей машине для сложения и57январь 2012 / ИНФорматика


в мир информатики № 17258январь 2012 / ИНФорматикавычитания нам нужно устройство, которое инвертировалобы биты, только если производится вычитание.Более подходящая схема выглядит так:ИнверсияРис. 5ВходыВыходыСигнал Инверсия подается на входы всех девятивентилей “Искл-ИЛИ”. Напомним, что вентиль“Искл-ИЛИ” работает так:Искл-ИЛИ 0 10 0 11 1 0Если сигнал Инверсия равен 0, восемь выходоввентилей “Искл-ИЛИ” повторяют сигнал на восьмиих входах. Например, если на вход подается число01100001, на выходе также будет 01100001. Если жесигнал Инверсия равен 1, восемь входных сигналовбудут инвертироваться (если на входе 01100001, навыходе имеем 10011110).Давайте поместим восемь вентилей “Искл-ИЛИ”в общий прямоугольник под названием “Дополнениедо единицы”:Вх 7Вх 6Вх 5Вх 4Вх 3Вх 2Вх 1Вх 0ИнверсияДополнение до единицыВых 7Вых 6Вых 5Вых 4Вых 3Вых 2Вых 1Вых 0Рис. 6Теперь вентиль “Дополнение до единицы”, 8-битовыйсумматор и выходной вентиль “Искл-ИЛИ”можно собрать в единую схему:Вход АВход BИнверсияДополнениедо единицыА 7…А 0 В 7…В 0СО8-битовый сумматорS 7…S 0Переполнение /ИсчезновениеВыход для суммыСlРис. 7Обратите внимание на сигнал Выч, идущий спереключателя “Сложение/Вычитание”. Этот сигналравен 0, если нужно выполнить сложение, и 1,если нужно выполнить вычитание. При вычитаниивходы В (второй ряд переключателей) перед сумматороминвертируются схемой “Дополнение до единицы”,а к результату сумматора прибавляется 1,для чего его вход CI установлен в 1. При сложениисхема “Дополнение до единицы” не делает ничего;сигнал на входе CI равен 0.Сигнал Выч и выход СО (выход для переноса) сумматоратакже поступают в вентиль “Искл-ИЛИ”,который управляет включением лампочки “Переполнение/Исчезновение”.При равенстве 0 сигналаВыч (выполняется сложение) лампочка горит, еслисигнал СО сумматора равен 1, т.е. результат сложенияоказался больше 255.Пусть вас не смущает, что выход СО сумматораравен 1, если выполняется вычитание и вычитаемое(переключатели В) меньше уменьшаемого (переключателиА). Так проявляется число 100000000,которое в этом случае должно вычитаться на заключительномшаге. Лампочка “Переполнение/Исчезновение” горит, только если выход СО сумматораравен 0. Это означает, что вычитаемое большеуменьшаемого и результат отрицателен. Отображениеотрицательных чисел в нашем устройстве непредусмотрено.Мы в этой статье уже неоднократно говорили оботрицательных числах, но все еще не показали, начто они похожи в двоичном представлении. Можно,конечно, обозначать отрицательные двоичныечисла знаком “минус”, как и в десятичной системе,скажем, записать число –77 как –1001101. Но однаиз целей введения двоичных чисел в том, чтобыпредставлять в виде нулей и единиц все что угодно,в том числе и знак “минус” перед отрицательнымчислом.Признаком знака может служить и дополнительныйбит, который, например, равнялся бы 1 уотрицательных чисел и 0 у положительных. Однакоесть другой способ представления отрицательныхчисел, который позволяет без особых хлопотскладывать отрицательные и положительныечисла. Недостаток его лишь в том, что вы должнызаранее решить, сколько цифр понадобится дляпредставления чисел, с которыми вам предстоитиметь дело.Давайте немного подумаем. Преимуществостандартного способа записи положительных и отрицательныхчисел в том, что он не накладываетникаких ограничений на их величины. Как отрицательные,так и положительные числа расходятся от0 до бесконечности.... –1000000 –999999 ...... –3 –2 –1 0 1 2 3 ...... 999999 1000000 ..,Но допустим, что бесконечный числовой ряд намне нужен, так как мы заранее знаем, что все числа,с которыми мы столкнемся, заключены в определенныхпределах.


Рассмотрим в качестве примера условный банковскийсчет, где нам иногда приходится на практикесталкиваться с отрицательными числами.Предположим, что мы никогда не держали на счетебольше 499 рублей и что банк при пользовании счетомразрешает кратковременный перерасход такжена 500 рублей (“в долг”). Это значит, что баланснашего счета всегда заключен между 499 рублямии –500 рублями. Допустим также, что мы никогдане вносим на счет больше 500 рублей, никогда несписываем со счета больше, чем 500 рублей, и, наконец,имеем дело только с рублями, не обращаявнимания на копейки.Этот набор условий означает, что в работе сосчетом нам никогда не приходится иметь дело счислами, выходящими за пределы от –500 до 499.Всего в этом диапазоне 1000 целых чисел. Это значит,что для представления всех нужных чисел мыможем использовать три десятичные цифры и неприбегать к знаку “минус”. Хитрость в том, что намне нужны положительные числа из диапазона от500 до 999, так как по нашим условиям максимальноеположительное число, в котором мы нуждаемся,— 499. Значит, с помощью трехзначных чиселиз диапазона от 500 до 999 можно представлять отрицательныечисла. Вот как это сделать:Вместо –500 используем 500Вместо –499 используем 501Вместо –498 используем 502…Вместо –2 используем 998Вместо –1 используем 999Вместо 0 используем 000Вместо 1 используем 001Вместо 2 используем 002…Вместо 497 используем 497Вместо 498 используем 498Вместо 499 используем 499Иначе говоря, все трехзначные числа, начинающиесяс 5, 6, 7, 8 и 9, представляют отрицательныезначения. Вместо записи чисел с минусами:–500 –499 –498 ... –4 –3 –2 –1 0 1 2 3 4 ... 497 498 499— мы записываем их так:500 501 502 ... 996 997 998 999 000 001 002 003 004... 497 498 499Заметьте: числа идут по кругу. Наименьшее отрицательноечисло (500) выглядит как продолжениенаибольшего положительного (499). Число 999(представляющее –1) на единицу меньше 0. Еслиприбавить к 999 единицу, мы получим 1000, но посколькумы имеем дело только с тремя цифрами, вдействительности получаем 000.Такой способ обозначения отрицательных чиселназывается дополнением до десяти. Чтобы преобразоватьтрехзначное отрицательное число в дополнениедо десяти, вычитаем его из 999 и добавляем1. Иными словами, дополнение до десяти — этодополнение до девяти плюс 1. Например, чтобы переделать–255 в дополнение до десяти, вычтем егоиз 999, получив 744, и прибавим 1, что дает 745.Вам, вероятно, приходилось слышать, что “вычитание— это просто сложение с отрицательнымчислом”. На это вы скорее всего отвечали: “Да, нопри этом оно остается вычитанием”. Дополнениедо десяти позволяет избавиться от вычитания, полностьюзаменив его сложением.Пусть на вашем счете 143 рубля. Вы потратили78 рублей. Это означает, что к 143 нужноприбавить –78. Дополнение –78 до десяти равно999 – 078 + 1, или 922. Таким образом, ваш баланссоставляет 143 + 922, что равно 65 рублей (безучета переполнения). Если вы после этого потратите150 руб лей, то должны будете прибавить к балансу1 число –150, дополнение которого до десятиравно 850. Сумма предыдущего баланса 065 и 850равна 915. В обычном представлении число 915 эквивалентно–85 рублям — вашему новому балансу.Аналогичная система в двоичном счислении называетсядополнением до двух. Предположим, чтомы работаем только с 8-битовыми числами, заключеннымив пределах от 00000000 до 11111111,или от 0 до 255 в десятичной системе. Чтобы отображатьс их помощью также и отрицательные числа,придется отдать в отрицательную область все8-битовые числа, начинающиеся с 1, как показанов таблице:ДвоичноезначениеДесятичноезначение10000000 –12810000001 –12710000010 –126…11111101 –311111110 –211111111 –100000000 000000001 100000002 2…01111110 12601111111 127Диапазон чисел, которые вы теперь можетепредставить, ограничен пределами от –128до +127. Старший значащий бит (крайний слева)называется знаковым разрядом. Знаковый разрядравен 1 для отрицательных чисел и 0 для положительных.Чтобы вычислить дополнение до двух, нужнопосчитать дополнение до единицы и прибавить 1или, что эквивалентно, инвертировать все цифрыи прибавить 1. Например, десятичное число 125 вдвоичной системе выглядит как 01111101. Чтобыпредставить –125 в виде дополнения до двух, инвертируемцифры в числе 01111101, получая в результате10000010, а затем прибавляем единицу,что дает 10000011. Проверьте результат по табли-59январь 2012 / ИНФорматика


в мир информатики № 172це. Чтобы проделать обратную операцию, нужносделать то же самое — инвертировать все биты иприбавить 1.Эта система позволяет выражать положительныеи отрицательные числа без знака “минус”, а такжескладывать положительные и отрицательные числа,используя только правила сложения. Давайте вкачестве примера сложим двоичные эквиваленты–127 и 124. Используя предыдущую таблицу какшпаргалку, запишем:+100000010111110011111101Этот результат эквивалентен десятичному числу–3 (то есть –127 +124 = –3).При этом необходимо следить за переполнениемили исчезновением разрядов. Такое случится, еслирезультат сложения окажется больше 127 или меньше–128. Допустим, мы хотим сложить число 125 сним самим.+011111010111110111111010Старший бит равен 1, т.е. результат интерпретируетсякак отрицательное число и становится равным–6.То же самое происходит, если с самим собой высложите число –125.+1000001110000011100000110Мы условились в начале, что ограничимся 8-битовымичислами, поэтому крайнюю левую цифрурезультата приходится игнорировать. Правые же8 битов эквивалентны +6.В заключение напомним, что описанная идеярасчетов используется для получения так называемого“дополнительного k-разрядного кода отрицательногочисла”. Алгоритм его получения [2]:1) модуль отрицательного числа представитьпрямым кодом в k двоичных разрядах;2) получить его обратный код;3) к полученному обратному коду, рассматриваемомукак k-разрядное неотрицательное двоичноечисло, прибавить единицу.Задания для самостоятельной работы1. Подумайте над вопросом: “Можно ли только повиду двоичного числа определить его десятичныйэквивалент?” Например, кто-то скажет вам: “У меняесть 8-битовое двоичное число, равное 110110. Каковего десятичный эквивалент?” Что ответите вы?2. Определите, каким десятичным числам соответствуют:1) 8-битовые числа без знака;2) 8-битовые числа со знаком.3. Подумайте, как по знаковым разрядам двухслагаемых (положительных и/или отрицательныхчисел) и знаковому разряду результата определитьправильность результата сложения.4. Ответьте на вопрос: “Для чего используетсядополнительный код отрицательного числа?”Ответы присылайте в редакцию (можно отвечатьне на все вопросы).Литература1. Создаем сами двоичный сумматор. / “В мир информатики”№ 171 (“Информатика” № 17/2011).2. Андреева Е.В., Босова Л.Л., Фалина И.Н. Математическиеосновы информатики. М.: Бином. Лабораториязнаний, 2005.3. Петцольд Ч. Код. М.: Издательско-торговыйдом “Русская редакция”, 2001.Творчество наших читателейРебусы, посвященные Году космонавтики. Часть 460Мы завершаем публикацию ребусов, посвященных Году космонавтики (таким был 2011 год), которыеразработали Анатолий и Ульяна Тимофеевы, ученики Именевской основной школы, Красноармейский р-нЧувашской Республики (учитель Тимофеева И.А.).Ребус № 1 Ребус № 2январь 2012 / ИНФорматика


Ребус № 3Ребус № 7Ребус № 8Ребус № 4Ребус № 9Ребус № 5Ребус № 6Ответы присылайте в редакцию (можнорешать не все ребусы). Подумайте также, скакой темой, относящейся к космонавтике,связаны ребусы.Спасибо авторам и всем приславшим ответы!“Ломаем” головуЧисловой ребус с неизвестнымчисломРассмотрим числовой ребус:A B C D+ D C B AX X X X1 2 3 0 0В нем A, B, C, D — четыре последовательные цифры,идущие в порядке возрастания. Четыре буквы Х — этоте же самые четыре цифры в неизвестном порядке. Какоечисло обозначено четырьмя буквами Х? Каково всерешение ребуса? Можно ли решить ребус, если системасчисления, в которой записаны числа, неизвестна?Выбрать фигуруИз шести пронумерованных фигур выберитету, которая должна стоять на месте вопросительногознака:61январь 2011 / ИНФорматика


в мир информатики № 172Как перейти реку? 3Река шириной 4 метра делает поворот под прямымуглом (см. рисунок). Как переправиться черезнее на другой берег, имея лишь две доски длиной3 метра 90 сантиметров?КроссвордРешите, пожалуйста, кроссворд.12 3 456 7 8 910 11Кто лишний?В приведенной ниже группе все названия животных,за исключением одного, выбраны по какомутоопределенному признаку: слон, лошадь, ехидна,лось, тигр, лев.Установите (используя информацию в Интернетеили другие источники) объединяющий признак иукажите, что ему не соответствует.Как разделить молоко?Как за наименьшее число переливаний с помощьюпустых трехлитрового и семилитрового бидонов разлитьпополам 10-литровый бидон с молоком?Алгоритм решения задачи, пожалуйста, оформитев виде:Бидон 10 л Бидон 7 л Бидон 3 лИсходное 10 0 0состояние1 Из 10 в 7 3 7 02 …Активные ученики Однажды в одной из стран инспектор учебногоуправления, проверявший одну из школ, задал ученикамкласса 10 вопросов. Во всех случаях в ответ поднималируку все ученики. И хотя школьный учителькаждый раз выби рал разных учеников, ответ всегдабыл правильным. Как это получалось? (Конечно,так, чтобы все ученики знали ответы на все вопросы,бывает очень редко.)12 13 1415 16По горизонтали2. В программировании — одна из характеристикпеременной величины.4. Денежная единица, в которой получают зарплатуболгарские программисты.5. Величина, с помощью которой осуществляетсясчет.6. Компонент данных типа запись.8. Конечное число точек на плоскости, соединенныхотрезками кривых линий.10. Структура данных, в которых применен принцип“последним пришел — первым вышел”.11. Семейство совместимых друг с другом компьютеров.12. Буква греческого алфавита.15. Название фигуры в настольной игре, для которойимеются компьютерные варианты.16. Часть рабочей книги программы Microsoft Excel.По вертикали1. Язык программирования.3. Элемент электронной таблицы.4. Наука о законах и формах мышления.7. Результат целочисленного деления.9. Пользователь телефонной линии.13. Константа логического типа.14. Поименованная совокупность данных на носителе.62январь 2012 / ИНФорматикаДля эрудитовВыберите правильный вариантМы предлагаем читателям прочитать начало занимательногофакта и выбрать один из двух вариантоввероятного оконча ния. Но не наугад, а найдясоответствующую информацию в Интернете.1. Хорошо натренированный бегун, рванув состарта, в первые десять метров способен опередить...3Задание предназначено для учащихся начальной школыи учеников 5–7-х классов.А. … арабского скакуна;Б. …гоночную машину.2. На каждый доллар, что американские автолюбителитратят на бензин, только на налоги приходится…А. …70 центов;Б. …27 центов.3. Голливудская актриса Николь Кидман, играяволевых и бесстрашных дам, на самом деле паническибоится…А. …электричества;Б. …бабочек.


4. Даже самая маленькая капля алкоголя, помещеннаяна скорпиона, практически сводит его сума. Он начинает…А. …жалить себя;Б. …кувыркаться.5. Среди золотых рыбок встречаются и “реальныедолгожители”. Самая старая из них по имениФреда прожила…А. …3 года;Б. …41 год.6. Несмотря на отсутствие Интернета в 30–40-хгодах прошлого века, США и Великобритания былибуквально заполнены “спамом”. Но не надоедливойинтернет-рекламой, а…А. …перченой колбасой;Б. …конфетами.7. В странах Индокитая есть предупреждающиезнаки на дверях отелей с перечеркнутым фруктом.Он очень популярен в тех местах, но имеет отвратительныйзапах и называется:А. …дуриан;Б. …маракуйя.Ответы (можно не все) присылайте в редакцию.Внимание! конкурсКонкурс № 91 “Удалитьи заменить букву”Тур 2По заданным словам, удалив в них одну букву изаменив другую, необходимо получить термин (и фамилиюученого), связанный с информатикой и ИКТ.Кунак.Кабала.Шланг.Байкер.Агат.Динар.Банту.Тостер.Венера.Работа.Сайра.Треть.Череда.Артек.Вода.Плитка.Ртуть.CALGON.Дуплет.Банан.Флокс.Беда.Дамка.Удача.Тиски.Сторожка.Поступь.Записка.Контроль. Дева.Приведите также комментарии к найденнымсловам.Ответы отправьте в редакцию до 10 февраля поадресу: 121165, Москва, ул. Киевская, д. 24, “Первоесентября”, “Информатика” или по электроннойпоч те: vmi@1september.ru. Пожалуйста, четко укажитев ответе свои фамилию и имя, населенныйпункт, номер и адрес школы, фамилию, имя и отчествоучителя информатики.В ответах сохраните нумерацию слов в задании(для ненайденных слов поставьте прочерк).Итоги конкурса будут подводиться с учетом двухтуров в целом.Итоги конкурса № 86Напомним, что необходимо было решить следующуюзадачу из старинной русской рукописи концаXVI — начала XVII века:Иными словами, нужно было определить, скольконадо уплатить за указанное количество пудов,учитывая, что все числа в задаче записаны в такназываемой “славянской алфавитной системе”,или “буквенной цифири”, — способе записи чиселв Древней Руси с помощью букв применявшегосятогда алфавита.Ответы представили:— Андрющенко Александр и Свистунов Николай,Ставропольский край, Кочубеевский р-н, станицаБарсуковская, школа № 6, учитель Рябченко Н.Р.;— Базылев Юрий и Галушкова Карина, РеспубликаКарелия, поселок Надвоицы, школа № 1, учительБогданова Л.М.;— Дукач Светлана и Клименко Надежда, г. ЛесосибирскКрасноярского края, поселок Стрелка,школа № 8 им. Константина Филиппова, учительЛопатин М.А.;— Кондратов Богдан, г. Ярославль, школа № 33,учитель Цикина Е.Н.;— Семенова Виктория, г. Саратов, школа № 52,учитель Пуйшо Н.В.;— Слипенчук Александр, Москва, гимназия№ 1530, учитель Козырева О.В.;— Тощев Андрей, г. Ярославль, школа № 33, учительЯрцева О.В.РешениеПрежде всего все денежные единицы в стоимости16 пудов воска переведем в самые мелкие, вданном случае — в полушки (полуденги):— 15 рублей = 6000 полушек;— 2 алтына = 24 полушки;и еще 1 полушка — итого 6025 полушек. Тогда стоимость9 пудов составит:6025*16= 10 711 и 1/9 полушки, или 26 рублей925 алтын 5 денег одна и 1/9 полушки.Абсолютным победителем конкурса признаныАлександр Слипенчук из московской гимназии№ 1530 и Андрей Тощев из школы № 33 г. Ярославля,получившие указанный ответ. Остальные участникиконкурса также будут награждены дипломами.63январь 2012 / ИНФорматика

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!