Глава 1
ВВЕДЕНИЕ В ИНФОРМАТИКУ

Об информатике вы, наверное, уже слышали и теперь с любопытством ждете, каким этот предмет предстанет перед вами.

Информатика -- это кабинет с мерцающими экранами и щелкающими клавиатурами, жужжащими принтерами и шуршащими дисководами.

Информатика -- это дверь в мир технологий, без которых немыслима современная цивилизация. Достаточно просто оглянуться вокруг. На столике стоит электронный будильник с заложенным в нем расписанием на неделю вперед, в прихожей -- умный телефон с определителем номера, записной книжкой, системой автодозвона и с чем-то там еще, на телевизоре -- видеомагнитофон, который сам знает, когда ему включиться, рядом -- игровая приставка...

И чудесные свойства этих вещей, а также многих-многих других за-ключены во внешне невзрачной коробочке, содержимое которой специалисты-электроники называют малопонятным словом "микропроцессор".

Но именно микропроцессоры составляют основу компьютеров, управляющих атомными станциями и космическими кораблями, компьютеров, перерабатывающих необозримые объемы самой разнообразной информации, компьютеров, без которых сейчас не обходятся проектирование и выпуск даже зубных щеток.

Словом, человек, не знакомый с компьютером, может оказаться совершенно неприспособленным к современной жизни.

Почему же тогда новый для вас предмет не называется, скажем, компьютерика или компьютерное дело? Откуда взялось слово "информатика"?

С ответа на этот вопрос мы и начнем наш рассказ.

Оглавление


Глава 2
ГРАМОТНЫЙ ПОЛЬЗОВАТЕЛЬ ПЕРСОНАЛЬНОГО КОМПЬЮТЕРА

Давайте посмотрим внимательно на рис. 6, где изображена самая общая схема обработки и подготовки документов с использованием компьютерных технологий.

Рис. 6. Общая схема компьютерной обработки документов

Под словом "документ" понимается отнюдь не только текст, но и фотографии, и рисунки, и схемы, и графики...

Если документ создан без помощи компьютера и существует на бумаге или на фотографическом слайде, а хотелось бы обработать его на ЭВМ, то в этом случае оказывается весьма полезным сканер -- специальный прибор, переводящий изображение на бумаге или слайде на понятный компьютеру язык нулей и единиц.

Конечно, в последнее время практически все текстовые документы создаются с помощью компьютера, который успешно вытесняет пишущую машинку -- ведь он, сохраняя все достоинства машинописной подготовки текстов, предоставляет много других полезных возможностей.

Одна из них, едва ли не самая главная -- это компьютерная обработка графической информации. О ней и пойдет речь в нескольких ближайших параграфах.


Библиотека Медиа-сети. Введение в информатику

Содержание

ПРЕДИСЛОВИЕ

Глава 1. ВВЕДЕНИЕ В ИНФОРМАТИКУ

    § 1. Информация

    § 2. Компьютер

    Лабораторная работа N 1. Первый раз в дисплейном классе

    § 3. Символьное кодирование

    § 4. Графическое представление информации. Монитор

    § 5. Графическое представление информации. Печать на бумаге

    § 6. Графическое представление информации.
    Сохранение на диске.     (Для дополнительного чтения)

Глава 2. ГРАМОТНЫЙ ПОЛЬЗОВАТЕЛЬ ПЕРСОНАЛЬНОГО КОМПЬЮТЕРА

    § 7. Компьютерная обработка графической информации

    § 8. Графический редактор. Общее описание

    Лабораторная работа N 2. Стандартные инструменты графического редактора
     Лабораторная работа N 3. Смешиваем краски на палитре и строим сказочный город
     Лабораторная работа N 4. Спецэффекты графического редактора
     Лабораторная работа N 5.Импортирование (перемещение) картинок
     Лабораторная работа N 6. Работа с редактором сценариев
     Лабораторная работа N 7. Создание мультфильма

    § 9. Текстовый редактор

    § 10. Стандартные инструменты текстового редактора

    Лабораторная работа N 8. Простейшие функции текстового редактора
     Лабораторная работа N 9. Работа с окнами и черчение
    Лабораторная работа N 10.Форматируем статью для газеты
     Лабораторная работа N 11.Работа с картинками и блоками
     Лабораторная работа N 12. Работа со шрифтами
    Лабораторная работа N 13. Работа с таблицами

    § 11. Электронные таблицы

    § 12. Примеры применения электронных таблиц

    Лабораторная работа N 14. Знакомство с электронной таблицей
     Лабораторная работа N 15.Работа с электронной таблицей
     Лабораторная работа N 16. Работа с электронной таблицей

    § 13. Базы данных и информационно-поисковые системы

    Лабораторная работа N 17.Работа с учебной базой данных УЧЕНИК

    § 14. Телекоммуникации

    Лабораторная работа N 18. Работа с гипертекстовым редактором Linkway

ГЛАВА ТРЕТЬЯ. Алгоритмы и исполнители

    § 1. Бездумные исполнители

    § 2. Что такое алгоритм

    § 3. Знакомтесь: исполнитель Паркетчик

      Практикум N1. Первая встреча с Паркетчиком

    § 4. Циклическое исполнение алготитма. Оператор "Делать пока..."

      Практикум N2. Оператор цикла в работе Паркетчика

    § 5. Условные операторы

      Практикум N3. Условные операторы в работе Паркетчика

      Практикум N4. Распознавание образов. Часть 1-я

      Практикум N5. Распознавание образов. Часть 2-я

    § 6. Сложное условие

      Практикум N6. Передвижение в лабиринте. Часть 1-я

      Практикум N7. Передвижение в лабиринте. Часть 2-я

      Практикум N8. Передвижение в лабиринте. часть 3-я

    § 7. Вспомогательный алгоритм или подпрограмма

    § 8. Оператор Возврат

    § 9. Как БИ работают с подпрограммами. Понятие о стеке( Для дополнительного чтения)

    § 10. Передача параметров подпрограмму

      Практикум N9. Передача параметров в подпрограмму

ГЛАВА ЧЕТВЕРТАЯ Переменные в алгоритмах

    § 1. Переменные в языке Паркетчика

    § 2. Еще раз о циклических алгоритмах. Оператор Делать от.. до ..

    § 3. Передача содержимого переменных в подпрограмму

      Практикум N1. Иллюзия движения, или создаем простенький мультик

    § 4. Немного о том, как происходит обмен данными между программой и подпрограммами (для дополнительного чтения)

    Практикум N2. Алгоритмы сортировки. Часть 1. Выбираем максимальное значение

    Практикум N3. Алгоритмы сортировки. Часть 2. "Пузырьковая" сортировка

    Практикум N4. Алгоритмы сортировки. Часть 3. Сортировка в особых случаях

ГЛАВА ПЯТАЯ. Введение в <большое программирование>

    § 1. Понятие о дуракоупорности систем. Играем в "Морской бой"

    § 2. Метод нисходящего проектирования

    § 3. Последняя игра с Паркетчиком, или игра "Жизнь"

      Практикум N1. Обучаем Паркетчика играть в "Жизнь"

    § 4. Первое знакомство с вычислительными Бездумными Исполнителями

    § 5. Использование языка проектирования программ

    § 6. Дополнительная конструкция ЯПП - оператор Выбор

    § 7. Понятие об интерактивных (диалоговых) программах

      Практикум N2. Стрельба по движущейся мишени


Лабораторная работа N 1

Первый раз в дисплейном классе

Вы пришли в дисплейный класс. Прежде всего нужно позаботиться о безопасности работы за компьютером.

    Необходимо помнить:
    к каждому рабочему месту подведено опасное для жизни напряжение.
    Если вы обнаружили какую-либо неисправность, немедленно сообщите об этом преподавателю.

Техника, с которой вы будете работать, достаточно нежная, поэтому соблюдайте следующие правила:

      1. Не работайте на неисправном оборудовании.
      2. Не стучите по клавиатуре и мышке.
      3. Не включайте и не выключайте компьютеры самостоятельно.
      4. Не дергайте и вообще не трогайте различные провода.
      5. Не садитесь за клавиатуру с грязными руками!

А теперь познакомимся поближе с клавиатурой ЭВМ. В этом вам помогут сам компьютер и обучающая программа "Клавиатурный тренажер".

Мы вам советуем сразу начать осваивать так называемый слепой десятипальцевый метод работы на клавиатуре. Это не так уж и сложно, самое главное -- не торопиться и набраться терпения.

Посмотрите внимательно на рисунок.

На нем указаны зоны ответственности каждого пальца:

Левый мизинец постоянно находится над буквой Ф, а нажимает еще и буквы Й и Я.

Левый безымянный постоянно находится над буквой Ы, а нажимает еще и буквы Ц и Ч.

Левый средний постоянно находится над буквой В, а нажимает еще и буквы У и С.

Левый указательный постоянно находится над буквой А, а нажимает еще и буквы К, Е, П, М и И. На большинстве клавиатур буква А отмечена риской.

Правый указательный постоянно находится над буквой О, а нажимает еще и буквы Н, Г, Р, Т и Ь. На большинстве клавиатур буква О тоже отмечена риской.

Правый средний постоянно находится над буквой Л, а нажимает еще и буквы Ш и Б.

Правый безымянный постоянно находится над буквой Д, а нажимает еще и буквы Щ и Ю.

Правый мизинец постоянно находится над буквой Ж, а нажимает еще и буквы З, Х, Ъ и Э.

Большие пальцы рук нажимают на длинную клавишу пробела.

Теперь усаживайтесь поудобнее. "Поудобнее" в данном случае означает "таким образом, чтобы работать за клавиатурой быстро и без усталости". Для этого:

  • позвоночник должен быть вертикальным. Спина опирается на спинку стула;
  • ступни удобно стоят на полу или специальной подставке;
  • расстояние до экрана -- не менее вытянутой руки;
  • верхний край экрана располагается примерно на уровне ваших глаз;
  • если вы посмотрите на центр экрана, то линия вашего взгляда должна быть перпендикулярной плоскости экрана. То есть экран должен быть развернут чуточку вверх;
  • плечи развернуты и опущены, и вам не составляет труда удобно расположить четыре пальца каждой руки над основными клавишами среднего ряда, то есть пальцы левой руки находятся над буквами ФЫВА, правой -- над ОЛДЖ.

Вот теперь запускайте клавиатурный тренажер, но не торопитесь осваивать сразу все буквы. Придерживайтесь того порядка, который предлагает вам клавиатурный тренажер. Самое главное на первых порах -- при нажатии на клавиши не нарушать зону ответственности каждого пальца.

Многим поначалу кажется, что гораздо удобнее и быстрее работать одним пальцем одной лишь правой руки, но подумайте о будущем. Десятипальцевый слепой метод сэкономит вам уйму времени, с лихвой возместив затраты на его изучение.

Надеемся, за пару-другую уроков вы достигнете скорости набора в 40--50 знаков в минуту, вполне достаточной на начальном этапе.


ЛАБОРАТОРНАЯ РАБОТА N 2

Стандартные инструменты
графического редактора

Прежде всего договоримся о терминологии.

ЩЕЛКНУТЬ клавишей мышки -- быстро нажать и отпустить клавишу.

ПРИЖАТЬ клавишу мышки -- держать, не отпуская (например, для рас-тягивания изображения).

Обычно ЛЕВАЯ КЛАВИША мышки используется для подтверждения выбора и фиксации объекта. Эта клавиша означает "ДА"; она употребляется наиболее часто.

ПРАВАЯ КЛАВИША используется для отказа от чего-либо (это клавиша "НЕТ"), а в некоторых графических редакторах и для изменения размеров изображения.

ПИКТОГРАММА -- схематичное изображение объекта или действия над объектом.

ВЫБОР ИНСТРУМЕНТА или РЕЖИМА, как правило, осуществляется установкой курсора на пиктограмме этого инструмента или режима, после чего надо щелкнуть левой клавишей мышки.

ПАЛИТРА -- поле выбора цвета, располагающееся обычно снизу или сбоку на экране.

Напомним, как работать со стандартными инструментами графического редактора.

Отрезок

  • выберите этот инструмент;
  • переведите графический курсор на палитру и выберите нужный цвет;
  • отметьте один конец отрезка (для этого обычно устанавливают курсор в нужной точке и щелкают/прижимают нужную клавишу мышки);
  • растяните отрезок до нужных размеров и отметьте его второй конец
    (щелкнув/отпустив нужную клавишу).

Прямоугольник

  • выберите этот инструмент;
  • переведите графический курсор на палитру и выберите нужный цвет;
  • переведите графический курсор на поле для рисования и установите его в точке,
    где будет располагаться одна из вершин прямоугольника;
  • растяните прямоугольник до нужного размера;
  • зафиксируйте прямоугольник на экране.

Овал

  • выберите этот инструмент;
  • переведите графический курсор на палитру и выберите нужный цвет;
  • переведите графический курсор на поле для рисования и установите его в точке,
    где будет располагаться центр овала;
  • растяните овал до нужной формы и желаемого размера;
  • зафиксируйте овал на экране.

Резинка-ластик

  • выберите этот инструмент;
  • переведите графический курсор на поле для рисования и установите нужный размер прямоугольника, изображающего резинку;
  • перемещая мышкой прямоугольник-резинку, сотрите ненужную часть рисунка.

Заливка

  • выберите этот инструмент;
  • переведите графический курсор на палитру и выберите нужный узор;
  • переведите графический курсор на поле для рисования и установите его внутри той части рисунка, которую вы намерены закрасить выбранным узором;
  • подтвердите свой выбор.

Если при заливке краска разлилась по всему полю, то щелкните на пиктограмме

Откатка

Применив откатку, просмотрите тот контур, внутри которого вы так неудачно выполнили заливку, с помощью

Лупы

  • выберите этот инструмент;
  • перемещая мышкой прямоугольник-лупу, установите ее на нужной части рисунка; · подтвердите свой выбор;
  • переведите курсор на палитру и выберите нужный цвет;
  • переведите курсор на поле для рисования и установите его в квадратике, изображающем нужный вам пиксель;
  • нажав соответствующую клавишу, либо закрасьте его выбранным цветом, либо, наоборот, отмените закраску.

Этот инструмент позволяет сделать особо тонкую корректировку вашего рисунка, в частности, зарисовать все дырки в заливаемом контуре.

Карандаш и распылитель особых комментариев не требуют -- выберите по очереди каждую из пиктограмм и попробуйте эти инструменты в деле.

А теперь выполните несколько заданий:

1. Перемещая курсор, попробуйте выяснить, где находится начало системы координат и куда направлены оси.

2. Изобразите, пожалуйста, домик. Используйте для этого инструменты прямоугольник и отрезок.

3. Пусть у этого домика будет труба, из которой идет дым, а рядом растет замечательное дерево (елка или тополь). Используйте инструменты распылитель и овал.

4. Раскрасьте дом и трубу, используя инструмент узор (для крыши -- черепицу, для дома и трубы -- кирпичи).

Соблюдайте «правила хорошего тона» при работе с графическим редактором.

  • Если вы случайно попали куда-нибудь "не туда", подзовите учителя, и он поможет вам выбраться из сложной ситуации. Не пытайтесь щелкать клавишей мыши по всем подряд пиктограммам или панически нажимать клавиши на клавиатуре (тем более сразу несколько одновременно).
  • Не выбирайте инструменты сканер и принтер, предварительно не посоветовавшись с учителем. Быть может, к вашему компьютеру не подключено ни то, ни другое. Это может привести к зависанию машины, т.е. отказу компьютера работать с вами дальше.
  • Не записывайте ничего на диск без разрешения учителя!
  • Не заливайте все поле яркой краской -- не будет виден курсор!


ЛАБОРАТОРНАЯ РАБОТА N 3

Смешиваем краски на палитре
и строим сказочный город

Выполните задания:

1. Вы уже научились раскрашивать картинки готовыми красками. Но настоящие художники любят смешивать краски. Мы уже рассказали, что новый цвет можно создать, смешивая три краски -- красную (RED), зеленую (GREEN) и синюю (BLUE). Следуя указаниям учителя или инструкции к вашему графическому редактору, создайте несколько новых цветов и подготовьте новую палитру.

2. Вы уже довольно опытный художник, поэтому, используя вашу палитру, нарисуйте еще раз такой же дом, как и на прошлой лабораторной работе. Но внимание! Дом не должен быть слишком большим или слишком маленьким: он должен занимать приблизительно 1/3 экрана по высоте и 1/3 по ширине. Это нужно для выполнения последующих заданий.

3. Постройте сказочный город, в котором все дома как будто похожи и в то же время не похожи друг на друга, а вернее, на ваш исходный дом. Для этого поместите изображение дома в БУФЕР ОБМЕНА. Как это сделать конкретно в вашем графическом редакторе, вам расскажет учитель или вы сможете прочитать в инструкции пользователю.

Затем щелкните нужной клавишей мышки на пиктограмме вставки содержимого буфера обмена (или выберите соответствующий пункт в меню «Редактировать») и наклейте домик, изменяя, если хотите, его размеры. Если дом сделать длинным и узким, он станет похожим на башню. Если растянуть вширь, он скорее будет похож на амбар. Экспериментируйте!

4. А теперь строим целую улицу домов, пользуясь правилами перспективы. У вас может получиться и средневековый город, и деревня, и поселение папуасов.

5. Нарисуйте дерево. Выполняя действия в соответствии с заданием 3, украсьте ваш город деревьями, изменяя их размер и пользуясь правилами перспективы.

6. В вашем сказочном городе пошел сказочный снег... Но у вас нет такой "снежной" заливки. Это новый узор. Как его создать, вам расскажет учитель или вы узнаете из инструкции для пользователя. Как только узор "снег" готов, выберите инструмент заливка, подберите нужный цвет и устройте в своем городе снегопад. Можно выбрать, например, сиреневый цвет, тогда ваш снег будет совсем необычным.


ЛАБОРАТОРНАЯ РАБОТА N 4

Спецэффекты графического редактора

РАЛЛИ В ПУСТЫНЕ, ИЛИ ЖЕСТОКИЙ СПОРТ

Вы уже освоили работу с буфером обмена и умеете вклеивать его содержимое в любое место рисунка. Но этим отнюдь не ограничиваются возможности графического редактора. Их дальнейшему освоению и посвящена предлагаемая лабораторная работа. Но для ее выполнения вы должны знать из рассказа учителя или инструкции для пользователя, как загрузить (считать) картинку с диска на экран.

1. Используя режим файл, загрузите рисунок "Джип" (или изображение какого-нибудь другого автомобиля) и с помощью вклейки создайте целую шеренгу из автомашин, уходящую вдаль. Надеемся, вы будете соблюдать при этом закон перспективы. (Вспомните предыдущую лабораторную работу, в частности, задание 3.)

2. Теперь представьте, что машина на переднем плане попала в ужасную катастрофу. Какие-то ее части отлетели, какие-то сплющились. Используя эффект переноса и эффект перекоса, создайте соответствующий рисунок.

3. В дополнение переверните одну из машин в шеренге, используя инструмент вертикального переворота.

4. Легко предположить, что организованное нами жестокое ралли далеко не все могут выдержать. С помощью инструмента зеркало или горизонтальный переворот разверните пару машин в другую сторону.

5. Две машины столкнулись "лоб в лоб", так что их передние колеса поднялись. Используйте инструменты вращение и зеркало.

6. А тем временем там, где идут наши соревнования, наступил вечер. Воспользуйтесь эффектом тени и измените контуры автомашин.

7. Напишите в правом верхнем углу картинки слово "Rally" и примените к буквам все оставшиеся в вашем распоряжении спецэффекты. Изумительно смотрятся буквы с расслоенным контуром, особенно если потом внутренний контур закрасить другим цветом. Не забудьте, что текст тоже можно наклонять, поворачивать...


ЛАБОРАТОРНАЯ РАБОТА N 5

Импортирование (перемещение) картинок

ЗАСЕЛЕНИЕ ПУСТЫНИ

Импортирование картинок -- это еще одна функция графического редактора, которая позволяет комбинировать на одном рисунке части картинок, находящихся в разных файлах на диске. Вы получаете замечательную возможность, взяв из разных картинок понемножку, соединить на одном рисунке то, что вам понравилось. Для этого вы должны из рассказа учителя или инструкции для пользователя узнать:

  • как загрузить (считать) картинку с диска на экран;
  • как загрузить (считать) часть картинки с диска в буфер;
  • как записать (сохранить) картинку на диске;
  • как записать (сохранить) часть картинки на диске.

А теперь приступим к работе и принесем жизнь в пустыню!

Выполните задания:

1. Нарисуйте пустынный пейзаж: желтый песок и голубое небо. Запишите картинку на диск, запомните (еще лучше -- запишите в свою тетрадку) имя файла.

2. Первыми в пустыне появляются внедорожные автомобили.

  • Загрузите с диска картинку "Джип" (JEEP).
  • Выделите нужную часть рисунка и, используя буфер обмена, перенесите (импортируйте) ее в свой рисунок.
  • Естественно, приехал не один джип, а несколько, поэтому изобразите еще парочку автомобилей, руководствуясь правилами перспективы (и навыками, приобретенными при выполнении задания 3 лабораторной работы N 3).
  • Сохраните картинку "Пустыня с джипами" с тем же именем, что и в пункте 1.

3. Загрузите с диска картинку с домиком (HOUSE). Повторяя действия, указанные в пункте 2, перенесите домик на ваш рисунок, постройте в пустыне селение. Запишите снова рисунок на диск с таким же именем, что и в пункте 1.

4. Загрузите с диска картинку с верблюдом (CAMEL) и перенесите его на свой рисунок. Пусть в вашей пустыне пасется целое стадо верблюдов. Запишите снова рисунок на диск с тем же именем, что и в пункте 1.

5. Исследуйте содержимое вашего диска, перенесите еще какую-нибудь понравившуюся картинку на ваш уже совсем не пустынный пейзаж. Запишите снова рисунок на диск с тем же именем, что и в пункте 1.


ЛАБОРАТОРНАЯ РАБОТА N 6

Работа с редактором сценариев

ВОЛШЕБНАЯ КОМНАТА

Многие графические редакторы позволяют нарисовать не только одну какую-нибудь картинку, а создавать целые мультфильмы, заменяя в определенном порядке одну картинку другой. При этом можно еще использовать и разнообразные эффекты, заставляющие предметы совершать в вашем мультфильме чудесные превращения. Ну, об эффектах речь пойдет чуть позже, а пока познакомимся с главными инструментами создания компьютерных мультиков. Эти инструменты, как правило, объединены в так называемый редактор сценариев.

Внимательно изучите экран редактора сценариев. Обычно он выглядит как таблица, в строках которой указывается, в какой последовательности и с какими эффектами нужно выводить заранее приготовленные картинки. Как конкретно пользоваться вашим редактором сценариев, вам расскажет учитель или вы прочитаете в инструкции пользователю.

А теперь за работу -- составляем первый в вашей жизни сценарий:

1. Введите в первую строку название рисунка (обычно его можно выбрать из окошка мышкой или клавишей <Enter>). Укажите какой-нибудь эффект, например проявка. Укажите темп, с которым будет выводиться на экран ваша картинка, а также время, в течение которого картинка будет демонстрироваться на экране. Если в последнем случае вместо числа написать слово ключ, то картинка будет оставаться на экране до нажатия какой-нибудь клавиши.

2. Выберите в меню режим просмотр и запустите выполнение сценария.

3. Добавьте в следующей строке новое имя картинки и другой эффект. Для того, чтобы посмотреть, как будет выполняться именно эта строка сценария, можно использовать режим просмотр с указанием номера строки.

4. Запустите сценарий, состоящий из двух строк.

5. Добавьте еще несколько картинок, используя различные эффекты. Запустите готовый сценарий.

6. Запишите готовый сценарий на диск.

Обычно редактор позволяет создавать мультик не только из целых картинок, но и из отдельных их частей. Для этого в редакторе сценариев имеются специальные режимы, о которых вам расскажет учитель или вы узнаете из инструкции для пользователя.

Составим сценарий мультфильма "Волшебная комната",
где из воздуха появляются различные предметы

1 строка сценария:

Выберите с диска рисунок интерьера комнаты. Вырежьте из него окно и поместите его в левый верхний угол экрана (эффект -- замена).

2 строка сценария:

Из того же рисунка вырежьте стол со скатертью и поместите его в правый нижний угол экрана
(эффект -- проявка).

3 строка сценария:

В том же рисунке вырежьте свечу и поставьте ее на подоконник (эффект -- сдвиг или проявка).

4 и 5 строки сценария:

Еще несколько свечей пусть возникнут прямо из воздуха (эффект -- квадрат наружу или жалюзи).

Следующие строки можете сделать подобными, причем в комнате могут появляться предметы не только из этой картинки, но и из любых других.

Запустите сценарий и наслаждайтесь своим творением.


ЛАБОРАТОРНАЯ РАБОТА N 7

Создание мультфильма

ВОСХОД СОЛНЦА В ВОЛШЕБНОЙ КОМНАТЕ

Мультфильм -- это быстрая смена кадров. Один кадр -- это одна картинка. Художники, создающие рисованные мультики, делают для каждого кадра картинку, которая немного отличается от предыдущей.
Для вас подготовлены несколько картинок на диске, из которых вы должны сделать мультфильм.

Часто в мультфильмах бывают повторяющиеся действия -- например, персонаж просто идет по дороге, при этом не изменяется характер движения, меняется только пейзаж.

А теперь выполните задание:

1. В первые 7 строк бланка сценария поместите названия рисунков с изображениями птички в различных положениях (BIRD1 -- BIRD7). Запустите полученный сценарий.

Можно сделать так, что сценарий будет повторяться несколько раз от начала до конца без вашего участия. Для этого нужно использовать эффект -- цикл. Он позволяет повторить исполнение выделенной части сценария столько раз, сколько вы пожелаете. Циклов может быть несколько -- они могут идти один за другим или выполняться один внутри другого. Как конкретно организовать циклическую работу вашего сценария, вы узнаете из рассказа учителя или инструкции пользователю.

2. А теперь сделайте так, чтобы ваш сценарий исполнялся 3 раза.

3. Из тех же картинок сделайте мультик, в котором первые 4 картинки будут повторяться 3 раза, а 3 оставшиеся картинки -- 4 раза. Циклов здесь, понятно, будет 2. Запустите сценарий и насладитесь полетом птички.

Вы уже почувствовали себя режиссером-мультипликатором?

Вспомним предыдущую лабораторную работу, где вы создали "Волшебную комнату". Устроим в ней рассвет. Сначала появляются темные цвета и тени, затем более светлые и наконец -- яркие, радостные тона. Этого можно достичь, используя эффект -- цвет, который выводит на экран только один указанный цвет. Цвета обозначаются так: 0 -- черный, 1 -- темно-синий, ..., 14 -- желтый, 15 -- ярко-белый.

А теперь выполните задание:

4. Организуйте рассвет в волшебной комнате. Для этого

  • в первую строку сценария введите название рисунка комнаты (INTERE) и укажите эффект -- цвет;
  • размножьте эту строку (режим -- копировать) для того, чтобы в каждой строке указать появление
    разных цветов; увеличивайте номер цвета от 1 до 15 (1 -- синий, 15 -- белый);
  • запустите сценарий.

5. Мы хотим увидеть восход солнца не один раз, а несколько раз подряд. Естественно предположить, что это можно сделать при помощи эффекта -- цикл. Но здесь вас подстерегает "подводный камень". Поскольку цвета выводятся по одному, добавляясь к уже выведенным, то 2-е выполнение цикла будет происходить при всех цветах на экране, поэтому рассвета мы не увидим. Значит, после вывода всех цветов надо очистить фон экрана с помощью эффекта -- очистка и только после этого снова повторять появление цветов. Готово? Запускаем сценарий!


ЛАБОРАТОРНАЯ РАБОТА N 8

Простейшие функции текстового редактора

У всех текстовых редакторов есть действия, которые выполняются одинаково, в частности, вставка и удаление символов, вставка и удаление строки, соединение строк и разбиение строки на две. Напомним, что под символом понимается буква, цифра, знак препинания, специальный знак, а также пробел. Пробел -- это такой же полноправный символ, его можно вставлять и удалять.

Итак, основные функции нашего текстового редактора:

  • Заглавная буква: клавиша <Shift> + эта буква.
  • Вставка символа:

    • выполняется всегда в режиме ВСТАВКА; если происходит наложение (ЗАМЕНА) символов, то для возврата в режим вставки надо нажать клавишу <Ins>, посредством которой осуществляется переключение из режима ВСТАВКА в режим ЗАМЕНА и наоборот.

  • Удаление символа:

    • справа от курсора или того, на котором стоит курсор, -- клавиша <Delete>;

    слева от курсора -- клавишу <BackSpace> (<BS>). Эта клавиша обычно располагается над клавишей <Enter> и на ней нарисован значок .

  • Вставка пустой строки:

    • установите курсор в начало строки, над которой надо вставить пустую строку, и нажмите клавишу <Enter>.

  • Удаление строки:

    • Установите курсор в любом месте строки, которую хотите удалить, и используйте комбинацию клавиш <Ctrl>+<Y>.

  • Разбиение строки на две:

    • установите курсор в нужном месте и нажмите клавишу <Enter>.

  • Соединение двух строк:

    • Установите курсор в начало второй строки (из двух) и нажмите клавишу <BS>.

А теперь выполните задания:

1. Наберите на клавиатуре слова новогодней песенки "Елочка" (или какое-нибудь другое стихотворение, которое вы еще помните), причем заголовок наберите заглавными буквами и каждую строку начинайте
тоже с заглавной буквы. Располагайте текст около левого края экрана. Используйте при работе вставку, удаление и т.д.

2. Отделите все строки друг от друга, вставляя каждый раз пустую строку.

3. Употребляя операцию разбиения строки, сделайте так, чтобы в каждой строке осталось только одно слово, и расположите эти слова "лесенкой" (как у Маяковского).

4. Соедините строки так, чтобы они стали такими, как до разбиения.

Что у вас получилось? Если это первоначально набранный текст, то

ПОЗДРАВЛЯЕМ!!!


ЛАБОРАТОРНАЯ РАБОТА N 9

Работа с окнами и черчение

Место на экране компьютера, выделенное для текста, принято называть окном. Современные текстовые редакторы имеют, как правило, несколько окон для работы с текстом. И раз вы собрались сделать эту лабораторную работу, значит, ваш текстовый редактор -- многооконный: используя его, можно открыть несколько окон и поместить туда разнообразную информацию. Окна могут располагаться в разных местах экрана и иметь разные размеры. Как именно менять конфигурацию окон, вам расскажет учитель или вы прочитаете в инструкции для пользователя текстового редактора.

Выполните следующие задания:

1. Перед вами уже открытое пустое окно. Уменьшите его высоту и ширину вдвое.

2. Переместите получившееся окно в правую нижнюю часть экрана.

3. Создайте еще одно окно. Уменьшите вдвое его высоту и ширину, а потом переместите окно в правую верхнюю часть экрана.

4. Создайте третье окно, измените размеры и поместите его в левую нижнюю часть экрана.

5. Создайте четвертое окно, измените размеры и поместите его в левую верхнюю часть экрана.
А сейчас -- приятная неожиданность! Почти в каждом текстовом редакторе (надеемся, и в том, с которым работаете вы) имеется возможность не только создавать текст, но и рисовать прямые линии. Может быть, вы думаете, что это так мало -- проводить прямые линии? Тут вы ошибаетесь! Прямая линия -- мощное изобразительное средство. Выполните-ка следующее задание, и вы сами в этом убедитесь.

6. Нарисуйте в созданных вами окнах такие же картинки:

Это четвертое окно

Это третье окно

Это второе окно

Это первое окно


ЛАБОРАТОРНАЯ РАБОТА N 10

Форматируем статью для газеты

Представьте себе, что вы -- редактор газеты и дали задание трем репортерам собрать материал, касающийся важного события. Каждый написал небольшую заметку. Сформированы соответствующие файлы с именами TEXT1, TEXT2, TEXT3. Вы должны соединить тексты из этих файлов в один текст и разместить его на странице в три столбца, отделив их друг от друга прямыми линиями.

Для этого надо сделать следующее:

  • Загрузите с диска в окно текстового редактора файл с именем TEXT1.
  • Создайте еще два окна и загрузите в них, соответственно, файлы TEXT2 и TEXT3.

    • Теперь у вас 3 окна с текстами. Сначала в первое окно нужно перенести TEXT2.

  • Для этого перейдите в окно 2, выделите при помощи блочных команд весь текст и поместите его
    в буфер обмена.
  • Теперь вернитесь в первое окно, установите курсор в то место, где должна начинаться вторая часть текста (а именно, сразу же после послед-ней строки первого отрывка), и вставьте содержимое буфера обмена.
  • Повторите действия предыдущих двух пунктов для третьего окна и последней части текста.

    • Сейчас перед вами окно со "склеенным" текстом. Можете его прочитать, -- возможно, вы узнали начало одной из популярных детских книжек.

    Но вы должны сделать газетную статью, т.е. разместить ваш текст в три узкие колонки. Для этого вам потребуется режим форматирование текста, который, в частности, позволяет весь текст или выделенную его часть выровнять по заданной длине строки.

  • Отформатируйте весь текст в один столбец шириной немного меньшей, чем треть ширины экрана.
  • Измените параметры форматирования и, используя блочное копирование, разместите текст в три аккуратных столбца на одной страничке.
  • В некоторых текстовых редакторах предусмотрен специальный режим размещения текста в несколько столбцов. Воспользуйтесь им.
  • Осталось совсем немного: нарисовать разделительные линии между столбцами (вспомните, как вы это делали в предыдущей лабораторной работе). Можете заодно провести общую прямую под всеми столбцами.

Вы замечательно справились с заданием, и на вашу статью приятно посмотреть!


ЛАБОРАТОРНАЯ РАБОТА N 11

Работа с картинками и блоками

Вам, конечно же, хотелось бы расположить картинку прямо в тексте? Или красиво подписать рисунок, созданный в графическом редакторе? Именно сегодня мы и займемся совмещением в одном документе рисунков, сделанных в графическом редакторе, с текстом.

Выполните задания:

1. Нарисуйте сначала в графическом редакторе нужную картинку и в зависимости от возможностей вашего текстового редактора поместите ее либо в буфер обмена, либо в файл на диске в нужном формате.

Теперь продолжим работу в текстовом редакторе.

2. Перед вами открытое окно текстового редактора. Вставьте в него подготовленную вами картинку.

3. А теперь, используя возможности текстового редактора, наберите текст и позаботьтесь о том, чтобы он красиво обтекал рисунок.

Если вы хотите, чтобы набранный вами текст выглядел профессионально, запомните также основные правила машинописи:

        После (но не до!) знаков препинания ставится пробел.
        Единственное исключение -- тире: пробел ставится и до, и после него.
        Буква "Ё", как правило, заменяется буквой "Е".

Ваша работа завершена.


ЛАБОРАТОРНАЯ РАБОТА N 12

Работа со шрифтами

ОФОРМЛЯЕМ НАКЛЕЙКУ НА ТЕТРАДЬ

Ваш текстовый редактор позволяет использовать разные шрифты: печатный и рукописный, подчеркнутый и увеличенный, наклонный и выделенный. Причем можно, например, использовать рукописный подчеркнутый шрифт -- если выбрать одновременно рукописный шрифт и режим подчеркивания. Попробуйте, используя различные шрифты, оформить наклейку на тетрадь, "приклеить" эмблему школы (см. предыдущую работу), а потом сделать рамочку.

Выполните задания:

1. Наберите на клавиатуре следующий текст (указав, конечно, свои данные):

ТЕТРАДЬ
по математике
ученицы 7 а класса
школы N 104
г. Санкт-Петербурга
Степановой Насти

2. Используя различные шрифты, преобразуйте каждую строку. Чтобы изменить шрифт, надо выделить фрагмент текста как блок. Блок будет помечен другим цветом. Затем выберите шрифт (как это сделать, вам объяснит учитель или вы узнаете из инструкции для пользователя).

Ваш текст может стать, к примеру, таким:

печатный, подчеркнутый, увеличенный, наклонный, выделенный

печатный, наклонный

печатный, выделенный, использован верхний индекс для указания буквы класса

печатный, наклонный, подчеркнутый

печатный, наклонный, подчеркнутый, выделенный

печатный, выделенный

Можете, конечно, использовать другие комбинации шрифтов (те, которые вам нравятся).

3. "Наклейте" эмблему школы (вспомните предыдущую работу).

4. Поместите текст и картинку в рамочку так, как вам объясняли на уроке теории.

5. Просматривая подготовленный текст перед печатью, обратите внимание на рамочку, подправьте ее при необходимости. Попробуйте (с разрешения учителя, разумеется) распечатать наклейку на принтере.

6. Не забудьте записать ваш файл на диск. Можете указать на наклейке название другой учебной дисциплины и сделать еще одну распечатку.

Ваша работа завершена.


ЛАБОРАТОРНАЯ РАБОТА N 13

Работа с таблицами

УЧИМСЯ НАЧИСЛЯТЬ ЗАРПЛАТУ

Современный текстовый редактор, как правило, позволяет не только готовить тексты, вставлять картинки, но и производить не очень сложные расчеты. Такие расчеты может выполнять, например, бухгалтер при начислении заработной платы. Представьте, что вы бухгалтер очень маленького предприятия, в котором работает всего пять человек, и вам надо решить подобную задачу. Предположим для простоты, что оплата труда у всех работников почасовая (т.е. стоимость каждого часа работы одного сотрудника одинакова, но зависит от квалификации сотрудника).

Выполните задание:

1. Создайте таблицу из восьми столбцов и семи строк. В первой строке в каждом столбце укажите его номер. Во второй строке будем указывать названия столбцов. Первый столбец предназначен у нас для фамилий сотрудников предприятия, поэтому во второй строке первого столбца наберите слово ФАМИЛИЯ. Название второго столбца: ОПЛАТА ЗА 1 ЧАС (тыс. руб.). Он, очевидно, будет содержать числа. Третий столбец КОЛИЧЕСТВО ЧАСОВ тоже будет содержать числа (количество отработанных часов за месяц).

2. Теперь наберите в первом столбце фамилии работников, во втором -- соответствующую каждому стоимость одного часа работы, в третьем -- количество отработанных часов.

На экране должно быть приблизительно следующее:

1 | 2 | 3
ФАМИЛИЯ | ОПЛАТА ЗА 1 ЧАС (руб.) | КОЛИЧЕСТВО ЧАСОВ
1. Иванов | 5 | 82
2. Петров | 23 | 75
3. Сидоров | 8 | 39
4. Степанов | 14 | 94
5. Михайлов | 27 | 76

3. Теперь нужно определить, какая сумма должна быть начислена каждому сотруднику за отработанное количество часов. Для этого нужно умножить каждое число из второго столбца на соответствующее число из третьего столбца. Заголовок четвертого столбца -- ОПЛАТА ЗА ЧАСЫ.

В вашем редакторе для работы со столбцами предусмотрены специальные операции: умножение, сложение, вычитание, а также умножение столбца на коэффициент. Как это делается в вашем редакторе, вам расскажет учитель или вы ознакомитесь с этим по инструкции для пользователя.

4. Заголовок пятого столбца -- РАЙОННЫЙ КОЭФФИЦИЕНТ. Для тех, кто живет, например, на Урале, полагается надбавка 15%, для тех, кто живет на Севере, -- другая надбавка: 20%, на Дальнем Востоке -- третья и т.д. Узнайте, действует ли в вашей местности какой-либо районный коэффициент, и если действует, то надо весь четвертый столбец на него умножить (надеемся, вы не забыли перейти от процентов к десятичным дробям).

5. Заголовок шестого столбца -- НАЧИСЛЕНО. Тут должна быть указана сумма четвертого и пятого столбцов -- это будет полная начисленная сумма.

6. Заголовок седьмого столбца -- ПОДОХОДНЫЙ НАЛОГ. Подоходный налог составляет 12%, или 0,12. Здесь при расчете учитывается начисленная сумма. Умножьте столбец 6 на число 0,12.

7. Заголовок восьмого столбца -- ИТОГО. Это, наконец, та сумма, которая выдается человеку на руки, и вычисляется она как разность столбцов 6 и 7.

Ваша работа завершена. И хотя на самом деле заработная плата рассчитывается намного сложнее (а кроме зарплаты, бухгалтеру надо рассчитывать приход и расход материалов, вести учет готовой продукции, рассчитывать доход и прибыль и многое другое), вы получили первое представление о том, как работает бухгалтерия.


ЛАБОРАТОРНАЯ РАБОТА N 14

Знакомство с электронной таблицей

СОСТАВЛЯЕМ ПРАЙС-ЛИСТ

Вы открыли небольшое предприятие по торговле вычислительной техникой. Во всяком солидном заведении такого рода каждому желающему должен быть выдан список товаров, имеющихся в данный момент в продаже, с указанием цен -- так называемый ПРАЙС-ЛИСТ. Все цены на импортную вычислительную технику увязаны с курсом доллара США. Поэтому для удобства клиентов желательно указывать, по какому курсу должна производиться оплата в рублях (а также цены в долларах и в рублях). Поскольку курс доллара меняется, было бы удобно, чтобы цены в рублях определялись автоматически -- в зависимости от этого курса, и тут может быть использована электронная таблица.

Что надо знать для работы с электронной таблицей?

  • Таблица содержит ячейки, адреса которых задаются с помощью обозначений для соответствующих столбцов и строк, например, F5, A8.
  • В каждую ячейку можно поместить либо число, либо текст, кроме того, число может быть вычислено по формуле, которая не видна (она как бы находится "в подвальном этаже").
  • При внесении в ячейку формулы или текста может потребоваться сначала ввод специального символа, например, = .
  • Редактирование формулы осуществляется по правилам работы с текстовым редактором.
  • Чтобы избавить себя от лишних манипуляций с клавиатурой, используйте мышь, отмечая с ее помощью нужные ячейки. Их адреса сами окажутся в формуле. Ваша забота -- указать знаки операций и не забыть нажать клавишу <Enter>.

Выполните задания:

1. Заполните таблицу:

о | А | В | C | D
1 | Курс доллара | 5828 | оооо | оооо
2 | Наименование | Цена (в долларах) | Цена (в рублях) | Цена>10 штук (руб.)
3 | 1. Монитор Samsung Suncmaster 3 Ne | 230 | оооо | оооо
4 | 2. Принтер ЕPSON... | 295 | оооо | оооо
5 | 3... | оооо | оооо | оооо

В общем, можете заносить в таблицу то, что подскажет вам фантазия (или используйте настоящий ПРАЙС-ЛИСТ).

2. В ячейки С3, С4, С5,... поместите формулы. Например, формула в ячейке С3 будет выглядеть так: =В1*В3.

3. В ячейки D3, D4, D5,... тоже занесите формулы. Тут должна определяться мелкооптовая цена, которая для десяти изделий снижается, например, на 3%. Тогда значение в ячейке D3 вычисляется по формуле =0.97*С3.

4. Наступило утро следующего дня. Стал известен новый курс доллара: 5842 рубля. Вам надо только указать этот курс в таблице. Что произошло с таблицей?

Можете смело распечатывать новый ПРАЙС-ЛИСТ и нести его в торговый зал!


ЛАБОРАТОРНАЯ РАБОТА N 15

Работа с электронной таблицей

РАССАЖИВАЕМ УЧАЩИХСЯ ПО АВТОБУСАМ

Условие задачи подробно изложено в тексте учебника.

Используя полученные навыки работы с электронной таблицей, выполните задание:

1. Заполните таблицу.

оо | A | B | C | D | E | F
1 | Класс | Едут на экскурсию | Первый автобус | Второй автобус | Третий автобус | Четвертый автобус
2 | 6а | 23 | 1 | оооо | оооо | оооо
3 | 6б | 17 | оооо | 1 | оооо | оооо
4 | 6в | 14 | оооо | оооо | оооо | оооо
5 | 6г | 7 | 1 | оооо | оооо | оооо
6 | 7а | 18 | оооо | оооо | оооо | 1
7 | 7б | 5 | оооо | оооо | оооо | оооо
8 | 7в | 19 | оооо | оооо | оооо | оооо
9 | 7г | 22 | оооо | оооо | оооо | оооо
10 | 8а | 21 | оооо | оооо | оооо | 1
11 | 8б | 11 | оооо | оооо | оооо | оооо
12 | 8в | 15 | оооо | оооо | оооо | оооо
13 | ооо | Итого в автобусе: | 30 | 17 | 0 | 39

2. В столбцах C, D, Е и F должны находиться либо 1 (единица), либо 0 (нуль), либо ничего (что аналогично нулю). Единица ставится в ячейку тогда и только тогда, когда класс, указанный в строке, едет в соответствующем автобусе, указанном в столбце. Обратите внимание, что при занесении чисел они прижимаются к правому краю столбца.

3. Перед тем, как начинать "рассаживание" классов по автобусам, необходимо заполнить формулами нижний этаж ячеек C13, D13, E13, F13. Так, в ячейке C13 должна стоять формула:

=C2*B2+C3*B3+C4*B4+C5*B5+C6*B6+C7*B7+C8*B8+C9*B9+C10*B10+C11*B11+C12*B12.

Это позволит в дальнейшем контролировать загрузку автобусов.

4. Ваша задача -- таким образом расставить единички и нулики по таблице, чтобы в каждом автобусе ехало не более 45.


ЛАБОРАТОРНАЯ РАБОТА N 16

Работа с электронной таблицей

ДИСПЕТЧЕР РАСПРЕДЕЛЯЕТ ГРУЗ

Условие задачи подробно изложено в тексте учебника.

Используя свои навыки работы с электронными таблицами, выполните задание:

1. Заполните таблицу.

оо | A | B | C | D | E | F
1 | Наименование оборудование | Количество | Вес единицы груза | Первый грузовик | Второй грузовик | Третий грузовик
2 | Станки (штуки) | 11 | 850 | оооо | оооо | оооо
3 | Трубы (упаковка) | 4 | 1930 | оооо | оооо | оооо
4 | Буровое оборудование (ящики) | 2 | 1700 | оооо | оооо | оооо
5 | Отделочный камень (ящики) | 4 | 1250 | оооо | оооо | оооо
6 | Промышленные электромоторы (штуки) | 7 | 730 | оооо | оооо | оооо
7 | Кабель (бухты) | 5 | 1100 | оооо | оооо | оооо
8 | оооо | оооо | Итого вес груза: | 0 | 0 | 0

2. В столбцах D, Е и F должны находиться числа, определяющие, сколько единиц данного груза берет соответствующий грузовик.

3. Перед тем как начинать распределение груза, необходимо заполнить формулами нижний этаж ячеек D8, E8, F8. Так, в ячейке D8 должна стоять формула:

=D2*C2+D3*C3+D4*C4+D5*C5+D6*C6+D7*C7

Это позволит в дальнейшем контролировать загрузку грузовиков.

4. Кроме того, необходимо заполнить формулами нижние этажи ячеек с F2 по F7. Предоставим компьютеру автоматически загружать третий грузовик теми товарами, которые не взяли первые два. Так, в ячейке F2 должна стоять формула: =B2-D2-E2. Воспользуйтесь возможностью дублирования формулы вниз, как вас научили на уроке теории, чтобы заполнить оставшиеся ячейки с F3 по F7.

5. Ваша задача -- таким образом распределить товары, чтобы загрузка каждой из автомашин не превышала
12 тонн более чем на 100--150 килограммов.


ЛАБОРАТОРНАЯ РАБОТА N 17

Работа с учебной базой данных УЧЕНИК

Итак, перед вами несложная база данных, которой может пользоваться даже непрофессионал. В ней содержатся следующие сведения о каждом ученике:

  • Класс
  • Фамилия
  • Имя
  • Дата рождения
  • Адрес
  • Телефон
  • Информация о братьях и сестрах: год рождения и имя
  • Спортивные результаты
  • Увлечения: чем увлекается

1. Выберите пункт меню "Список с сортировкой и поиском по фамилиям". С помощью клавиш управления курсором сделайте так, чтобы рамка остановилась на этом пункте меню, и нажмите клавишу <Enter>.

Перед тем, как начать поиск, компьютер в большинстве случаев спросит вас, какой объем информации надо обработать: обо всех учениках, внесенных в базу, или только об учениках одного конкретного класса. (Напомним, что исключение составляет лишь поиск тех, кого надо поздравить с днем рождения. В этом случае просматривается вся база.) Ќ Выберите режим класс. ЭВМ предложит вам этот класс указать. Наберите номер класса и, перемещая курсор, выберите его букву.

Далее возможны варианты.

Если в базе данных уже есть ученики вашего класса (бывшие или нынешние), то вы сразу же получите их список.

Правила обращения с ним весьма просты.

  • Чтобы перейти на нужную запись, воспользуйтесь клавишами со стрелками вверх или вниз -- для перехода на одну запись, или
    • клавишей <Page Up> -- на страницу вверх, клавишей <Page Down> -- на страницу вниз, или
    • одновременно нажмите клавиши <Ctrl> и <Page Up> для перехода к самой первой записи, или
    • одновременно нажмите клавиши <Ctrl> и <Page Down> для перехода к самой последней записи.
  • Чтобы найти запись по первым буквам (или цифрам), надо просто набрать их на клавиатуре. Компьютер автоматически поместит искомые записи в самый верх экрана. · Чтобы добавить новую запись, надо нажать клавишу <Insert> (при этом на экране появится ОКНО ВВОДА ИНФОРМАЦИИ и вам будет предложено ввести в это окно новую информацию).
  • Чтобы убрать запись из базы данных, надо нажать клавишу <Delete> (при этом на экране снова появится ОКНО ВВОДА ИНФОРМАЦИИ и вам будет предложено подтвердить удаление записи).
  • Чтобы подправить старую запись, надо нажать клавишу <Enter>.
  • В любой момент вы можете воспользоваться палочкой-выручалочкой -- клавишей <F1>.

    • Если же в базе данных учеников вашего класса нет, вы сразу попадете в режим ввода новой записи, как если бы вы нажали клавишу <Insert>.

    При вводе новой информации компьютер вам время от времени будет помогать, предлагая уже готовый список видов спорта или увлечений. Вам останется лишь выбрать из него нужное и нажать клавишу <Enter>.

    Эти списки меняются точно так же, как и списки учеников. Единственное отличие заключается в использовании клавиши <Enter>. Как вы уже поняли из предыдущего абзаца, она служит для переноса, скажем, наименования вида спорта или увлечения в запись какого-либо конкретного ученика. А что если неправильно изначально введено наименование? Что же, теперь вся школа будет "прыгать в длену" или "увликаться фудболом"? Конечно, нет.

  • Чтобы исправить эти наименования, недостаточно нажать только на клавишу <Enter>, обычно используемую для изменения данных, а нужно нажать две клавиши одновременно: <Ctrl> и <Enter>.
  • Добавим, что для путешествия по различным пунктам меню вам потребуется еще клавиша <Выход>
    (как правило, на ней написано <Esc>), которая возвращает вас на шаг назад -- к тому пункту меню, из которого вы сюда попали.

    • Ну, теперь не осталось никаких препятствий для выполнения заданий:

2. Проверьте, содержится ли в базе данных вашего класса верная информация об учениках, и если нет -- подправьте ее или создайте заново.

3. Занесите в базу данных результаты последних спортивных соревнований в вашем классе. Если это сделают и в остальных классах, легко узнать и чемпиона школы.

4. Не забывайте с помощью базы данных поздравлять именинников.

5. Если ваша база данных уже в меру заполнена, выясните, какие самые популярные имена в вашей школе.

6. Придумайте еще несколько задач, которые можно решить с помощью этой базы данных.


ЛАБОРАТОРНАЯ РАБОТА N 18

Работа с гипертекстовым редактором Linkway

Гипертекстовые документы идеально используют все возможности компьютера преподнести информацию в любой форме и в самом удобном для пользователя виде. Именно поэтому они используются не только в глобальных компьютерных сетях, но и в большинстве чисто электронных документов, начиная с подсказок и кончая объемными мультимедийными энциклопедиями. Гипертекстовый редактор Linkway, несмотря на его простоту, поможет вам понять основные принципы создания и работы с такими документами.

Итак, представим, что мы хотим сделать WWW-документ, посвященный собственной персоне. Не ограничиваясь рамками нашей страны, сделаем так, чтобы его могли прочитать и зарубежные пользователи Интернет, поэтому оформим его на изучаемом вами иностранном языке.

В вашем распоряжении уже есть его заготовка, состоящая из пяти страничек.

Первая страничка называется базовой (Base) и сама по себе не существует для того, кто в дальнейшем будет документ просматривать. Но все объекты из нее накладываются на остальные страницы. Поэтому вполне можно считать ее прозрачной.

1. На базовой страничке находятся три объекта: имя и фамилия (обычный объект) и две кнопки (гипертекстовые объекты). Левая переводит на предыдущую страничку, правая -- на последующую. Ваша задача -- дважды щелкнуть левой кнопкой мыши по обычному тексту и вписать свое имя и фамилию.

2. Дважды щелкните мышью по правой кнопке и перейдите на первую страничку, где находится оглавление вашего документа. Здесь вы уже видите девять объектов: три -- с базовой странички, три -- обычных надписи: "Мой город", "Моя школа" и "Моя семья" (на иностранном языке) -- и три кнопки, которые переводят вас на соответствующие страницы. На кнопке, соответствующей страничке о городе, изображен домик, на "школьной" кнопке -- карандаш, а на "семейной" -- симпатичная рожица.

3. Но вот незадача -- три надписи и три кнопки расположены в беспорядке, и от вас требуется переставить их так, чтобы оглавление выглядело аккуратно. Для этого

  • выберите объект, нажав на него левой кнопкой мыши
  • нажмите левой кнопкой мыши на слово "Object" в верхнем меню и выберите подпункт "Move"
  • укажите новое месторасположение объекта

4. Теперь дважды щелкните мышкой по кнопке с изображением домика и перейдите на страничку с рассказом о вашем городе.

Здесь уже создан обычный объект для размещения нескольких предложений о городе, и, дважды щелкнув по нему мышкой, введите эти предложения аналогично тому, как вы делали, когда меняли свое имя и фамилию на базовой страничке.

5. Щелкните несколько раз по левой кнопке, листающей документ назад, и снова перейдите на страничку с оглавлением. Затем, нажав на кнопку с изображением карандаша, перейдите на страничку с рассказом о школе.

Она совершенно пустая, если не считать объектов с базовой страницы. Вам требуется создать поле для размещения текста о школе. Для этого

  • в верхнем меню нажмите на слово "Object"
  • выберите подпункт "New"
  • выберите тип нового объекта ("Field"), нажмите на левую верхнюю точку
  • выберите размер шрифта и снова нажмите на левую верхнюю точку
  • выберите цвет шрифта из предложенных 256
  • переместите указатель мыши в левый верхний угол вновь создаваемого поля, нажмите левую кнопку мыши ровно один раз и тут же отпустите
  • растяните полученный прямоугольник до нужных размеров
  • дважды щелкните по вновь созданному объекту и введите текст о своей школе

6. Теперь осталось снова вернуться на первую страничку с оглавлением, дважды щелкнуть левой клавишей мыши по кнопке с изображением рожицы, перейти на страничку, где должен располагаться рассказ о семье, и в точности повторить всю процедуру создания нового объекта типа "поле" ("Field"), описанную в пятом пункте.

Теперь наш документ полностью готов к использованию. Одно неудобно -- приходится постоянно листать странички назад, чтобы вернуться в оглавление.

7. А было бы здорово, если бы существовала специальная кнопочка, сразу переправляющая нас на первую страницу с оглавлением. Для этого:

  • перейдите на базовую страницу, выбрав в верхнем меню пункт "Go to" и подпункт "Base page", -- ведь мы хотим, чтобы эта кнопка была на всех страницах
  • выберите пункт верхнего меню " Object", подпункт "New"
  • выберите тип объекта -- "Button" -- то есть "Кнопка"
  • определите ее размеры аналогично тому, как это делалось в пункте 5
  • выберите тип кнопки (GO -- кнопка перехода)
  • введите ее имя (любое, например, MENU)
  • выберите вид кнопки из большого количества предложенных
  • укажите, куда осуществляет переход эта кнопка (FIRST -- то есть на первую страницу)

Теперь на всех страницах появилась кнопочка, сразу возвращающая нас к оглавлению, и кнопочки, листающие вперед и назад, оказались просто ненужными.

8. Перейдите на базовую страницу, как это указывалось в седьмом пункте, и удалите эти две, ставшие ненужными, кнопочки. Для этого

  • выберите объект, щелкнув по нему левой кнопкой мыши
  • выберите пункт верхнего меню "Object"
  • выберите подпункт "Delete" -- удалить
  • подтвердите удаление (выберите "YES" и нажмите верхнюю левую точку

Наш гипертекстовый документ по удобству использования совсем приблизился к профессиональным.


§ 1. Информация

Представьте себе, что вы ничего не видите, ничего не слышите, не ощущаете никаких запахов, ни холода, ни тепла, а вдобавок вся пища абсолютно безвкусная...

Надо полагать, жизнь сразу бы потеряла для вас свою привлекательность. Ни телевизора, ни компьютерных игр, ни музыки, ни чудесных цветочных ароматов... И все потому, что нас лишили постоянного притока информации, без которого немыслимо нормальное существование человека в окружающем мире.

Более того, можно смело сказать, что человек отличается от животного характером той информации, которую он способен воспринимать и обрабатывать. Вот только один пример. Около сотни детей по разным причинам выросли в окружении зверей, лишенные всего лишь обычной человеческой речи -- одного из главных источников информации. Результат печален -- они были совсем не похожи на легендарного Маугли, из них получились существа, почти не отличающиеся от животных.

Попробуем разобраться немного подробнее с таким жизненно важным предметом, как информация. Пусть ваш приятель принес видеокассету с самым новым захватывающим фильмом о космических приключениях. Вы ни секунды не сомневаетесь, что эта кассета гораздо ценнее, чем точно такая же, но с записью скучного и неинтересного фильма.

А, собственно говоря, почему? Фирма-производитель одна и та же, марки кассеты совпадают, кассета со скучным фильмом даже новее кассеты с записью интересного фильма. И вес у них одинаковый. Мало того, даже подробнейший физико-химический анализ не найдет особых отличий в составе вещества обеих кассет.

Так чем же нам так ценна именно кассета с записью космических приключений? Ну конечно же, информацией.

Информация -- это очень странный объект. Вы можете посмотреть один и тот же фильм с видеокассеты, с видеодиска, с компьютерного CD-диска, просто в кинотеатре в конце концов... Информация одна и та же, но в рассмотренных случаях она находится на разных носителях. И в принципе нам все равно, на каком носителе находится информация, лишь бы было качественное ее воспроизведение (в данном случае выбранного фильма).

Немного попозже, в курсе физики, вы узнаете, что все предметы во-круг нас характеризуются наличием в них вещества (грубо говоря, одни легче, другие -- тяжелее) и энергии. Кто сомневается в наличии энергии, например, в холодном утюге, -- попробуйте уронить его себе на ногу (это чисто умозрительный эксперимент!). Но, кроме всего прочего, любой предмет несет в себе еще и информацию. Даже самый маленький камешек, валяющийся на дороге, можно бесконечно изучать, получая информацию о его химическом составе, физических свойствах породы, особенностях его образования в земной коре и тому подобном.

Но, говоря об информации, мы обычно имеем в виду те сведения, которые предоставляют нам телевидение, радио, газеты, книги. Информация -- это карты местности и картины художников. Информация аккумулирована в тысячах научных трудов, составляющих основу нашей цивилизации. Информация составляет основу ваших школьных учебников, без которых трудно стать образованным человеком.

Оторвитесь на минуту от нашего учебника и выгляните в окно. Вы увидите дома и людей, солнце и небо, деревья и траву и автоматически переключитесь на анализ информации совсем другого сорта. Она очень сильно отличается от однообразных черных строчек с буквами, какие вы видите в книге.

Информация, получаемая из сообщений, записанных с помощью букв и цифр, называется символьной; информация, получаемая с помощью зрительных образов окружающего мира, называется видеоинформацией.

И если раньше человек имел дело в основном с видеоинформацией, то современная цивилизация окружила нас бездонными морями символьной информации, способными поглотить любого в своих пучинах.

Человек создан природой как мощный аппарат по переработке видеоинформации. Вспомните хотя бы пословицу "Лучше один раз увидеть, чем сто раз услышать", ярко отражающую отличие в восприятии символьной (текстовой) информации от видеоинформации. В современных потоках символьной информации человек чувствует себя как щепка в водопаде. Чтобы покорить океаны символьной информации, нужны "корабли", способные преодолеть океанские просторы. Ими и стали компьютеры или электронно-вычислительные машины (ЭВМ).

Но, кроме кораблей нужна, наука об управлении этими кораблями, нужны люди, способные прокладывать курс корабля, и люди, знающие устройство этих кораблей. Но прежде всего нужны капитаны.

Итак, информатика -- это наука обо всех видах информации и инструментах ее обработки. Иными словами:

      Информатика изучает процессы получения, хранения, переработки
      и передачи информации и разрабатывает технологии этих процессов.

И человек, и компьютер вместе с дополнительным оборудованием для компьютера (профессионалы бы сказали -- периферийными устройствами) -- основные инструменты информационных технологий. Обратите внимание, что человек -- это тоже мощнейший инструмент по переработке информации. Роль устройств, посредством которых он получает информацию, выполняют его органы чувств; сохраняет и перерабатывает информацию мозг, а передача осуществляется самыми разными способами, из которых важнейшие -- устная и письменная речь.

Вопросы и задания

  • 1. Какие способы передачи информации от человека к человеку вы знаете?
  • 2. Разузнайте подробнее, каким образом записывается информация о фильме на тех носителях, которые были перечислены в этой главе, и сделайте об этом сообщение на уроке информатики.
  • 3. Приведите примеры, когда компьютер не может заменить человека в деле обработки информации.


Глава третья. Алгоритмы и исполнители

§ 1. Бездумные Исполнители

Начнем с приятного. Вспомним забавную сценку из мультфильма "Вовка в тридевятом царстве", где наш незадачливый герой пытается командовать двумя розовощекими крепышами-силачами:

— Эй, Двое-из-Ларца, Одинаковы-с-лица!!!
— Мы здесь!
— Замесить и нарубить!.. Эй, да вы что?!!
— А что?
— Наоборот!!!

Бедный Вовка! Ничего хорошего из его затеи не получилось, одни неприятности! А все дело в том, что школьников в его время не учили информатике и он не распознал в лихих удальцах из ларца особый класс созданий, называемых Бездумными Исполнителями(БИ).

Но не торопитесь сетовать вместе с Вовкой на их редкостную тупость. Так ли уж они плохи? Все Вовкины приказания были выполнены быстро и четко. Разве нет?

Конечно, рубилось тесто, а месились дрова, но никто и не просил сделать наоборот. Вернее, слово "наоборот" было произнесено, но к чему оно относилось? Вполне можно было трактовать Вовкину фразу, как приказание поменяться рабочими местами без изменения характера самой работы, что исполнители успешно и проделали.

Вспомните, разве вам не приходилось "Принести вон то!", или "Купить чего-нибудь поесть", или делать нечто, вроде "Пойди туда, не знаю куда, принеси то, не знаю что"? И всегда ли вам удавалось выполнить эти команды ко всеобщему удовлетворению?

Стоит ли упрекать Двоих-из-Ларца за то, что они, получив в общем-то , понятную команду, шустренько кинулись ее выполнять?

Вряд ли вы будете гордиться, если вас назовут Бездумным Исполнителем. Но всегда ли плохо им быть? Будет ли рад хозяин овчарки, когда по команде "Фас!" его четвероногий друг задумается, стоит ли связываться с бандитом? А самолет в ответ на движение штурвала пилота продолжит лететь дальше, потому как разворот делать не хочется. А оператор ядерного реактора, забросив инструкцию, начнет управлять сложнейшим агрегатом по наитию... Согласитесь, быть БИ иногда просто-таки необходимо!

Да... но как же быть с нарубленным тестом?

Впрочем, разбираться надо не с тестом, а с Вовкой. БИ, разумеется, бездумный, но это вовсе не означает, что бездумным должен быть и человек, отдающий команды.

Вспомнив предыдущие уроки информатики, вы наверняка поймете, что все те программы, которые мы с вами изучали, являются не чем иным, как группой Бездумных Исполнителей, готовых по одному движению вашего пальца кинуться обрабатывать электронные документы.

И если электронная таблица почему-то не хочет пересчитывать данные, то объясняется это либо неисправностью оборудования, либо (что бывает гораздо чаще) нашими неправильными действиями.

Подумаем, какими же должны быть команды, чтобы БИ нас не разочаровывал. Правильными? Но что это означает? Правильная команда — понятная команда?

А если вам скомандуют починить суперкомпьютер? Или сделать двойное сальто назад? Или графическому редактору скомандуют напечатать картинку, а принтер не подключен?

Значит, для БИ правильной командой будет та, которую он не только понял, но и способен выполнить. Во избежание недоразумений следовало бы поинтересоваться у БИ, как он понимает каждую команду. Собственно говоря, мы это и делаем, когда, например, внимательно читаем инструкцию к новому магнитофону, разбираясь, как он реагирует на нажатие различных кнопочек. Этим мы занимались и тогда, когда учились работать с текстовым редактором или базой данных. И очень жаль, что Вовка пошел по пути наименьшего сопротивления, а не поинтересовался у Двоих-из-Ларца, как они понимают и будут выполнять ту или иную команду.

Совокупность всех команд, которые может выполнить конкретный БИ, называется системой команд этого исполнителя.

Подведем итоги

  • Многие устройства и существа вокруг нас выступают в качестве Бездумных Исполнителей.

  • Отличительной особенностью БИ является то, что он строго и точно выполняет команды из своей системы команд.

Вопросы и задания

1. Насколько можно говорить о том, плох БИ или хорош? Например, что означает фраза «Я недоволен своим текстовым редактором»? Означает ли это, что БИ не справляется со своей системой команд?

2. Что такое система команд исполнителя?

3. Приведите примеры БИ и опишите их Системы Команд. С какими БИ вы уже познакомились на уроках информатики?

4. Какую систему команд вы бы предложили для домашнего робота "БИ-001"?

5. Часто ли вы бываете БИ? Кто и какую систему команд использует, чтобы вами управлять?

6. Какими способами можно подавать команды БИ?

7. Что, на ваш взгляд, ответит человек и что ответит БИ, если к ним обратиться со следующими вопросами:

а) Не можете ли вы сказать, который час?

б) Не знаете ли вы, который сейчас час?

в) Не будете ли вы любезны сказать, который сейчас час?

г) Который сейчас час?

8. Разведывательный дозор в составе двух человек подошел к реке. Мост был разрушен, а река слишком глубока и широка, чтобы переправиться через нее вброд или вплавь. К счастью, около берега в маленькой лодке проплывали два мальчика.

Как переправиться на этой лодке через реку, если она может выдержать либо одного взрослого, либо двух мальчиков?

Для решения этой задачи представьте, что у вас есть БИ «Перевозчик», который и управляет лодкой, ее погрузкой и разгрузкой. Определите систему его команд и напишите их последовательность, обеспечивающую успешную переправу.

9. На полустанке одноколейной железной дороги остановился поезд в составе тепловоза и трех вагонов, доставивший бригаду рабочих для строительства второго пути. Пока же на этом полустанке имеется только небольшой тупик, в котором при необходимости может поместиться тепловоз с вагоном или два вагона.

Вскоре следом за поездом со строительной бригадой к тому же полустанку подошел пассажирский поезд. Как пропустить пассажирский поезд?

Аналогично предыдущей задаче придумайте БИ, ответственного за разводку поездов.

10. (Вопрос с уклоном в философию.) В шестидесятые годы достаточно популярной была дискуссия о том, могут ли электронно-вычислительные машины думать. Что бы вы могли сказать на эту тему, учитывая свое знакомство с БИ?


§ 2. Компьютер

При слове "компьютер" нам сразу же представляются цветной экран монитора, красивый корпус, клавиатура... Но ведь есть еще и бортовые компьютеры автомобилей. А на предыдущих уроках, рассказывая о новых компьютерных технологиях, мы упоминали и говорящий будильник, и видеомагнитофон, и телефон с определителем номера...

Что же объединяет все эти вещи? В них во всех есть две наиглавнейшие части, без которых компьютер просто не существует.

Это центральный процессор и память. Память может быть разная. В некоторых компьютерах есть только постоянное запоминающее устройство (или ПЗУ), в некоторых -- и ПЗУ, и оперативная память. Во всех этих тонкостях мы разберемся немного позже. А сейчас запомним:

      Процессор и память -- это главные устройства компьютера.
      Без них он не существует, как человек не существует без головы.

Чисто внешне процессор -- это маленькая металлическая или керамическая плоская коробочка размером в
2—3 почтовые марки. Именно он руководит работой всех частей ЭВМ. Конечно, "главнокомандующий" процессор сам исправно исполняет указания человека. Но ЭВМ была бы бесполезна, если бы она не могла запоминать информацию, необходимую для решения задач. Для хранения информации и предназначено особое устройство -- память. Представьте себе, что вы читаете захватывающую книжку. Она настолько интересна, что вы буквально переселились в другой мир, переживая приключения главных героев. И тем не менее в данный конкретный момент времени перед вами всего одна страничка, информация из которой поступает вам в мозг и там анализируется.

Оперативную память компьютера вполне можно уподобить вот этой самой страничке книжки, которая находится прямо перед вашими глазами в процессе чтения.

Конечно, вам важна информация и из предыдущих страниц, но она уже обработана и отложилась в памяти. Так же и компьютер, обработав информацию из оперативной памяти, записывает ее во внешнюю память и "листает книжку" дальше, считывая в оперативную память очередную порцию информации.

Мы уже подчеркивали, что компьютер предназначен для работы с большими объемами символьной информации. Никакой оперативной памяти никакого компьютера не хватит, чтобы удержать ее всю. Ведь и человек не может все упомнить. Поэтому люди пользуются записными книжками, магнитофонными лентами, видеокассетами и т.п.

Подобные "записные книжки" имеются и у ЭВМ. Для персонального компьютера это главным образом жесткие и гибкие магнитные диски и оптические диски. Гибкий магнитный диск называют еще дискетой. На одной дискете может храниться до 700 страниц текста -- этого достаточно, чтобы поместить несколько школьных учебников (правда, без картинок). Специальное устройство, называемое дисководом, позволяет записывать на дискету и считывать с нее информацию.

Жесткие диски, как правило, несъемные. Оптические диски работают быстрее гибких, но существенно медленнее жестких. Зато они съемные и на них помещается значительно больше информации, чем на гибких дисках.

Жесткие, гибкие, лазерные, магнитооптические и тому подобные диски, магнитные ленты, накопители на магнитных доменах и прочее, и прочее называются внешними носителями информации. И вовсе не потому, что их всегда можно взять и вытащить, а потому, что процессор не имеет прямого до


§2. Что такое алгоритм

Прекрасное время — каникулы! Особенно летние. Сладко потягиваясь, вы просыпаетесь, когда все уже ушли на работу, и наталкиваетесь на записку: "Митя! Завтрак на столе. Сходи за хлебом и молоком. Съезди к бабушке в сад. Вымой посуду. Надень новую футболку. Целую, мама".

Вот оно! Опять придется почти весь день быть БИ! Разве нет? Все команды понятны. Во всяком случае, совершенно очевидно, что завтрак должен быть съеден, сколько покупать хлеба и молока тоже ясно — не в первый раз, а дорога в сад хорошо знакома...

Конечно, можно согласиться, что все команды в маминой записке входят в Систему Команд, но здесь, с точки зрения БИ, мы имеем нечто новенькое: нам предписано выполнить сразу несколько команд. Вернее, предписано сразу, а вот как их выполнять?

"Ну, конечно, по порядку! — скажете вы. — Это же естественно!" Кстати, в упражнениях предыдущего параграфа мы именно так и переправлялись через реку и разводили поезда.

Действительно, такой порядок так и называется естественным. Настоящий БИ только так команды и выполняет. Но тогда посуда будет стоять грязной целый день, а в новой футболке вам придется щеголять только к вечеру. Вряд ли мама имела это в виду. Тогда нужно признать, что для настоящего БИ последовательность команд в маминой записке неверна.

Последовательность команд, полученная БИ для выполнения, называется программой. Таким образом, мама допустила в своей программе сразу две ошибки.

Конечно, здесь это не страшно, но если в инструкции для электрика пункт о предварительном отключении электричества попадет лишь в конец, а электрик обязан сработать, как БИ!.. Нет уж! Лучше в программах не делать ошибок!

Вполне возможно, у вас возник вопрос: "А зачем нужны эти самые программы? Мама вообще-то могла просто позвонить часиков эдак в десять, разбудить, а заодно и объяснить все человеческим голосом".

Тогда посмотрите внимательно те книги и журналы, которыми чаще всего пользуется ваша мама. Открываем одну наугад:

"Слоеное тесто раскатать в пласт толщиной 1 см, разрезать на квадраты такой величины, чтобы в них можно было завернуть яблоки. На каждый квадрат положить очищенное яблоко с вынутой сердцевиной, заполненной сахарным песком. Углы квадрата приподнять и соединить узелком, тесто защипать по шву так, чтобы яблоко было завернуто полностью. Изделия смазать яйцом, уложить на противень, смоченный холодной водой, и выпекать при температуре 200—220 градусов в течение 25—30 мин. Готовые изделия посыпать сахарной пудрой".

Ну и как? Не правда ли, перед вами типичная программа, рассчитанная на БИ? Конечно, мама может обидеться, если назвать ее Бездумным Исполнителем. Но никто не будет спорить, что чем чаще выпекаются яблоки в слойке, тем они вкуснее, а готовятся они с каждым разом все более автоматически, все более бездумно.

Очень многие люди постоянно пишут для себя программы и считают это полезным. Даже выпускаются специальные ежедневники, в которых расписываются все дела на день.

Совершенно понятно, что один и тот же рецепт каждая хозяйка запишет для себя по-своему. Но если потребуется записать программу для другого человека, а тем более механизма, мы должны совершенно точно быть уверены в том, что все команды входят в Систему Команд БИ (сокращенно СК БИ).

Итак, цель может быть одна, а программы достижения этой цели могут быть и разными — в зависимости от исполнителей. Прочитайте внимательно две программы:

How to make a good tea:

Bring fresh water to boil.

Warm tea-pot by rinsing out with hot water.

Put one teaspoonful of tea per сup into the tea-pot and pour immediately the boiling water into the tea.

Stir the tea after 3—5 minutes.

Add sugar to taste.

Как приготовить хороший чай:

Вскипятите свежую воду.

Ополосните заварочный чайник крутым кипятком.

Положите чай в заварочный чайник из расчета одна чайная ложка на чашку и сразу же залейте кипятком.

Через 3—5 минут размешайте.

Добавьте сахар по вкусу.

Первая программа, очевидно, написана для Джонни-из-за-Океана, о котором мы уже как-то упоминали, когда рассказывали об электронной почте. Вторая — для его русского друга Вани. Ясно, что каждый из них будет выполнять одни и те же действия, и поэтому, наблюдая за их работой, мы не сможем отличить одного от другого. Ведь фактически они выполняют один и тот же набор действий. Только записаны эти наборы для каждого на своем языке.

Более того, можно заснять на видеокассету все манипуляции Джонни или Вани, а затем показать любому жителю Земли, и ему будет ясно, как заваривать чай. И совершенно не важно, какой язык понимает этот житель! (Вот, кстати, с точки зрения человека, еще одно преимущество видеоинформации перед информацией символьной.)

Поэтому когда говорят о самой последовательности действий для достижения какой-либо цели, то используют термин алгоритм, а не программа.

Иными словами, один и тот же алгоритм может быть записан на самых разнообразных языках, но его суть от этого не изменится.

Разумеется, исполнитель должен уметь производить все действия, встречающиеся в алгоритме. Про такие действия говорят, что они допустимы для данного исполнителя. Чтобы алгоритм стал программой для конкретного БИ, нужно все действия, входящие в алгоритм, записать командами из Системы Команд этого исполнителя. То есть, на языке этого конкретного БИ.

Итак, алгоритм — это последовательность действий, допустимых для исполнителя, а программа — запись алгоритма на языке конкретного БИ. Различие весьма тонкое, однако для поиска ошибок в программе даже есть специальный термин — отладка. Поиск ошибок в алгоритме никак по-особенному не называется.

После напряженных раздумий пора разрядиться и попить чайку. Например, того, что приготовили Джонни и Ваня. К нашему величайшему изумлению, чаек оказался разным: от Ваниного чая язык прилипает к губам, а чай Джонни почти несладкий. Почему один и тот же алгоритм в разном исполнении привел к столь различным результатам?

Очевидно, все дело в последнем действии: добавлении сахара по вкусу. Это, конечно, допустимое действие для каждого исполнителя. Просто у каждого свой вкус. А нам урок:

Один и тот же алгоритм, претворяемый в жизнь различными исполнителями, может давать различные результаты.

Как правило, алгоритмы пишутся для человека. Поэтому мы будем записывать алгоритмы на обычном русском языке. При этом каждый из вас может применять какие-либо сокращения слов и вообще заменять одни слова другими. Важно только, чтобы за этими словами стояли действия, допустимые для данного вам исполнителя.

Подведем итоги

  • Некоторые БИ принимают к исполнению заранее составленный список команд, который называют программой.

  • · Программы выполняются БИ в естественном порядке — команда за командой.

  • Последовательность действий, допустимых для БИ, называется алгоритмом. Алгоритм, записанный на языке БИ (с помощью его Системы Команд) , и есть программа.

  • Если у БИ при исполнении программы не получается то, для чего она предназначалась, значит, в программу закралась ошибка. Выявление ошибок и их устранение называется отладкой программы.

  • Алгоритм пишется человеком для человека. С его помощью уясняют последовательность действий исполнителя, приводящую к нужному результату.

Вопросы и задания

1. Любые ли действия могут присутствовать в алгоритме?

2. В чем различие между алгоритмом и программой?

3. Что такое отладка программы?

4а. Петя и Коля в роли БИ выполняют с помощью микрокалькулятора следующий алгоритм:

— сложить 83,2438 и 57,6847;

— полученный результат умножить на 10.

У Пети на табло калькулятора помещается 6 цифр, а у Коли — 8. Будут ли у них одинаковы результаты выполнения этого алгоритма?

4б. Приведите другие примеры алгоритмов, результаты исполнения которых зависят от их исполнителей.

5. Назовите книги-сборники алгоритмов. Кто является для них БИ и какие наиболее типичные команды входят в его систему команд?

6. С какими алгоритмами вы познакомились, занимаясь

а) русским языком;

б) иностранным языком;

в) математикой;

г) литературой;

д) химией;

е) физкультурой;

ж) информатикой?

7. Сыграйте в БИ. Пусть ваш товарищ станет БИ. Обсудите с ним его систему команд и попробуйте составить для него небольшую, команд в десять, программу. Посмотрите, сможет ли он ее выполнить. Если нет, то почему? Уточните систему команд или отладьте программу.

8. Составьте программу для выполнения какой-либо работы по дому роботом "БИ-001" (о нем шла речь в задаче 4 из предыдущего параграфа).

9. Представьте себе, что ваш младший братишка впервые пойдет в магазин за хлебом. Напишите для него алгоритм, объясняющий, как добраться до магазина и как обращаться с деньгами. (Совет: предварительно обсудите список его допустимых действий; например, является ли для него допустимым переход через дорогу.)

10. Старинная задача. Некий БИ должен перевезти в лодке через реку волка, козу и капусту. Его допустимые действия таковы, что за один раз он может перевезти только что-нибудь одно: волка, козу или капусту. Ничем, кроме погрузочно-разгрузочных работ и перевозок, этот БИ не занимается.

Составьте для данного БИ алгоритм переправы, позволяющий избежать жертв.

11. Имеется два кувшина емкостью 3 л и 8 л. Исполнитель ДЖИНН может набирать воду из реки в каждый кувшин, выливать из него воду и определять, налита ли вода в кувшине доверху. Составьте алгоритм, выполнив который ДЖИНН наберет из реки 7 л воды.

12. Исполнитель умеет заменять в слове ровно одну букву, причем из осмысленного слова должно получаться снова осмысленное слово (иначе исполнитель ломается). Составьте алгоритмы преобразования

а) слова САД в слово КОТ;

б) слова МУХА в слово СЛОН.

13. БИ умеет выполнять следующие действия:

— взять Х;

— поджарить Х;

— смолоть Х в мясорубке;

— закатать Х в Y;

— сварить Х;

— нарезать Х;

— положить Х на Y,

где вместо букв Х и Y можно подставить слова "мясо", "тесто", "сыр", "то, что получилось", "хлеб".

Используя эти действия, составьте

а) алгоритм приготовления пельменей;

б) алгоритм приготовления чего-либо еще съедобного;

в) алгоритм приготовления чего-нибудь несъедобного;

г) какой-нибудь неисполнимый алгоритм.

14. Придумайте несколько коротких (не более 15 команд) алгоритмов с ошибками и дайте проанализировать их своему товарищу. Предварительно сообщите, с какой целью вы составляли каждый алгоритм.


    § 3. Символьное кодирование

Надеемся, вы еще помните о том, что информатика -- наука о получении, преобразовании, сохранении и передаче информации.

Информация… Без нее буквально как без воды. Недаром марафонский бегун пожертвовал жизнью всего лишь ради пары слов. Говоря научным, прозаическим языком, он обеспечивал информационную инфраструктуру государства. Давайте же уделим свое внимание тому, ради чего не жалели жизни, -- передаче информации.

Многие африканские племена до сих пор используют специальные барабаны -- тамтамы, обмениваясь сообщениями со скоростью звука.

На Руси, где леса гасили звук, использовали другой метод. Ни один гонец с пограничной заставы не успел бы вовремя предупредить горожан о набеге кочевников -- их кони были не менее быстрыми. И для передачи срочных сообщений использовался дым костров.

До сих пор на флоте используется семафорная азбука, когда каждой букве соответствует определенное положение рук сигнальщика, подчеркиваемое флажками.

Но удары барабана, столбы дыма, поднятые вверх руки -- это вовсе не то же самое, что звуки человеческой речи или знакомые с первого класса буквы. Но, подумав, можно обнаружить между ними много общего. Ведь речь идет фактически о том, что каждое сообщение, несущее нам информацию, представляет собой последовательность сигналов. А для того, чтобы сообщение было не только принято, но и понято, нужно предварительно договориться, что означают, например, два столба дыма или последовательность из трех быстрых ударов, или разведенные в стороны руки.

Итак, кроме самого сообщения и способа его передачи, появился еще один компонент -- кодирование.

По мере развития цивилизации появлялись новые возможности передачи сообщений, а значит, и новые способы кодирования. Мы остановимся только на одном из них.

Майкл Фарадей в 1831 году сделал открытие, буквально перевернувшее мир: он изобрел способ получения электрического тока. И чуть ли не сразу же электрический ток был использован для передачи сообщений -- американский изобретатель Сэмюэл Морзе создает и широко внедряет в практику телеграфные аппараты и линии связи.

В какой-то степени Морзе пришлось решать проблему, аналогичную проб-леме передачи сообщений по африканскому барабанному телеграфу. И электрический ток, и барабан имеют весьма небогатые выразительные -возможности. По барабану можно либо стучать, либо нет. Электрический ток или идет, или нет. Поэтому и кодировка, предложенная Морзе, использовала всего три своеобразные буквы: длинный сигнал (тире), короткий сигнал (точка), нет сигнала (пауза) -- для разделения букв. Так, знаменитый сигнал SOS (Save Our Souls -- спасите наши души) кодируется так:

    • • • <пауза> -- -- -- <пауза> • • •

                S___________O___________ S

Код Морзе вот уже полтора века служит человечеству. Его до сих пор используют на радиостанциях, потому что его сигналы пробиваются сквозь такие атмосферные помехи, которые глушат любую членораздельную речь.

С течением времени телеграф превратился в массовое средство передачи сообщений, доступное (в принципе) любому желающему. Но все же до-статочно дорогое. Требовался хорошо обученный оператор, виртуозно владеющий специальным ключом, замыкающим и размыкающим электрическую цепь. И тем не менее его скорость передачи сообщений не шла ни в какое сравнение со скоростью работы машинисток, набивающих текст с помощью клавиатуры, -- ведь, чтобы передать одну букву, скажем, О, надо трижды нажать на ключ, а машинистке один раз ударить по клавише.

Вот бы совместить пишущую машинку с телеграфным аппаратом! Но для этого нужно автоматизировать процесс кодирования-декодирования информации. К сожалению, все попытки сделать машину, понимающую код Морзе, оказались безуспешными. Предложенные варианты оказывались излишне громоздкими, ненадежными и дорогими.

Конечно, техника начала века была еще не столь совершенна, как сейчас, но свою роль сыграло и то, что сам по себе код Морзе был весьма сложен для распознавания его автоматами. Более удачный код был предложен немецким изобретателем Бодо.

Во-первых, в нем использовались только два сигнала (например, точка и тире без паузы), а во-вторых, чтобы не возникала проблема отделения одной буквы от другой, все буквы кодировались последовательностями сигналов одинаковой длины. Аппараты Бодо были просты в производстве и надежны. С их помощью удалось сделать телеграф на самом деле массовым средством передачи срочных сообщений.

Давайте теперь встанем на место Бодо и подумаем, сколько же нужно сигналов, чтобы закодировать все буквы.

Для удобства записи будем обозначать сигнал одного типа нулем (0), а другого типа -- единицей (1). Конечно, можно было бы договориться обозначать сигналы и какими-нибудь другими знаками, например и [image], но, как вы позже увидите (в 9-м классе), это менее удобно. Итак, последовательностью из одного сигнала можно закодировать всего две буквы. Например:

    0 | А
1 | Ы

Если бы наш язык состоял всего лишь из этих двух букв, нам бы этого и хватило.

К сожалению, в русском языке букв несколько больше. Поэтому продолжим исследование.

Последовательностью из двух сигналов можно закодировать уже четыре буквы. Например:

    0 | 0 | А
0 | 1 | Ы
1 | 0 | В
1 | 1 | Р

В общем, получше, но изъясняться на таком языке тоже не слишком удобно.

Трехсигнальной последовательностью можно закодировать уже восемь букв:

    0 | 0 | 0 | А
0 | 0 | 1 | Ы
0 | 1 | 0 | В
0 | 1 | 1 | Р
1 | 0 | 0 | Б
1 | 0 | 1 | У
1 | 1 | 0 | З
1 | 1 | 1 | Ш

Это уже совсем хорошо. Можно послать сверхсрочное сообщение "ВЫРВУАРБУЗ". Но всегда хочется лучшего.

Думается, вы уже догадались, что с помощью последовательности из четырех сигналов можно закодировать шестнадцать букв, а пятисигнальной -- тридцать две.

Попросите у родителей какую-нибудь старую телеграмму. Вы увидите, что буквы там только заглавные. А вместо точек и запятых стоят слова "ТЧК" и "ЗПТ". Поэтому, хотя вроде бы пятисигнальной последовательности вполне достаточно, чтобы изъясняться на вполне русском языке, мы будем ее наращивать.

С помощью последовательности из шести знаков (нулей и единиц) можно закодировать уже 64 символа. Но если мы хотим, чтобы в сообщении были заглавные и строчные буквы, а также цифры, этого недостаточно.

На цифре семь можно и остановиться. Этого хватает для того, чтобы закодировать все символы, необходимые для посылки сообщений на хорошем русском языке. Именно таков отечественный код КОИ-7. Сокращение КОИ родилось из первых букв словосочетания "код обмена информацией".

Чтобы не употреблять длинный оборот "последовательность из стольких-то знаков, каждый из которых нуль или единица", люди договорились появление одного такого знака в последовательности называть битом (от английского BInary digiT -- двоичная цифра). Теперь можно сказать, что последовательность из шести нулей или единиц -- это шестибитная последовательность, а КОИ-7 -- это семибитное кодирование русскоязычных сообщений.

Когда в середине нашего века на сцене появились компьютеры с их убогим языком нулей и единиц (ток, сами понимаете, либо есть, либо его нет, кусочек поверхности либо намагничен, либо нет, конденсатор либо разряжен, либо заряжен), все было готово к тому, чтобы обрабатывать с их помощью буквы и цифры, иными словами, символьную информацию.

Впервые, по всей видимости, это было сделано под руководством Алана Тьюринга в местечке Блетчли-Парк неподалеку от Лондона. Именно там в 1943 году был создан специализированный компьютер, расшифровывающий немецкие военные коды. Машина называлась "Колосс". Тысячи перехваченных за день неприятельских сообщений вводились в память "Кол осса", после чего в поисках соответствия машина перебирала сотни тысяч вариантов, расшифровывая самые сложные коды.

Как говорил один из участников этой работы И. Дж. Гуд: "Я не хочу сказать, что мы выиграли войну благодаря Тьюрингу, но беру на себя смелость сказать, что без него мы могли бы ее проиграть".

Уже в 1950 году в Англии компьютер LEO (Lyon’s Electronic Office) начислял зарплату работникам чайных магазинов.

В большинстве первых компьютеров использовался именно семибитный код. Но с развитием техники это стало довольно неудобно. Новый код был уже восьмибитным и основывался на американском стандартном коде информационного обмена (ASCII -- American Standard Code for Information Interchange). В частности, именно благодаря восьмибитному кодированию мы без всяких проблем используем в тексте большие и маленькие буквы и русского, и латинского алфавитов, знаки препинания, цифры, специальные символы вроде N и, конечно же, пробел. Это очень важный символ -- ведьбезнегочитатьтекстпростопротивно.

Последовательность восьми битов договорились называть словом байт. Вот и получается, что один символ занимает в памяти компьютера ровно один байт.

Но и одного байта окажется маловато, если потребуется оценить, сколько места в памяти компьютера занимает, скажем, десяток-другой страниц текста. Поэтому были введены более крупные единицы --


§3. Знакомьтесь:
исполнитель Паркетчик

Итак, как вы уже поняли из предыдущих параграфов, весь прошлый год мы с вами только и занимались тем, что изучали все новых и новых Бездумных Исполнителей и осваивали их Системы Команд. Понять-то, может, и поняли, но все-таки одно дело — общаться с исполнителем на нормальном человеческом языке и совсем другое — когда он понимает только язык нажатий на кнопочки мышки или клавиатуры.

Как повезло Вовке в тридевятом царстве и как не повезло...

Не торопитесь сетовать! Именно сегодня мы познакомимся с исполнителем, который почти понимает человеческую письменную речь. Его зовут Паркетчик, и, надеемся, он станет вашим хорошим другом.

На первый взгляд он вам покажется совсем простым. Но именно с его помощью вы узнаете законы мира Бездумных Исполнителей, решите немало увлекательных головоломок, а иногда с ним можно будет и поиграть.

Говоря о Бездумных Исполнителях и их Системах Команд, мы неявно предполагали наличие еще одного важного компонента — среды обитания, или операционной среды, Бездумного Исполнителя. То есть того окружения, с которым исполнитель может производить какие-либо действия.

Так, операционной средой Перевозчика являются лодка и пассажиры, Джинна — два кувшина и вода в реке, текстового редактора — символьный электронный документ и т.д.

Операционной средой (или, если хотите, игровым полем) Паркетчика является лист клетчатой бумаги. Ну, не настоящей бумаги, разумеется. Так же, как и текстовый редактор, Паркетчик выкладывает квадратные паркетные плитки двух цветов, красного и зеленого, на листе электронного документа.

Каждая клеточка на поле имеет свой адрес, чтобы Паркетчик знал, где ему предстоит выполнять работу. На экране своего компьютера вы видите игровое поле как бы сверху, поэтому мы будем говорить о горизонтальных и вертикальных рядах клеток.

Так, клетка, стоящая в 5-м столбце и 7-й строке, имеет адрес (5, 7). Вы, наверно, уже сталкивались с подобным, если играли в "морской бой". В отличие от игры в "морской бой" мы нумеруем строки снизу вверх и в адресе клетки вначале указываем столбец, а затем — строку. (Кое-кто сразу понял, почему так сделано, а остальным рекомендуем вспомнить, что такое система координат. И почему номер столбца называют абсциссой, а номер строки — ординатой.)

Чтобы выложить тот или иной орнамент, Паркетчик может переходить с любой клетки на соседнюю. Иными словами, для Паркетчика допустимы следующие четыре действия:

  • шаг вверх,

  • шаг вниз,

  • шаг вправо,

  • шаг влево.

Кроме того, как было уже сказано, у Паркетчика есть еще два допустимых действия:

  • положить красную плитку,

  • положить зеленую плитку.

Осталось сообщить, что в начале игры Паркетчик всегда находится в левом нижнем углу, т.е. на клетке (1,1).

Теперь вы можете составлять разнообразные алгоритмы, объясняющие Паркетчику, как выложить задуманный вами орнамент.

Разумеется, когда вы будете записывать алгоритмы для Паркетчика в своих тетрадях, совсем не обязательно записывать действия буквально. Можно писать и так:

-> — вместо Шаг вправо;

К — вместо Положить красную плитку;

^ — вместо Шаг вверх;

З — вместо Положить зеленую плитку;

<- — вместо Шаг влево;

V — вместо Шаг вниз

— или как-нибудь еще.

Главное — чтобы было совершенно ясно, какое действие подразумевается. (Кстати, что сделает Паркетчик, исполнив написанный выше алгоритм?)

Другое дело, когда вы будете писать программу. Программа — это не алгоритм: в ней должны стоять команды только из СК БИ. Так, команду «Шаг вверх;» Паркетчик понимает как родную, а вот вашего сокращения не поймет.

Нельзя также делать грамматические ошибки, записывая команды для Паркетчика. Увидев операторы "Шаг верх", "Полажить (з)" и т.п., Паркетчик сообщит, что таких команд он не знает.

Не поймет Паркетчик и другого. Скажем, вы предложите ему из начальной позиции сделать шаг вниз. Или, к примеру, положить плитку на поле, где плитка уже лежит. И хотя команды написаны без ошибок, Паркетчик остановится, обиженно сообщив:

Ошибка во время выполнения программы.

Это надо понимать так: "Рад бы выполнить, да не могу!" А уж ваша задача — определить, что же мешает Паркетчику выполнить команду.

То есть, как и в русском языке, ошибки в программе для Паркетчика могут быть двух типов: синтаксические и смысловые (или семантические).

О том, как записываются команды Паркетчика, мы подробнее расскажем при подготовке к лабораторной работе.

Подведем итоги

1. На компьютер можно смотреть как на дом, в котором живут разнообразные БИ. Некоторые из них выполняют команду сразу, как только она им сообщена, а другие руководствуются заранее составленной программой. Одним из таких программируемых исполнителей является Паркетчик.

2. Кроме Системы Команд, любой Бездумный Исполнитель имеет еще и операционную среду, которую он преобразует с помощью этих самых команд.

3. Допустимые действия в алгоритмах можно записывать так, как удобно человеку. В программах же должны стоять команды только из СК БИ.

Вопросы и задания

1. Какие допустимые действия Паркетчика вы знаете?

2. Что является операционной средой:

— системы управления базами данных;

— станка с числовым программным управлением;

— автопилота;

— графического редактора;

— программируемого видеомагнитофона.

3. Нарисуйте в тетради поле Паркетчика, имеющее 5 горизонтальных и 5 вертикальных рядов. Поработайте за Паркетчика и определите, какой рисунок он выложит, выполнив следующий алгоритм:

    Положить красную плитку;

    Шаг вверх;

    Положить красную плитку;

    Шаг вверх;

    Положить красную плитку;

    Шаг вверх;

    Положить красную плитку;

    Шаг вверх;

    Положить красную плитку;

    Шаг вправо;

    Шаг вправо;

    Шаг вправо;

    Положить зеленую плитку;

    Шаг влево;

    Шаг вниз;

    Положить зеленую плитку;

    Шаг вниз;

    Положить зеленую плитку;

    Шаг вниз;

    Положить зеленую плитку;

    Шаг вправо;

    Шаг вниз;

    Положить зеленую плитку;

    Шаг вправо;

    Шаг вверх;

    Положить зеленую плитку;

    Шаг вверх;

    Положить зеленую плитку;

    Шаг вверх;

    Положить зеленую плитку;

    Шаг влево;

    Шаг влево;

    Шаг влево;

    Шаг вниз;

    Положить красную плитку;

4. Для каждого из рисунков 1а—в составьте алгоритм выкладывания Паркетчиком этих орнаментов.

Рис. 1а

Рис. 1б

Рис. 1в

5. Нарисуйте какой-нибудь паркет с узором, приятным вашему глазу, и составьте алгоритм для Паркетчика, выполняя который он сможет выложить паркет таким образом.

6. Напишите алгоритм для Паркетчика, выполняя который, он выложит на поле ваши инициалы.


§ 4. Графическое представление информации. Монитор

Итак, символьная информация была именно тем видом информации, в котором начало тонуть человечество. Все эти бухгалтерские расчеты, экономические обоснования, проектирование самолетов, расчеты траекторий и разнообразные таблицы отнимали безумно много сил и средств.

Компьютеры оказались долгожданным спасательным кругом, позволившим резко увеличить эффективность управления производством и создать мощные математические модели, с помощью которых конструировали новые изделия -- от одежды до спутников. И все это удавалось сделать с помощью одной только символьной информации. Как мы уже видели в предыдущей главе, ее перевод на язык компьютеров оказался очень даже простым и естественным.

Давайте теперь посмотрим на процесс получения и переработки информации с другой стороны.
С человеческой.

Пусть, к примеру, тренерскому совету спортивного клуба “Шустрые шиповки” был представлен следующий документ:

Итоги сдачи нормативов в средней группе по четвертям

 | Не сдали | Сдали плохо | Сдали хорошо | Сдали отлично
Первая четверть | 12 | 12 | 5 | 1
Вторая четверть | 9 | 15 | 4 | 2
Третья четверть | 8 | 9 | 10 | 3
Четвертая четверть | 4 | 9 | 10 | 7

Можете ли вы качественно оценить работу тренера по этой таблице? Конечно, если вдумчиво посидеть над ней минут 10--15, то можно сказать и нечто большее, чем “Положительные сдвиги налицо” или “Процесс пошел”.

А теперь преобразуем этот документ (см. рис. 2).

Рис. 2

Сразу видно: основной заботой тренера средней группы во второй четверти было подтянуть отставших. Количество ребят, не выполнивших нормативы, уменьшилось. Но зато почти не выросло количество тех, кто сдал зачет хорошо и отлично. Видимо, тренером были сделаны правильные выводы, и он всю третью четверть занимался именно с теми ребятами, которые зачет сдали, но плохо. Результат не замедлил сказаться. Кстати, подтянулись и те, кто совсем не сдал зачет. И только в четвертой четверти достаточно много внимания было уделено тем юным спортсменам, кто сдал зачет хорошо, но не отлично.

Правильно ли организовал учебный год тренер средней группы -- решать тренерскому совету клуба “ШШ”. Нам важно другое -- весь этот анализ можно сделать, взглянув один раз на диаграмму.

Этот простой пример показывает, что человек тоже может очень быстро обрабатывать информацию, но информацию не символьную, а графическую и видео. Достаточно сказать, что самому быстрому компьютеру требуется почти полгода, чтобы проанализировать всю ту информацию, которую человек получил и осознал, просто оглядевшись вокруг себя в течение одной секунды.

Впрочем, и человеку потребуется больше чем полгода, чтобы проанализировать всю ту символьную информацию, которую перелопачивает компьютер в течение одной секунды. И раз уж он начал претендовать на роль лучшего друга и помощника человека, то компьютеру следовало бы научиться подавать информацию человеку в привычном человеческом виде. Ведь современный мир немыслим без игровых и обучающих программ, систем автоматического проектирования, баз данных, фотографических и видеоизображений... Одним словом, без всего того, что мы называем компьютерной графикой.

Теперь возьмите фломастеры (лучше всего 24-х цветов), белый лист бумаги и нарисуйте что-нибудь. Нарисовали? А теперь подумаем, как закодировать с помощью символьной информации то, что вы сотворили. Символьной -- поскольку компьютер ничего, кроме нулей и единиц, не воспринимает (надеемся, вы это еще помните).

Ну и как? Ничего путного в голову не приходит? А между тем с компьютерной графикой мы сталкиваемся на каждом шагу. И не только на экранах компьютеров. Практически любая современная книжка готовится к печати с помощью компьютера. Многие фильмы, такие, как “Терминатор” или “Парк Юрского периода”, без компьютера просто не снять...

Вглядимся в проблему более пристально. А именно -- возьмем увеличительное стекло и посмотрим для начала на цветной экран компьютера или телевизора, а чуть позже -- и на цветные иллюстрации в книжке.

В зависимости от марки видеотехники вы увидите либо множество разноцветных прямоугольничков, либо множество разноцветных кружочков. И те и другие группируются по три штуки, причем разного типа: одни из них всегда только синие (разной степени синевы -- от ярчайшего до почти черного), другие -- только красные, третьи -- только зеленые. Группа из трех таких элементов образует пиксель (от английского PICture’S ELement -- элемент картинки). Разумеется, если ваш монитор -- черно-белый (или, выражаясь профессиональным языком, монохромный), мельчайший “элемент картинки” будет выглядеть совсем по-другому.

Но вернемся к цветному монитору. Как бы мы ни вглядывались в лупу, других цветов, кроме красного, зеленого и синего, на экране компьютера не различить. В чем же дело?

Те из вас, кто занимался рисованием, наверняка уже поняли, в чем дело: в смешении цветов.

Действительно, все разнообразие цветов, которое мы видим на экране телевизора и компьютера, достигается смешением всего трех основных цветов. Любой серо-буро-малиновый цвет характеризуется тем, какая в нем доля красного, зеленого и синего цветов.

Давайте представим, что каждый кружочек в пикселе может либо гореть в полный накал (1), либо вообще не гореть (0). Сколько различных цветов мы сможем получить?

Красный | Синий | Зеленый | Цвет
0 | 0 | 0 | Черный
0 | 0 | 1 | Зеленый
0 | 1 | 0 | Синий
1 | 0 | 0 | Красный
0 | 1 | 1 | Бирюзовый
1 | 0 | 1 | Желтый
1 | 1 | 0 | Малиновый
1 | 1 | 1 | Белый

А если различных типов яркости каждого элемента (или, как это называют, градаций яркости) будет не два, а 64? Нетрудно сообразить, что тогда различных цветов будет 643= 262 144.

Значит, любое видеоизображение на экране можно закодировать с помощью чисел, сообщив, сколько в каждом пикселе долей красного, сколько -- долей синего и сколько -- долей зеленого.

А теперь займемся привычным делом -- расчетом количества байт, килобайт и мегабайт, необходимых для кодирования информации.

Для этого перво-наперво нужно знать, сколько на экране пикселей. Вопрос этот непростой, и по мере того, как компьютеры становились все мощнее и мощнее, количество пикселей на мониторе увеличивалось.

Рассмотрим, к примеру, один из самых первых графических режимов. Он назывался CGA (Crayon Graphics Adaptor -- графический адаптер “как цветной карандаш”) и предусматривал 320x200 пикселей на экране. Каждый из пикселей мог гореть одним из восьми цветов -- именно тех, которые указаны в таблице. Из нее же видно, что для кодирования этих восьми цветов нужно всего 3 нуля и/или единицы, т.е. 3 бита. Умножим теперь 3 на 320 и на 200 и получим 192 000. Вот сколько бит требуется, чтобы закодировать изображение в режиме CGA. Проведем заключительную операцию -- разделим это число на 8 и получим количество байт, необходимых для хранения изображения на экране при таком разрешении -- 24 000 или примерно 24 К (кстати, а почему примерно?).

Надеемся, вы теперь сможете самостоятельно рассчитать, сколько требуется памяти для хранения изображения в стандарте VGA (Video Graphics Adaptor): 640x480 пикселей. При этом каждый элемент в пикселе имеет 64 градации яркости, поэтому стандарт VGA допускает те самые 262 144 цвета, количество которых мы подсчитали выше. При этом на кодирование цвета только одного пикселя требуется 18 бит. Но, как правило, нет необходимости предусматривать для каждого пикселя все 262 144 цветовых варианта, и обычно в этом стандарте пользователю предлагается выбрать 16 цветов. Но в любой момент вы можете поменять свой выбор. И, как по мановению волшебной палочки, до неузнаваемости изменится цветовая гамма вашей картинки. А для хранения такой картинки требуется 150 К памяти (проверьте, кто не верит).

Наверняка среди вас найдутся доки, которые заявят, что мы считаем невесть что: уж они-то доподлинно знают, что две разные картинки со стандартным разрешением VGA занимают разные объемы на жестком или гибком диске и уж никак не те безумные, которые мы насчитали.

Давайте не будем забегать вперед (о сохранении графической информации на диске мы поговорим в § 6), а лучше посмотрим на экран монитора боковым зрением. Ежели он у вас не суперсовременный, вы наверняка заметите мерцание. Оно, конечно, гораздо меньше, чем на экране телевизора, но все же вполне ощутимо. Откуда оно берется?

Дело в том, что изображение на экране и телевизора, и компьютера создается тремя электронными лучами, каждый из которых отвечает за свой цвет. В считанные доли секунды лучи обегают весь экран. Где-то они почти гаснут, где-то горят в полную силу. Ну а экран обладает способностью не сразу гаснуть (в этом он немного похож на фосфор, которым красят стрелочки и цифры на светящихся часах). Все вместе это и создает иллюзию постоянного изображения.

Быть может, вы знаете, что изображение в телевизоре меняется 25 раз в секунду. На компьютере -- в зависимости от его качества -- от 60 до 120 раз в секунду. Чем чаще меняется изображение, тем меньше мерцание, тем меньше устают глаза.

Откуда же лучики знают, какое рисовать изображение? Даже если на экране неподвижная картинка, они все равно бегают как угорелые. Так вот, информация о том, что сейчас надо вырисовывать на экране, хранится в видеопамяти, и именно ее размеры мы считали для различных видеорежимов.

Кодирование шестнадцати цветов одного пикселя требует, как нетрудно подсчитать, 4 бита памяти. В современных компьютерах предусмотрено одновременное использование и более широкой палитры цветов, например, 65 536 цветов. Для этого требуется уже 16-битное кодирование (оно называется еще Hi-Color).

А теперь, когда вы так много узнали про изображение на мониторе, несколько советов владельцам домашнего компьютера:

  • Прежде чем начать работу, поинтересуйтесь, с какой частотой обновляется изображение на вашем экране. Желательно, чтобы это происходило не реже 75 раз в секунду.
  • Поинтересуйтесь также размером точек, из которых состоит пиксель. Чем они меньше, тем качественнее изображение. Желательно, чтобы они были не больше 0,28 мм.
  • Качественный монитор с частотой обновления изображения не менее 75 раз в секунду не должен раздражать глаза при работе в текстовом редакторе черными буквами на белом фоне. Если это не так, отрегулируйте яркость и контрастность монитора.
  • Нелишне знать: если расположить в поле зрения какой-нибудь ярко-красный или ярко-желтый объект и время от времени переводить на него взгляд, то это снизит утомляемость ваших глаз при долгой работе за компьютером.

Вопросы и задания

  • 1. Что является пикселем в случае цветного монитора и почему он так называется?
  • 2. Как получается ярко-белый цвет на экране цветного монитора?
    а) Вы хотите работать с разрешением 800x600, используя одновременно 65 536 цветов (16-битное кодирование). В магазине продаются видеокарты с памятью 256 К , 512 К, 1 М, 2 М, 4 М. Какие карты можно покупать для вашей работы?
    б) А если для вашей издательской системы необходимо разрешение 1200x1600 пикселей и работа с 16 777 216 цветами (24-битное кодирование -- режим True-Color; этого количества цветов достаточно для качественного воспроизведения обычной цветной фотографии), тогда какие видеокарты годятся для вашей работы?
  • 3. Подготовьте на уроке информатики небольшое сообщение о том, как устроен цветной кинескоп.


§4. Циклическое исполнение алгоритма. Оператор "Делать пока..."

Наверно, все вы наслышаны о замечательных приключениях Тома Сойера, описанных Марком Твеном.

Конкретнее нас сегодня будет занимать история с покраской забора. Итак, слово Марку Твену:

"ВЕЛИКОЛЕПНЫЙ МАЛЯР

Том вышел на улицу с ведром известки и длинной кистью. Он окинул взглядом забор, и радость в одно мгновение улетела у него из души, и там воцарилась тоска... Со вздохом обмакнул он кисть в известку, провел ею по крайней доске, потом проделал то же самое снова и остановился: как ничтожна белая полоска по сравнению с огромным пространством некрашеного забора!.."

Остановимся. Попробуем представить, как могла бы выглядеть та же история в наши дни.

Конечно, современная тетя Полли вряд ли огораживала бы свой дом тридцатью ярдами деревянного забора высотой девять футов! Скорее всего ухоженная лужайка возле дома если и огорожена, то изящными решетками на столбиках.

Нынешние мальчишки, когда дело касается покраски забора, отнюдь не стали более прилежными. Зато они увлекаются программированием. Поэтому во избежание недоразумения тетушка Полли могла бы давать наставления племянничку в виде программ, так любимых Томом.

Подойти к первой решетке;

Покрасить первый прутик;

Покрасить второй прутик;

Покрасить третий прутик; ...

Здесь старушка поняла бы, что гораздо легче самой покрасить оградку или найти кого-нибудь попокладистей. Шутка ли: только в первой решетке то ли две, то ли три дюжины прутиков, а этих самых решеток!..

Пора прийти ей на помощь и ввести новый оператор:

    Делать пока (условие)

      { оператор;

      оператор;

      оператор;

      ...

      } (* конец цикла *)

Этот замечательный оператор называется циклом. Запись Делать пока (условие) называется заголовком цикла. Идущая после заголовка цикла совокупность операторов, заключенных в операторные скобки, называется телом цикла.

В круглых скобочках со звездочками стоит комментарий. Он совершенно не нужен БИ, но просто-таки необходим тому человеку, который пишет программы, если он не хочет стать бездумным. С умом написанные комментарии помогают понять программу даже тому, кто ее не составлял. Кроме того, в программах с комментариями допускается гораздо меньше ошибок, чем в программах без них.

Программа покраски забора с использованием цикла будет выглядеть так:

Делать пока (есть неокрашенная решетка)

    {1 Подойти к неокрашенной решетке;

    Покрасить ее;

    }1 (* конец цикла *)

Сообщить о том, что работа выполнена;

Идти купаться;

Профессионалы, занимающиеся теорией программирования, вместо слова "условие" договорились употреблять термин "высказывание". От высказывания требуется единственное — БИ должен уметь определять, истинно оно или ложно.

Думается, вам ясно, как работает этот оператор:

Сначала БИ проверяет, истинно ли высказывание в скобках, и если да — выполняются операторы, стоящие в операторных скобках после заголовка цикла.

Дойдя до закрывающейся фигурной скобки, БИ снова проверяет, верно ли вышенаписанное высказывание в заголовке цикла, и если да — снова выполняет те же самые операторы, окаймленные фигурными скобками. Если же в момент проверки высказывание ложно (нет больше неокрашенных решеток), то БИ пропускает весь цикл и начинает выполнение операторов, следующих за закрывающейся фигурной скобкой.

Поскольку слова Делать пока — стандартные, мы будем их подчеркивать. Кроме того, при написании программы в тетради будем выделять циклы стрелочками или нумеровать фигурные скобки так, как показано в программе покраски забора.

Теперь вспомним, что решетка состоит из прутиков, и, следовательно, оператор "покрасить решетку" требует дальнейшего уточнения:

(* Покрасить решетку — это: *)

Делать пока (есть неокрашенный прутик)

    {1Подойти к неокрашенному прутику;

    Покрасить его; }1

То есть, как и при сборе детской игрушки "матрешка", необходимо собрать программу покраски ограды в одно целое, вставив этот фрагмент в основную программу:

Делать пока (есть неокрашенная решетка)

    {1Подойти к неокрашенной решетке;

      Делать пока (в решетке есть неокрашенный прутик)

      {2Подойти к неокрашенному прутику;

      Покрасить его;

      }2

    }1

Сообщить о том, что работа выполнена;

Идти купаться;

Интересно, что здесь мы получили двойной цикл. Внутренний цикл предписывает Тому красить по одному прутику в решетке, пока не выкрасит их все.Внешний цикл предписывает перейти к новой, не покрашенной решетке.

Обратите внимание на порядок записи операторов: те из них, которые составляют тело цикла, пишутся со сдвигом вправо. Это делается для того, чтобы с первого взгляда увидеть в программе циклы.

Подведем итоги

  • Если в алгоритме имеются повторяющиеся действия, то они объединяются в блок и для его выполнения используется оператор цикла.

  • Циклом (повтором) называется такая форма организации действий, при которой один и тот же блок операторов выполняется несколько раз (или ни разу) до тех пор, пока высказывание в заголовке цикла истинно.

  • Повторяющийся блок действий (или операторов) в этом случае составляет тело цикла; тело цикла заключают в операторные скобки.

  • Высказывание, которое нужно проверить для того, чтобы принять решение, выполнять ли тело цикла в очередной раз, называется условием продолжения цикла и записывается в заголовке цикла.

  • Циклы могут быть вложены один в другой, образуя двойные, тройные и т.п. циклы.

Вопросы и задания

1. Когда целесообразно применять оператор цикла?

2. Что такое заголовок цикла?

3. Что такое тело цикла?

4. Какие циклы называются вложенными?

5. Нужны ли комментарии БИ?

6. Если вы хотите оправдать репутацию не только знатока оператора цикла, но и литературы, объясните, почему историю с Томом нельзя использовать для иллюстрации циклической работы. (Совет: внимательно прочитайте исходный текст М.Твена, а не только приведенную в объяснительном тексте цитату.)

7. Придумайте программу для Тома с использованием цикла делать пока и тетушкиного забора, позволяющую ему превратиться из жалкого бедняка в богача, буквально утопающего в роскоши.

8. Используя циклическую форму организации действий, запишите следующий алгоритм выполнения домашнего задания по переводу текста с иностранного языка:

    Прочитать первое предложение;

    Перевести его;

    Записать перевод в тетрадь;

    Найти следующее предложение;

    Перевести его;

    Записать перевод в тетрадь;

    Найти следующее предложение;

    Перевести его;

    Записать перевод в тетрадь;

    Найти следующее предложение;

. . .

9. "Приключения Тома Сойера" начинаются с того, что тетя Полли зовет Тома:

    — Том!
    Нет ответа.
    — Том!
    Нет ответа.
    — Том!
    Нет ответа...

Петя Торопыжкин составил следующий алгоритм вызова Тома:

Делать пока (нет ответа)

    { Крикнуть: "Том!"

    } (* конец цикла *)

Найдите ошибку в этом алгоритме.

10. Перечитайте задачу о мальчиках, переправляющих двоих солдат через реку (см.§1 задача 8). Представьте, что к реке подошел взвод солдат. Составьте алгоритм переправы для взвода.

11. Перечитайте задачу о разъезде рабочего и пассажирского поезда (см.§1 задача 9). Представьте, что рабочий поезд имеет не два, а больше вагонов. Составьте алгоритм для пропуска пассажирского поезда в этом случае.

12. Прочитайте внимательно стихотворение

Г.Остера:

    Возьми густой вишневый сок

    И белый мамин плащ.

    Лей аккуратно сок на плащ —

    Появится пятно.

    Теперь, чтоб не было пятна

    На мамином плаще,

    Плащ надо сунуть целиком

    В густой вишневый сок.

    Возьми вишневый мамин плащ

    И кружку с молоком.

    Лей аккуратно молоко —

    Появится пятно.

    Теперь, чтоб не было пятна

    На мамином плаще,

    Плащ надо сунуть целиком

    В кастрюлю молока.

    Возьми густой вишневый сок

    И белый мамин плащ...

Неоспоримы поэтические достоинства этого шедевра. Однако ни один программист такого бы не написал.

Придумайте условия окончания цикла и запишите то же самое с помощью операторов цикла. И гораздо короче.


§ 5. Графическое представление информации. Печать на бумаге

К этому времени у нас накопилось уже два вопроса, на которые необходимо дать ответ.

Как кодируется информация при печати на бумаге?

Почему одна и та же картинка занимает разный объем в видеопамяти и на магнитном диске?

Давайте по порядку.

В предыдущем параграфе мы, вооружившись лупой, выяснили, что все цвета и в мониторе, и в телевизоре формируются всего тремя основными: красным, синим и зеленым. И все многообразие цветов объясняется степенью яркости каждого из них. Посмотрите на рисунок куба.

Рис. 3.

Каждому из цветов, который мы видим на дисплее, соответствует точка внутри этого куба. В начале координат стоит черный цвет. На красной оси в вершине куба -- ярко-красный цвет. Вершины, где смешиваются два цвета, подписаны. Как вы думаете, какой цвет соответствует вершине, противоположной черной и на которую указывает стрелка?

Поскольку все цвета получаются смешением трех основных, то модель цветопередачи (то есть способ получения цветного изображения), используемая в телевизоре и мониторе, называется аддитивной, или суммирующей. А вариант, который мы рассмотрели, называется RGB-кодировкой цвета (от английских названий цветов -- Red, Green, Blue).

Ну а теперь, чтобы не терять времени даром, снова вооружимся лупой и посмотрим... нет, не на тот шедевр, который вы создали, изучая предыдущий параграф, а на цветную иллюстрацию, напечатанную в типографии.

Берем, стало быть, книжку с цветными картинками, рассматриваем и...

Изображение распалось на мельчайшие кляксы всего лишь четырех цветов. Причем до боли знакомых: черного, малинового, бирюзового и желтого. Не далее как 5 минут назад мы столкнулись с ними, разглядывая цветовой куб.

Давайте порассуждаем и постараемся объяснить картину, представшую перед нами под лупой.

Итак, белый цвет можно рассматривать как смесь трех основных цветов. И когда мы видим белый лист бумаги, в наш


§5. Условные операторы

Как мы уже говорили, алгоритмы исполняют в естественном порядке: команда за командой. Однако жизнь весьма разнообразна и никто не может абсолютно все предусмотреть. А цели все же хочется достичь. Вот и юный программист Петя Торопыжкин, собираясь в школу, составил следующую программу:

Вскочить с постели;
надеть рубашку;
надеть пиджак;
надеть правый ботинок;
посмотреть на часы;
если вскочил на несколько минут раньше,
то лечь подремать,
в противном случае надеть брюки;
надеть левый носок;
сходить умыться;
если портфель не собран, то собрать,
в противном случае позавтракать;
надеть правый носок;
надеть галстук и пиджак;
надеть левый ботинок;
если холодно, то снять ботинки;
надеть валенки; надеть пальто;
надеть куртку;
надеть шапку;
выбежать из дома;
вернуться назад;
взять портфель;
выбежать из дома;
забежать за Вовкой;
если он дома и еще завтракает,
то позавтракать вместе с ним и бежать
в школу вместе;
в противном случае бежать в школу одному.

Сейчас мы не будем полностью анализировать эту выдающуюся программу, а обратим внимание только на некоторые ее команды. Например, разберемся с такой командой: если холодно, то снять ботинки.

На первый взгляд команда как команда. Конечно, выглядит немного диковато, но вполне выполнимо. Однако если мы выйдем из роли БИ и немного подумаем, то заметим, что она требует либо двух действий, либо одного действия. А именно: вначале надо проверить истинность высказывания — холодно или нет, а уж затем, в зависимости от результатов проверки, выполнять или не выполнять следующее действие.

Команды, которые содержат условие, называются условными командами, или условными операторами. Дело в том, что программисты (те, кто пишет программы для БИ, — значит, и мы с вами) объявили слова "команда" и "оператор" синонимами, и мы тоже будем к этому привыкать.

С одним из условных операторов — оператором цикла Делать пока вы уже познакомились в предыдущем параграфе. Как вы помните, там в случае выполнения какого-либо условия зачастую приходится выполнять не один, а несколько операторов.

Точно такая же ситуация возникает и при использовании оператора Если ...то...

Вот, например, какую замечательную программу написал для вас писатель Григорий Остер в книжке "Вредные советы":

Если друг на день рожденья
Пригласил тебя к себе,
То оставь подарок дома —
Пригодится самому.
Сесть старайся рядом с тортом,
В разговоры не вступай,
(* Ты во время разговора *)
(* Вдвое меньше съешь конфет. *)
Выбирай куски помельче,
(* Чтоб быстрее проглотить. *)
Не хватай салат руками,
(* Ложкой больше зачерпнешь. *)
Если вдруг дадут орехи,
Ссыпь их бережно в карман,
Но не прячь туда варенье —
(* Трудно будет вынимать. *)

В этой программе, кроме операторов, присутствуют и очень небесполезные комментарии, которые мы, как обычно, заключили в скобки со звездочками.

Комментарии-то присутствуют, но отсутствует нечто другое, более важное. И если вы еще не догадались, в чем дело, подумайте, как понимать в программе Пети Торопыжкина все тот же ряд операторов:

    Если холодно,

      то снять ботинки;

      надеть валенки;

      надеть пальто;

      надеть куртку;

      надеть шапку;

Петя снимает ботинки, надевает валенки, надевает пальто, на него куртку, а затем шапку только тогда, когда холодно или условие относится к единственному оператору — "снять ботинки"? Или к двум — "снять ботинки;" "надеть валенки"? А может, к трем?..

Вы, конечно, можете возразить, что Петин условный оператор выглядит так:

Если высказывание то <оператор>;<оператор>;...

— где все операторы после слова то выполняются только тогда, когда высказывание истинно, и располагаться они должны в одной строке.

Разумеется, здорово, если все операторы, идущие после то, умещаются в одной строке. А ну как почерк окажется размашистым и придется некоторые из них писать в новой строке? Как тогда определить, надо ли их выполнять в любом случае или только при выполнении условия? Тот, кто писал программу, это, конечно, знает. А бедняга БИ? Короче говоря, как узнавать, где кончается область действия условного оператора?

Для тех, кто внимательно читает наш учебник, это, конечно же, не вопрос. В предыдущем параграфе мы договорились объединять операторы тела цикла фигурными скобками, и никто нам не мешает решить проблему точно так же.

Итак, мы будем заключать все операторы, к которым относится условие, в фигурные скобки. Ну, и не забудем о том, что высказывание надо поместить в обычные круглые скобки, как это сделано в операторе Делать пока...

Поэтому в соответствии с новыми правилами записи этого условного оператора перепишем фрагмент программы Пети Торопыжкина:

Если (холодно) то

    {снять ботинки; надеть валенки;
    надеть пальто;}

надеть куртку; надеть шапку;

(Все ли согласны? Или кому-нибудь захотелось поставить закрывающую скобку в другом месте? Попробуйте и посмотрите, что из этого получится.)

Итак, еще один условный оператор для БИ выглядит следующим образом:

Если (высказывание)то {<оператор>;<оператор>;...}

— где все операторы после слова то выполняются только тогда, когда высказывание истинно. Среди этих операторов, в свою очередь, снова могут быть условные ("Если вдруг дадут орехи...").

Поскольку слова если и то в таком операторе всегда присутствуют, мы будем их подчеркивать.

В программе Пети Торопыжкина есть еще один странный условный оператор:

Если вскочил на несколько минут пораньше, то лечь подремать, в противном случае надеть брюки.

Он отличается от предыдущего оператора небольшим довеском, начинающимся со слов "в противном случае". То есть указывается, что делать, если условие не выполняется.

Здесь мы имеем дело с так называемой полной формой условного оператора. А та форма, с которой вы имели дело выше, называется неполной формой условного оператора.

Для краткости заменим слова "в противном случае" на слово "иначе" и получим:

Если (высказывание)

    то {<оператор>;<оператор>;...}

    иначе {<оператор>;<оператор>;...}

Тут, как вы видите, имеются две группы операторов, и в зависимости от истинности высказывания одна из них выполняется, а другая — нет. (Это, между прочим, означает, что Петя наденет брюки только если вскочит вовремя или позже. Нам остается надеяться на лучшее.)

Обратите внимание на запись условного оператора, в которой Если (высказывание) написано с отступом влево. Благодаря такому написанию, любому человеку с первого взгляда очень легко разобраться в нашей программе. Давайте по возможности и в дальнейшем придерживаться этой формы записи.

В давние времена весьма распространенной формой передачи знаний являлась притча. Вспомним напоследок древний обычай. Итак:

ПРИТЧА

Однажды в студеную зимнюю пору Петя из дому вышел, держа в уме алгоритм, состоящий всего лишь из одного оператора:

Если (первый встречный окажется инопланетянином)

    то {поворачиваю обратно домой;}
    иначе {пойду в кино;}

Каков же был его ужас, когда, завидев прохожего, он понял, что не знает, куда идти, домой или в кино, — ведь он не может проверить, является ли прохожий инопланетянином.

Мораль: проверка условия должна быть допустимым действием БИ!

КОНЕЦ ПРИТЧИ

Подведем итоги

В том случае, когда исполнение какого-либо действия зависит от проверки истинности некоторого условия, применяется условный оператор Если ... то...

Этот условный оператор имеет две формы: полную и неполную. В неполной форме он выглядит так:

Если (высказывание)

    то { оператор; оператор; ... }

В полной форме он выглядит так:

Если (высказывание)

    то { оператор; оператор; ... }

    иначе { оператор; оператор; ... }

Условный оператор можно использовать только в том случае, если проверка условия является допустимым действием исполнителя.

Вопросы и задания

1. Что такое условный оператор?

2. Как записывается условный оператор в полной форме? А в неполной?

3. (С философским уклоном.) Для чего служат операторные скобки и почему они одинаковые в операторах Делать пока и Если ...то...?

4. В стихотворении, процитированном в объяснительном тексте, не отмечен один комментарий.

а) Найдите его.

б) Где в том же стихотворении вы бы поставили операторные скобки?

5. Ох, не до конца мы с вами разобрались с валенками, ботинками и морозом! Напишите наконец-то правильный фрагмент программы, используя полную форму условного оператора.

6. Напишите для себя программу проведения свободного вечера, используя условные операторы и операторные скобки.

7. Вспомните ДЖИННА, который переливает воду из одного сосуда в другой (см. задачу № 11 из §2). Предположим, он умеет проверять, полный кувшин или нет (наполнен доверху) и есть ли в кувшине вода (по характерному бульканью). После нескольких переливаний в трехлитровом сосуде осталось А л воды (А — целое число). Известно, что сосуд неполный. Составьте алгоритм, после выполнения которого в трехлитровом сосуде будет 3—А л воды.

8. Петя Торопыжкин решил позвонить приятелю по телефону и составил для себя такой алгоритм:

Снять трубку;
Если (есть гудок) то набрать номер;
Если (длинные гудки) то подождать полминуты;
Если (приятель ответил)

    то сказать: "Привет!";
    Рассказать новости;
    Послушать новости приятеля;
    Сказать: "До свидания";
    Повесить трубку;

Петя, как обычно, торопился и забыл расставить операторные скобки. Объясните, к каким неприятностям может привести исполнение этого алгоритма. Расставьте в алгоритме операторные скобки.

9. Перепишите в той форме, о которой мы с вами условились, следующие алгоритмы, предлагаемые Г.Остером. Не забудьте выделить комментарии:

а)

    Если тебя родная мать
    Ведет к зубным врачам,
    Не жди пощады от нее,
    Напрасных слез не лей.
    Молчи, как пленный партизан,
    И стисни зубы так,
    Чтоб не сумела их разжать
    Толпа зубных врачей.

б)

    Если всей семьей купаться
    Вы отправились к реке,
    Не мешайте папе с мамой
    Загорать на берегу.
    Не устраивайте крика,
    Дайте взрослым отдохнуть.
    Ни к кому не приставая,
    >Постарайтесь утонуть.

в)

    Если друг твой самый лучший
    Поскользнулся и упал,
    Покажи на друга пальцем
    И хватайся за живот.
    Пусть он видит, лежа в луже:
    Ты ничуть не огорчен.
    Настоящий друг не любит
    Огорчать своих друзей.

10. Перечитайте еще раз эпохальную программу Пети Торопыжкина. Это должна быть программа прихода в школу одетым, сытым и с портфелем. В частности, не является ошибкой, если Петя дважды позавтракает или умоется в пальто (или даже вообще не умоется).

а) Найдите в программе все ошибки и объясните, почему это ошибки.

б) Перепишите Петину программу с использованием операторных скобок и в той форме, о которой мы с вами условились.

11. Приведите примеры каких-либо не проверяемых человеком условий.

12. (С математическим уклоном.) Однажды к Пете и Коле пришел их приятель шестиклассник Саша и сказал, что им задали трудную задачу: "Для двух чисел 999/1000 и 1000/1001 установить, равны ли эти числа, и если равны, то их надо перемножить, а если нет, то из большего вычесть меньшее". Скандируя: "Для программиста нет трудных задач!" — Петя и Коля составили такой алгоритм решения сформулированной задачи:

Разделить 999 на 1000 и результат обозначить буквой b;

Разделить 1000 на 1001 и результат обозначить буквой c;

Если (b=c) то {умножить b на c};

Если (b>c) то {из b вычесть c};

Если (bто {из c вычесть b};

а) Проверьте, правильно ли составлен алгоритм.

б) Напомним (см. задачу № 4а из §2 ), что Петя и Коля в роли БИ исполняют алгоритмы с помощью микрокалькулятора, при этом у Пети на табло калькулятора помещается 6 цифр, а у Коли — 8.

Будут ли у них одинаковыми результаты выполнения этого алгоритма?

в) Устроит ли Сашу хотя бы один из полученных результатов? Попытайтесь в уме решить Сашину задачу.

13. Придумайте несколько условий, которые, на ваш взгляд, должен уметь проверять "БИ-001" (о нем шла речь в задаче №4 из §1 и в задаче №8 из §2 . Составьте две-три программы для этого исполнителя с использованием условных операторов.


§ 6. Графическое представление информации. Сохранение на диске
(Для дополнительного чтения)

На радость докам, о которых мы упомянули в предыдущих главах, рассмотрим, как же сохраняется графическая информация на диске. Для этого вернемся к тому шедевру, что вы нарисовали разноцветными фломастерами на бумаге. Еще немного, и вам не составит труда повторить его на экране компьютера.

Представьте, что ваша картинка уже на мониторе. Как мы уже говорили, она занимает громадный объем видеопамяти, и от этого никуда не уйти -- электронному лучу чуть ли не каждую сотую долю секунды нужна информация о том, как обегать экран.

Но вот вы решили записать информацию, соответствующую нашему рисунку, на жесткий или гибкий магнитный диск. Надо ли сохранять всю видеопамять? Ну разумеется, нет. Во-первых, на рисунке практически все пиксели имеют один и тот же цвет -- белый. А у тех, которые не белые, тоже не так уж много вариантов раскраски (если помните, для создания шедевра вы использовали набор из 24 различных фломастеров). Сразу же возникает желание каким-то образом сэкономить память на диске, сообщив нечто вроде "Первые двадцать рядов пикселей -- белые".

Такого сорта кодирование называется сжатием информации, и первыми, естественно, начали сжимать информацию разработчики программ для работы с графикой -- графических редакторов. Поскольку сжатие информации -- процесс очень творческий и далеко не очевидный, каждый из вновь создаваемых графических редакторов имел свою собственную систему сжатия и сохранения информации.

А чтобы простые люди -- пользователи случайно не запутались в этом разнообразии кодировок, к именам файлов стали приписывать расширения, по которым можно определить, в каком именно формате сохранено графическое изображение.

Так, существуют расширения BMP, CDR, GIF, IFF, JPG, PCX, PIC, TIF, TGA... Впрочем, всех, наверное, и не перечислить. Как видите, с кодировкой графической информации дело обстоит отнюдь не так просто, как с символьной, где вполне хватает одного стандарта -- ASCII.

Теперь поговорим немного о размерах файлов с графической информацией.

Помните, когда мы обсуждали кодировку символьной информации, то говорили, что на самую обыкновенную дискету войдет здоровенный том энциклопедии. И при этом делали довольно важную оговорку -- без иллюстраций.

А сколько же дискет будет занимать том энциклопедии с иллюстрациями?

На этот вопрос так просто не ответить. И дело не только в том, что в разных энциклопедиях разное количество иллюстраций. Дело еще и в качестве печати этих самых иллюстраций.

Одно дело -- иллюстрация в вашем школьном учебнике и совсем другое -- в роскошно изданном на глянцевой бумаге журнале мод. Чтобы понять, в чем дело, опять вооружимся лупой и снова посмотрим на цветные иллюстрации, только теперь уже из разных изданий.

Изображение, как обычно, распалось на мелкие кляксы четырех цветов. Эти кляксы называют растровыми точками. Видимо, не нужно сильно напрягать зрение, чтобы понять: чем мельче капельки краски на бумаге, тем качественнее иллюстрация (мы молчаливо предполагаем, что качество краски одинаковое, что, конечно, не совсем так, но для наших рассмотрений большой роли не играет).

Как же можно измерить качество графического изображения?

На экране компьютера, если вы помните, чем больше пикселей и чем больше у каждого из них градаций яркости каждого цвета, тем изображение качественней. Нечто похожее мы имеем и с изображением на бумаге. Только там важно количество растровых точек на единицу поверхности. И если внимательно приглядеться, то видно, что растровые точки располагаются рядами -- эти ряды называются растровыми линиями. И, как вы, наверно, успели заметить, располагаются они, как правило, не горизонтально, а под некоторым углом.

Кроме того, точки бывают разной "жирности". Некоторые просто целиком покрывают всю бумагу, сливаясь в однородный фон, а некоторые -- ну просто как мельчайшая, трудно различимая даже под лупой цветная пыль.

Так вот. Линиатурой растра называется частота растровых линий, и измеряется она в количестве линий на дюйм (LPI -- lines per inch), то есть примерно на 2,7 см. Чем больше линиатура, тем качественнее изображение. Для изображений высокого качества выбирают линиатуру 133 и более. Для среднего качества -- 100 линий на дюйм. Фотографии для газет имеют линиатуру 75--85 линий на дюйм.

Теперь, если мы посмотрим на рекламу любого печатающего устройства, например, струйного цветного принтера, то увидим вовсе не сокращение LPI, а непонятное DPI. Что же это такое?

А дело как раз в тех самых размерах растровой точки, на которую мы обращали ваше внимание. Для простоты будем считать, что растровые линии горизонтальны, и еще раз более пристально вглядимся в растровую точку.

На самом деле это вовсе не точка, а квадрат, как бы разграфленный на клеточки (см. рис. 5). И каждая клеточка либо закрашена краской, либо нет. Оно и понятно -- чернила или порошок из принтера, как и краска из печатного автомата, подается мельчайшими порциями, которые никаких полутонов не имеют. Вот именно о количестве этих мельчайших неделимых капелек на единицу длины и сообщает характеристика DPI (dots per inch -- крошечных точек на дюйм).

ээ | ээ | ээ | ээ | ээ | ээээээ
ээ | ээ | ээ | ээ | ээ | э
ээ | ээ | ээ | ээ | ээ | ээ
ээ | ээ | ээ | ээ | ээ | ээ
ээ | ээ | ээ | ээ | ээ | ээ
ээ | ээ | ээ | ээ | ээ | ээ

Рис. 5. Растровая "точка" с девятой (из 37) градацией серого цвета

Давайте рассмотрим ситуацию, когда мы хотим напечатать картинку с линиатурой 100 lpi на лазерном принтере с разрешением 600 dpi.

Тогда каждая растровая «точка» будет представлять собой квадрат 6x6 (600/100=6) ячеек, каждая из которых может быть закрашена или нет (см. тот же рис. 5). Как легко понять, в этом случае мы располагаем всего лишь 37 градациями яркости (растровая точка либо вообще не закрашена, либо закрашена полностью 36 "дотами" -- мельчайшими точками).

Подсчитаем теперь, какова должна быть разрешающая способность фотопечатающего автомата для воспроизведения максимально возможного в современной полиграфии числа полутонов -- 256 при линиатуре 150 lpi.

Это совсем просто: для отображения 256 полутонов необходима растровая ячейка размером 16x16 мельчайших точек. Умножаем 150 на 16 и получаем 2400 dpi. Ясно, что при всем видимом качестве печатаемых документов нашему лазерному принтеру еще далековато до настоящей полиграфии.

На самом деле из-за того, что растровые линии негоризонтальны, на практике применяют разрешение
2540 dpi.

Итак, запомним: способность печатающего устройства нанести определенное количество мельчайших
капелек на единицу длины измеряется в точках на дюйм, или dpi (dots per inch). Современные принтеры имеют разрешение от 200 до 1200 dpi, а фотонаборные автоматы в типографиях обеспечивают разрешение
до 3600 dpi.

Кроме того, существуют специальные формулы, которые связывают оптимальные значения разрешения обрабатываемого изображения в компьютере и выходной линиатуры. Приближенно обычно считают, что графическое изображение должно быть в полтора-два раза больше, чем значение линиатуры, с которой предполагается печатать. К примеру, чтобы напечатать изображение с линиатурой 175, как правило, вполне хватает размеров обрабатываемого изображения (в пикселях) из расчета 300 пикселей на дюйм.

Ну а под конец -- небольшое арифметико-компьютерное исследование. Берем журнал мод, ищем иллюстрацию побольше, считаем, что ее линиатура -- 100 (еще далеко не самая большая);

примерно считаем, что для такой линиатуры вполне достаточно размеров изображения (в пикселях) исходя из разрешения 150 пикселей на дюйм;

вымеряем размер страницы в дюймах и переводим его в пиксели;

вспоминаем, что в режиме True-Color каждый цвет имеет 256 градаций яркости, а основных цветов -- 4 (поскольку печать на бумагу идет в формате CMYK). Стало быть, на кодировку одного пикселя тратится
4 байта;

считаем количество байтов, переводим в килобайты и, если нужно, в мегабайты.

Если у вас получилось что-то порядка 5--6 мегабайт, вы близки к истине. Конечно, после сжатия размер файла с изображением раза в два уменьшится, но все равно -- одна цветная картинка среднего качества из энциклопедии (правда, на всю страничку) занимает примерно в три раза больше компьютерной памяти, чем вообще весь текст из этой же самой энциклопедии!

Ошеломляющий факт, однако он наглядно показывает все различие в восприятии и обработке информации между человеком и машиной.


§ 7. Компьютерная обработка графической информации

В предыдущих параграфах мы с вами говорили о том, что современный мир немыслим без компьютерной обработки графической информации. И это надо отнюдь не только профессионалам, создающим мультфильмы и спецэффекты, компьютерные игры и книжные иллюстрации.

Деловая графика, простейший пример которой вы видели в отчете тренера клуба "Шустрые Шиповки", становится все более необходимой. Информация, поданная в привычной человеку графической форме, позволяет быстро принимать качественные решения в самых разных областях деятельности. Даже перед операторами некоторых атомных электростанций на экранах мониторов высвечиваются не только сотни цифровых показателей, но и сформированное компьютером человеческое лицо, каждый из элементов которого отражает какой-либо показатель работы станции. Скажем, поднимающиеся вверх брови говорят о повышении давления в трубопроводе. Человек умеет почти мгновенно анализировать лицо собеседника, и даже мельчайшие изменения режима станции окажутся сразу же замеченными.

Быть может, некоторые из вас имели дело с компьютерными обучающими программами и смогли оценить присутствие иллюстраций, выводимых на экран монитора. Согласитесь, без них изучать предмет было бы гораздо скучнее.

Компьютерная графика вовсю используется и тогда, когда различные фирмы представляют свою продукцию и рассказывают о своей работе на презентациях.

В общем, работа с графикой на компьютере все больше становится неотъемлемой частью компьютерной грамотности любого человека и скрывается за фразой "Требуется умение работать на ПК" (т.е. персональном компьютере) во многих объявлениях о приеме на работу.

Правда, для создания текста в вашем распоряжении имеется клавиатура с набором разнообразных символов. Что же касается графики, тут, как правило, нечего предложить, кроме манипулятора "мышь". Легко понять, что им так же удобно рисовать, как и куском мела на доске. Конечно, существуют люди (и их не так уж и мало), способные даже и мышкой нарисовать неплохую картину (смотри, например, рис. 7). Но все же обычные карандаши, фломастеры, кисточки для художников гораздо привычнее.

Рис. 7. Рисунок, сделанный мышкой в графическом редакторе IMAGE72

Чтобы одинокая мышка могла успешно справляться с компьютерной обработкой графической информации, создано много специальных программ для работы с графическим изображением на компьютере. Они делятся на несколько групп.

Графические редакторы. Незаменимы, когда требуется нарисовать или подправить картинку.

Программы корректировки и преобразования фотографий. С их помощью можно добавить фотографии яркость или контрастность, отретушировать ее, создать те или иные эффекты (например, добиться такого эффекта, что изображение будто бы находится на шаре или отчеканено на металле и т.д.).

Программы создания графиков и диаграмм по имеющимся численным данным. Программы, с помощью которых текст и иллюстрации объединяются в книгу, журнал, брошюру или газету. Их еще называют программами верстки.

Программы создания слайд-фильмов и мультфильмов.

Программы презентационной графики. Из названия ясно, где эти программы используются. Графическое изображение и звуковое сопровождение, объединенное с их помощью, просто незаменимы для наглядной иллюстрации любого выступления.

Конечно, возможны самые различные варианты объединения вышеназванных программ в пакеты и друг с другом, и с текстовыми редакторами, и с электронными таблицами, и с базами данных, которые мы будем изучать чуть попозже.

Свое знакомство с программами обработки графической информации вы начнете с изучения графического редактора. Отметим, что принципиально графические редакторы, как правило, не очень-то отличаются друг от друга; поэтому, освоив один, вы быстро разберетесь, как работать и с любым другим. То же самое можно сказать и про другие виды программ. Поэтому не надо думать, что вы будете напрасно терять время, изучая относительно простые программные средства в следующих параграфах. Ведь главное -- научиться читать, а потом по зубам окажутся и толстые книжки.


§ 8. Графический редактор. Общее описание

Те из вас, кто внимательно читал предыдущий параграф, не могли не задаться вопросом: зачем вообще нужен графический редактор, если рисовать в нем не очень-то удобно? Не проще ли всегда и во всех случаях пользоваться сканером, переводя в электронный вид рисунки, подготовленные самыми обычными карандашами, фломастерами, красками и кисточками?

Давайте представим себе художника, который долго трудился над какой-нибудь картиной, нарисовал ее масляными красками, а на следующее утро с ужасом понял, что вот не по душе ему бурый медведь на сосне. Лес, стало быть, радостный, солнечный, веселый, а мишка угрюмый и забирается на сосну, словно вешаться собрался. Стирать надо медведя. Нарушает он настроение рисунка.

После такого решения почти наверняка не один час уйдет только на то, чтобы аккуратно замазать старого медведя и рисовать нового. А если рисунок сделан акварелью, так и вообще придется переделывать все с самого начала.

Вот именно поэтому так много времени уходит у художников на карандашные эскизы, которые легко править.

Но ведь ни по какому эскизу невозможно до конца понять, как будет выглядеть полноцветная картинка. А в графическом редакторе можно запросто подправлять готовый цветной рисунок. И уже ради одного этого свойства он интересен.

Конечно, речь не идет о том, чтобы создавать шедевры живописи, используя компьютер и графический редактор (хотя, быть может, и здесь они бы пригодились -- например, для отработки композиции). Мы говорим прежде всего о подготовке бумажных документов и видеоматериалов. И для их оформления графический редактор незаменим. При этом легкость корректировки -- только одно из многих его полезных свойств.

Посмотрите на рис. 8. На нем показаны основные компоненты графического редактора, которые превращают его в незаменимого помощника художника-оформителя.

Рис. 8. Основные компоненты графического редактора

Со всем, что изображено на рисунке, вы неоднократно встретитесь на практике, а пока ограничимся кратким описанием.

Стандартные инструменты

Стандартные инструменты называются так потому, что позволяют делать то, что человек обычно делает с помощью карандаша, линейки, циркуля, стирательной резинки и тому подобных привычных инструментов.

При этом нет никакой необходимости рисовать черно-белые эскизы. Всего одним нажатием на клавишу мыши можно выбрать любой цвет, представленный в палитре редактора. Если же подходящего цвета нет, его несложно подобрать, регулируя доли красного, синего и зеленого цветов (вспомнили, почему это так?).

Место на экране, где будет возникать очередной элемент рисунка, указывает графический курсор. Он может выглядеть по-разному: в виде стрелки, крестика или точки. Курсор можно перемещать по экрану с помощью мышки (иногда -- клавиш со стрелками). При этом в специально отведенном месте экрана можно увидеть два изменяющихся числа. Это координаты курсора. Они показывают, на каком пикселе находится курсор. (Надеемся, вы еще помните, что такое пиксель на экране монитора?)

Познакомимся с некоторыми стандартными инструментами и возможностями, которые имеются практически у любого графического редактора:

Карандаш -- смысл ясен из названия. При нажатой (обычно левой) клавише мыши курсор оставляет за собой линию заранее выбранного цвета.

Отрезок -- позволяет провести прямую линию. Отметьте мышкой начальную точку, растяните прямую линию до конечной точки и снова нажмите клавишу мышки.

Прямоугольник -- позволяет рисовать прямоугольники выбранного цвета любых размеров со сторонами, параллельными краям экрана. Выбрав этот инструмент, установите курсор в одну из вершин будущего прямоугольника и зафиксируйте ее, нажав нужную клавишу мыши (какую именно -- указано в инструкции к конкретному графическому редактору; вам эту информацию сообщит учитель). Затем, сдвигая мышь, выберите нужный размер прямоугольника и зафиксируйте его.

Овал -- еще одна из стандартных фигур. Выбрав этот инструмент, поставьте курсор в центр будущего овала и зафиксируйте его (в соответствии с инструкцией или указаниями учителя). Затем, сдвигая мышь, выберите нужный размер овала и зафиксируйте его. Этим же инструментом легко рисуются и окружности.

Выбор толщины линии -- это необходимо не только для карандаша, но и при рисовании стандартных фигур.

Резинка-ластик -- вы можете выбрать размер резинки, а затем стирать ненужные фрагменты рисунка.

Разбрызгиватель -- разбрызгивает краску (как будто из аэрозольного баллончика).

Заливка -- заливает выбранным цветом часть рисунка, ограниченную замкнутым (не обязательно одноцветным) контуром. Будьте осторожны! Если в контуре есть дырочка хотя бы в один пиксель, краска разольется по всему рисунку. По счастью, беду можно поправить с помощью "Откатки", о которой мы расскажем немного позже.

Узор -- залить можно не только сплошным цветом, но и некоторым рисунком. Можно, например, сделать заливку красными кирпичами или фиолетовыми цветочками.

Редактирование узора -- стандартных узоров довольно много. Если они вас не устраивают, создайте свои.

Лупа -- после выбора этого инструмента появится небольшой прямоугольник. Наложите его на часть рисунка, которую хотелось бы рассмотреть получше, т.е. увидеть, какой цвет имеет каждый пиксель. Это особенно важно проделать перед заливкой. С помощью лупы легко отыскать малейшие дырочки в контуре.

Откатка (иногда этот инструмент называют Отмена) -- дает возможность отменить только что выполненное действие, вернувшись к предыдущему изображению. Например, с его помощью можно тут же отменить заливку, если вам не понравился узор, которым вы закрасили нарисованный воздушный шарик.

Файл -- в этом разделе содержатся команды загрузки уже готовых рисунков и сохранение того, над которым вы работаете.

Работа с текстом

Немного подробнее поговорим о создании текстовых надписей на рисунках.

Возьмите любую книжку и откройте последнюю страницу. Там, где напечатаны данные об издательстве, тираже и тому подобное, вы почти наверняка найдете надпись вроде такой:

"Гарнитура школьная"

И слова-то вроде не совсем иностранные, а понять сложно, если не знать, что гарнитура -- это просто-напросто вид букв, или шрифт, которым напечатана книга.

Вот несколько образцов шрифтов:

Этот шрифт называется Курьер.

И таких шрифтов в распоряжении профессионала-оформителя несколько тысяч. Учтите к тому же, что надпись в графическом редакторе очень легко сделать.

Понятно, что ни один оформитель, владеющий навыками работы на компьютере, не будет выполнять надписи вручную, если речь не идет о каких-либо совсем уж нестандартных шрифтах.

Спецэффекты

Спецэффекты графического редактора позволяют перевернуть фрагмент картинки, перекосить его, зеркально отразить, оставить от него только тень, изменить контур, получить копию объекта... Одним словом, изменить, иногда до неузнаваемости, картинку или ее фрагмент.

С их помощью можно, нарисовав всего лишь одно деревце, создать за пару минут целую рощу.

Результаты применения некоторых эффектов к исходной картинке приведены на рис. 9.

Рис. 9. Пример применения различных эффектов к исходной картинке (слева)

Библиотека рисунков

Любой современный графический редактор снабжается обширной библиотекой рисунков (либо сразу в комплекте, либо за отдельную плату). Мало того, многие фирмы занимаются исключительно тем, что разрабатывают и продают картинки самой разнообразной тематики для графических редакторов.

Похоже, нет ни одного предмета в жизни, рисунка которого не было бы в графических библиотеках. Здесь и самые разнообразные здания, и множество видов животных и растений (как живых, так и вымерших), и все инструменты, которыми пользуется человек, начиная от швейной иголки и кончая громадными экскаваторами. О компьютерах и их деталях уж и говорить не приходится.

В графических библиотеках можно найти изображение (карикатурное, схематическое, почти натуральное) любого известного спортсмена, артиста, политического деятеля...

Объединение картинок

Ну и, наконец, графический редактор позволяет очень легко переносить фрагменты из одних картинок в другие, компонуя новые изображения из старых. Умело это используя и не забывая о спецэффектах и библиотеках стандартных рисунков, можно создавать громадное количество оригинальных картинок, даже совершенно не умея рисовать.


§ 9. Текстовый редактор

Вам наверняка приходилось читать чужой рукописный текст. И скорее всего вы его разбирали далеко не так хорошо, как книжный. А ведь есть люди, чья работа -- постоянно читать тексты, написанные от руки. Например, это учителя русского языка и литературы. Давайте теперь проведем небольшой эксперимент.

  • Возьмите часы с секундомером, засеките время и напишите пару-другую предложений своим обычным почерком так, как вы пишете только для себя.
  • А теперь снова засеките время и напишите тот же текст так, как если бы писали его на поздравительной открытке, -- разборчиво и аккуратно.
  • Подсчитайте количество символов в тексте, включая, естественно, знаки препинания и пробелы,
    и определите свою скорость письма в символах в минуту в обоих случаях.

Вспомним начало учебного года и работу на клавиатурном тренажере. Если вы успешно его освоили, то наверняка ваша скорость ввода текста с помощью клавиатуры превосходит скорость разборчивого письма. И при этом даже разборчивый текст не идет ни в какое сравнение с аккуратным, почти типографским текстом, который печатает принтер.

Нет, мы вовсе не хотим сказать, что поздравления своим родным и друзьям надо непременно печатать на принтере. Аккуратный рукописный текст на поздравлении выглядит живым, доверительным. По почерку можно судить об авторе текста. Существует даже целая наука, позволяющая определить основные черты характера человека по почерку.

Но когда речь идет о деловой переписке и подготовке документов, тут, согласитесь, просто необходимо совместить скорость создания текста, разборчивость, грамотность и аккуратность, что очень даже непросто. Вспомните хотя бы, сколько неприятностей доставляет вам порой всего лишь одна неверно написанная буква!

Итак, давайте более пристально рассмотрим технологию написания писем, книг и документов.

Конечно, можно сказать, что уж где-где, а здесь прогресс шел постоянно. Сначала надписи вырубали на камнях. Затем выдавливали стилом на глиняных дощечках. Царапали на бересте. Писали охрой на керамике и палочками на папирусах, кисточками на шелке и перьями на бумаге. Гусиные перья сменялись перьевыми ручками, те -- авторучками, авторучки -- пишущими машинками... А ежели вспомнить шариковые ручки, фломастеры, "мокрый шарик", особо тонкие автоматические карандаши!.. А сколько типов пишущих машинок!..

Однако не менялось главное: чтобы внести изменения в текст, его надо заново переписывать (если, конечно, стремиться к аккуратности). Вы по себе знаете, что такое черновик и сколько сил и времени отнимает переписывание начисто обычного школьного сочинения. Может быть, поэтому многие ученики больше думают не о содержании сочинения, а о том, как бы не допустить помарки.

А каково писателям! Лев Николаевич Толстой, например, переделывал "Войну и мир" более восьми раз, и каждый раз приходилось (целиком!) переписывать роман (правда, этим занималась главным образом его жена Софья Андреевна).

Появление компьютеров коренным образом изменило технологию письма. С помощью специальной программы, которая называется редактором текстов (или текстовым процессором), на экране ЭВМ можно увидеть любой текст и внести в него (при необходимости) любые изменения. Хочешь -- букву заменяй, хочешь -- целую страницу.

Но этим дело не ограничивается. Так же, как и графический редактор, текстовый редактор -- это принципиально новый инструмент для работы, имеющий множество уникальных функций, о которых и мечтать-то не приходится при использовании традиционных методов письма.

Эти функции иллюстрирует рис. 10, и мы сейчас поговорим о них более подробно.

Рис. 10


§ 10. Стандартные инструменты
текстового редактора

При работе с редактором текстов роль бумаги играет экран ЭВМ, а роль карандаша и резинки -- курсор: либо небольшой прямоугольник, либо вертикальная или горизонтальная мерцающая черточка, стоящие на экране там, где должен будет появиться очередной символ.

Текст на экране компьютера как бы написан на некоем электронном свитке, который можно просматривать ("прокручивать"), используя клавиши управления курсором (это уже известные вам четыре клавиши со стрелками) и еще четыре клавиши, описанные ниже. Кстати, процесс просмотра информации (в частности, текста) на компьютере с помощью "прокрутки" называется "скроллингом" (от английского слова scroll -- свиток).

Текст можно раздвигать, вставляя новые слова. Можно удалять отдельные буквы или слова и переставлять целые абзацы, автоматически заменять во всем тексте одно слово другим...

Для работы с текстовым редактором используются следующие стандартные клавиши:

Вставка (<Insert>) переключает режим ввода. В режиме Вставка новый текст, который вы набираете, будет сдвигать вправо старый текст. В режиме Замена новый текст будет набираться прямо поверх старого.

Удаление (<Delete>) удаляет символ справа от курсора, сдвигая весь текст, находящийся правее курсора, на одну позицию влево.

Назад (<BackSpaсe>) -- стрелочка, направленная влево в правом верхнем углу буквенной части клавиатуры; удаляет последний введенный символ слева. Весь текст справа от курсора тоже сдвигается на одну позицию влево.

Смена регистра (<Shift>) служит для ввода больших (прописных) букв. Для этого достаточно нажать эту клавишу и, не отпуская ее, нажать клавишу буквы. Для тех, кто сталкивался с пишущими машинками, можно сказать, что эта клавиша точно такая же, как и специальный рычажок на пишущей машинке, временно поднимающий литеры вверх.

Фиксация верхнего регистра (<Caps Lock>) это все равно, как если бы мы держали клавишу Смена регистра в постоянно нажатом положении. Требуется тогда, когда надо писать только большими буквами. Клавиша имеет световой индикатор.

Табуляция (<Tab>) служит для мгновенного перемещения курсора на строго определенную позицию в строке. На пишущей машинке без нее немыслимо печатать разного рода таблицы, но в большинстве современных текстовых редакторов имеются специальные средства редактирования таблиц, и там эта клавиша используется редко.

На страницу вверх (<Page Up>). Под словом "страница" в данном случае понимается та часть текста, которая видна на экране компьютера. При нажатии на эту клавишу текст "прокручивается" вверх как раз на размер экрана.

На страницу вниз (<Page Down>) -- то же самое, что и предыдущая клавиша, только при нажатии на эту клавишу текст "прокручивается" вниз на размер экрана.

В начало строки/текста (<Home>/<Ctrl>+<Home>). Если просто нажать эту клавишу, то курсор перескочит в начало той строки, с которой вы работаете, а если нажать и удерживать клавишу <Ctrl> так же, как вы это делали с клавишей <Shift>, и нажать клавишу <Home>, то курсор перескочит в начало текста.

В конец строки/текста (<End>/<Ctrl>+<End>) -- то же самое, что и предыдущая клавиша, но курсор перескакивает либо в конец текущей строки, либо в конец текста.

Конечно, это далеко не все возможные клавиши и сочетания клавиш, облегчающих работу с текстом, но зато они работают так, как указано, практически во всех текстовых редакторах.

Используя клавиши вставки и удаления символов, необходимо иметь в виду следующее. В электронном тексте присутствуют невидимые символы, которые воспринимаются компьютером точно так же, как и самые обычные буквы.

С одним из таких символов вы уже очень хорошо знакомы -- это пробел. А невидимый он потому, что с ходу и не понять, сколько пробелов между двумя словами. Определить, сколько же их в конце предложения, и вовсе тяжело.

Невидимым символом является и символ табуляции.

Третий, самый коварный, невидимый символ -- перевод строки. Он вставляется в текст тогда, когда вы нажимаете клавишу <Ввод> (<Enter>). Многие редакторы самостоятельно делают перенос слов на новую строку и трактуют этот символ как начало нового абзаца.

Представьте теперь, что курсор стоит в конце абзаца и вы нажали клавишу <Delete>. Если в тексте стоял символ перевода строки, то, как и любой другой символ, он удалится и два абзаца объединятся в один.

Того же эффекта можно добиться, если поставить курсор в начало абзаца и нажать клавишу <BackSpace>.

Одним словом, невидимые символы -- дело тонкое, и, будем надеяться, они не очень отравят вам жизнь. Кстати, в некоторых современных редакторах их при желании можно увидеть на экране (но, естественно, не в готовом, напечатанном тексте).

Автоформатирование и автоперенос

Большинство редакторов текстов автоматически следит за длиной строки и в нужный момент делает либо перенос слова на новую строку, либо его перемещение целиком.

Многие редакторы текстов умеют автоматически разбивать текст на страницы и нумеровать их. Они следят за размером полей и выравнивают текст...

Посмотрите внимательно на текст любого вашего учебника. Он аккуратно выровнен и слева, и справа. И, конечно же, это было сделано компьютером в автоматическом режиме.

Обычно можно заказать три типа выравнивания: по левой границе (обычный тип для не очень больших деловых документов), по обеим границам (для больших текстов) и по правой границе (как правило, для специальных оформительских целей).

В случае выравнивания по обеим границам текстовый редактор равномерно растягивает пустые места между словами (некоторые текстовые редакторы добавляют между ними пробелы), добиваясь красивого расположения текста.

Если вдруг возникла необходимость изменить параметры строки и/или страницы (например, расположить текст в две колонки или повернуть страничку на 90 градусов), вовсе не требуется вводить текст заново. Редактор самостоятельно расставит, если нужно, новые переносы и расположит текст в соответствии с изменившимися требованиями.

Кстати, вам совсем будет не лишним знать и об основных стандартных параметрах страниц, используемых при подготовке документов.

  • Стандартная машинописная страница имеет размеры 210x 297 миллиметров. Такой формат называется форматом А4.
  • Страница может иметь книжную ориентацию или (после поворота на 90 градусов) альбомную.
  • Стандартная строка на такой странице в книжной ориентации содержит примерно 63--65 символов при использовании шрифта, похожего на шрифт пишущей машинки.
  • Необходимо помнить и о полях:
    • 2,5 -- 3 сантиметра слева,
    • 2 сантиметра справа и сверху,
    • 1,5 -- 2 сантиметра снизу.

Набор шрифтов

Со шрифтами мы уже встречались при изучении графического редактора. Но там все-таки главным объектом был рисунок. Что же касается текстового редактора, то здесь необходимо сделать небольшое добавление.

Во-первых, как вы уже видели в нашем учебнике, шрифт может быть обычным, а может быть жирным или курсивным. Иногда в книгах применяют подчеркивание; в рукописных текстах это наиболее распространенный способ выделения важных положений -- ведь там нет ни жирного шрифта, ни курсива.

Во-вторых, каждый шрифт имеет размер, называемый кеглем. Величину кегля принято указывать в условных единицах, называемых пунктами. Стандартный шрифт пишущей машинки, к которому стараются приблизиться, печатая деловые документы, очень похож на шрифт Times размером в 12 пунктов. Вообще хорошо читаются тексты, набранные кеглем от 9 до 12 пунктов.

Во-третьих, в полиграфии и издательском деле различают шрифты с засечками и без засечек, или рубленые. Вот образцы:

Этот текст набран шрифтом с засечками.

Шрифты с засечками как бы визуально объединяют слово в единое целое, и это увеличивает скорость чтения на 10--15%.

Рубленые шрифты, как правило, используются в заголовках и подписях к рисункам.

Изменяя размер и форму шрифта, можно добиваться самых различных эффектов, но не надо впадать в крайности. Наличие на одной странице большого количества шрифтов ухудшает восприятие текста и вряд ли свидетельствует о хорошем вкусе. (Кстати, можете это проверить практически на любой газете, основу которой составляют рекламные объявления).

Не надо забывать, что выбор шрифта очень сильно зависит от характера материала и предполагаемого читателя.

Табличный редактор и калькулятор

Табличный редактор позволяет разграфить часть страницы документа горизонтальными и вертикальными линиями. При вводе текста в ячейку получившейся таблицы мы можем быть уверены, что он будет строго ограничен левой и правой вертикальными линиями и не выйдет за их пределы. При необходимости горизонтальные и вертикальные линии можно сделать видимыми, а часть ячеек выделить штриховкой.

Если в ячейках таблицы находятся числа, то редактор может выполнить с ними различные арифметические действия. Например, найти сумму по столбцу или строке, вычислить среднее или максимальное значение и тому подобное.

Проверка орфографии

К сожалению, проверка орфографии текстовым редактором сводится к поиску слова в электронном словаре. А почему "к сожалению" -- сейчас объясним.

Допустим, что в тексте встретилось предложение: "Карова дает молоко". Если включить режим орфографической проверки, то скорее всего компьютер предложит либо заменить его словом "корова", либо пропустить, либо добавить в словарь, поскольку слова "карова" в словаре не оказалось.

И если от большого ума выбрать режим "Добавить", то уже в следующий раз слово "карова" не будет считаться ошибкой. Впрочем, в исходном словаре тоже, как правило, встречается немало ошибок -- заполняли-то его тоже люди, а не ошибается у нас сами знаете кто.

Что касается знаков препинания -- запятых, двоеточия, тире и т.д. -- текстовый редактор их и проверять-то не берется.

Так что на проверку надейся, а сам не плошай.

Вставка графических объектов

Тут, думается, и так все понятно. Единственный новый термин, с которым необходимо познакомиться, -- это обтекание.

Давайте опять откроем любой ваш учебник. Можно заметить, что большая часть иллюстраций как бы "встроена" в текст, который их аккуратно огибает. Вот это и называется "обтекание графики текстом".

Видимо, излишне говорить, что современные редакторы выполняют эту функцию автоматически.

Файловая система

Документ, который вы подготовили, может быть не только с ходу распечатан на принтере, но и сохранен на магнитном носителе для дальнейшего использования и правки. Часть магнитного диска, выделенная для такой цели, называется файлом.

Чтобы не перепутать, каждому файлу дают свое имя.

К сожалению, до сих пор на многих компьютерах существуют очень строгие ограничения на имена файлов. На них нельзя, например, назвать файл "Мое письмо Васе в день его рождения 12 мая 1997 года". А можно так: "PISMO12.DOC", что не слишком-то информативно.

Поэтому многие редакторы позволяют создать свою внутреннюю табличку вот такого типа:

Содержание файла | Имя файла
Мое письмо Васе в день его рождения 12 мая 1997 года | PISMO12.DOC

И пользователям (то есть нам с вами) вовсе не надо каждый раз ломать голову над именем файла. Его очень легко найти по описанию.

Объединение документов, многооконность

Как графический редактор позволяет объединять несколько картинок в единое целое, так и текстовый редактор позволяет одновременно работать с несколькими документами и с помощью буфера обмена переносить текст из одного документа в другой.

При этом каждый документ открывается в своем окне, размеры которого мы можем менять. Можно добиться того, чтобы на экране были видны части вообще всех документов, с которыми вы в данный момент работаете.

В общем, если бы вы всегда писали свои сочинения с помощью компьютера, то в один прекрасный день вам хватило бы возможностей любого текстового редактора, чтобы из десятка своих сочинений скомпоновать новое совершенно оригинальное, не написав при этом ни единого слова!

Предварительный просмотр страницы перед печатью

Режим, при котором вид документа на экране соответствует тому, как он будет напечатан на бумаге, называется "Что вижу, то и получаю", или WYSIWYG (это далеко не очевидное, скажем прямо, сокращение происходит от английской фразы "What You See Is What You Get").

Далеко не все текстовые редакторы поддерживают этот режим в процессе работы, но почти все могут показать, как будет смотреться на бумаге уже готовый документ.

Конечно, мы рассмотрели только наиболее важные функции современного текстового редактора. Со многими дополнительными вы столкнетесь в процессе выполнения лабораторных работ.

Но, думаем, вы уже поняли, что путь, пройденный от гусиного пера до пишущей машинки, гораздо короче, чем от пишущей машинки до хорошего текстового редактора.


§ 11. Электронные таблицы

В последней лабораторной работе с текстовым редактором вы всласть повычисляли с помощью компьютера. И, наверно, поняли, чем он принципиально отличается от простого калькулятора. Одно дело -- сидеть с калькулятором и вычислять заработную плату каждого из работников и совсем другое -- перемножать, складывать и вычитать целыми столбцами. Или просто вставить в ячейку таблицы необходимую для расчетов формулу и сразу получить нужный результат.

Одно плохо. Предположим, мы ошиблись, и оказалось, что Иванов Петр Сидорович отработал вовсе не 120 часов в течение месяца, а целых 180. Тогда придется или вручную пересчитывать его зарплату, или повторять увлекательные, но немного утомительные операции по перемножению столбцов или вставке формул.

А нельзя ли сделать так, чтобы компьютер автоматически пересчитывал все данные в таблице при изменении некоторых из них? Бухгалтеру, например, частенько требуется пересчитать весь квартальный отчет (а это несколько десятков показателей), если возникает необходимость заменить несколько исходных чисел. Или заново начислить заработную плату всем работникам при изменении всего одного числа -- минимальной заработной платы.

Подобные проблемы возникают не только у бухгалтеров. Диспетчерам при составлении графиков движения транспорта, экспериментаторам при проведении серий опытов и многим другим приходится решать задачи, в которых изменение значения какого-то одного параметра требует пересчета большого числа результатов.

И компьютер способен учесть огромный объем данных и сослужить добрую службу, если требуется неоднократно проводить однообразные вычисления. Для этого программистами созданы специальные программы -- электронные таблицы.

Но прежде, чем знакомиться с ними, давайте подумаем, что требуется для расчета все той же заработной платы.

Ну, во-первых, фамилии и инициалы сотрудников и все то, что надо о них знать: ставки, количество отработанных ими часов, льготы по налогообложению и тому подобное. Эту информацию надо просто занести в компьютер для использования в дальнейших вычислениях. Такого сорта информация называется исходными данными.

Во-вторых, необходимо знать формулы, по которым рассчитываются заработная плата, налоги, премиальные и тому подобное. Получающиеся при этом числа называют рассчитываемыми данными, или результатами.

Электронная таблица позволяет хранить в табличной форме большое количество исходных и рассчитываемых данных, а также связи между ними (то есть формулы). Но главное -- при изменении исходных данных все результаты автоматически пересчитываются и изменяются прямо у вас на глазах.

Вообще-то электронную таблицу можно себе представлять, как здание с подвалом: на видимом этаже -- привычные для нас числа, буквы и другие символы, то есть исходные и рассчитываемые данные, записанные в ячейки обычной таблицы, а в подвале -- невидимые с первого взгляда формулы, по которым получаются результаты (см. рис. 11).

Рис. 11. Структура электронной таблицы

Ячейки таблицы, у которых в верхнем слое число, а в нижнем ничего нет, -- это, как легко понять, ячейки с исходными данными. Они, напомним, заносятся вручную и компьютером никак не изменяются.

Ячейка таблицы, у которой в нижнем слое формула, -- это ячейка, в которую компьютер самостоятельно записывает результат. Вычислить его -- долг и забота компьютера.

Идея проста, однако додумались до нее спустя целых двадцать лет после того, как стали применять компьютеры в бухгалтерии. Сделал это Дэниэл Бриклин в 1979 году. Вместе с программистом Робертом Фрэнкстоном они и создали первую в мире электронную таблицу с названием "Визикалк", что по замыслу создателей означало "Визуальный калькулятор".

Даже одна эта программа оправдывала в глазах пользователей приобретение персонального компьютера: более чем 100 тысяч человек купили персональный компьютер ради возможности работать с "Визикалком". Экономисты, захлебываясь от восторга, писали, что с помощью этой программы можно почти мгновенно определить прибыль компании, если заработная плата вырастет на 6% при одновременном увеличении производительности труда на 3,5% и уменьшении цены на готовую продукцию на 7% с ожидаемым увеличением сбыта на 14%.

Посмотрим же внимательно на электронную таблицу (см. рис. 12):

Рис. 12. Внешний вид электронной таблицы на экране компьютера

Несмотря на экзотическую структуру, видимый этаж электронной таблицы почти ничем не отличается от самого обычного документа, созданного в уже знакомом вам текстовом редакторе.

Правда, страничка разбита на столбцы, обозначенные буквами латинского алфавита, и на строки, пронумерованные целыми числами, но само это разбиение при выводе на принтер, как правило, делается невидимым, и по внешнему виду документа невозможно понять, сделан он с помощью текстового редактора или электронной таблицы.

Благодаря разбиению на пронумерованные строки и поименованные столб-цы каждая ячейка электронной таблицы имеет свой собственный адрес.

Так, например, в ячейке B1 написан заголовок таблицы. Вообще-то столбец B не такой уж и широкий, чтобы в него влез весь заголовок целиком, но таблица устроена так, что если в правой соседней ячейке ничего нет, то текст перекрывает и ее. Если же в ячейку C1 что-нибудь поместить, то вместо слов Итоги первой четверти по школе мы бы увидели только Итоги п.

Ширину столбцов можно произвольно менять, выбирая наиболее подходящую для различных данных, а некоторые строки -- пропускать. Это позволяет красиво оформить документ.

К сожалению, далеко не во всех электронных таблицах есть возможность увидеть подвальный этаж целиком, но всегда виден подвал той ячейки, на которой стоит курсор в виде прямоугольника. На нашем рисунке он стоит на ячейке F14.

Содержимое подвала отображается в специально отведенном для этого месте (на рис. 12 оно изображено в рамочке над таблицей, куда показывает черная стрелка). Кроме того, во многих электронных таблицах сообщается, что же находится в ячейке: результат вычисления (как в нашем случае, поскольку в нижней рамочке написано слово Формула) или исходные данные (в той же рамочке будет написано Текст или Число).

Слово Готово в левом нижнем углу означает, что произведен авто-пересчет и все результаты соответствуют формулам.

Что же касается формул, то, взглянув на рис. 12, вы сразу догадаетесь, как их вставлять в таблицу.

Для каждой таблицы существуют специальные правила ее заполнения, указанные в инcтрукции для пользователя:

  • Если среди символов, вводимых в ячейку, есть буквы или нечто, чего не может быть в числе, то это -- текст или формула.

    • Например: Василий, или 10.234.245, или а1234

  • Если вводится правильная запись числа, то это число.

    • Например: 234 (разумеется, без кавычек; первый символ " сразу же указывает, что тип данных -- Текст).

  • Чтобы электронная таблица распознавала, что вводится -- просто текст или формула, -- в начале того и/или другого ставится заранее обусловленный знак. Текст обычно начинается с кавычек ", а формула -- со знака = или знака @, или еще какого-нибудь знака.

Кстати, а можете ли вы сказать, в каких ячейках таблицы, изображенной на рис. 12, находятся результаты, а в каких -- исходные данные?

Любая уважающая себя электронная таблица имеет, помимо всего прочего, целый набор стандартных функций, облегчающих жизнь пользователю. Как вы думаете, какая формула стоит в ячейке B14? Нет, разумеется, можно написать такое:

=B6+B7+B8+B9+B10+B11+B12

и это будет правильно. Ну а если надо будет сложить не семь, а двадцать семь или сто семь чисел? Для облегчения работы с таблицей имеется стандартная функция -- суммирование содержимого блока ячеек: SUM(B6:B12)

У электронной таблицы есть много разных операций над блоками ячеек. Это -- поиск максимального или минимального элемента, расчет среднего значения и т.д. Блок ячеек можно скопировать или перенести в другое место таблицы. Надо только помнить, что блоком ячеек в электронной таблице называется совокупность всех ячеек, заполняющих некоторый прямоугольник. Для того чтобы электронная таблица знала, с каким блоком ей иметь дело, указывают через двоеточие адреса ячеек, стоящих в левом верхнем и правом нижнем углах прямоугольника, (например, С6:Е12).

Одним словом, современная электронная таблица вполне способна заменить целое бухгалтерское бюро прошлого.


§ 12. Примеры применения электронных таблиц

ПРАЙС-ЛИСТ

Представьте себе, что вы решили заняться торговлей. Не важно, чем. Может быть, компьютерами, может быть, обувью, может быть, мясными пирожками сорока восьми различных сортов.

Как известно, частенько цена на чуть ли не все товары определяется значением какой-нибудь одной величины. Ну, скажем, подорожало мясо на 7,5%. Стало быть, и пирожки надо переоценивать. А компьютеры покупаются за рубежом на доллары США. Меняется курс доллара -- меняются и цены.

В случае изменения цен нам срочно требуется изменить список товаров с соответствующими им ценами. Этот-то список и называется прайс-листом.

Как легко понять, электронные таблицы идеально подходят для оперативного изменения прайс-листа. Посмотрите еще раз на рис. 12 и представьте себе, что в столбце A написаны наименования товаров, в столбце, скажем, C -- их стоимость в рублях, в столбце F -- стоимость в условных единицах (например, по отношению к стоимости килограмма мяса или доллара США) и, наконец, где-нибудь вверху, в клеточке F1 -- стоимость самой этой условной единицы.

Понятно, что столбец C -- это столбец результатов, зависящий от стоимости условной единицы. Думается, для вас не составит большого труда понять, какие формулы стоят в подвальном этаже столбца C, и оформить прайс-лист. Естественно, при последующей печати для покупателей вовсе ни к чему выдавать на бумагу столбец F, носящий чисто служебный характер.

ЭКСКУРСИОННАЯ ПОЕЗДКА

В конце учебного года администрация школы организовала для всех желающих экскурсию и, получив информацию из классов о числе экскурсантов, заказала соответствующее количество автобусов.

                              Таблица 1

Класс | Едут на экскурсию | Первый автобус | Второй автобус | Третий автобус | Четвертый автобус
6а | 23 | 23 | оооо | оооо | оооо
6б | 17 | 17 | оооо | оооо | оооо
6в | 14 | 5 | 9 | оооо | оооо
6г | 7 | оооо | 7 | оооо | оооо
7а | 18 | оооо | оооо | оооо | оооо
7б | 5 | оооо | оооо | оооо | оооо
7в | 19 | оооо | оооо | оооо | оооо
7г | 22 | оооо | оооо | оооо | оооо
8а | 21 | оооо | оооо | оооо | оооо
8б | 11 | оооо | оооо | оооо | оооо
8в | 15 | оооо | оооо | оооо | оооо

Зная, что в каждый автобус входит ровно 45 пассажиров, завуч по внеклассной работе уже начала было заполнять таблицу (см. табл. 1), но тут возмутилась классный руководитель 6в класса. Конечно, всем ребятам из одного класса хотелось бы ехать в одном автобусе. Завуч, понятное дело, заявила в ответ, что все равно так не получится и какому-то классу придется ехать в разных автобусах. Классный руководитель, в свою очередь, не пожелала быть козлом отпущения...

Так бы и разгорелся конфликт, но тут мимо пробегали компьютерно грамотные семиклассники и взялись с помощью электронной таблицы рассадить всех, к всеобщему удовольствию.

Задача, за которую взялись семиклассники, отнюдь не простая. Как вы думаете, что должно стоять в ячейках таблицы на пересечении номеров автобусов и классов? Количество человек? Но если класс целиком садится в один автобус, оно и так нам известно.

Немного отвлечемся от автобусной экскурсии и сформулируем одно из самых главных правил информатики:

          Любая задача, связанная с обработкой информации,
          требует в первую очередь глубокого осмысления связи
          между исходными данными и результатами.

Итак, что же общего имеют между собой первый автобус и, скажем, 7а класс? Ну конечно же, 7а класс либо едет в этом автобусе, либо нет. Стало быть, и в соответствующей ячейке должны стоять либо единичка, либо нулик. Ну а для контроля заполняемости автобуса необходимо добавить еще одну строку (см. табл. 2):

                              Таблица 2

Класс | Едут на экскурсию | Первый автобус | Второй автобус | Третий автобус | Четвертый автобус
6а | 23 | 1 | оооо | оооо | оооо
6б | 17 | оооо | 1 | оооо | оооо
6в | 14 | оооо | оооо | оооо | оооо
6г | 7 | 1 | оооо | оооо | оооо
7а | 18 | оооо | оооо | оооо | 1
7б | 5 | оооо | оооо | оооо | оооо
7в | 19 | оооо | оооо | оооо | оооо
7г | 22 | оооо | оооо | оооо | оооо
8а | 21 | оооо | оооо | оооо | 1
8б | 11 | оооо | оооо | оооо | оооо
8в | 15 | оооо | оооо | оооо | оооо
Итого в автобусе: |  | 30 | 17 | 0 | 39

Можете считать, что перед вами электронная таблица, трудиться над которой уже начали смышленые семиклассники.

Естественно, что пересчет количества людей в автобусе производится автоматически, то есть у этих ячеек заполнен подвальный этаж. А как он заполнен, вы, наверное, уже догадались. Выполняя лабораторную работу, вы сумеете рассадить школьников по автобусам.

ПЕРЕВОЗКА ГРУЗОВ

Перед диспетчером компании "Пануралтранссибсервис" встала непростая задача. Три грузовика компании должны забрать с разных предприятий Новосибирска следующий груз (см. табл. 3) и доставить его в Омск. Грузоподъемность каждой машины -- 12 тонн, и хотелось бы распределить весь груз примерно поровну. Ну, быть может, допустив 100--150 кг перегрузки какого-нибудь грузовика.

                              Таблица 3

Наименование оборудование | Количество | Вес единицы груза | Первый грузовик | Второй грузовик | Третий грузовик
Станки (штуки) | 11 | 850 | оооо | оооо | оооо
Трубы (упаковка) | 4 | 1930 | оооо | оооо | оооо
Буровое оборудование (ящики) | 2 | 1700 | оооо | оооо | оооо
Отделочный камень (ящики) | 4 | 1250 | оооо | оооо | оооо
Промышленные электромоторы (штуки) | 7 | 730 | оооо | оооо | оооо
Кабель (бухты) | 5 | 1100 | оооо | оооо | оооо
Всего груза в машине (кг) |  |  | оооо | оооо | оооо

Видимо, вы уже поняли, что и в этом случае диспетчеру поможет электронная таблица.

Как обычно, постараемся поточнее понять связь между строками и столбцами. И здесь есть отличие от предыдущего задания. А именно: вовсе не обязательно, например, грузить весь кабель на одну машину. Поэтому в ячейках могут стоять не одни только нулики и единички.

В данном случае связь заключается в том, сколько единиц данного груза (штук, ящиков) берет конкретная автомашина.

Есть и еще одно отличие. Решите-ка такую задачку:

На складе было 11 станков. Четыре увез первый грузовик. Три -- второй. А остальное увез третий. Спрашивается: сколько станков увез третий грузовик?

Что, задачка для первого класса? Ну так пусть компьютер сам ее и решает. А для этого необходимо заполнить подвальный этаж столбца, соответствующего третьему грузовику.

Ну и, разумеется, требуется нижняя строка, которая контролирует загрузку каждой из машин. Ее подвальный этаж записывается аналогично тому, как это было сделано в предыдущей задаче. Желаем успешной работы новоиспеченному диспетчеру!


§ 13. Базы данных и информационно-поисковые системы

Представьте себе, что у вас есть небольшая фирма по выдаче напрокат видеокассет. К вам постоянно обращаются клиенты в надежде получить интересующую их запись. Кому-то требуется самый популярный фильм сезона, у кого-то есть любимый актер, другие испытывают ностальгию по фильмам давно прошедших лет.

Вы, скажем, не бедствуете. Одно удручает: слишком много времени уходит на каждого клиента, поскольку нелегко в длинных списках отыскать нужное название. Мало помогают и выложенные на прилавок списки записей.

Одному клиенту надо подобрать фильмы-боевики. Другому -- фильмы с любимой актрисой. Третий интересуется всеми мультиками с трансформерами...

Кстати, интересуются ведь не только видеофильмами. Наверняка почти каждый из вас пережил увлечение собирательством марок (этикеток, календариков, ластиков, баночек из-под соков, ножиков для резки бумаги, вкладышей от жвачек...). Заметим, что истинный коллекционер не станет складывать как попало дорогие ему экспонаты, а рассортирует их по тем или иным признакам.

Например, для марок -- это страна, выпустившая марку, год выпуска, тема, гашеная марка или нет... Учитывается даже состояние (сохранность зубцов, наличие клея и др.). Возможно, что баночки из-под газировки допускают свои, не менее интересные способы классификации. Всю эту информацию коллекционеры хранят в специальных каталогах. Однако даже имея под рукой каталог, порой приходится тратить много усилий, чтобы подобрать нужный вариант обмена.

Описанные ситуации имеют много общего: в большом объеме информации разыскивается та, которая необходима на данный момент. И здесь снова надежным помощником становится компьютер.

Давайте вспомним предыдущие параграфы. Там мы продемонстрировали, что компьютер -- это мощный механизм для переработки информации. По исходным данным и формулам он получает необходимые нам результаты.

Теперь же требуется, чтобы компьютер сыграл роль этакого рыбака с сетью, который выловит из громадной стаи рыб только крупную добычу, которая нас интересует.

Или, если это вам больше понравится, компьютер похож на обогатительную фабрику, которая из сотен тонн породы извлекает нужный минерал.

Роль косяка рыбы (или необогащенной руды) выполняют базы данных. Ну а чтобы накапливать, изменять, хранить и искать нужную информацию, необходимо использовать специальные программы -- системы управления базами данных (СУБД) и информационно-поисковые системы (ИПС).

Различие между ними весьма условное. Пояснить его можно так. Если речь идет о каталоге крупной библиотеки, то, конечно, было бы крайне безответственно позволить любому посетителю изменять информацию о книгах, хранящихся в ее фондах. А просмотреть и выбрать то, что необходимо, -- пожалуйста.

Можно сказать, что специалистам -- сотрудникам библиотеки -- доступны все возможности работы с базой данных, а посетители работают только с информационно-поисковой системой. Как же организована база данных?

В ней содержатся сведения о большом количестве однотипных объектов. При этом для каждого из объектов существенными являются значения лишь некоторых признаков.

Что понимается здесь под словами "признак" и "значение признака"? Поясним на примерах.

Для базы данных фирмы по прокату видеокассет объектами являются художественные и мультипликационные фильмы, записи концертных программ и т.д., а их признаками, например, будут: жанр, название фильма, фамилия режиссера, год выхода фильма, список актеров в главных ролях. Быть может, для особых ценителей важно и название студии.

Значения этих признаков могут быть, скажем, такими: "Правдивая ложь", боевик, Джеймс Камерон, 1994, Арнольд Шварценеггер, "XX век Фокс".

Особенность базы данных в том, что у всех объектов, входящих в эту базу, количество признаков одно и то же. Другое дело, что у некоторых из этих признаков может не быть значения (например, у мультфильма, естественно, нет списка актеров в главных ролях).

Иногда некоторые из признаков объявляют ключевыми. Это полезно, потому что по ним, в частности, в дальнейшем можно сделать сортировку. Например, если мы хотим получить список всех фильмов Шварценеггера в хронологическом порядке, необходимо год выпуска фильма объявить ключевым признаком.

Некоторые из признаков могут быть объявлены обязательно присутствующими. Например, любой художественный фильм всегда имеет какое-нибудь название.

Каждая конкретная база предназначена для решения своего круга задач. В свою очередь, для каждого класса задач характерен свой набор объектов и их признаков. Поэтому и соответствующие базы будут различными: одна нужна, чтобы разыскивать марку по каталогу, и совсем другая -- для облегчения работы директора фирмы по прокату видеокассет.

Даже если в разных базах данных объекты и одинаковы, наборы нужных признаков вполне могут оказаться разными. Например, овощевода интересуют урожайность, время посева и сроки уборки овощей, повара -- калорийность овощей и рецепты овощных блюд, а директора овощехранилища -- условия хранения тех же самых овощей.

Для того чтобы поручить ЭВМ найти интересующие нас сведения, нужно составить запрос. Правила записи запросов для каждой ИПС свои -- они устанавливаются теми, кто создает данную ИПС. Более того, обычно самые распространенные запросы к базе данных уже заранее составлены. Чтобы получить информацию по такому запросу, надо, как правило, просто выбрать соответствующий пункт в меню, расположенном на экране. А в большинстве персональных баз данных заранее составлены вообще все запросы, и работа с такими базами данных доступна человеку, весьма далекому от компьютерных премудростей. С одной из таких баз вы познакомитесь, проводя очередную лабораторную работу.

Сейчас в мире созданы сотни тысяч баз данных. Они используются в библиотеках и больницах, в гидрометцентрах и на заводах, в магазинах и планирующих организациях, в банках и частных фирмах.

Тематические базы данных для узких специалистов называют банками данных. Это может быть банк данных по микропроцессорам, банк по лекарственным средствам, банк публикаций в области ядерной физики и т.п.

В нашей стране действуют десятки банков данных. Пожалуй, самый большой из них -- банк данных Российского института научной и технической информации. В нем содержится более 6 млн библиографических сведений о книгах и статьях практически по всем отраслям знаний.

Тот, кто покупает авиабилеты, пользуется услугами другого крупного банка данных нашей страны -- системой "Сирена". С помощью компьютера кассир связывается с центральной ЭВМ, находящейся за тысячи километров от него, почти мгновенно получает сведения о наличии мест на данный рейс и печатает билет.

Как и было обещано, на первой лабораторной работе, посвященной базам данных, вы познакомитесь с несложной базой данных "Ученики". Она вполне может быть частью автоматизированного рабочего места (сокращенно АРМ) для директора или завуча школы. В ней содержатся следующие сведения об учениках:

  • Класс
  • Фамилия
  • Имя
  • Дата рождения
  • Адрес
  • Телефон
  • Информация о братьях и сестрах: год рождения и имя
  • Спортивные результаты
  • Увлечения
    Предусмотрены и разнообразные формы выдачи информации. Можно разыскивать и сортировать записи:
    • По фамилиям
    • По именам
    • По старшинству (самый старший -- в самом верху таблицы)
    • По дням рождения (тот, кто родился в январе, -- вверху таблицы)
    • По адресам

    Можно задать интервал, скажем, с 1 по 10 ноября, и компьютер выберет всех, у кого в это время будет день рождения.
    Можно узнать рекорды школы или класса по различным видам спорта, выдать список умеющих вязать или, скажем, список собирающих баночки из-под сока.
    Наконец, можно узнать:

  • У кого есть братья
  • У кого есть сестры
  • У кого есть младшие братья или сестры
  • У кого есть старшие братья или сестры

Уф-ф! Кажется, всё!..

Перед тем, как начать поиск, компьютер в большинстве случаев спросит вас, какого сорта информацию вы хотите получить: обо всех учениках, внесенных в базу, или только об одном конкретном классе. Исключение составляет лишь поиск тех, кого надо поздравить с днем рождения. Здесь всегда просматривается вся база.

Конечно, можно сказать, что эта система несовершенна. А вдруг мне понадобятся фамилии лучших бегунов среди филателистов? Или всех, у кого есть не только брат или сестра, но еще и говорящий попугайчик?.. А вот тут мы с приятелем поспорили, что на улице Полуночной все держат собак... Информация обо всем этом в компьютере есть, но получить ее с помощью имеющихся запросов невозможно. Необходима специальная программа составления новых запросов.

Естественно, от вас потребуется умение не только правильно выбирать пункт меню, но еще и грамотно написать запрос. Впрочем, в тех случаях, когда создатели ИПС думают об удобстве пользователей, а не о собственных удобствах программирования, это настолько несложно, что вы разберетесь в ее языке запросов буквально в первые же минуты.

Вопросы и задания

  • 1. Что такое база данных?
  • 2. Что такое СУБД? Что такое ИПС?
  • 3. Что такое банк данных?
  • 4. Какие операции можно производить с данными, хранящимися в базе данных?
  • 5. Что является объектом в базе данных "Почтовые марки"? Какие признаки объекта в этой базе данных вы считаете целесообразным рассматривать?


§ 14. Телекоммуникации

Мы уже довольно долго изучаем, как создают и редактируют электронные документы. Это и графические изображения, и тексты, и электронные таблицы, и базы данных.

Видимо, ни у кого не возникает сомнения, что электронные документы нужны не только их создателю.
И отчет, и деловое письмо, и результаты расчетов, производимых на компьютере, разумеется, необходимы
и другим людям. Как же их можно передать?

Конечно же, можно перевести электронные документы в обычный бумажный вид и переслать бумажку обычной почтой. Можно вывести картинки на видеопленку или слайды и в дальнейшем работать с ними.
Но, потеряв электронный вид, созданные нами документы теряют и чрезвычайно полезное свойство -- легкость редактирования.

Кроме того, редакции многих газет и журналов теперь принимают статьи и заметки только в электронном виде.

Итак, возникает проблема передачи документов в электронном виде с одного компьютера на другой.

Самое простое решение -- скопировать файл на дискету (или на несколько) и перенести на другой компьютер. На протяжении многих лет это и был наиболее популярный и доступный путь передачи электронных документов. Но дискета не всегда удобна, как средство передачи информации, особенно если этой информации много или приходится пересылать ее по почте, которая не отличается оперативностью.

И уж, конечно, никакие дискеты не помогут, если мы хотим, чтобы группа людей одновременно работала с одним и тем же документом или с одной и той же базой данных. А это в современном мире требуется постоянно. Достаточно зайти в крупный магазин и посмотреть, как кассиры используют банковскую базу данных, проводя расчеты с покупателями по электронным кредитным карточкам.

Если компьютеры находятся недалеко друг от друга, их можно соединить, воспользовавшись либо кабелем, очень похожим на телевизионный, либо специальным проводом, называемым витая пара, либо оптоволоконным кабелем. Потребуются еще и специальные сетевые платы, и соответствующее программное обеспечение. Такое соединение называется локальной компьютерной сетью.

Соединить же два компьютера, находящиеся на расстоянии не более 10 метров, вообще может каждый из вас, воспользовавшись дешевым так называемым нуль-модемным кабелем и стандартными разъемами, которые есть в каждом компьютере (если вдруг надумаете это делать, не забудьте вначале выключить оба компьютера из электросети!).

Ну а что делать, если необходимо подключить к тому же банковскому компьютеру далекий магазин? И нельзя ли безо всяких дискеток и почты переслать электронный документ в другой город или даже на другой континент?

Разумеется, можно, но для этого необходимо каким-либо образом соединить передающий и принимающий компьютер.

Давайте подумаем, есть ли какая-нибудь всемирная электронная коммуникационная сеть, доступная буквально каждому? Ну конечно же, это телефонная сеть, которая более чем за сто лет своего развития дотянулась практически до всех уголков Земли.

Но телефонная сеть, именно в силу своей "древней" природы, не предназначена для того, чтобы компьютеры пользовались ею напрямую. Необходимо специальное устройство, которое преобразует их язык (а это, если вы помните, язык нуликов и единичек) в телефонные сигналы и наоборот.

Преобразование компьютерных сигналов в телефонные называется модуляцией, а телефонных в компьютерные -- демодуляцией. Поэтому соответствующие устройства и называются модемами
(МОдуляция -- ДЕМодуляция). Схема связи двух компьютеров приведена на рис. 13.

Рис. 13. Схема связи двух компьютеров по телефонной линии

Внимательно приглядевшись к этой схеме, вы наверняка поймете, что оба компьютера в момент приема-передачи сообщения должны не просто быть включенными, но и работать с программой приемки-посылки сообщений.

Это не очень-то удобно. Нужно специально договариваться, одновременно запускать одну и ту же программу, мучительно ждать, пока закончится процесс передачи (а по обычным телефонным каналам скорость передачи даже теоретически не может быть выше 28 800 бит в секунду), повторять передачу, если произошел обрыв связи...

Одним словом, прямое использование телефонных линий для связи двух абонентов, особенно если они находятся в разных городах, не такое уж простое дело. И, конечно, не подходит для того, чтобы русский мальчик Ваня черкнул своему заокеанскому другу Джонни пару-другую приветственных строчек.

Выходом из такого положения явилось создание глобальных компьютерных сетей, буквально перевернувших наше представление об обмене информацией.

Для того чтобы понять принцип их организации, забудем на время о компьютерах, модемах, телефонных линиях и вспомним про обычную почту. Здесь вот уже более столетия предлагают такую услугу, как абонент-ский почтовый ящик.

Это означает, что вся ваша корреспонденция будет аккуратно складываться в специальный почтовый ящик, находящийся прямо в здании почты, а не доставляться вам на дом.

С одной стороны, мы лишаемся доставки на дом, с другой -- письма, газеты и журналы ждут нас в надежном месте и точно не пропадут.

Обычно абонентскими ящиками пользуются люди и организации, которые ведут большую переписку и почтовый обмен. Обратите, например, внимание на почтовые адреса газет, журналов, телевидения, многих фирм.

Существенно то, что, во-первых, эти адреса очень короткие (например: Россия, Екатеринбург, 620147, а/я 145), а во-вторых, можно не заботиться о сохранности своей корреспонденции и спокойно уехать хоть на полгода: ваша почта будет ждать вас в здании почтового отделения.

Вот на принципах абонентских почтовых ящиков и построена так называемая электронная почта, или E-mail.

Роль почтовых отделений в ней играют мощные, круглосуточно работающие компьютеры, которые находятся во многих городах и соединены между собой не только обычными телефонными проводами, но и специально проложенными кабелями для цифровой связи и даже спутниковыми каналами связи (см. рис. 14).

Рис. 14

Эта система и называется глобальной компьютерной сетью.

Для того чтобы воспользоваться услугами электронной почты, необходимо заказать на одном из таких компьютеров (их еще называют серверами) абонентский ящик, куда и будет приходить вся адресованная вам корреспонденция. Физически ваш ящик представляет собой область на жестком диске, то есть винчестере.

Поскольку серверы компьютерной сети работают круглосуточно, нет никакой необходимости договариваться с кем-либо о приеме сообщений. Достаточно связаться по модему в удобное для вас время с сервером, получить свою почту и отправить собственные сообщения (электронные документы).

Теперь вернемся к вопросу об адресе.

Адресуя обычное письмо, необходимо указать страну, город, почтовое отделение, улицу, дом и квартиру. Первые три реквизита, между прочим, определяют не только географическое положение получателя, но и почтовые службы, которые займутся вашим письмом.

В стране назначения его получит поначалу почтовое ведомство, занимающееся международными отправлениями, затем оно попадет в обще-городской почтамт, сортирующий корреспонденцию по отделениям связи, и лишь затем оно окажется на ближайшей к адресату почте и его доставят на дом.

Такой принцип построения службы называется иерархическим. По иерархическому принципу построена и электронная почта. Но эта иерархия весьма отдаленно связана с географией.

Во-первых, глобальные сети изначально создавались отнюдь не для того, чтобы Ваня мог написать Джонни, а для стратегического управления вооруженными силами и крупными транснациональными компаниями.

Понятно, что при таком построении сетей было совершенно не важно, в какой стране находится абонент. Важно лишь то, какой сервер его обслуживает.

А во-вторых, глобальных сетей много, созданы они на основе различного оборудования и программного обеспечения, каждая использует свою систему кодировки и пересылки информации (которая называется протоколом информационного обмена). Потребовались значительные усилия для того, чтобы объединить почти все глобальные сети в единое целое, называемое сейчас Интернет.

Итак, адресуя сообщение по Интернет, мы должны, во-первых, сообщить компьютеру, какой глобальной сети необходимо передать сообщение, во-вторых, какому "главному" серверу в этой сети, в-третьих, должен ли этот сервер отправить сообщение "менее главному" серверу, в четвертых ... одним словом, указать все иерархические уровни абонента. Заметим, что и в случае обычного почтового отправления мы делаем примерно то же самое.

Этих иерархических уровней обычно не так уж и много: 3--5, и электронный адрес выглядит гораздо короче вашего почтового адреса. Например: Billt@tenet.edu, или Shaynes@monroe.lib.mi.us, или 2170@dialup.mplik.ru. Значком @, как правило, отделяется идентификатор конечного пользователя, то есть присвоенные нам позывные на ближайшей станции электронной почты.

За время работы с компьютером вы убедились, что это не просто дорого-стоящая игрушка, заменяющая пишущую машинку, калькулятор, записную книжку и альбом для рисования, но и принципиально новый инструмент обработки информации. Он предоставляет человеку множество ранее недоступных возможностей.

И несмотря на то, что наш рассказ об электронной почте очень краток, он все же был бы неполным без описания, хотя бы частичного, тех поистине фантастических возможностей, которые немыслимы при использовании обычной почты.

Началось с того, что крупным фирмам -- абонентам электронной почты -- показалось утомительным рассылать во все концы света однотипную информацию о своих товарах и услугах, отвечая на запросы клиентов. Они совершенно логично рассудили, что, поскольку серверы все равно работают круглосуточно, пусть все желающие получат доступ к рекламным электронным документам и, если требуется, скопируют их на свой компьютер.

Дальше -- больше. Как вы помните, электронные документы -- это не только странички текста, но и картинки, и базы данных, и электронные таблицы, и файлы с мультипликацией, и даже оцифрованный звук.

Представьте себе рекламный буклет, полный не только текста и картинок, но и мультиков со звуком!

А чтобы такой электронный буклет было удобно листать, воспользовались довольно старой идеей гипертекстовых документов. Теперь, когда вы знаете, что такое электронная таблица, вы безо всякого труда разберетесь и с их принципом работы.

Итак, гипертекстовая страничка тоже состоит из видимого и подвального этажей. На видимом располагается самый обычный текст и самые обычные картинки. При этом отдельные слова и картинки выделены особо. Это означает, что под этими элементами страницы находятся ссылки на другие электронные документы или даже на целые программы, которые будут выполнены в случае выбора этого слова или этой картинки.

Что же располагается в подвале, какие бывают ссылки?

Самая простая ссылка -- переход к другим страницам или к другому документу. Не очень сложно организовать показ картинки, мультика, прослушать записанный звуковой фрагмент. Можно даже переадресовать пользователя к другому гипертекстовому документу на другом сервере, расположенном, быть может, за тысячи километров.

Возможна, как мы уже говорили, активизация специальных программ. Чаще всего это программы пересылки файлов. Так, практически все мировые производители комплектующих для компьютеров совершенно бесплатно распространяют новейшее программное обеспечение, необходимое для их работы (такие программы называются драйверами).

Любители компьютерных игр могут, невзирая на расстояние, сыграть с несколькими (даже с сотнями) соперниками-партнерами.

И, наконец, относительно недавно начали работу электронные магазины, в которых вы можете познакомиться с товаром и заказать приглянувшуюся вам вещицу с доставкой на дом. Система гипертекстовых страниц, располагающихся на серверах и позволяющих с легкостью странствовать по всем закоулкам глобальных компьютерных сетей, называется World Wide Web -- всемирной паутиной. Странички же называются WWW-страницами.

Существует довольно-таки много гипертекстовых редакторов и соответствующих им стандартов форматов страниц. Понятно, что просто необходимо было выбрать один из них, чтобы обеспечить всем желающим беспрепятственное путешествие по электронной паутине. Таким стандартом стал HTML-стандарт. (Hyper Text Markup Language -- гипертекстовый язык "отмеченных" объектов.)

Во время проведения лабораторных работ мы с вами поближе познакомимся с одним из гипертекстовых редакторов.

Конечно, мы не рассказали даже о десятой доле возможностей глобальных сетей. Но, будем надеяться, вы уже поняли, что и здесь новые компьютерные технологии не ударили в грязь лицом, далеко оставив позади информационные возможности обычной почты.


§6. Сложное условие

До сих пор, рассуждая о высказываниях, мы считали эту тему настолько простой, что и пары слов про них не сказали. Пора восстановить справедливость.

Проанализируем, к примеру, известное высказывание:

Пить и курить – здоровью вредить!

Любой человек понимает, что и пить вредно, и курить. Но, с точки зрения БИ, знаменитое высказывание означает вред питья и курения одновременно. Иными словами, эта народная мудрость не утверждает, что при любых обстоятельствах курить вредно. Вот если еще и пьешь – тогда конечно! Так что для БИ эту мудрость следовало бы написать так:

Пить или курить – здоровью вредить!

Коварная игра союзов "и" и "или" испортила программистам много нервов. И не только программистам. Очень многие люди, пользующиеся самыми различными информационно-поисковыми системами и электронными справочниками, тоже зачастую получают неверную информацию из-за неправильно сформулированного запроса.

Как вы думаете, какую информацию получит пользователь ИПС "Пульс цен", заказав поиск информации о товаре по следующему запросу:

Двухкамерный холодильник или производитель – фирма "Норд".

Не надо обладать большим воображением, чтобы представить, как в ответ на этот запрос система засыпает беднягу данными вообще обо всех двухкамерных холодильниках с полным перечнем предложений всех фирм, торгующих продукцией "Норда" в придачу. А все потому, что в запросе стоит неправильный союз. И просто счастье, что незадачливый пользователь ограничился всего лишь двумя характеристиками. А если бы он решил проявить свою "компутерную грамотность" и составил нечто вроде:

Двухкамерный холодильник или производитель – фирма "Норд" или цена не выше 3 тыс. руб.?

После такого запроса можно долго разбирать выданный системой многокилобайтный список товаров.

А ведь достаточно поменять союз "или" на союз "и", и система вряд ли найдет более пяти-шести предложений необходимого товара.

Если эти примеры не очень убедительны, рассмотрим высказывания:

    Завтра будет ветер и пойдет дождь.

    Завтра будет ветер или пойдет дождь.

Первый прогноз оправдается в единственном случае – будет дождь с ветром. Второй предсказывает либо сухую ветреную погоду, либо дождливую без ветра, либо, что совсем неприятно, дождь и ветер вместе.

А теперь рассмотрим программу:

Если (вы нарвали яблок у соседа в огороде
И не знаете, куда бы их на время положить,)

    то { не давайте их соседу,
    (* он не скажет вам спасибо *);
    съешьте вы их лучше сами потихоньку, за углом;}

Автор, как и прежде, Г. Остер. Разберемся с программой по существу.

Яблоки не даются соседу и потихоньку съедаются за углом только в том случае, когда одновременно выполняются оба условия: они нарваны у соседа и неизвестно, куда их ненадолго положить. Своими яблоками, стало быть, соседа вполне можно угостить. Немного парадоксальнее то, что в этом стихотворении не возбраняется дать соседу яблоки, собранные в его огороде, если у вас есть, куда их на время положить.

Одним словом, высказывание, от которого зависит, выполняются или не выполняются операторы, идущие после слов то или иначе, может быть довольно-таки сложным, состоящим из нескольких, объединенных союзами "и" и "или".

Давайте сформулируем правила обращения с этими союзами.

Вспомним, что если высказывание истинно, то выполняются операторы, стоящие после то, а если высказывание ложно, то выполняются операторы, идущие после слова иначе.

Итак, пусть высказывание получено из двух, соединенных союзом "и". Каждое из этих двух высказываний может быть истинным или ложным. Тогда получается следующая система равенств, в которой вместо каждого высказывания написано его возможное значение – "истина" или "ложь":

    "истина" и "истина"= "истина"

    "истина" и "ложь" = "ложь"

    "ложь" и "истина" = "ложь"

    "ложь" и "ложь" = "ложь"

Например, высказывание: "Я был сегодня на всех уроках и получил пятерку" – истинно только тогда, когда истинны оба высказывания. Полуправда тут не допускается, и если пропущен хотя бы один урок, то никакая пятерка не спасет: все вместе будет ложью.

Для союза "или" получается такая система равенств:

    "истина" или "истина"="истина"

    "истина" или "ложь"="истина"

    "ложь" или "истина"="истина"

    "ложь" или "ложь"="ложь"

Например, высказывание легендарного Дадона: "Или бес в тебя ввернулся, или ты с ума рехнулся" – ложно только тогда, когда мудрец звездочет и с ума не рехнулся, и бес в него не вворачивался.

Кроме союзов, есть еще частица "не". Ее действие очень простое: она каждое истинное высказывание превращает в ложное, но зато ложное становится истинным. Так что таблица здесь состоит всего из двух строк:

    не "истина"="ложь"

    не "ложь"="истина"

Поскольку Паркетчик принадлежит к дружному семейству Бездумных Исполнителей, то его язык полностью соответствует тем правилам, которые мы только что разобрали. Именно поэтому так странно и не совсем по-русски записываются знакомые нам отрицания высказываний:

    Не справа стена

    Не слева стена

    Не снизу стена

    Не сверху стена

Конечно, в сложных высказываниях может быть не один союз, а много. И частица "не" может переплетаться с ними довольно причудливыми способами. Мы пока такие высказывания рассматривать не будем. Всему свое время.

Добавим только, что выписанные выше системы равенств для союзов "и" и "или", а также частицы "не" называются таблицами истинности.

Подведем итоги

С помощью союзов "и" и "или", а также частицы "не" можно получать сложные высказывания из более простых.

Истинность или ложность сложного высказывания можно установить, зная истинность или ложность входящих в него простых высказываний. Для этого пользуются таблицами истинности.

Вопросы и задания

а) Еще одно стихотворение-алгоритм Г. Остера надо переписать в форме, о которой мы договорились:

    Если вы еще нетвердо
    В жизни выбрали дорогу
    И не знаете, с чего бы
    Трудовой свой путь начать,
    Бейте лампочки в подъездах,
    Люди скажут вам: "Cпасибо", —
    Вы поможете народу Электричество беречь.

б) Посмотрите свое решение задачи из пункта а. В нем в условном операторе записано два высказывания, соединенных союзом "и". Разберитесь, правильный ли союз здесь употреблен. Ответ обоснуйте. Какой общий вывод можно сделать о высказывании вида А и А, где буквой А обозначено какое-то высказывание?

в) Аналогично пункту а творчески переработайте еще два произведения Г. Остера, разобравшись, правильно ли в них стоят союзы.

    Если ты попал в больницу
    И не хочешь там валяться,
    Жди, пока к тебе в палату
    Самый главный врач придет.
    Укуси его, и сразу
    Кончится твое леченье,
    В тот же вечер из больницы
    Заберут тебя домой.

    Если вы по коридору
    Мчитесь на велосипеде,
    А навстречу вам из ванной
    Вышел папа погулять,
    Не сворачивайте в кухню,
    В кухне твердый холодильник,
    Тормозите лучше в папу,
    Папа мягкий. Он простит.


§7. Вспомогательный алгоритм

или подпрограмма

Вспомним наши первые занятия, посвященные Бездумным Исполнителям. На них мы узнали, что не имеет смысла говорить о БИ, не определив его Систему Команд и операционную среду. Система Команд конкретного БИ называется языком БИ. Возникает вопрос: можно ли обогатить этот язык новыми словами, и если да, то каким образом?

В §2 "Что такое алгоритм", есть интересная задачка номер 9. Если вы ее все еще не читали – прочитайте и вдумайтесь в содержание. Одна и та же задача – сходить в булочную и купить хлеба – приводит к совершенно различным алгоритмам. Для вас достаточно написать:

Сходить в булочную за хлебом;

Для младшего брата, возможно, потребуется довольно-таки сложная программа, объясняющая, где находится хлебный магазин, как выбирать хлеб и что делать с деньгами. Но если братик будет ходить за хлебом постоянно, ему тоже можно будет через некоторое время написать программу, состоящую всего лишь из одной команды.

Иными словами, несколько команд для БИ могут быть иногда "свернуты" в одну, более емкую. При этом в Системе Команд БИ (в нашем случае у младшего братика) появляется новая команда. Однако так бывает не всегда. Например, команда

Приготовить торт "Птичье молоко";

для большинства хозяек требует расшифровки, даже если команда выполняется и не в первый раз. Более емкая команда здесь не встраивается в Систему Команд БИ, а просто вызывает ссылку на подробную расшифровку в книге кулинарных рецептов. Расшифровка, разумеется, должна содержать только команды из прежней Системы Команд БИ.

Таким образом, существует два пути расширения Системы Команд БИ.

  • Первый путь, "путь младшего брата":

Программа, содержащая команды из старой Системы Команд, объявляется новой командой и намертво встраивается в уже новую Систему Команд.

Типичный пример такого пути – обучение езде на велосипеде. Поначалу вам подробно объясняют, как сидеть в седле, а самое главное – убеждают поворачивать руль в сторону предполагаемого падения. А затем вы просто забываете об этом: ваши руки делают все уже чисто автоматически.

  • Второй путь, "путь кулинарной книги". В этом случае Система Команд на самом деле не меняется:

Создается как бы новая команда, которая является просто ссылкой на уже существующую программу, записанную в исходной Системе Команд БИ.

Первый путь называется определением нового оператора.

Второй — созданием вспомогательного алгоритма.

Вспомогательный алгоритм, написанный с использованием исключительно Системы Команд конкретного БИ, называется подпрограммой.

Может возникнуть подозрение, что вспомогательный алгоритм нужен только потому, что человек не в силах запомнить наизусть книгу кулинарных рецептов, разнообразные пособия "Сделай сам" и тому подобное. Однако это не всегда так.

Откроем полюбившуюся нам книгу кулинарных рецептов, и обнаружим, что очень многие мясные блюда, скажем, тушеная баранина, просто немыслимы без , например, белого соуса. И совершенно ни к чему десяток раз описывать, , как его приготовить. Достаточно в нужном месте просто сослаться на страницу, где находится его рецепт.

Иными словами, если в разных местах программы есть совершенно одинаковые повторяющиеся последовательности команд, имеет смысл объявить одну такую последовательность подпрограммой и облегчить себе работу по написанию программы.

Облегчится не только написание, но и чтение программы. И мы с вами в этом очень скоро убедимся.

Но сначала ненадолго вернемся к нашим тушеным баранам.

Встретив в рецепте фразу "Приготовить 200 граммов белого соуса", хозяйка, как истинная БИ, бросится его готовить, быть может, даже забыв в предпраздничной суете, зачем этот соус нужен. Ничего страшного не случится. Главное – чтобы она помнила количество: 200 граммов. В лучшем случае она даже может перепоручить это дело кому-нибудь другому, написав на бумажке заветное число: "200 г".

Мы тоже будем считать, что БИ напрочь забывает все из основной программы, приступая к выполнению подпрограммы.

Единственное, что следует помнить, – это количество белого соуса, которое надо приготовить. Иначе говоря, в подпрограмме должна быть заранее подготовлена коробочка для необходимой ей информации. Дело БИ – эту коробочку заполнить, прежде чем по уши уходить в подпрограмму. БИ уподобляется при этом рассеянному профессору, который сам себе писал письма с напоминанием, что требуется сделать. Ну что ж, хоть и бездумный, а все же чем-то смахивает на профессора...

Но вот белый соус приготовлен. Пора вспомнить, зачем же это делалось, и продолжить приготовление праздничного ужина. Как же объяснить БИ, что подпрограмма закончилась и надо возвращаться в программу?

И здесь нам самое время вспомнить о фигурных скобках. Они окаймляют несколько операторов, например, в операторе Делать пока (и за одно это достойны называться операторными), и показывают, что все операторы в теле цикла могут рассматриваться как один бо-о-ольшой оператор, состоящий из нескольких операторов.

Точно так же и операторы подпрограммы заключаются в такие же скобки, объединяющие их в единое целое. А называется эта совокупность операторов подпрограммы телом подпрограммы.

При написании программы для БИ подпрограмма в отличие от оператора цикла выносится за пределы главной программы. Этим, в частности, и объясняются не совсем вам понятные фигурные скобки, окаймляющие тело самой главной программы.

О подпрограммах можно рассказать еще много интересных вещей, но давайте для начала познакомимся с тем, как они применяются в работе любимого нами Паркетчика.

Задача (выращиваем лютики-цветочки)

На поле произвольных размеров достаточно далеко друг от друга и от стен располагаются зеленые плитки. Требуется из каждой зеленой плитки вырастить цветочек так, как это показано на рис. 19.

Рис. 19

Конечно, вы уже достаточно опытные "паркет-программисты", чтобы с ходу понять, как решать такую задачу. Напишем проект решения:

    Обежать все поле;
    В процессе обегания
    Если (з) то {Нарисовать цветочек;}

На следующем этапе нам придется переводить все операторы проекта в команды из СК Паркетчика. И, как вы уже поняли, не самая сложная, но самая кропотливая часть работы – это рисование самого цветочка.

Вспоминая о прихотях заказчиков, можно предвидеть, что завтра их не устроит вид цветочка и программу придется переписывать.

Чтобы хоть немного облегчить свой труд, воспользуемся механизмом подпрограммы. Итак, начнем:

    Программа {
      Делать пока (НЕ сверху стена)
      {
        Шаг вверх; (* Первую строку можно не обегать *)

        (* Обегание строки, на которой стоишь *)
        Делать пока (НЕ справа стена)
        { Шаг вправо;
          Если (З) то {Нарисовать цветочек}
        }
        (* Конец обегания строки, на которой стоишь *)
        Вернуться на ту плитку, с которой начинал;
      }
}

Вместо оператора

    Вернуться на ту плитку, с которой начинал;

надо будет вставить простенький цикл, а вот оператор Нарисовать цветочек можно оставить практически в том же виде, в каком он и есть.

Естественно, Паркетчику как-то надо сообщить о том, что описание нового оператора необходимо найти в подпрограмме с соответствующим именем:

    Программа {
    Делать пока (НЕ сверху стена)
    { Шаг вверх; (* первую строку можно не обегать *)
      (* Обегание строки, на которой стоишь; *)
      Делать пока (НЕ справа стена)
      { Шаг вправо;
        Если (З) то {Вызвать Цветочек;}
      } (* конец обегания строки, на которой стоишь *)
      (* Вернуться на ту плитку, с которой начинал*)
      Делать пока (НЕ слева стена)
      { Шаг влево;
      }
    }
}

Подпрограмма Цветочек

    {
    ...........
    }

Операторы Вызвать и Подпрограмма являются стандартными , поскольку аналогичные им команды есть в СК практически всех БИ. Стандартные операторы мы, как обычно, подчеркиваем.

Работая с Паркетчиком, вы, наверное, неоднократно сталкивались с тем, что он отказывается воспринимать команды, отсутствующие в его СК. Именно для того, чтобы он с ходу не отметал непривычные команды, и существует оператор Вызвать. Он отсылает Паркетчика на поиск подпрограммы, где незнакомый оператор расшифровывается известными ему операторами.

Подведем итоги

  • Система команд конкретного БИ называется языком БИ.

  • Этот язык можно пополнить новыми словами двумя способами.

    Первый способ: определить новый оператор, заставив БИ на веки вечные его запомнить.

    Второй способ: создать подпрограмму, которая сообщается БИ вместе с основной программой.

  • В жизни встречаются различные БИ. Некоторые допускают оба пути пополнения своего языка, некоторые – только первый, некоторые – только второй. Автоматическая стиральная машина вообще не допускает изменения своего языка.

  • Подпрограммой называется программа, снабженная заголовком, позволяющим исполнителю обратиться к ней из главной программы или другой подпрограммы.

  • Переход к исполнению подпрограммы осуществляется командой Вызвать подпрограмму (по ее имени). По окончании подпрограммы происходит возврат в главную программу или подпрограмму, откуда произошел переход в выполненную подпрограмму.

  • Вся последовательность команд, из которой состоит программа или подпрограмма, заключается в операторные скобки и называется телом программы (подпрограммы).

Вопросы и задания

1. Напишите подпрограмму Цветочек, нарисовав его, быть может, по собственному вкусу, и запустите получившуюся программу.

2. Для того чтобы не загромождать основную программу второстепенными деталями, организуйте еще две подпрограммы:

    СТРОКА (обегание строки, на которой стоишь) и

    НАЗАД (вернуться на ту плитку, с которой начинал).

Запустите на выполнение и эту программу. Не правда ли, структура главной программы, да и всего нашего творения, стала не в пример понятнее и нагляднее?

3. Как вы думаете, почему возникли именно такие названия: "вспомогательный алгоритм" и "подпрограмма"?

4. Приведите примеры определений новых операторов и создания вспомогательных алгоритмов для известных вам БИ.

5. а) Ниже приведена программа мытья посуды (чашек, блюдец, ложек) после чаепития:

Программа

    {ВызватьМыть (чашки);
    Вызвать Мыть (блюдца);
    Вызвать Мыть (ложки);
    } (* конец программы *)

Составьте подпрограмму Мыть(коробочка:посуда), если исполнитель понимает такие команды:

  • открыть кран;

  • закрыть кран;

  • взять посуду (по этой команде исполнитель берет со стола 1 предмет посуды);

  • вымыть посуду под краном (по этой команде исполнитель моет имеющийся у него предмет);

  • положить посуду в сушку (исполнитель кладет имеющийся у него предмет в сушку).

Совет: чтобы исполнитель наверняка перемыл всю посуду, вспомните о циклической форме организации действий.

б) Составьте программу мытья посуды после обеда, использующую подпрограмму Мыть(коробочка: посуда).

в) Программы, составленные в пунктах а и б, вполне годятся для домашнего робота БИ-001, о котором мы как-то упоминали. Составьте еще две-три программы для БИ-001, в которых использовалась бы циклическая форма организации действий и/или подпрограммы.


§8. Оператор Возврат

Продолжая тему выращивания растений, начатую нами в §7, рассмотрим следующую задачу.

Задача (выращиваем листочки-ягодки)

На поле произвольных размеров достаточно далеко друг от друга и от стен располагаются "семена" – зеленые и красные плитки. Требуется из каждой зеленой плитки вырастить листочек, а из каждой красной – ягодку так, как это показано на рис.1 (исходные плитки указаны синими стрелочками).

Рис. 20

Быть может, на первый взгляд она не очень-то отличается от последней разобранной нами задачи, но, если внимательно к ней присмотреться и хотя бы вчерне прикинуть решение, сразу станет ясной вся сложность нашего положения.

В предыдущей задаче каждая зеленая плитка являлась зародышем нового цветочка. Здесь же, прежде чем рисовать листочек или ягодку, мы должны проверить, не является ли встреченная плитка частью уже нарисованного ранее изображения.

Давайте, как обычно, напишем проект решения задачи, а затем подумаем, как перевести его на язык Паркетчика.

Итак:

Обежать все поле;
В процессе обегания
Если (з) то {Нарисовать листочек;}
Если (к) то {Нарисовать ягодку;}

Обсудим подробнее оператор

Нарисовать листочек;

Как уже говорилось, сразу бежать и рисовать листочек нельзя: а вдруг это не "семечко" – отдельно лежащая зеленая плитка. То есть вначале мы должны заняться проверкой, а нет ли еще плиток в клеточках возле встреченной зеленой плитки. Это можно сделать, прогулявшись по пути, изображенном стрелочками на рис. 21.

Рис. 21

Теперь предположим, что мы обежали вокруг этой злосчастной плитки и обнаружили, что она не одинока (как, например, плитка, отмеченная желтой стрелочкой на рис. 20 ). Что делать дальше? По идее, надо вернуться на плитку, которая проверялась, и продолжить бег по полю. То есть надо выскочить из блока операторов Паркетчика, которые будут соответствовать оператору Нарисовать листочек. Причем выскочить сразу, прекратив теперь уже никому не нужный процесс обегания плитки по периметру, то есть прервав проверку.

Паркетчик способен проявить такую акробатическую сноровку только в том случае, если оператору

Нарисовать листочек

будет соответствовать уже знакомая вам конструкция Подпрограмма. Выйти же из подпрограммы и вернуться в вызывающую программу (или подпрограмму) можно в любом месте, использовав новый для вас оператор Возврат.

Уделим все внимание подпрограмме, поскольку основная программа практически не отличается от программы, которую мы написали, решая задачу из §7:

Подпрограмма Листочек
{

    (* начало проверки плитки *)
    Шаг вверх;
    Если (з) то {Шаг вниз; Возврат;}
    Шаг вправо;
    Если (з) то {Шаг вниз; Шаг влево; Возврат;}
    Шаг вниз;
    Если (з) то {Шаг влево; Возврат;}
    Шаг вниз;
    Если (з) то {Шаг вверх; Шаг влево; Возврат;}
    Шаг влево;
    Если (з) то {Шаг вверх; Возврат;}
    Шаг влево;
    Если (з) то {Шаг вверх; Шаг вправо;Возврат;}
    Шаг вверх;
    Если (з) то {Шаг вправо; Возврат;}
    Шаг вверх;
    Если (з) то {Шаг вниз; Шаг вправо; Возврат;}
    Шаг вниз;
    Шаг вправо;
(* окончание проверки плитки *)
    ......
}

Далее, если Паркетчик ухитрился-таки не вернуться в вызывающую программу, можно смело рисовать листочек. Надеемся, это не составит для вас особого труда. Не забудьте только после окончания работы вернуться на "семечко", с которого начали свою работу. Естественно, как и раньше, вы можете придумать свой рисунок при условии, что в нем используются только зеленые плитки (кстати, почему?).

Операторы в фигурных скобках, предшествующие оператору Возврат, обеспечивают возврат Паркетчика на ту клетку, с которой следует продолжать обход всего поля.

Оператор Возврат, как и Подпрограмма, является стандартным. Его аналоги есть в СК практически всех БИ, поэтому мы его, как обычно, будем подчеркивать.

Подведем итоги

  • Для того, чтобы вернуться к исполнению той программы, из которой произошел переход в подпрограмму, не дожидаясь окончания подпрограммы (то есть до последней закрывающейся фигурной скобки), в подпрограмме ставится команда Возврат.

Вопросы и задания

Допишите подпрограмму Листочек и напишите аналогичную ей подпрограмму Ягодка (листочки и ягодки можете нарисовать по собственному вкусу). Напишите и главную программу, а затем заставьте Паркетчика вырастить листочки-ягодки. Не забудьте предварительно разбросать "семена".


§9. Как БИ работают с подпрограммами. Понятие о стеке

(Для дополнительного чтения)

Заканчивая программу выращивания листочков и ягодок, вы должны были написать две подпрограммы: Листочек и Ягодка, которые начинаются с одинакового блока проверки. И у вас наверняка возник вопрос, нельзя ли как-нибудь исхитриться и обойтись без мучительного повторения одних и тех же операторов. Нельзя ли, например, оформить их в отдельную подпрограмму Проверка и вызывать в нужном месте?

Давайте посмотрим, как могло бы выглядеть взаимодействие программ и подпрограмм в этом случае (см. рис. 22 ).

То есть оператор Возврат из подпрограммы «Проверка» катапультирует нас отнюдь не в главную программу, как хотелось бы, а на тот оператор, который следует непосредственно за оператором Вызвать. И, стало быть, мы обрекаем Паркетчика на заведомо неудачное выращивание рассады, которое закончится ошибкой во время исполнения (кстати, а какой?).

А нельзя ли заставить Паркетчика возвращаться из подпрограммы Проверка сразу в главную программу?

И сейчас самое время рассказать о том, как практически все Бездумные Исполнители работают с подпрограммами.

Мы уже говорили о том, что подпрограмму можно вызывать не только из главной программы, но и из любой другой подпрограммы. Вполне возможно, что во время работы БИ перешел из главной программы в подпрограмму, затем, не возвращаясь, приступил к выполнению еще одной подпрограммы, из второй подпрограммы последовал вызов в третью... Как же БИ ухитряются не запутаться и всегда возвращаться именно в то место, откуда произошел последний вызов?

Дело в том, что БИ записывают те места, куда им надо возвращаться, то есть адреса возвратов в специальную записную книжечку. Но эта книжечка устроена по-особому (см. рис.23 ).

Рис. 23. Стек возвратов.

Можно представлять, что она похожа на коробочку с пружинкой на дне. В реальной жизни именно так устроен рожок автомата. Быть может, вы сможете привести и менее милитаризованный пример.

Тот предмет, который мы положим в эту коробочку


§10. Передача параметров в подпрограмму

Наш рассказ о подпрограммах будет неполным, если мы не рассмотрим еще одну замечательную возможность, связанную с ними. А для этого, как обычно , рассмотрим задачу, с которой как-то раз столкнулся Паркетчик:

Задача

(различаем форму зала и делаем бордюр разных цветов)

По периметру поля произвольных размеров требуется выложить красные плитки в том случае, если его ширина больше, чем высота, или зеленые плитки, если высота больше ширины. Квадратное поле требуется оставить без изменений (см. рис. 24 а и 24 б).

Рис.24а

Рис.24б

Чтобы не запутаться, мы ни в коем случае не будем пытаться с ходу писать программу для Паркетчика, а подробно разберемся в том, как решать задачу, составив проект ее решения.

Итак,

Проект решения задачи в первом приближении

(в дальнейшем будем называть этот проект проектом первого уровня)

Определить тип поля;
Если (ширина больше высоты) то

    {Выложить красный бордюр;}

Если (ширина меньше высоты) то
    {Выложить зеленый бордюр;}

Внимательно приглядевшись к проекту, не очень стойкие Паркет- программисты могут не на шутку затосковать. И причины для этого, скажем прямо, серьезные. Во-первых, непонятно, как определять тип поля, а во-вторых, придется, похоже, дважды писать практически одинаковые блоки по выкладыванию бордюра, заменив только операторы Положить (к) операторами Положить (з).

Ну, с первой проблемой можно справиться, если привлечь свой природный ум и сообразительность, а со второй...

Однако давайте по порядку.

Итак, как может Паркетчик, не считая клеточки по горизонтали и вертикали, понять, с каким полем он имеет дело?

Ну, хорошо, зададим вопрос определеннее: куда упрется биссектриса левого нижнего угла в случаях, изображенных на рис. 24 а и 24 б?

И завершающий вопрос: можно ли заставить Паркетчика бежать по биссектрисе угла?

Конечно же, это очень просто: надо организовать цикл из операторов

    Шаг вправо;
    Шаг вверх;

Если по окончании этого цикла Паркетчик наткнется на стену справа, то нужно рисовать зеленый бордюрчик. Если на стену сверху – то красный.

Если стена будет и сверху, и справа, то ничего рисовать не надо.

Будем считать, что с первой и самой важной проблемой мы разобрались. Теперь очень бы не хотелось дважды писать практически одинаковые куски программы. К тому же сегодня попросили выложить бордюр, а завтра надо будет закрасить вообще все поле, и одинаковые блоки станут просто неприлично большими.

Для того чтобы понять, как избавить себя от лишней работы, вернемся немного назад. Все к тем же тушеным баранам и белому соусу из §7. Как вы помните, там фигурировала коробочка, в которую этот соус и помещали по мере готовности. Мало того, быть может, вы даже решали задачу 5а, помещенную после рассказа о вспомогательном алгоритме или подпрограмме.

Быть может, именно использование механизма коробочки поможет нам как-нибудь избежать лишнего труда?

Скажем, было бы очень неплохо положить туда зеленую или красную краску, а уж Паркетчик просто красил бы бордюрчик тем, что дали.

Соответствующие операторы на языке Паркетчика выглядят следующим образом:

Предположим, в главной программе мы определили, что красить бордюр надо красным цветом. Тогда необходимо оформить вызов подпрограммы так:

Вызвать Бордюр(к);

Если бордюр должен быть зеленым, пишем:

Вызвать Бордюр(з);

Что же касается самой подпрограммы Бордюр, то ее заголовок выглядит так:

Подпрограмма Бордюр(короб:ц)
{ ...

    Положить (ц);
    ...
}

То есть тогда, когда надо положить какую-либо цветную плитку, мы заставляем Паркетчика обратиться к коробочке и посмотреть, а какая же в ней краска. В зависимости от того, как выглядел вызов подпрограммы, там может быть либо красная, либо зеленая краски.

Подведем итоги

  • В подпрограмму для Паркетчика через коробочку можно передавать цвет, которым в дальнейшем будут выкладываться плитки. Для этого в заголовке подпрограммы необходимо эту самую коробочку заказать, а при вызове соответствующей подпрограммы в круглых скобках определить тот цвет, который заполнит коробочку. Слово короб тоже является стандартным, и мы будем его подчеркивать.

Вопросы и задания

1. Напишите программу для Паркетчика, решающую рассмотренную только что задачу.

2. Наши самые дурные предчувствия оправдались: необходимо не только выложить бордюрчик, но и закрасить все поле. А именно:

Поле произвольных размеров требуется все целиком выложить красными плитками в том случае, если его ширина больше, чем высота, или все целиком выложить зелеными плитками, если высота больше ширины. Квадратное поле требуется оставить без изменений.

Подправьте немного подпрограмму Бордюр так, чтобы с ее помощью Паркетчик закрашивал вообще все поле.


§1. Переменные в языке Паркетчика

Вспомните, сколько хитрости и изворотливости пришлось нам применить, когда мы в §10 решали задачу о выкладывании бордюра на поле неизвестных размеров! И лишь потому, что наш Паркетчик не умеет считать. Как все было бы просто, если бы сначала он обежал поле, подсчитал количество столбцов и строк, а затем решил, какую рамочку выкладывать - красненькую или зелененькую.

Конечно, наше решение, в котором исполнитель бежит по биссектрисе угла, тоже довольно-таки простое и красивое. Но если каждый раз вместо того, чтобы без затей посчитать плитки или клеточки, мы будем исхитряться, обходя эту незамысловатую операцию, доступную даже первоклашке, то в один прекрасный момент рискуем окончательно сломать себе голову. Поэтому давайте-ка отправим нашего Паркетчика в первый класс, и пусть он поучится считать.

Как же учатся считать в первом классе? Прежде всего надо выучить число 1. Это очень важное число – во-первых, с него начинается ряд натуральных чисел, а во-вторых, каждое следующее число в этом ряде получается прибавлением единицы!

И, пересчитывая любые предметы, мы именно так и поступаем: какой-то предмет объявляем первым, а затем с каждым новым предметом увеличиваем уже имеющееся число на единицу.

Теперь самое время сказать, что в распоряжении Паркетчика находится склад, на котором он может взять коробочку, наклеить на нее этикетку и затем в процессе работы кидать в нее бусинки. Разумеется, бусинки можно и вынимать, а содержимое коробочек сравнивать между собой или с каким-либо натуральным числом.

В программировании такие коробочки с бусинками называются переменными. У каждой переменной обязательно есть имя, которое и записывается на этикетке в момент получения коробочки на складе. Паркетчик понимает имена, состоящие из русских букв и цифр или только русских букв, но без цифр. Всего в имени переменной не должно быть больше 8 символов. Начинаться же имя должно с буквы.

Самое важное действие над переменной состоит в том, что ей можно присвоить то или иное значение, например, 1. Если Столб – имя некоторой переменной, то указанное действие записывается так:

      Столб:=1;

Иными словами, из коробочки, на которой наклеена этикетка «Столб» вытряхиваются все бусинки, если они там есть, а затем кидается ровно одна.

Если переменная уже имеет какое-то значение, то его можно поменять. Для этого есть несколько путей. Можно просто присвоить переменной новое значение. Скажем,

      Столб:=7;

А можно указать, на сколько надо изменить исходное значение:

      Столб:=Столб+4;

Последняя запись означает, что к прежнему значению переменной надо прибавить 4 и результат снова присвоить переменной Столб. Или, говоря нашим прежним языком, в коробочку с именем Столб бросаются еще 4 бусинки. Естественно, после нескольких подобных операций будет уже невозможно установить, что же изначально было в коробочке Столб.

Поэтому, если нам хочется запомнить начальное значение переменной Столб, необходимо взять другую переменную, например, с именем Новая:

      Новая:=Столб+4;

Тогда в переменной Столб сохранится ее исходное значение, а переменная Новая будет иметь значение на 4 больше, чем переменная Столб.

Символы := означают, таким образом, не просто своеобразно написанный привычный вам знак равенства, а оператор присваивания. Алгоритм работы с этим оператором у Паркетчика следующий:

1. Вычислить, что получается в правой части оператора присваивания;

2. Вытряхнуть все бусинки из переменной, имя которой стоит в левой части оператора присваивания;

3. Количество бусинок, соответствующих результату, полученному в п.1, засыпать в вышеуказанную переменную.

Напомним, что Паркетчик выступает в роли первоклассника. Поэтому он знает только натуральные числа, число 0 (ноль) и умеет лишь складывать их, вычитать и умножать (действие умножения, он обозначает символом "*"). При этом он не поймет, если вдруг в процессе вычитания получится отрицательное число.

Кроме того, как уже говорилось, среди допустимых действий Паркетчика есть сравнение значений переменных друг с другом и с натуральными числами(больше, меньше, равно). Наконец, если мы захотим, Паркетчик сообщит значение интересующей нас переменной. Соответствующая команда выглядит так:

      Сообщить "уточняющее сообщение", имя переменной;

Вместо уточняющего сообщения можно писать любые слова, лишь бы в нем было не более 19 символов, считая пробелы.

Можно попросить Паркетчика сообщить просто некоторый текст. Соответствующая команда выглядит так:

      Сообщить "текст";

(кавычки подсказывают Паркетчику, что здесь записаны не имена переменных, а сообщение, которое надо просто выдать на экран).

Подведем итоги

  • Для выполнения вычислений используются переменные.

  • Каждая переменная имеет свое имя и может принимать разнообразные значения.

  • Для изменения значения переменной применяют операцию присваивания.

Вопросы и задания

1. Как Паркетчик различает переменные?

2. Как изменить значение переменной?

3. Какие допустимые действия над переменными может совершать Паркетчик?


§2. Еще раз о циклических алгоритмах. Оператор Делать от ... до....

Вернемся к приключениям любимого нами Тома Сойера. Напоминаем, что тетушка Полли, используя слабость своего племянничка к компьютерам, решила общаться с ним на соответствующем языке. А именно на языке Бездумных Исполнителей.

И раз уж мы взялись за облегчение ее жизни, то надо быть последовательными и ввести еще одну конструкцию цикла. Дело в том, что на огороде вызревает ровно десять грядок клубники. И гораздо проще прямо указать Тому, что требуется выполнить цикл по их поливу ровно десять раз:

Делать от номер:=1 до 10
{Подойти к "номер-ной" грядке клубники;
Полить "номер-ную" грядку клубники
}(* конец цикла *)

Конечно, здесь можно было обойтись и циклом Делать пока. Но отнюдь нелишним оказывается наше знание того, который раз выполняется цикл. Так, если Полли заботится о любимом племяннике, она могла бы написать:

Делать от номер:=1 до 10
{Полить "номер-ную" грядку клубники;
Если (номер=5) то {сесть отдохнуть минут пять; откушать несколько ягодок;}
}(* конец цикла *)

Как вы, наверное, уже поняли, что слово "номер" написано на коробочке, которая перед самым началом работы тщательно вытряхивается, и в нее кидается одна бусинка. А при каждом выполнении операторов, написанных в теле цикла, в эту коробочку дополнительно кидается еще одна бусинке.

Эта коробочка называется счетчиком цикла. Как только в коробочке станет 10 бусинок, операторы в теле цикла исполнятся последний раз.

Обратите внимание на отличия в записи двух выражений:

номер:=1 и номер=5.

Знак равенства с предшествующим двоеточием говорит о том, что содержимое коробочки «номер» будет изменяться. Знак равенства без двоеточия, использованный в проверке условия, означает всего лишь операцию сравнения содержимого этой коробочки с числом 5.

Бывает, что в счетчик цикла при каждом выполнении операторов из тела цикла кидается не одна бусинка, а две, три или даже больше. Например, если мы хотим занумеровать пять домов на четной стороне только что отстроенной улицы, выполним:

Делать
от ДОМ:=2 до 10 с шагом 2
{ Подойти к очередному дому;
Присвоить ему номер ДОМ;
} (* конец цикла *)

В результате выполнения этого цикла счетчик последовательно будет принимать значения 2, 4, 6, 8, 10. Такие номера и получат дома.

Слова Делать от ... до ... и с шагом являются стандартными, и, как обычно, мы будем их подчеркивать.

Чтобы "досрочно" закончить исполнение цикла, используют оператор Покинь. Встретив его, БИ приступает к выполнению оператора, следующего сразу за циклом.

Так, если забота тети Полли о племянничке перейдет всякие разумные границы, она вполне может написать следующее:

Делать
от номер:=1 до 10
{Полить "номер-ную" грядку клубники;
Если (номер=5 и уж очень устал) то {Покинь;}
}(* конец цикла *)
Идти купаться;

В этом случае Тому достаточно полить всего лишь пять грядок клубники и счесть себя смертельно уставшим, чтобы прекратить работу и идти купаться.

Подведем итоги

  • Довольно часто условие окончания цикла состоит в том, что тело цикла нужно выполнить некоторое заранее известное число раз. Тогда целесообразно применить конструкцию Делать от ... до ....

  • Для нового оператора цикла необходимо предварительно на складе получить коробочку-переменную для счетчика цикла.

  • Категорически запрещается внутри тела цикла изменять содержимое переменной цикла.

  • Оператор Покинь вызывает досрочное окончание цикла.

Вопросы и задания

1. Когда целесообразно использовать конструкцию цикла Делать от ... до

2. Для чего служит оператор Покинь?

3. Если назавтра снова захочется клубники, то можно, разумеется, опять воспользоваться тем же алгоритмом. Но ясно, что на первых грядках особенно не поживишься. Вот если начать с последней грядки, то чашка, конечно, наполнится много быстрее. Что ж, составьте нужный алгоритм.

4. Придумайте 2—3 программы для себя, в качестве БИ, с использованием операторов Делать пока, Делать от ... до ..., Покинь.

5. БИ умеет складывать одно число с записанным на доске и результат записывать на доску. Кроме того, он понимает все определенные нами конструкции.

а) Напишите для него программу сложения всех чисел от 1 до 20;

б) А теперь, чуть изменив программу, добейтесь того, чтобы БИ складывал все четные числа от 2 до 50.

6. Имеется N монет одного и того же достоинства, среди которых ровно одна фальшивая, отличающаяся от настоящей только весом. Составьте алгоритмы нахождения фальшивой монеты с помощью чашечных весов, если

а) известно, что фальшивая монета легче настоящей;

б) неизвестно, легче или тяжелей настоящей фальшивая монета.

7. Имеется N монет одного и того же достоинства, среди которых, возможно, встречаются фальшивые. Известно, что все фальшивые монеты имеют один и тот же вес, и он меньше, чем у настоящей монеты. Составьте алгоритм нахождения с помощью чашечных весов всех фальшивых монет в данном наборе (предполагается, что хотя бы одна настоящая монета в наборе есть).

8. В восьмидесятиквартирном доме 4 подъезда по 20 квартир в каждом. Почтовые ящики всех квартир одного подъезда располагаются на первом этаже. Составьте алгоритм раскладки почты в этом доме. (Совет: воспользуйтесь двойным циклом в форме Делать от ... до ....)

9. Нижеследующая программа заставляет Паркетчика пробежаться по первому ряду клеток и положить на них красные плитки:

Программа
цел: столб;

    {
      Делать от столб:=1 до 42
      {Перейти на (столб, 1);
      Положить (к);
      } (* конец цикла *)
    } (* конец программы *)

а) Проанализируйте программу, поймите, как на складе заказываются переменные и, немного модифицировав эту программу, добейтесь того, чтобы Паркетчик закрасил все поле.

(Указание: вам потребуется заказать еще одну переменную и, добавив еще один оператор, организовать двойной цикл.)

10. Напишите программу для Паркетчика, выполнив которую он узнает и сообщит размеры поля, на котором он работает.

11. Напишите программу для Паркетчика, выполнив которую он узнает и сообщит:

    а) количество зеленых клеток на поле;

    б) количество непокрытых клеток на поле.

12. Напишите программу для Паркетчика, выполнив которую он соберет с поля все зеленые плитки и выложит их одна за другой вдоль нижнего края поля.


§ 3. Передача содержимого переменных в подпрограмму.

Давайте вспомним задачу, решение которой мы разбирали в §10 предыдущей главы. Там мы, между прочим, тоже столкнулись с коробочкой, в которую загружался один из двух цветов. Затем содержимое коробочки передавалось в подпрограмму, и Паркетчик выкладывал один и тот же узор (а именно, бордюр) разными цветами.

Правда, эта коробочка существовала неявно: Паркетчику даже не надо было получать ее на складе. А жаль. Полученная на складе полноправная переменная, в которую можно было бы положить необходимую краску, имеет одно неоспоримое преимущество: на нее можно наклеить этикетку.

Казалось бы, что в этом особенного? Однако использование переменной типа «цвет» придает нашей программе совершенно новое качество...

Впрочем, давайте лучше сравним два решения: старое, с использованием неявной коробочки-переменной и новое, в котором коробочка будет получена на складе:

Старое решение Решение с использованием обьявленной переменной
Программа
    {Делать пока ((не к) и (не з))
    {Вызвать бордюр(к);
    Шаг вверх;
    Шаг вправо;
    Вызвать бордюр(з);
    Шаг вверх;
    Шаг вправо;
    }

} (* конец главной программы *)

Подпрограмма бордюр (короб:ц)

    { Делать пока ((не справа стена) и (не К) и (не з))
    {Положить(ц);
    Шаг вправо;
    }
    Если ((к) или (з)) то {Шаг влево;Шаг вверх}
    Делать пока ((не сверху стена) и (не К) и (не з))
    {Положить(ц);
    Шаг вверх;
    }
    Если ((к) или (з)) то {Шаг вниз;Шаг влево}
    Делать пока ((не слева стена) и (не К) и (не з))
    {Положить(ц);
    Шаг влево;
    }
    Если ((к) или (з)) то {Шаг вправо;Шаг вниз}
    Делать пока ((не снизу стена) и (не К) и (не з))
    {Положить(ц);
    Шаг вниз;
    }

} (* конец подпрограммы *)

 Программа
цвет: цв;
{ цв:=к;
    Делать пока ((не к) и (не з))
    {Вызвать бордюр(цв);
    Шаг вверх;
    Шаг вправо;
    Если (цв=к) то {цв:=з}
    иначе {цв:=к}
    }

} (* конец главной программы *)

Подпрограмма бордюр (короб:цв)
цвет: цв;

    { Делать пока ((не справа стена) и (не К) и (не з))
    {Положить(цв);
    Шаг вправо;
    }
    Если ((к) или (з)) то {Шаг влево;Шаг вверх}
    Делать пока ((не сверху стена) и (не К) и (не з))
    {Положить(цв);
    Шаг вверх;
    }
    Если ((к) или (з)) то {Шаг вниз;Шаг влево}
    Делать пока ((не слева стена) и (не К) и (не з))
    {Положить(цв);
    Шаг влево;
    }
    Если ((к) или (з)) то {Шаг вправо;Шаг вниз}
    Делать пока ((не снизу стена) и (не К) и (не з))
    {Положить(цв);
    Шаг вниз;
    }
    } (* конец подпрограммы *)

«Ну и что? Где же здесь обещанное новое качество?» - можете спросить вы. - «Программы почти одинаковые, а новая даже чуточку длиннее.»

А все дело в главной подпрограмме. Если вы помните условие задачи, размеры поля и по горизонтали, и по вертикали были четными исключительно для того, чтобы мы смогли за один проход цикла нарисовать и красный, и зеленый бордюры.

Теперь же в теле цикла рисуется всего лишь один бордюр, а содержимое переменной, в которой хранится цвет, каждый раз меняется на противоположное. Это означает, что второй программе совершенно не важно, каковы размеры паркета. Она прекрасно сработает даже на поле размером 3х3 клеточки.

И если вы пытались (быть может, даже успешно) решить задачу №2 к §10, то в полной мере оцените, насколько проще стало работать, когда появились переменные.

Конечно, в подпрограмму можно передавать не только переменные типа «Цвет», но и целочисленные переменные, объявленные с помощью оператора описания типа цел:.

Сформулируем теперь основные правила передачи содержимого коробочек в подпрограмму.

1. Количество переменных, передаваемых в подпрограмму с помощью оператора «Вызвать» должно совпадать с количеством переменных, описанных в заголовке подпрограммы после слова короб:. Кроме того, должен совпадать и порядок следования переменных.

2. Все переменные, передаваемые в подпрограмму, должны быть описаны и в главной программе, и в подпрограмме.

Надеемся, в процессе выполнения практикумов, вы еще не раз оцените крайне полезное умение нашего исполнителя передавать в подпрограмму содержимое переменных.


§4. Немного о том, как происходит обмен данными между программой и подпрограммами

(для дополнительного чтения)

Заголовок подпрограммы, с которой мы работали в предыдущем практикуме, между прочим, может выглядеть и по-другому:

Подпрограмма Рисунок (короб:х,у,флаг)
цел: х,у,флаг;

И если вы насторожились, увидев его, то правильно сделали. Пришла пора более подробно рассказать о том, как Бездумные Исполнители обращаются с переменными.

Видимо, вы давно уже заметили, что подпрограмма оформляется точно так же, как и программа. Располагается она отдельно от программы, вне ее главных фигурных скобок, имеет собственное описание переменных... В общем, почти полная независимость.

Давайте вспомним и то, что БИ, углубляясь по уши в выполнение подпрограммы, напрочь забывает об основной задаче, которую выполнял в основной программе.

Все эти особенности подпрограммы позволяют, помимо всего прочего, заказать ее разработку совсем другому человеку, договорившись лишь о том, в каком порядке подпрограмме передаются переменные. Ну а чтобы не связывать разработчиков еще и именами переменных, БИ организуют перегрузку содержимого коробочек при входе в подпрограмму.

Иными словами, первое, что сделает Паркетчик после вызова подпрограммы Рисунок, — это переместит:

  • содержимое коробочки столб в коробочку x;
  • содержимое коробочки строка в коробочку y;
  • содержимое коробочки сигнал в коробочку флаг
  • — и лишь после этого начнет работу в подпрограмме.

То есть коробочки в программе и коробочки в подпрограмме — это разные коробочки. Фактически это означает, что Паркетчик взял на складе столько коробочек, сколько их описано после всех ключевых слов цел:. То есть в нашем случае имеются три коробочки с наклейкой столб, три — с наклейкой строка и т.д. Но Паркетчик их не путает, поскольку они располагаются на разных рабочих площадках: одни — на рабочей площадке Программа, другие — на рабочей площадке Подпрограмма Рисунок, третьи — на рабочей площадке Подпрограмма Рисунок1.

И Паркетчику, и любому другому БИ строго-настрого запрещено перетаскивать коробочки с площадки на площадку, именно поэтому на границе площадок и происходит операция перегрузки.

...И все же подпрограммы не совсем уж независимы от главных программ. Так, если вы помните, на рабочей площадке подпрограммы может быть подготовлена коробочка для цвета, которая остается пустой до тех пор, пока из главной программы не прибежит Паркетчик и не заполнит ее какой-нибудь краской. Это тем не менее не мешает такую подпрограмму написать, использовав в тексте немыслимый для главной программы оператор

Положить (ц);

Про другие коробочки, заказанные в подпрограмме и предназначенные для перегрузки содержимого коробочек главной программы, можно сказать то же самое: мы не знаем их содержимого до тех пор, пока из главной программы не прибежит Паркетчик.

Именно поэтому главнейшие коробочки-переменные, заказанные в программе, называются фактическими параметрами, передаваемыми в подпрограмму. К моменту передачи в них должно лежать что-то определенное.

Те же коробочки-переменные, которые заказаны в подпрограмме с расчетом на их заполнение при выполнении оператора Вызвать и которые описаны после ключевого слова короб:, называются формальными параметрами. А называются они так потому, что мы использовали эти переменные в подпрограмме, рассчитывая на то, что их значение будет определено лишь после передачи значений фактических параметров из программы.

В этом учебнике мы больше не будем сообщать новые интересные сведения о подпрограммах, однако это вовсе не означает, что тема полностью исчерпана.

Так, существуют коробочки-переменные, которые разрешается перетаскивать через границы рабочих площадок и использовать в любом месте. Они называются глобальными переменными. И те из вас, кто в дальнейшем соберется писать сложные программы для Бездумных Исполнителей, наверняка будут их активно использовать. Но это, как говорится, уже совсем другая история...

Подведем итоги

  • Эффект движущегося изображения в кино, на телевидении или на экране компьютера достигается за счет быстрой смены статичных (то есть не движущихся) картинок.

  • В кино и на телевидении следующий кадр снимается камерой, в мультфильмах он предварительно рисуется художниками, а в компьютере он может быть рассчитан каким-либо Бездумным Исполнителем.

  • Иногда возникает необходимость сообщить БИ о том, в какой ситуации он находится. Для этого служат сигнальные переменные.

  • Любой БИ пользуется в главной программе и подпрограммах разными наборами переменных. При необходимости при входе в подпрограмму и выходе из нее производится перезагрузка содержимого одних переменных в другие.

  • Переменные, которые передаются в подпрограмму по команде Вызвать , называются фактическими параметрами. Переменные, в которые происходит перезагрузка фактических параметров и которые описаны после ключевого слова короб:, называются формальными параметрами.

  • В принципе существуют переменные, работать с которыми без всякой перезагрузки разрешается в главной программе и в любой подпрограмме. Такие переменные называются глобальными.

Вопросы и задания

1. Допишите программу, рисующую мультик "Летящая птичка", и запустите ее.

2. Если мы захотим увеличить или уменьшить скорость полета птички, а также изменить его направление, нам придется задать другие значения для смещений по горизонтали. Немного преобразуйте программу, заставив Паркетчика самого запрашивать требуемые смещения и, быть может, еще и начальное положение птички.

3. Придумайте рисунки для мультика "Шагающий робот" и, не меняя программы, напишите соответствующие подпрограммы.

4*. Попробуйте написать программу рисования мультика, в которой использовались бы не две, а три-четыре фазы движения какой-либо фигурки.


§1. Понятие о дуракоупорности систем. Играем в «Морской бой»

Как-то раз, и даже совсем недавно, в §3 четвертой главы, мы с вами помогали Паркетчику выкладывать сужающиеся прямоугольники, чередуя их цвета. И, как вы помните, очень полезным оказалось то, что наш исполнитель умеет передавать в подпрограммы содержимое переменных. параметры. Затем, уже в Практикумах №1 и №2 той же четвертой главы мы с успехом использовали то, что передаваться может не только содержимое переменной типа «цвет», но и типа «целая».

Сегодняшняя задача тоже немножко посложнее и потребует передачи в подпрограмму числовых значений. Но, кроме всего прочего, она впервые позволит вам почувствовать себя настоящими программистами, пишущими программы не только для личного использования. Оказывается, такая работа чуть ли не в три раза сложнее того, что мы делали до сих пор! Однако, не будем торопиться...

Видимо, все вы прекрасно знаете, для чего простому школьнику позарез нужен дома компьютер: играть в игрушки. Не оспаривая несомненную ценность такого времяпровождения для развития мозга (особенно спинного), хотим вас уверить, что для головного мозга в сто раз полезнее самому написать даже простенькую игрушку, чем пройти очередной уровень "крутой леталки- стрелялки". Итак:

Задача (простенький морской бой)

На поле 10х10 клеточек где-то расположен ваш крейсер, представляющий собой прямоугольник размером 1х5 и ориентированный либо по горизонтали, либо по вертикали (см. рис. 36 ). Вы предлагаете своему приятелю уничтожить его, сообщая Паркетчику координаты очередного выстрела.

В случае промаха Паркетчик ставит на поле зеленую плитку, в случае попадания — красную. Как только крейсер полностью подбит, Паркетчик заканчивает работу, сообщая, за сколько залпов была потоплена цель.

Рис. 36 .Игровое поле "Морской бой". Темно-синим цветом закрашены клетки, попадание в которые должен проверять Паркетчик.

Как обычно, сначала займемся проектом задачи. Его первый уровень достаточно прост:

Счет:=0; (* обнуляем счетчик попаданий. Кстати, а помните ли вы, зачем это надо?*)
Делать от залп:=1 до 200

    (* даем противнику 200 снарядов для, как это нынче водится, двойного гарантированного уничтожения *)
    {Просим ввести координаты очередного залпа;
    Проверяем, попал или нет; Если (попал) то {счет:=счет+1;
    Если (счет=5) то {Покинь;} }
    }
Сообщить "Крейсер уничтожен!";
Сообщить "Количество залпов: ", залп;

Оператор:
Просим ввести координаты очередного залпа;
переводится на язык Паркетчика проще всего:

Запросить "Введи номер столбца: ", х;
Запросить "Введи номер строки: ",у;

А для того, чтобы не усложнять главную программу, организуем подпрограмму Проверка. А в ней:

1. Проверим, попал ли залп в цель.

2. Поставим красную или зеленую плитку в ту клеточку, куда был произведен залп.

3. Оставим Паркетчика на этой клеточке.

Тогда после выхода из подпрограммы достаточно проверить, не стоит ли Паркетчик на красной плитке. Если да, то это и означает, что очередной залп накрыл цель.

Главная программа, стало быть, будет выглядеть следующим образом:

Программа
цел: х,у,счет,залп;
{ счет:=0;

    Делать от залп:=1 до 200
      { Запросить "Введи номер столбца: ", х;
      Запросить "Введи номер строки: ",у;
      Вызвать Проверка (х,у);
      (* Подпрограмме необходимо передать координаты выстрела *)
      Если (к) то {счет:=счет+1;
        Если (счет=5) то {Покинь;}
        (* Напоминаем, что оператор "Покинь" обеспечит досрочное окончание цикла и начало выполнения операторов после закрывающей его фигурной скобки *)
        }
      }
    Сообщить "Крейсер уничтожен!";
    Сообщить "Количество залпов: ", залп;
}

Таким образом, подпрограмма Проверка становится ключевой. Именно в ней необходимо каким-то образом задать местоположение крейсера и проконтролировать точность залпа.

Давайте условимся определять местоположение крейсера четырьмя числами: координатами его самой нижней (или самой левой) клеточки, длиной (а вдруг мы захотим в дальнейшем ее изменить) и ориентацией (1 — по вертикали, 2 — по горизонтали).

А теперь напишем заголовок подпрограммы :

Подпрограмма Проверка (короб:х,у)
цел: кх1,ку1,кд1,ко1,х,у;

Ясно, что, кроме заголовка, необходимо присвоить какие-нибудь значения "местополагающим" переменным.

Так, положение крейсера, соответствующее рис. 36 , будет описываться следующими операторами:

кх1:=4; ку1:= 3; кд1:=5; ко1:=1;

После такой детальной проработки грешно не написать целиком простенький блок проверки:

Подпрограмма Проверка (короб:х,у)
цел: кх1,ку1,кд1,ко1,х,у;
{

(* дислокация крейсера *)

    кх1:=4; ку1:=3; кд1:=5; ко1:=1;
    Перейти на (х,у);

    (* вертикальная ориентация *)
    Если (ко1=1) то

      { Если ((х=кх1) и (у>ку1-1) и (у<ку1+кд1)) то
      { Положить (к); }
      иначе {Положить (з);}
    }

    (* здесь не хватает блока горизонтальной ориентации *)

}

Как обычно, было бы крайне грустно, если бы написанная нами программа не требовала никаких доработок и изменений.

Вам предлагается:

1. Дописать блок горизонтальной ориентации.

2. Запустить программу на выполнение и попробовать с ней поиграть.

Наверняка в процессе игры вы выясните, что достаточно вторично указать Паркетчику координаты какой-либо клетки, как тут же появится сообщение:

Ошибка во время исполнения, попытка положить плитку поверх другой.

То есть наша программа не защищена от ввода неправильной информации. Профессионалы называют такую защиту "дуракоупорностью". Для вас, надеемся, не составит особого труда немного изменить часть подпрограммы:

{ Положить (к) }

    иначе {Положить (з)},

сделав программу в целом немного более дуракоупорной. Иными словами, не должно быть никакой ошибки, если выстрел произведен дважды в одну и ту же клеточку. Для этого мы и закладывали двукратное гарантированное уничтожение.

К сожалению, кроме случайного неправильного ввода, приходится защищать программу и от сознательных действий "шибко умных" пользователей. Так, после того, как мы изменим два вышеописанных оператора, достаточно будет пять раз подряд выстрелить в первую же попавшуюся красную плитку, чтобы Паркетчик поздравил нас с победой. Значит, необходимо еще и изменить операторы главной программы:

Если (к) то {счет:=счет+1;

    Если (счет=5) то {Покинь;}

Здесь придется просто обежать все поле и пересчитать количество красных плиток.

А если вспомнить о том, что нечаянно можно еще и ввести еще и неверные координаты выстрела (например, (11, 7)), то понятно, что надо защититься еще и от этого.

Как видите, дуракоупорность системы — вещь дорогостоящая. В программировании считается, что в среднем защищенная система в три раза сложнее незащищенной. Видимо, это справедливо не только применительно к программам.

Подведем итоги

  • Если мы решили написать программу для того, чтобы ее использовал другой человек, необходимо предусмотреть то, что вводимые данные будут случайно или сознательно искажены. Проверка корректности вводимых данных является одним из элементов "дуракоупорности" программы.

  • Дуракоупорными бывают не только программы, но и самые различные технические изделия.

Вопросы и задания

1. Приведите примеры дуракоупорности технических систем. Скажем, домашнего утюга или чайника.

2. Разберитесь самостоятельно в сложном условии Если ((х=кх1) и (у>ку1-1) и (у<ку1+кд1)). Без этого вам будет трудно написать проверку залпа в случае горизонтальной ориентации крейсера.

3. Напишите программу для Паркетчика, решающую задачу "Морской бой" и максимально защищенную от ввода неправильных данных.

4. Улучшите программу, разместив на поле много кораблей так, чтобы они не касались друг друга ни сторонами, ни углами.

После этого:

5. Проведите турнир класса по "Морскому бою" по следующим правилам:

  • Два человека запускают собственные программы морского боя, а затем меняются компьютерами. Побеждает тот, кто расстреляет вражескую эскадру за меньшее число выстрелов.

  • Судьи-наблюдатели не допускают остановки работы программы и просмотра исходного текста.

  • В случае сбоя программы из-за отсутствия проверки вводимых данных автору программы засчитывается поражение.

  • Поражение автору программы засчитывается и из-за ошибочной дислокации кораблей


§2. Метод нисходящего проектирования

До сих пор мы рассматривали человека, как такового, лишь в роли исполнителя алгоритмов. И только объясняя различие между понятиями алгоритм и программа на примере инструкции по завариванию чая, мы слегка выделили homo sapiens (человека разумного) из дружного семейства компьютеров, станков с числовым программным управлением, магнитофонов, роботов и автоматических стиральных машин.

Теперь пора вспомнить, что именно человек в большинстве случаев создает алгоритмы и пишет программы для всех бездумных устройств. Вспомним также, что в программах лучше не делать ошибок. А для этого совершенно необходимо придерживаться вполне определенных правил написания программ.

С некоторыми из них мы уже познакомились: подчеркивание служебных слов и ступенчатая форма записи условных операторов и операторов цикла.

Правила, конечно, важны, но есть вещи и поважнее правил. Хотелось бы иметь технологию, сводящую к минимуму ошибки при написании программ.

И такой метод разработки алгоритмов существует. Он, во-первых, облегчает нелегкий и творческий процесс написания программ и, во-вторых, уберегает от многих погрешностей .

Метод этот называется методом пошаговой детализации, а еще — методом проектирования сверху вниз, или методом нисходящего проектирования программ. Самое интересное, что мы давным-давно применяем его, программируя работу Паркетчика, но вот только не знали, что он так мудрено называется.

Метод этот универсален. Он пригоден не только для программирования БИ, но и для разумного планирования вообще любой человеческой деятельности – начиная от проектирования завода и кончая приготовлением пирожков с яблоками.

Давайте в качестве примера применения метода нисходящего проектирования рассмотрим задачу ремонта квартиры.

В своем ежедневнике в начале года хозяин квартиры записал себе на июль:

Отремонтировать квартиру;

Вот такой алгоритм, состоящий из одного действия, мы и будем считать проектом первого уровня. Ясно, что эта запись настолько неконкретна, что в бюро по ремонту квартир, куда обратился хозяин, попросили уточнить, какие же именно работы необходимо выполнить.

И через некоторое время был создан проект второго уровня:

    (* Отремонтировать квартиру – это: *)

    Отремонтировать гостиную;
    Отремонтировать спальню;
    Отремонтировать кабинет;
    Отремонтировать ванную комнату;
    Отремонтировать туалет;
    Отремонтировать коридор;

Приемщица заказов мило улыбнулась (это ее допустимое действие, и оно входит в алгоритм обслуживания клиента) и объяснила, что указанная заказчиком последовательность действий, безусловно, более подробна, чем проект первого уровня, но вряд ли может служить программой для конкретного исполнителя. Даже если в качестве этого конкретного исполнителя будет выступать самый квалифицированный мастер.

Требуется создать проект третьего уровня. Что ж, уточняем первый оператор:

    (* Отремонтировать гостиную – это: *)

    Отремонтировать потолок;
    Отремонтировать стены;
    Отремонтировать пол;

Все равно непонятно. Ведь стены могли быть оклеены обоями, и их надо поменять на новые или снять, а стены покрасить. А может быть, стены требуется закрыть специальными панелями. Тогда необходимо выбрать их вид и рисунок... Да мало ли что можно сделать со стенами?! Поэтому переходим на проект четвертого уровня, раскрывая операторы третьего:

    (* Отремонтировать потолок в гостиной – это: *)

    Смыть меловую покраску;
    Зашпаклевать щели;
    Подождать, пока застынет шпаклевка;
    Покрасить водоэмульсионной краской;

Вполне может быть, что в проекте четвертого уровня ремонт потолка в ванной комнате может выглядеть по-другому:

(* Отремонтировать потолок в ванной комнате – это: *)

Покрасить водоэмульсионной краской;

Раскрывая таким образом все операторы проекта третьего уровня, получим алгоритм, который уже вполне понятен исполнителю (в нашем случае — мастеру из указанного бюро). Стало быть, это уже программа.

Если же останется нечто, не являющееся допустимым действием исполнителя, то процесс уточнения придется продолжить.

Итак, постепенно уточняя наш алгоритм ремонта квартиры, мы переходим от алгоритма из одного действия, которого нет в списке допустимых действий ни одного БИ, к алгоритму из нескольких десятков действий, которые являются операторами конкретного БИ. Во всяком случае, мастеру-строителю алгоритм четвертого уровня (в отличие от алгоритма первого уровня) совершенно понятен.

Можно теперь сказать, что по мере уточнения операторов (или, говоря профессиональным языком, в процессе разработки проекта) мы получаем все более подробный алгоритм ремонта квартиры, а на последнем уровне имеем алгоритм, написанный на языке БИ, то есть программу.

Важно еще и то, что при такой пошаговой детализации легко выделить похожие последовательности действий. А следовательно, можно по ходу дела наметить, какие действия можно выделить в подпрограммы (в случае ремонта квартиры можно будет, например, сразу определить объем работ для маляра- штукатура, специалиста по установке стеновых панелей, сантехника и т.п.).

Последним этапом пошаговой детализации будет сборка уточненных операторов в единую программу для исполнителя. На самом деле вы уже неоднократно сталкивались с этой работой.

Кроме того, поскольку подавляющее большинство современных БИ имеют в своей Системе Команд аналоги стандартных конструкций, с которыми мы имеем дело при программировании Паркетчика, то метод нисходящего проектирования приводит к следующему главному принципу:

Основной задачей программирования БИ является разработка проекта до такого уровня, чтобы в нем остались только стандартные конструкции (те самые, которые мы всегда подчеркивали), и операторы из СК БИ, для которого и пишется программа.

Подведем итоги

  • Существует метод разработки надежных программ, существенно сокращающий время их написания и отладки. Это метод нисходящего проектирования.

  • При использовании метода нисходящего проектирования разработчик алгоритма последовательно уточняет действия, создавая в конечном итоге программу для БИ.

  • Метод нисходящего проектирования используется для качественного планирования любой человеческой деятельности, как с использованием программируемых механизмов, так и без них.

Вопросы и задания

1. В чем состоит метод нисходящего проектирования? В чем его преимущество перед методом написания алгоритма "с ходу"?

2. Спланируйте свою деятельность, уточнив проект первого уровня "Выучить уроки".

3. Как вы думаете, почему метод так называется?

4*. Существует ли метод восходящего проектирования? Существуют ли такие виды человеческой деятельности, проектировать которые лучше всего "снизу"?


§3. Последняя игра с Паркетчиком,

Или игра "Жизнь"

Эту игру придумал американский математик Джон Хортон Конуэй, и в свое время она была настолько популярной среди программистов, что съела немало их рабочего времени и машинного времени сверхмощных ЭВМ. Написание соответствующей программы считалось неплохой задачей для студентов- программистов младших курсов университетов.

Но время идет, компьютерные технологии развиваются немыслимыми темпами, и теперь любой восьмиклассник, подружившийся с Паркетчиком, вполне может поиграть с компьютером в "Жизнь".

Начнем с правил игры.

На бесконечном листе клетчатой бумаги живут колонии закрашенных клеток. Эти клетки рождаются и умирают по определенным правилам:

1. Если закрашенная клетка имеет четырех или более закрашенных соседей (на бесконечном листе каждая клетка имеет восемь соседей), то она умирает от перенаселенности (в терминах Паркетчика — с клетки снимается плитка, и она перестает быть закрашенной).

2. Если закрашенная клетка не имеет закрашенных соседей или имеет ровно одного такого соседа, то она умирает от нехватки общения.

3. Если незакрашенная клетка имеет ровно трех закрашенных соседей, то она закрашивается (в этом случае говорят, что родилась новая закрашенная клетка. А в терминах Паркетчика — на клетку кладется плитка).

Игра эта пошаговая, и за один шаг игры со всеми клетками поля одновременно происходят (или не происходят) изменения, описанные тремя вышеуказанными правилами.

Играют в эту игру так: рисуют какую-нибудь колонию закрашенных клеток, а затем шаг за шагом прослеживают ее эволюцию.

Забудем пока о Паркетчике и поучимся играть сами.

Итак, исходная колония клеток выглядит следующим образом (см. рис . 37):

Рис. 37 . Колония клеток в игре "Жизнь", носящая название "Чеширский кот". В исходной конфигурации легко просматриваются ушки и глазки

Давайте теперь желтым отметим те пустые клетки, на которых произойдет рождение новых закрашенных клеток. Напомним, что это такие пустые клетки, которые имеют ровно трех закрашенных соседей:

Рис. 37 а . Колония клеток с отмеченными "новорожденными" клетками

Теперь перечеркнем те старые клетки, которые должны умереть. Напомним, что это такие закрашенные плитки, которые имеют либо меньше двух закрашенных соседей, либо больше трех. При расчетах, разумеется, не надо принимать во внимание желтые клеточки – на них процесс рождения еще не закончился:

Рис. 38. Колония клеток с отмеченными клетками, которые должны умереть

И, наконец, уберем с зачеркнутых полей плитки, а желтые поля перекрасим в красный цвет:

Рис. 39 . Колония клеток "Чеширский кот" на втором шаге игры. Глазки закрылись, зато морда стала шире, и это уж точно кот, а не кошечка

Повторяя этот процесс cнова и снова, мы должны получить следующие конфигурации:

Рис.40 . "Чеширский кот" на третьем шаге. Появился во всей красе, только ушки слегка обвисли

Рис.41 . "Чеширский кот" на четвертом шаге игры. Морда с усиками

Надеемся, что для вас не составит труда проследить эволюцию этой колонии клеток до самого конца.

Как вы уже, наверное, поняли, кропотливо считать соседей и рисовать вручную все стадии эволюции колонии клеток не очень-то интересное занятие. Поэтому в самом ближайшем будущем мы постараемся обучить этой игре нашего любимого Паркетчика.

Вопросы и задания

1. На бесконечном листе клетчатой бумаги расположились колонии закрашенных клеток (см. рис. 42). Проследите их эволюцию в соответствии с правилами игры "Жизнь".

Рис.42 . Начальные колонии клеток.

2. Придумайте какую-нибудь свою не слишком сложную колонию и проследите ее эволюцию.

3. Раз уж мы заговорили об обучении Паркетчика правилам игры "Жизнь", то ему наверняка в дальнейшем потребуется умение считать красных соседей для любого поля. Начните с создания программы, решающей следующую задачу:

Где-то на поле Паркетчика располагаются красные плитки. Паркетчик обегает все поле, и если красных соседей у пустой клетки ровно 3, то он сообщает: "Рождение"; а если у красной клетки соседей меньше двух или больше трех, сообщает: "Смерть" – и, ничего не делая, бежит дальше после нажатия на клавишу Enter.


§4. Первое знакомство
с вычислительными Бездумными Исполнителями

Для начала напомним, что любой компьютер – это Бездумный Исполнитель со своей специфичной системой команд. Эта система команд не что иное, как набор инструкций или операторов, которые понимает его мозг – центральный процессор (надеемся, вы еще помните, что это такое).

Используя эти операторы, человек составляет программы, заставляя процессор выполнять необходимую работу. Если рассматривать СК процессора как язык общения с ним, то, к несчастью, он весьма далек не только от человеческого языка, но даже и от языка Паркетчика, к которому вы уже успели привыкнуть.

Фактически язык Паркетчика – это промежуточный язык, созданный исключительно для того, чтобы было проще общаться с компьютером. Программа, написанная на языке Паркетчика, дополнительно переводится на родной язык процессора, а уж затем выполняется.

Подробно о родном языке процессора мы поговорим с вами в 9-м классе. А для того чтобы ситуация стала чуть более понятной, представьте, что к нам прилетели марсиане. Как ни странно, их язык оказался непостижимо похож на язык одного из индейских племен сельвы Амазонки. Язык настолько отличается от всех остальных земных языков, что приходится пользоваться услугами индейского шамана, с грехом пополам изъясняющегося на английском. Вот через индейско-английский все остальное человечество и ухитрилось наладить контакт с пришельцами.

Язык Паркетчика – далеко не единственный промежуточный язык, придуманный для облегчения диалога с компьютером. Графические и текстовые редакторы, базы данных и электронные таблицы – все написано с использованием так называемых универсальных языков программирования. И каждый из них по-своему пытается имитировать живую человеческую речь. По счастью, они не слишком далеко отстоят от языка Паркетчика.

И сейчас мы на примере трех достаточно распространенных языков покажем, как за весьма непродолжительное время можно выучить любой "настоящий" язык программирования.

Конечно, за оставшееся до конца учебного года время вы не станете специалистами в этих языках, не постигнете все их тонкости. Но ведь и изучая иностранный язык, вы не стремитесь сразу овладеть им так, чтобы писать поэмы и романы. Вам хочется, чтобы вас понимали. И здесь то же самое – мы расскажем, как овладеть языком настолько, чтобы ЭВМ вас понимала. А если уж захотите, можете совершенствовать свои знания самостоятельно – для этого всегда есть соответствующие руководства.

Что значит изучить язык? Для обычного иностранного языка с некоторой натяжкой можно сказать, что это значит выучить перевод слов и правила их соединения в предложения.

То же самое и для языков программирования. К счастью, в языках программирования используется очень мало слов (как правило, два-три десятка), а правил их соединения еще меньше. Правила эти, как вы, наверно, догадались, и есть в точности те самые алгоритмические конструкции ветвлений, циклов и подпрограмм, с которыми вы познакомились, работая с Паркетчиком.

Для начала вспомним историю.

В августе 1799 года неподалеку от городка Розетты, расположенного в 70 км к северо-востоку от египетского города Александрии, французские саперы обнаружили массивную плиту из черного базальта, покрытую четко высеченными письменами.

Эти письмена были трех видов, причем нижние строчки, написанные на древнегреческом, легко прочли и перевели. Над этим текстом шла надпись, сделанная на разговорном египетском языке, а самая верхняя, выполненная бесчисленными рисунками – человечками, птицами, змейками, представляла собой древнеегипетский иероглифический текст, секрет чтения которого был утерян.

Французскому исследователю Жану Франсуа Шампольону после длительных трудов удалось вернуть миру это, казалось бы, навсегда утерянное знание. Исходил же он при этом из единственного предположения о том, что все три текста на розеттском камне были идентичны.

Вот и мы воспользуемся приемом сравнения, чтобы быстро освоить новый незнакомый язык. Рассмотрим следующую задачу для Паркетчика:

Требуется положить красную плитку на поле с заданными координатами.

Она настолько проста, что вы, скорее всего не задумываясь, напишете что-нибудь такое:

Программа {
Перейти на (24,10);
Положить (к);
}

Паркетчик, выполняя эту программу, перескочит на клетку с координатами (24, 10) и положит красную плитку. При этом произойдет автоматическое переключение с экрана текстового редактора, содержащего текст программы, на рабочее поле Паркетчика.

Универсальные языки программирования, или универсальные БИ, тоже выполняют программу на рабочем поле. Правда, в отличие от Паркетчика эти рабочие поля могут быть разными. Выберем знакомый нам по графическому редактору экран монитора, разбитый на пиксели. Их количество и цвет соответствуют стандартному режиму VGA – 640x480, 16 цветов.

Напоминаем, что система координат на мониторе отличается от системы координат, к которой вы привыкли на уроках математики и при работе с Паркетчиком. А именно — начало координат располагается в левом верхнем углу, а ось Y направлена вниз так, как это изображено на рисунке 47:

Рис. 47. Расположение системы координат на экране монитора

Координаты пикселей по оси X меняются от 0 до 639, по оси Y – от 0 до 479.

Ну а теперь, вспомнив о розетском камне, приведем тексты программ на различных языках программирования, "зажигающих" пиксель с заданными координатами на экране монитора.

Qbasic:

SCREEN 12
PSET (200,200)

После выполнения этой программы пиксель, имеющий координаты (200, 200), загорится белым цветом. Оператор SCREEN 12 необходим для того, чтобы указать исполнителю его рабочее поле – стандартный экран VGA.

Pascal:

uses graph;
var

    i, gdriver, gmode : integer;
Вegin
    gdriver:=VGA;
    gmode:=VGAHI;
    initgraph(gdriver, gmode, '');
    putpixel(200,200,15);
    closegraph;
End.

На языке Паскаль программа уже несколько сложнее.

Во-первых, появились аналоги открывающих и закрывающих фигурных скобок, содержащих все операторы программы. Это слова Begin и End.

Во-вторых, для перехода в режим VGA потребовалось заказать две переменные и, используя их, написать оператор initgraph.

В-третьих, операторы языка Паскаль, отвечающие за работы с графическим экраном, располагаются в отдельной библиотеке. И этому БИ следует указать, что мы намерены ее использовать. Для этого служит оператор uses graph;

И, наконец, если QBasic по умолчанию красил пиксель в белый цвет, то Паскалю необходимо указать номер цвета. Если вы еще помните лабораторные работы 7-го класса, то 15 – это как раз номер ярко-белого цвета.

C (Си):

#include

void main(void)
{
    int gdriver = VGA, gmode = VGAHI;
    initgraph(&gdriver, &gmode, "");
    putpixel(200,200,15);
closegraph();
}

Вместо слова Программа в языке Си используется слово main. Язык, кроме того, отличается повышенным демократизмом, и поэтому чисто внешне главная программа и подпрограммы оформляются одинаково (отсюда и взялась пара скобок для передачи параметров, расположенных в заголовке. Служебное слово void в вольном переводе означает «пусто» – т.е. параметры не передаются, main – главная программа, то есть не подпрограмма).

Переменные можно описывать и внутри тела программы, с ходу присваивая им нужные значения. Этот процесс называется инициализацией переменных.

int gdriver = VGA, gmode = VGAHI;

Все остальные операторы имеют тот же смысл, что и в языке Паскаль, а фигурные скобки вам должны быть знакомы еще по Паркетчику.

Подведем итоги

  • Истинный язык процессора настолько далек от человеческого, что для удобства общения с компьютером были придуманы промежуточные языки, один из которых – знакомый нам язык Паркетчика.

  • Кроме языка Паркетчика, существует довольно много других придуманных промежуточных языков, основанных на тех же самых принципах.

  • Программа, написанная на промежуточном языке, вначале переводится на истинный язык процессора, или машинный язык, а уж затем выполняется компьютером.

  • Новые языки, как компьютерные, так и человеческие, очень удобно изучать с помощью сопоставления текстов, один из которых написан на известном вам языке.

Вопросы и задания

1. Почему всем БИ, которые мы рассмотрели в этом параграфе, требуется указывать тип рабочего поля? С помощью каких операторов это делается в случае каждого из языков?

2. Запустите программу-транслятор с выбранного вами языка программирования и разберитесь с помощью учителя или пользуясь руководством для пользователя, как работает его текстовый редактор, какова специфика запуска и отладки программ.

3. В соответствии с указаниями учителя, руководствуясь инструкцией для пользователя или описанием языка программирования, напишите разобранную выше программу на одном или нескольких языках программирования и запустите ее.

4. Усложните вашу программу. Зажгите пиксели самых разных цветов, расположив их по всему экрану.


§5. Использование языка проектирования программ

Напомним, что совсем недавно мы рассматривали технологию написания программ, обеспечивающую последовательную разработку проекта сверху вниз. Эта технология называется методом нисходящего проектирования. С ее помощью нелегкий и творческий процесс программирования сильно облегчается с одновременным уменьшением количества ошибок.

Был сформулирован и главный принцип разработки программ:

Основной задачей программирования БИ является разработка проекта до такого уровня, чтобы в нем остались только стандартные конструкции (те самые, которые мы всегда подчеркивали) и операторы из СК БИ, для которого и пишется программа.

Стандартные конструкции, о которых идет речь, вовсе не являются только элементами языка Паркетчика, а составляют общее ядро всех тех языков программирования, с которыми мы познакомились в предыдущем параграфе.

Кроме того, в процессе разработки проекта мы почти всегда использовали вообще любое осмысленное предложение на русском языке. Например: "Посчитать количество красных плиток на поле".

Предложение-то, конечно, может быть любым, но для успешного продвижения в решении задачи в нем должна быть четко сформулирована подзадача для нашего исполнителя. И совсем не так уж легко сделать шаг в методе нисходящего проектирования и свести сложную задачу к нескольким более простым.

Вот почему классик программирования Эдсгер Дийкстра заявил, что самый главный язык, который должен знать программист, – это его родной язык, на котором он изъясняется в повседневной жизни.

Исходя из такого понимания работы программиста С.Кэйн и Е.Гордон в 1975 году предложили Язык Проектирования Программ, элементами которого являются стандартные конструкции и осмысленные предложения на обычном языке.

Использование ЯПП позволило более чем в два раза увеличить производительность труда программистов. Эта технология совершенно не привязана к какому-либо конкретному языку программирования и позволяет с легкостью воплотить в работающую компьютерную программу детализированное решение любой задачи, написанное с использованием ЯПП. Окончательным языком при этом может быть хоть Паскаль, хоть Бэйсик, хоть Си.

Как вы помните, решая задачи для Паркетчика, мы активно использовали метод нисходящего проектирования, а стандартные конструкции нашего ЯПП являлись заодно и операторами Бездумного Исполнителя.

Познакомившись на предыдущих уроках с одним или несколькими из "настоящих" языков программирования, вы убедились, что в них есть операторы, в точности соответствующие операторам стандартных конструкций , поэтому в дальнейшем мы вернемся к старому, испытанному методу решения задач с помощью нисходящего проектирования, не отступая от сформулированного выше принципа.

А для того чтобы продемонстрировать, как с помощью ЯПП разрабатывается проект программы на выбранном вами языке, рассмотрим следующую задачу:

Задача:
    Напишите программу, итогом работы которой будет летающий шарик, отражающийся от "стенок" монитора. При этом должен выполняться известный физический закон о том, что "угол падения равняется углу отражения". Траекторию шарика см. на рисунке 48 .

Рис.48 . Траектория движения шарика.

Итак, считаем, что проект первого уровня – это оператор, которого нет ни в одном языке программирования:

Запустить отражающийся шарик;

Поскольку вы занимаетесь имитацией движения уже не в первый раз, то понимаете, что на самом деле проблема заключается в том, чтобы:

  • нарисовать окружность, скажем, белым цветом;
  • сделать паузу;
  • нарисовать окружность на том же самом месте черным цветом (цветом фона);
  • нарисовать окружность белым цветом на новом месте;
  • и так далее, повторяя все эти действия в цикле.

    • Именно этот процесс мы и отразим в проекте второго уровня:

    Делать
от I:=1 до 2000
{ Нарисовать белую окружность с центром
    в (X,Y);
Сделать паузу;
Нарисовать черную окружность с центром
    в (X,Y);
Изменить координаты центра;
}

    Операторы рисования окружностей есть практически в любом языке программирования, поэтому, внимательно присмотревшись к проекту второго уровня, мы найдем всего лишь один непонятный оператор, требующий дальнейшей детализации:

    Изменить координаты центра;

    Как же происходит это самое изменение? Обратимся к рисунку 49:

    Рис. 49 . Смещение окружности

    Видно, что для получения иллюзии равномерного движения необходимо каждый раз добавлять к координатам одно и то же число. Так, в нашем примере к координате X добавляется число 3, а к координате Y – число 4. Эти числа как раз и определяют скорость полета окружности. Конечно, выбирать их слишком большими нельзя, иначе это будет иллюзия не полета, а скачков окружности.

    Теперь, на третьем этапе проектирования, можно озаботиться и коробочками, в которых будут храниться переменные.

    Программа

    целые: R, X0, Y0, X, Y, DX, DY, I;
    (*
      R – радиус окружности,
      X0, Y0 – начальное положение центра окружности;
      X, Y – текущее положение центра окружности;
      DX, DY – изменения текущего положения центра окружности.
      В нашем примере DX=3, DY=4
      I – переменная цикла.
    *)
    { Присвоить значения переменным R, X0, Y0, DX, DY;
    Переключиться в графический режим VGA;
    X:=X0;
    Y:=Y0;
    Делать от I:=1 до 2000
      { Нарисовать белую окружность с центром в (X,Y);
      Сделать паузу;
      Нарисовать черную окружность с центром в (X,Y);
      X:=X+DX;
      Y:=Y+DY;
      Обработать ситуацию столкновения со "стенкой";
      }
    }

    Единственное, что осталось сделать на четвертом этапе проектирования, – это детализировать оператор

    Обработать ситуацию столкновения со "стенкой";

    Эту ситуацию иллюстрирует рисунок 50.

    Рис. 50

    Видно, что если при переходе от окружности 1 к окружности 2 к координате Y прибавлялось число DY=4, то при переходе от окружности 2 к окружности 3 это же самое число вычитается. А это означает просто смену знака у переменной DY.

    Очевидно, что точно такая же ситуация создастся и тогда, когда окружность "столкнется" с верхней стенкой. Итак,

    Если (Y+R>479 или Y-R <0) то {DY:= — DY};

    Аналогично для изменения координаты X:

    Если (X+R>639 или X-R <0) то {DX:= — DX};

    Осталось собрать все операторы воедино и получить окончательный проект на ЯПП:

    Программа
целые: R, X0, Y0, X, Y, DX, DY, I;
{ Присвоить значения переменным R, X0, Y0, DX, DY;
Переключиться в графический режим VGA;
X:=X0; Y:=Y0;
Делать
от I:=1 до 2000

      { Нарисовать белую окружность с центром в (X,Y);
      Сделать паузу;
      Нарисовать черную окружность с центром в (X,Y);
      X:=X+DX; Y:=Y+DY;
      Если (Y+R > 479 или Y-R <0) то {DY:= — DY};
      Если (X+R > 639 или X-R <0) то {DX:= — DX};
      }
    }

    Конечно, конкретный язык программирования почти наверняка потребует не только перевода стандартных операторов, но и добавления новых. Так, на языке Бейсик пауза обычно организуется с помощью дополнительного цикла и, соответственно, дополнительной переменной цикла; на языках Си и Паскаль необходимо подключить библиотеки с операторами графики и тому подобное.

    Но, согласитесь, все эти мелочи не представляют ровным счетом никакой сложности, и, имея перед глазами программу на Языке Проектирования Программ, любой, даже начинающий, программист легко переведет ее на тот язык программирования, которым он владеет.

    Подведем итоги

  • Метод нисходящего проектирования, существенно сокращающий время написания и отладки надежных программ, наиболее полно реализуется при проектировании с помощью Языка Проектирования Программ (ЯПП).

  • ЯПП представляет собой набор стандартных конструкций, известных нам по языку Паркетчика. Кроме того, в нем допускается написание любого осмысленного предложения на естественном человеческом языке.

  • Стандартные конструкции ЯПП представляют собой ядро таких языков, как Си, Паскаль, Бейсик и им подобных. Эти языки называются процедурно-ориентированными.

  • Программа, разработанная и написанная на ЯПП, с легкостью переводится на любой процедурно-ориентированный язык.

  • Поскольку разработка программы фактически идет на естественном человеческом языке, это сильно облегчает труд программиста и уменьшает количество ошибок.

  • При использовании ЯПП на первый план выходит способность четко мыслить и ясно формулировать задачи на обычном человеческом языке. Именно поэтому хороший программист лучше всего должен знать свой собственный язык, к


§6. Дополнительная конструкция ЯПП - оператор Выбор

Отвлечемся немного от увлекательного написания программ и поговорим о других школьных предметах.

Предположим, по поводу вашего сочинения учитель сказал только одно слово: "Плохо!" Как вы думаете, какая отметка появилась в журнале? Нет, конечно, если вы, по общему мнению, начинающий Лев Толстой, то даже четверка могла вызвать такую реакцию. Мы же рассматриваем немного иную ситуацию: просто всем ученикам сообщается об их отметках.

Тогда алгоритм, которым руководствуется учитель в качестве БИ, довольно- таки прост. (Здесь можно позлорадствовать, представив учителя не очень далеким БИ.)

Итак, в классе 27 учеников:

(* Алгоритм ритуального оглашения отметок *)

Открыть журнал;

Делать от I:=1 до 27;
{ Прочитать про себя имя i-го ученика;
    Если (i-й ученик присутствует в классе) то
    { Запомнить имя;
    Посмотреть на его отметку;
      Если (в журнале выставлена отметка "1") то
      {Сказать "Очень плохо,"};
      Если (в журнале выставлена отметка "2") то
      {Сказать "Плохо,"};
      Если (в журнале выставлена отметка "3") то
      {Сказать "Удовлетворительно,"};
      Если (в журнале выставлена отметка "4") то
      {Сказать "Хорошо,"};
      Если (в журнале выставлена отметка "5") то
      {Сказать "Отлично,"};
      Если (в журнале ничего не выставлено) то
      {Сказать "И где же ты у нас был,"};
      Добавить к сказанному запомненное имя;
    } (* конец "Если" *)

} (* конец цикла *)

В принципе этого бы уже хватило. Но такая ситуация встречается в программировании настолько часто, что оказалось целесообразным специально для таких случаев ввести конструкцию языка проектирования программ, называемую Выбор:

(* Алгоритм ритуального оглашения отметок *)
Открыть журнал;
Делать от I:=1 до 27;
{Прочитать про себя имя i-го ученика;

    Если (i-й ученик присутствует в классе) то
    { Запомнить имя;
    Посмотреть на его отметку;
    Выбор (отметка в журнале)
    { 1: {сказать "Очень плохо,"};
    2: {сказать "Плохо,"};
    3: {сказать "Удовлетворительно,"};
    4: {сказать "Хорошо,"};
    5: {сказать "Отлично,"};
    }
    иначе {сказать "И где же ты у нас был,"}
    Добавить к сказанному запомненное имя;
    } (* конец "Если" *)
}(* конец цикла *)

Здесь вроде бы все ясно и без пояснений. Единственное, на что хотелось бы обратить внимание: в скобках после стандартного (и потому подчеркиваемого) слова Выбор стоит выражение, которое может принимать какие-то значения. В нашем случае эти значения числовые: 1, 2, 3, 4 и 5. Но в операторе Выбор могут участвовать и значения другого типа.

Далее каждая строка начинается с указания одного из этих значений, после него ставится двоеточие, а после двоеточия в фигурных скобках – те операторы, которые нужно выполнять при данном значении выражения.

Если выражение принимает значение, которое не перечислено слева от двоеточий, то выполняется оператор, стоящий после стандартного слова иначе. Если это слово отсутствует, то начинают выполняться операторы, идущие после закрывающейся фигурной скобки, означающей конец выбора.

Подведем итоги

  • Если при составлении алгоритма встретилась ситуация, когда надо писать сразу целый блок однотипных операторов Если, то удобно пользоваться конструкцией Выбор.

  • Чтобы воспользоваться этой конструкцией, нужно выбрать признак, ответственный за выбор дальнейшего пути в алгоритме, – значения этого признака и будут служить исполнителю путеводной звездой.

  • Конструкция Выбор оформляется так:

    Выбор (название признака или выражение)
      { Первое значение признака (выражения):
      {оператор; оператор; ...}
      Второе значение признака (выражения):
      {оператор; оператор; ...}
      ...
      ... значение признака (выражения):
      {оператор; оператор; ...}
    иначе {оператор; оператор; ...}

    Естественно, этому оператору ЯПП тоже соответствуют аналогичные операторы практически любого языка программирования.

    Вопросы и задания

    1. В каких случаях удобно применять конструкцию Выбор?

    2. Узнайте, как оформляется оператор Выбор в вашем языке (языках) программирования.


§7. Понятие об интерактивных (диалоговых) программах

Интерактивной, или диалоговой, программой называется такая программа, для которой характерен отклик на вводимые человеком команды. Эти команды могут вводиться с помощью любого устройства ввода: клавиатуры, джойстика, мыши, сенсорного экрана и т.п.

Диалог с компьютером может идти двумя различными способами:

1. Программа останавливается и ждет ответа от человека.

2. Программа, не останавливаясь, ждет ввода команды, и как только такая команда поступает, меняет режим своей работы.

Простейшим примером первого типа интерактивной программы является написанная и отлаженная нами программа "Морской бой", в которой Паркетчик останавливался и ждал координат очередного залпа.

Хорошим примером интерактивных программ второго типа являются различные симуляторы полетов или автогонок. Симуляторы, кроме того, разрабатываются так, чтобы компьютер почти мгновенно реагировал на команду человека. Программы и системы, обладающие этим свойством, называются системами реального времени. Кроме программ-симуляторов, в режиме реального времени работают бортовые компьютеры автомобилей, самолетов, ракет, системы управления физическими процессами, например атомными электростанциями, системы торговых автоматов и т.п.

Обычно считается, что система является системой реального времени, если время ее реакции на ввод и обработку какого-либо сигнала (называемое еще временем отклика) измеряется тысячными долями секунды. Для диалоговой (интерактивной) системы приемлемо время отклика до нескольких секунд.

Сегодня мы попробуем самостоятельно написать простенькую интерактивную программу второго типа, чтобы лучше понять и прочувствовать механизм работы всех подобных систем. Итак:

Задача:

Напишите программу, итогом работы которой будет движение шарика. Его движение должно определяться тем, какая из клавиш управления курсором нажата. Если нажата клавиша со стрелочкой вверх, то шарик двигается вверх, если со стрелочкой вправо, то шарик двигается вправо и т.д.

В любом языке программирования существуют специальные операторы, способные определить, нажата ли какая-нибудь клавиша на клавиатуре, и если да, то в специально зарезервированную переменную передается число, соответствующее именно этой клавише.

Другими словами, все клавиши на клавиатуре имеют так называемые "скан-коды". И в случае нажатия на клавишу именно ее скан-код и передается в нашу программу через заранее выбранную переменную.

Будем считать, что из рассказа учителя или из инструкции по программированию вы узнали, как выглядит и как работает оператор получения скан-кода именно на вашем языке программирования, и для дальнейших рассуждений используем Язык Проектирования Программ (ЯПП).

Договоримся, что программа будет выполняться до тех пор, пока не будет нажата клавиша Esc, известная вам по многим программам как клавиша выхода из режима (кстати, английское слово escape как раз и означает "выходить, убегать").

Итак, достаточно подробный проект нашей программы может выглядеть следующим образом:

Определить следующие переменные:

    X – координаты окружности по X,
    Y – координаты окружности по Y,
    R – радиус окружности,
    DX – величина сдвига окружности по X,
    DY – величина сдвига окружности по Y,
    SCAN – в эту переменную будут заноситься скан-коды нажатых клавиш клавиатуры;
Переключиться в графический режим;
Нарисовать окружность с координатами X, Y и радиуса R белым цветом;
Делать пока (не нажата клавиша Esc)
{
    Нарисовать окружность с координатами X, Y и радиуса R черным цветом;
    Опросить клавиатуру, поместить скан-код нажатой клавиши в переменную SCAN;
    Если (SCAN= коду "стрелочка вверх") то {Y=Y–DY}
    Если (SCAN= коду "стрелочка вниз") то {Y=Y+DY}
    Если (SCAN= коду "стрелочка влево") то {X=X–DX}
    Если (SCAN= коду "стрелочка вправо") то {X=X+DX}
    Нарисовать окружность с координатами X, Y и радиуса R белым цветом;
}

Легко заметить, что в проекте присутствуют четыре подряд идущих оператора Если, которые, вспоминая если вспомнить предыдущий параграф, удобно просто необходимо заменить оператором Выбор:

      Выбор (SCAN)

      { код "стрелочки вверх": { Y=Y–DY}
      код "стрелочки вниз": { Y=Y+DY}
      код "стрельчки вправо": { X=X–DX}
      код "стрелочки влево": { X=X+DX}
      }

Естественно, вместо код "стрелочки вверх" должно стоять конкретное число, соответствующее скан-коду этой клавиши.

Надеемся, что для вас не составит особого труда перевести этот проект в программу на выбранном языке программирования, отладить ее и выполнить.

Вопросы и задания

1. Что называется интерактивной программой или системой?

2. Чем принципиально отличаются диалоговые системы и системы реального времени?

3. Переведите рассмотренную нами программу на один или несколько языков программирования, отладьте ее и запустите.

4. Наша программа, к сожалению, не является дуракоупорной. Шарик совершенно свободно можно увести далеко-далеко за пределы экрана и там потерять. Подправьте проект и саму программу, чтобы заблокировать пересечение шариком границы экрана.

Приложение

Поскольку обращение в языках программирования со скан-кодами и с оператором Выбор – дело довольно тонкое, приводим пример вышеописанной программы на двух языках программирования.

QBASIC

SCREEN 12
x = 200
y = 200
R=10
dx=5
dy=5
CIRCLE (x, y), R, 15
WHILE (a$ <> CHR$(27))
    CIRCLE (x, y), R, 0
    a$ = RIGHT$(INKEY$, 1)
    SELECT CASE a$
      CASE CHR$(75)
        x = x – dx

      CASE CHR$(77)
        x = x + dx

      CASE CHR$(80)
        y = y + dy

      CASE CHR$(72)
        y = y – dy

    END SELECT
    CIRCLE (x, y), R, 15
WEND

СИ

#include graphics.h
#include stdlib.h
#include stdio.h
#include conio.h
void main(void) {
int gdriver = DETECT, gmode, errorcode;
int radius = 10;
char ch;
initgraph(&gdriver, &gmode, "");
int x = 200;
int y = 200;
int dx = 5;
int dy = 5;
setcolor(getmaxcolor());
circle(x, y, radius);
ch = getch();
while (ch != 27)
{
    ch = getch();
    setcolor(0);
    circle(x, y, radius);
    switch (ch) {
      case 75: x-=dx; break;
      case 77: x+=dx ; break;
      case 72: y-=dy ; break;
      case 80: y+=dy ; break;
    }
    setcolor(getmaxcolor());
    circle(x, y, radius);
}
closegraph();
}


ПРАКТИКУМ № 1

Первая встреча с Паркетчиком

Пришла пора посмотреть, как слушается вас Паркетчик не на бумаге, а в жизни — на экране дисплея. Напоминаем, что Паркетчик относится к тем БИ, которым для работы требуется программа. И поэтому поначалу вы видите экран обычного не очень сложного текстового редактора, в котором вам предстоит набирать эту самую программу (см. рис. 2).

Рис. 2. Вид экрана компьютера при работе с Паркетчиком

Но набирать программу слово за словом по одной буковке слишком долго. Пока наберешь, урок кончится. По счастью, все слова, которые понимает Паркетчик, занесены в меню. И выбор слова в меню обеспечивает его автоматическое появление в тексте программы. Как же найти это замечательное меню, которое, кстати, изображено на рис.2?

Вы уже довольно много работали с меню, поэтому просто нажмите функциональную клавишу F4. Перед вами появятся шесть пунктов меню:

  • Действия;

  • Условия;

  • Ветвления;

  • Циклы;

  • Подпрограммы;

  • Описания.

С помощью клавиш управления курсором выберите нужный пункт и нажмите Enter. Поначалу вам потребуются в основном "Действия".

В появившемся списке команд выберите ту, которая необходима, и снова нажмите клавишу Enter. Эта команда тут же появится в программной строке в том месте, где стоит курсор.

Если вы выбрали команду "Положить( )", то нужно будет указать цвет плитки, нажав клавишу с буквой З или К, в зависимости от того, зеленую или красную плитку вы хотите положить на поле.

А во всем остальном работа по набору команд ровным счетом ничем не отличается от работы в среде текстового редактора, с которым вы уже знакомы. Рекомендуем, кстати, вспомнить, как в текстовом редакторе удаляются, разрезаются и склеиваются строки, вставляются и удаляются символы.

Для Паркетчика действует еще одно правило: каждая программа должна начинаться со слова Программа, а весь последующий текст заключается в фигурные скобки. Слово Программа, как и сами фигурные скобки, набирать вручную не обязательно — вы можете найти его в подпункте меню "Подпрограммы".

Наберите, например, самую простенькую программу:

Программа

    {

      Шаг вверх;

      Положить(к);

      Шаг вправо;

      Положить(з);

      Шаг вправо;

      Шаг вправо;

      Положить(к);

    }

— и запустите ее.

Чтобы поручить Паркетчику исполнить программу, выберите пункт меню "Выполнение" или просто нажмите функциональную клавишу F9. На экране появится поле Паркетчика, и он примется бойко бегать по полю, выполняя написанные вами операторы.

Конечно, можно записывать и несколько операторов в одной строке, но это верный путь запутаться в собственной программе, когда она станет чуточку посложнее. Поэтому давайте сразу будем привыкать к правильному стилю записывания программ для БИ. Не забудьте также всегда ставить точку с запятой после каждого оператора.

Если программа вам надоела, ее легко стереть, последовательно выбрав в меню пункты "Файл" и "Новая программа". Вас предусмотрительно спросят, не надо ли предварительно записать старую программу на диск — для дальнейшего использования.

Вы, конечно, помните, что Паркетчик живет и трудится на прямоугольном клетчатом листе бумаги. Значит, если вам вдруг захотелось изменить стандартные размеры игрового поля — 42х30 клеточек, выберите пункт меню "Установка" и задайте другие размеры.

Теперь вы можете создать на поле любой интересный для вас орнамент, положив плитки нужного цвета. Для этого выберите пункт меню "Паркет", подпункт "Изменить" и воспользуйтесь клавишами с буквами К и З, для того, чтобы начать выкладывать красные или зеленые плитки, нажимая клавиши управления курсором. Нажатие на клавишу ПРОБЕЛ заставит Паркетчика очищать поле от плиток. Впрочем, в нижней строке экрана всегда написано, что будет делать Паркетчик. Чтобы выйти из режима редактирования поля Паркетчика, достаточно нажать клавишу Esc.

А теперь для тренировки составьте программу, исполнив которую Паркетчик на чистом поле выложит по диагонали (начиная с левого нижнего угла) 4 зеленые плитки. Не забудьте только поставить открывающую фигурную скобку после слова Программа — {, а в конце текста программы — закрывающую скобку — }.

Для целей отладки служит команда «Стоп;». Ее можно поставить в любое место программы, чтобы убедиться, что программа выполняется нормально вплоть до этого места.

Наконец, если это необходимо, не забудьте после работы сохранить свою программу. Для этого служат пункты меню "Сохранить" и "Сохранить как". Не сохраняйте программу со стандартным именем NONAME! Вы можете оказаться не одиноки, и тогда вместо вашей программы будет записана чужая.

Мы не в последний раз работаем с Паркетчиком. Постепенно вы запомните его режимы работы. Впрочем, это совсем не обязательно: нажав знакомую вам клавишу F1, вы тут же на экране дисплея получите подсказку.

А теперь напишите программу по алгоритму, который вы составили, выполняя задание 6 к третьему параграфу. Введите эту программу. Надеемся, Паркетчик нарисовал именно то, что вам хотелось.


ПРАКТИКУМ № 2

Оператор цикла в работе Паркетчика

Жизнь у Паркетчика сложная. И заказчики все как один привередливые. Нет чтобы ограничиться выкладыванием одной или там двух плиток, так подавай им большие красочные узоры.

А попробуй-ка выложить красной плиткой всего лишь один первый ряд! Вон какая здоровущая программа получается:

Программа

    {

    Положить (к);
    Шаг вправо;
    Положить (к);
    Шаг вправо;
    Положить (к);
    Шаг вправо;
    Положить (к);
    Шаг вправо;
    Положить (к);
    ...

    (а там, где точки, — еще более шести десятков операторов!)

    }

Мало того! Вот недавно работал по этой программе, выкладывал себе спокойненько первый ряд красными плитками, и все было хорошо. И надо же было кому-то перейти в режим "Установки" и поменять размеры паркета ! Чуть было не упал за пределы поля! Пришлось исправлять программу.

Неужели придется и в дальнейшем работать по этой огромной программе, когда надо будет выложить красными плитками всего лишь один ряд? Конечно же, нет!

Паркетчик прекрасно понимает конструкцию Делать пока, о которой мы так много говорили. А вот и высказывания, истинность которых он умеет проверять:

  • Справа стена

  • Слева стена

  • Снизу стена

  • Сверху стена

Умеет Паркетчик проверять и отрицание этих высказываний:

  • Не справа стена

  • Не слева стена

  • Не снизу стена

  • Не сверху стена

Почему так странно, не по правилам русского языка, располагается частица НЕ, мы поговорим немного позже, а сейчас воспользуемся новым оператором Паркетчика для облегчения жизни... Нет, не Паркетчику, а в первую очередь себе.

  • Так, не составляет труда написать коротенькую программу, с помощью которой Паркетчик выложит нижний ряд красными плитками при каком угодно размере паркета:

    Программа
    {

      Делать пока (не справа стена)
      { Положить (к);
      Шаг вправо;
      }
    }

    Наберите эту программу и заставьте Паркетчика ее выполнить.

    Все ли получилось так, как вы задумывали? Если нет — немного подумайте, подправьте программу и запустите ее еще раз. Другими словами, займитесь ее отладкой.

  • Если вы точно уверены, что до конца разобрались с первой программой, попробуйте заказать Паркетчику одноцветную рамочку вдоль границ поля неизвестных размеров. Для этого достаточно к вышенаписанному оператору цикла приписать еще три почти таких же. Будем надеяться, это вряд ли вызовет у вас затруднения.

  • Теперь давайте попробуем выложить красными плитками все поле. Очевидно, можно было бы записать следующий алгоритм:

      Закрасить первый ряд;
      Вернуться на ту плитку, с которой начинал;
      Делать пока (не сверху стена)
      { Шаг вверх;
      Закрасить ряд, на котором стоишь;
      Вернуться на ту плитку, с которой начинал;
      }

    Но в том-то и дело, что это — алгоритм, а не программа. Нам он понятен, а Паркетчику — лишь частично. Воспользуемся тем самым приемом сборки программы, который уже помог нам как-то раз организовать двойной цикл. Правда, теперь мы имеем дело с Паркетчиком, а не с Томом, ну да какая разница — исполнитель-то все равно бездумный.

    Итак, можем ли мы написать программу, с помощью которой Паркетчик закрасит первый ряд?

    Поскольку мы это уже сделали, то с ходу приводим ее текст:

    Делать пока (не справа стена)

      { Положить (к);
      Шаг вправо;
      }
    Положить (к);

    Внимательно присмотревшись, понимаем, что это не просто программа закраски первого ряда, но любого. Лишь бы к ее началу Паркетчик стоял в самой левой клетке этого ряда. Значит, ее вполне можно вставлять вместо сразу двух операторов алгоритма:

    Закрасить первый ряд;

    Закрасить ряд, на котором стоишь;

    На следующем этапе мы получим алгоритм, который уже гораздо ближе к программе на языке Паркетчика:

    (* Закрасить первый ряд; *)
    Делать пока (не справа стена)

      { Положить (к);
      Шаг вправо;
      }
    Положить (к);
    (* конец закраски первого ряда *)
    Вернуться на ту плитку, с которой начинал;

    Делать пока (не сверху стена)

      { Шаг вверх;
      (* Закраска ряда, на котором стоишь; *)
        Делать пока (не справа стена)
        { Положить (к);
        Шаг вправо;
        }
      Положить (к);
      (* конец закраски ряда, на котором стоишь *)
      Вернуться на ту плитку, с которой начинал;
      }

    Остался один оператор, который не понимает Паркетчик:

    Вернуться на ту плитку, с которой начинал;

  • Надеемся, для вас не составит труда перевести его на язык Паркетчика, и то, что получится, вставить в соответствующее место алгоритма.

  • Заставьте Паркетчика выполнить написанную вами программу.

  • Выполняя программу закраски, Паркетчик бегает так, как если бы водил кистью в горизонтальном направлении. Подправьте вашу программу так, чтобы его "кисть" двигалась по вертикали. То есть сначала закрашивается первый столбик, затем — второй и т.д.


ПРАКТИКУМ № 3

Условные операторы в работе Паркетчика

Как мы уже отмечали, жизнь у Паркетчика сложная, а заказчики привередливы: вчера был заказан орнамент в зеленых тонах, а сегодня нужен только в красных. Пришел, видите ли, домой и понял, что зеленый орнамент ему не подходит.

Хорошо, если бы это был какой-то единичный случай. Можно было бы просто переписать программу выкладывания орнамента, заменив все операторы Положить (з); на операторы Положить (к).

Однако желающих поменять цвет паркета так много, что хочется иметь программу, выполнив которую Паркетчик заменил бы все зеленые плитки на красные. Но для этого Паркетчик должен уметь распознавать цвета плиток.

По счастью, в добавление к высказываниям

    <>
  • Справа стена
  • Слева стена
  • Снизу стена
  • Сверху стена

Паркетчик умеет проверять, истинны ли такие два высказывания: "на клетке, где я нахожусь, лежит красная плитка" и "на клетке, где я нахожусь, лежит зеленая плитка".

Договоримся для краткости писать эти условия в алгоритмах так: красная плитка и зеленая плитка (а вы в тетрадях можете писать еще короче, например , как в СК Паркетчика: Если (к)...) — и попробуем разобраться с такой задачей:

Где-то на границах поля располагаются плитки разных цветов.
Требуется все красные плитки заменить на зеленые.

Алгоритм решения этой задачи довольно-таки прост:

Обежать границы поля;
В процессе обегания
Если (к) то {Снять плитку; Положить (з)};

Конечно, Паркетчик такого алгоритма не поймет. Если вы еще не забыли, БИ требуется программа. То есть алгоритм, записанный с помощью СК БИ. Поэтому вспомним предыдущую работу и программу, с помощью которой мы раскрашивали границы поля в красный цвет. В ней Паркетчику как раз пришлось обежать границы и в процессе обегания выкладывать красные плитки:

Программа
{
Делать пока (не справа стена)

    { Положить (к);
    Шаг вправо;
    }
    Положить (к);

Делать пока (не сверху стена)

    { Положить (к);
    Шаг вверх;
    }
    Положить (к);

Делать пока (не слева стена)

    { Положить (к);
    Шаг влево;
    }
    Положить (к);

Делать пока (не снизу стена)

    { Положить (к);
    Шаг вниз;
    }
    Положить (к);
}

Для вас, умудренных опытом написания и отладки этой программы с четырьмя циклами, вряд ли будет сложным чуть-чуть ее подправить и, используя оператор Если ...то..., решить поставленную задачу замены плиток. Не забудьте нажимать клавишу F4 и использовать текстовые шаблоны.

Еще немного измените программу замены плиток так, чтобы с ее помощью Паркетчик решал похожую, но чуть более сложную задачу:

Где-то на границах поля располагаются плитки разных цветов.
Требуется все красные плитки заменить на зеленые и наоборот.

Ну и, наконец, самое сложное. Пользуясь тем, что вы уже научили Паркетчика обегать не только границы, но и вообще все поле, составьте для него программу смены цвета всех лежащих на поле плиток.


ПРАКТИКУМ №4

Распознавание образов. Часть 1-я

Уже много говорилось о трудностях работы в сфере сервиса и причудах клиентов. Тем не менее раз уж Паркетчик посвятил всего себя этому нелегкому анятию, попробуем помочь ему разобраться с очередным заказом.

Вдоль нижней границы поля паркета чередуются "лежачие" и "стоячие" фигурки, как это изображено на рис. 3.

Рис. 3. Часть исходного рисунка паркета

Ни одна из фигурок не располагается в углу, и все они красного цвета.
Требуется перекрасить все "лежачие" фигурки в зеленый цвет.

Ну, разумеется, если бы на месте Паркетчика оказались вы, все было бы предельно просто. С высоты птичьего полета вы бы указывали на фигурки и командовали: "Эту!.. И эту!.. А затем – эту!"

К сожалению, такие ваши команды Паркетчик понять не может. Давайте попробуем обойтись теми командами из его СК, которые вы уже знаете.

Сначала попробуем сформулировать решение задачи на своем собственном языке, но стараясь мыслить примерно так же, как и Паркетчик. Это не так уж и сложно.

Итак, бежим по первой строке, и, если натыкаемся на две красные плитки, лежащие одна за другой, — перекрашиваем.

Теперь запишем это решение более аккуратно, по правилам, о которых мы говорили в предыдущих параграфах:

Бежим по первой строке и

    Если (встретили две рядом лежащие красные плитки)

      то {Перекрасить их в зеленый цвет};

Разумеется, Паркетчик не понимает ни слова из того, что мы написали, кроме разве что подчеркнутых слов и фигурных скобок.

По счастью, мы уже решали задачу, связанную с просмотром нижней строки, и нам не составляет никакого труда уточнить решение:

Программа
{

    Делать пока (не справа стена)
      {Шаг вправо;
      Если (встретили две рядом лежащие красные плитки)
      то {Перекрасить их в зеленый цвет};
      }
}

Здесь Паркетчик понимает уже существенно больше, и нам осталось только написать на его языке часть, начинающуюся с оператора Если.

Итак, как же Паркетчику определить, что он встретил две красные плитки подряд? Немного подумав, мы поймем:

как только Паркетчик обнаружит красную плитку, ему необходимо сделать шаг вправо и проверить, не лежит ли там еще одна.

Но шаг вправо и проверка делаются только тогда, когда мы встанем на красную плитку! Это очень важно, потому что неверное определение области действия оператора Если приведет к неправильной расстановке фигурных скобок и в итоге к неправильной работе программы. Получаем следующую версию программы:

Программа
{

    Делать пока (не справа стена)
    {Шаг вправо;
      Если (к) то {Шаг вправо;
        Если (к) то {Перекрасить их в зеленый цвет};
      } (* конец первого «Если» *)
    } (*конец цикла *)

}

Осталось всего ничего: заменить оператор

Перекрасить их в зеленый цвет;

на операторы из СК Паркетчика. Например, такие:

      Шаг влево;
      Снять плитку;
      Положить (з);
      Шаг вправо;
      Снять плитку;
      Положить (з);

Вставьте самостоятельно эти операторы в программу.

Немыслимые усилия, затраченные нами на то, чтобы научить Паркетчик решать крайне примитивную, с точки зрения человека, задачу, еще раз заставляют вспомнить о различиях в восприятии информации человеком и компьютером, о котором мы говорили в самом начале изучения информатики.

Задача, которую мы только что решили, весьма похожа на те, которые с переменным успехом решают вот уже несколько поколений программистов. Это так называемые задачи распознавания образов.

Представьте, что вы написали какое-нибудь слово своим обычным почерком. И точно так же, не особенно стараясь, по одному слову написали все ученики вашего класса.

Удивительный факт, но до сих пор не существует компьютера, который смог бы уверенно прочитать все те слова, которые вы написали разными почерками. Быть может, помогая Паркетчику в решении сегодняшней задачи, вы хоть немного поняли, почему это так.

Вопросы и задания

Наберите программу, о которой шла речь выше, и отладьте ее.


ПРАКТИКУМ № 5

Распознавание образов. Часть 2-я

Между прочим, мы умеем обходить не только первую строчку, но и все поле. Давайте посмотрим, насколько сложно обучить Паркетчика распознавать на всем поле все те же фигурки, похожие на лежащие и стоящие костяшки домино. Конкретнее:

На поле паркета располагаются "лежачие" и "стоячие" фигурки, как это изображено на рис.4.

Рис. 4. Часть исходного рисунка паркета

Ни одна из фигурок не касается края поля или другой фигурки, и все они – красного цвета.

Требуется перекрасить все "лежачие" фигурки в зеленый цвет.

Наверное, вы скажете, что тут нет ровным счетом ничего сложного: достаточно в уже известную программу просмотра поля вставить несколько операторов – и дело готово:

    Делать пока (не справа стена)
    { Шаг вправо;
      (* начало нового куска программы *)
      Если (к) то { Шаг вправо;
        Если (к) то {
        Снять плитку;
        Положить (з);
        Шаг влево;
        Снять плитку;
        Положить (з);
        Шаг вправо;
        Шаг вправо;
        }
      }       (* конец нового куска *)
    }
    (* конец просмотра первого ряда *)

Вернуться на ту плитку, с которой начинал;

    Делать пока (не сверху стена)
    { Шаг вверх;
    (* Просмотр ряда, на котором стоишь; *)

      Делать пока (не справа стена)
      { Шаг вправо;
      (* сюда еще раз вставляется новый кусок *)
      }
    (* конец просмотра ряда, на котором стоишь *)
    Вернуться на ту плитку, с которой начинал;
    }

Как видите, уже известная программа просмотра всего поля обогатилась лишь двумя новыми одинаковыми кусочками, один из которых написан и выделен жирным шрифтом.

Если мы сравним ее с программой в решении предыдущей задачи, то найдем одно весьма важное сходство:

после каждого шага вправо следует проверка на "лежачую фигуру".

И проверка эта в обеих задачах в общем-то одинаковая и не очень сложная. Но это потому, что и фигурки, которые должен распознать Паркетчик, совсем простенькие.

Давайте посмотрим, как Паркетчик будет распознавать более сложные фигуры . Например, такие, какие приведены на рис. 5 :

Рис. 5

Договоримся, что перекрашивать в зеленый цвет надо фигурки, похожие на букву "Г" с перекладинкой в другую сторону.

Теперь мало найти две подряд лежащие красные плитки. Надо сделать еще одну дополнительную операцию, и проверка будет выглядеть так:

(* начало проверки *)
Если (к) то { Шаг вправо;

    Если (к) то { Шаг вниз;
      Если (к) то {
      Перекрасить фигурку;
      Вернуться на тот ряд, по которому бежал, но уже на клетку правее от фигурки;
      } (* конец третьего «Если» *)
    } (* конец второго «Если» *)
} (* конец проверки *)

То есть нам пришлось иметь дело уже с тремя операторами Если, вложенными один в другой.

Первое вложение означает, что Паркетчик делает шаг вправо, а затем проверку на красную плитку в том и только в том случае, если он в самом начале попал на красную плитку.

Второе вложение означает, что Паркетчик делает шаг вниз и еще одну проверку на красную плитку в том и только в том случае, если он попал в самом начале на красную плитку, сделал после этого шаг вправо и снова попал на красную плитку.

Ну уж если и после этого он обнаружит на своем пути красную плитку – это уж точно означает, что он отыскал фигурку нужного нам типа и ее просто необходимо перекрасить.

Подведем итоги

В задачах на распознавание фигурок, которые мы рассмотрели, Паркетчику необходимо обежать все поле, используя измененную стандартную программу, которую мы отладили еще во втором Практикуме, закрашивая красными плитками все поле. Изменение заключается в том, что после каждого шага вправо необходимо осуществить проверку типа фигурки и, если необходимо, ее перекрасить.

Вопросы и задания

1. Напишите и отладьте программу распознавания фигурок, изображенных на рис. 5:

а) в том варианте, в котором она разобрана в объяснительном тексте;

б) в варианте, когда перекрашивать надо фигурки другого типа. То есть, те, у которых внизу располагаются две красные плитки, а вверху - одна.

2. Напишите программы распознавания для фигур, изображенных на рисунках 6 а, б, в (точно так же, как и в первой задаче, рассмотрите оба варианта перекрашивания фигурок):

Рис. 6а

Рис. 6б

Рис. 6в

3. На поле расположены "контейнеры" двух типов (см. рис. 7). Все эти контейнеры выложены плитками красного цвета. Напишите программу для Паркетчика, выполнив которую он бы заполнил маленькие контейнеры зелеными плитками, а большие оставил бы пустыми.

Рис. 7


ПРАКТИКУМ № 6.

Передвижение в лабиринте. Часть 1-я

"Когда Тесей пришел в Афины, вся Аттика была погружена в глубокую печаль . С Крита от могущественного царя Миноса прибыли послы за данью. Тяжела и позорна была эта дань. Афиняне должны были каждые девять лет посылать на Крит семь юношей и семь девушек. Там их запирали в громадном дворце — Лабиринте, и их пожирал Минотавр, ужасное чудовище с туловищем человека и головой быка..."

Надеемся, вы еще не забыли этот жуткий древнегреческий миф и помните, как мудрая Ариадна помогла своему любимому Тесею прикончить хоть и ужасное, но в чем-то глубоко несчастное чудовище и живым выйти из Лабиринта.

Вот с тех стародавних времен лабиринты и стали модным развлечением. Наверняка и вы не раз старательно прорисовывали путь по лабиринту на страничке какого-нибудь детского журнала, помогая, например, любимому Винни-Пуху добраться до меда.

Давайте обучим и нашего Паркетчика гулять по лабиринтам. Но лабиринт надо сперва создать. Для этого в режиме изменения рисунка паркета (функциональная клавиша F5) нажмите буквенную клавишу C и нарисуйте несколько столбиков. Стереть их можно, как обычно, клавишей пробела.

Столбики принципиально отличаются от разноцветных плиток тем, что Паркетчик воспринимает их как стенки и пройти сквозь них не может. То есть, если справа от Паркетчика располагается столбик, а вы дали ему команду Шаг вправо, он обиженно просигнализирует: «Ошибка во время выполнения программы».

Другими словами, к столбикам применимы проверки высказываний:

    Справа стена

    Слева стена

    Снизу стена

    Сверху стена

Конечно, прогулка по сложному лабиринту, судя по приключениям того же Тесея, дело очень даже непростое. Поэтому сначала мы будем учить Паркетчика обходить лабиринты простенькие. Итак:

Задача

Поле произвольных размеров перегорожено стеной так, как это изображено на рис. 8

Рис.8

Проход в стене может находиться в любом месте, но не в первой строчке. Где-то возле правой стены (но выше прохода) располагаются несколько зеленых и красных плиток.

Необходимо составить программу для Паркетчика, выполняя которую он найдет проход.


ПРАКТИКУМ № 7

Передвижение в лабиринте

Часть 2

Научив Паркетчика "проходить сквозь стену" в предыдущем практикуме, , мы не остановимся на достигнутом и усложним задание.

Задача

Поле произвольных размеров перегорожено несколькими стенами различной толщины с проходами ширины 1 примерно так, как это изображено на рис . 10. Размеры поля и количество стен неизвестны.

Рис. 10

Требуется пройти сквозь все проходы в стенах и убрать плитки разного цвета, располагающиеся в проходах и у правой стены.

Мы уже решали похожую задачу, и вы наверняка уже потянулись за карандашом, чтобы указать Паркетчику путь (см. рис. 11 ):

Рис. 11

Возможно, у некоторых из вас появилось искушение проводить линию через проходы в стенках без лишнего крюка вниз – непосредственно до следующей стенки (см. рис. 12 ).

Рис.12

Но вот спустится ли Паркетчик вниз после последней стенки? К сожалению, он не знает, сколько стенок ему преодолевать, а значит, не сможет и определить, которая из стенок последняя.

Стало быть, Паркетчик попросту не способен пробежаться вниз там, где это указано стрелочкой.

И все же не хочется заставлять Паркетчика спускаться каждый раз на первую строку. Казалось бы, возможен и другой вариант обхода. Если в процессе обхода и сверху, и справа от Паркетчика будет располагаться стена, он уж точно поймет, что находится возле границы поля, и тогда достаточно заставить его лишний раз пробежаться вниз так, как это показано на рис.13 .

Рис.13

Но к сожалению, вовсе не факт, что проход в очередной стене располагается выше того, который мы только что миновали. Поэтому мы не получим варианта обхода, который был бы проще варианта, соответствующего рис. 11.

Итак, начнем. Поскольку мы не знаем ни количества стенок, ни их толщины, ни даже размеров поля, необходимо заставить Паркетчика многократно выполнять серию однотипных действий, организовав цикл.

Внимательно приглядевшись к рис. 11 , можно в качестве таких действий выбрать следующие:

    Бежать вправо до стены;
    Добежав до стены справа,
    бежать вверх до дыры справа или до тех пор, пока не упремся в стенку сверху
    (*стена сверху в этом месте и будет означать конец работы*);
    Бежать по проходу в стене вправо до тех пор, пока снизу есть стена;
    После выхода из дыры бежать вниз до стены;

Естественно, на каждом шаге необходимо проверять, не наткнулся ли наш исполнитель на цветную плитку, и если наткнулся - необходимо ее убрать.

Постоянно заставляя Паркетчика опускаться на первую строчку поля, мы уверены, что он пробежится по самому последнему столбику поля, начиная с самого его низа и уберет на нем все цветные плитки.

Все эту серию однотипных действий необходимо поместить в цикл, обеспечивающий их выполнение "по кругу". Например, в такой:

    Делать пока (не сверху стена)
    { Бежать вправо до стены;
    Добежав до стены справа,
    бежать вверх до дыры справа или до тех пор, пока не упремся в стенку сверху
    (*стена сверху в этом месте и будет означать конец работы*);
    Бежать по проходу в стене вправо до тех пор, пока снизу есть стена;
    После выхода из дыры бежать вниз до стены;
    }

Конечно, если мы внимательно проанализируем алгоритм, то поймем, что Паркетчик упрется в стенку сверху отнюдь не при проверке условия самого главного цикла, а поднимаясь вверх во внутреннем цикле. Это место алгоритма отмечено у нас комментарием. Таким образом, самый внешний цикл носит чисто формальных характер. Его условие окончания никогда не сработает.

Осталось аккуратно перевести операторы нашего алгоритма в команды из Системы Команд Паркетчика.

Итак:

Бежать вправо до стены;

Это уже многократно встречавшаяся конструкция:

    Делать пока (не справа стена)
        { Шаг вправо;
        } (* конец цикла *)

Немного сложнее будет перевод следующего оператора:

Добежав до стены справа,
бежать вверх до дыры справа или до тех пор, пока не упремся в стенку сверху
(*стена в этом месте сверху и будет означать конец работы*);

    Делать пока ((справа стена) и (не сверху стена))
    { Шаг вверх;
      Если (К или З) то {Снять плитку;}
    } (* конец цикла *)
    Если (сверху стена) то {Стоп;}

То есть Паркетчик как бы держится правой рукой за стену, поднимаясь вверх. В расчете на последнюю колонку в этот цикл добавлены операторы, убирающие плитки. Обратите внимание, что для окончания работы Паркетчика использован новый для вас оператор Стоп;. Встретив его в программе, исполнитель просто нормально заканчивает работу.

Как только справа не будет стены, пора переходить к следующей стадии:

Бежать по проходу в стене вправо до тех пор, пока снизу есть стена:

    Делать пока (снизу стена)
    { Шаг вправо;
      Если (К или З) то {Снять плитку;}

    } (* конец цикла *)

Надеемся, для вас не составит большого труда закончить перевод оставшихся операторов алгоритма на язык Паркетчика и запустить получившуюся программу.


ПРАКТИКУМ № 8

Передвижение в лабиринте

Часть 3

Решая предыдущую задачу обхода лабиринта по варианту, которому соответствует рис. 11 , мы применили очень древнее правило. Паркетчик как бы коснулся правой рукой стенки лабиринта и, не отрывая руки от стены, успешно по нему прошел.

Это чудесное правило так и называется — "Правило правой руки", и позволяет оно найти выход из любого лабиринта, если он односвязный.

Не надо пугаться нового слова. Его смысл очень прост. Представьте себе, что лабиринт сделан из деревянных стен. Он называется односвязным в том случае, когда сгорает весь, где бы мы ни подожгли стену, при условии, что огонь не перебрасывается через коридоры. Так, лабиринт, изображенный на рис.14 , является односвязным, а на рис. 15 – нет.

Рис. 14. Односвязный лабиринт

Рис. 15 . Многосвязный лабиринт

Не забывайте, что граница поля – тоже стена наших лабиринтов.

Итак, при условии, что лабиринт – односвязный и выход всегда находится возле стены, можно смело его искать, используя правило правой руки. Пробегитесь с Паркетчиком по лабиринту, изображенному на рис. 14 , и убедитесь, что возле какой бы стены ни стояла зеленая плитка, отмечающая выход, Паркетчик ее найдет.

Напротив, если лабиринт не односвязный, то существует множество клеток возле стен, в которых Паркетчик никогда не побывает, обходя лабиринт по правилу правой руки.

Итак, решаем последнюю задачу нашего «лабиринтного» практикума.

Задача

Поле произвольных размеров перегорожено несколькими стенами различной толщины, образующими односвязный лабиринт. Возле одной из стен стоит зеленая плитка, отмечающая выход из лабиринта. В качестве примера вполне можно рассматривать лабиринт на рис. 14.

Требуется найти зеленую плитку.

Обучим Паркетчика правилу правой руки.

Проанализировав свое путешествие по лабиринту, изображенному на рис. 14 , мы обнаружим, что оказывались в четырех различных ситуациях:

Ситуация 1:

Снизу стена и справа нет стены – нужно делать шаг вправо. Если мы натыкались на стену, то переходили в

Ситуацию 2:

Справа стена и сверху нет стены – нужно делать шаг вверх. Если мы натыкались на стену, то переходили в

Ситуацию 3:

Сверху стена и слева нет стены – нужно делать шаг влево. Если мы натыкались на стену, то переходили в

Ситуацию 4:

Слева стена и снизу нет стены – нужно делать шаг вниз. Если мы натыкались на стену, то переходили в ситуацию 1.

Стало быть, надо просто поместить эти ситуации в один большой цикл, а на каждом шаге проверять, не попалась ли нам зеленая плитка. То есть, поступить точно так же, как и во второй части «лабиринтного» практикума.

Так-то оно так, но при анализе ситуаций мы разобрали только один из возможных вариантов: "Шли и наткнулись на стенку". Но ведь возможен и другой вариант. Посмотрите, например, на рис. 16.

Рис. 16 . Фрагмент лабиринта с Паркетчиком, движущимся вправо

Паркетчик находится в первой ситуации и движется вправо до тех пор, пока, напоминаем, снизу есть стена и справа нет стены. Но как только эти условия перестают выполняться, он вовсе не переходит во вторую ситуацию, поскольку не наткнулся на стену, а "завис над провалом" (см. рис. 17 ). Его положение не удовлетворяет условиям ни одной из ситуаций.

Рис. 17

В таком случае Паркетчику, чтобы не нарушить правило правой руки, необходимо сделать шаг вниз. Кстати, это необходимо сделать и в том случае, когда он не только "завис над провалом", но и одновременно наткнулся на стену (см. рис. 18 ).

Рис. 18

Как вы помните, мы договорились поместить все ситуации в один большой цикл, поэтому после шага вниз Паркетчик примется по очереди проверять условия всех ситуаций. А условия ситуации номер 2 вполне удовлетворяют его положению: справа стена и сверху нет стены. Стало быть, Паркетчик пойдет вверх вместо того, чтобы исследовать провал.

Для того чтобы избежать отступления от правила правой руки, надо всего лишь поменять порядок ситуаций в цикле следующим образом:

    Делать пока (не З)
      {Ситуация 1;
      Ситуация 4;
      Ситуация 3;
      Ситуация 2;
      } (* конец цикла *)

Вот тогда, очутившись в положении, показанном на рис. 17 , и сделав шаг вниз, Паркетчик перейдет к отработке ситуации номер 4, поскольку она встретилась ему первой, и успешно зашагает вниз, что от него и требуется.

Напишем то, что должен делать Паркетчик в первой ситуации:

    Делать пока ((снизу стена) и (не справа стена) и не (З))
    { Шаг вправо;
    Если (не снизу стена) то {Шаг вниз;}
    } (* конец)


ПРАКТИКУМ №9

Передача параметров в подпрограмму

В этом практикуме мы не торопясь разберем задачу, поставленную перед Паркетчиком очередным заказчиком-эстетом.

Задача

(закраска зала разноцветными прямоугольниками)

Поле произвольных размеров, но такое, что количество клеточек по горизонтали и вертикали делится на 2, требуется закрасить так, как это показано на рис. 25.

Рис. 25

Мы уже не раз обегали поле по периметру, выкладывая разноцветные бордюры, так что и эта задача не отличается какой-то особой новизной. Просто надо обеспечить, чтобы Паркетчик выкладывал плитки определенного цвета не только до стенки, а либо до стенки, либо до выложенных плиток какого-либо цвета.

То есть вполне можно себе представлять Паркетчика стоящим в левом нижнем углу незакрашенного участка с задачей выложить бордюр (см. рис . 26 ).

Рис. 26

Тогда проект первого уровня может выглядеть так:

Делать пока ((не к) и (не з))
{

    Выложить внутри пустого пространства красный бордюр;
    Шаг вверх;
    Шаг вправо;
    Выложить внутри пустого пространства зеленый бордюр;
    Шаг вверх;
    Шаг вправо;
}

Тут существенно использовано условие задачи о четности ширины и высоты поля. Именно это дает возможность всегда выложить сразу пару бордюров – красный и зеленый.

Теперь заметим, что непонятные Паркетчику операторы

Выложить внутри пустого пространства красный бордюр;

Выложить внутри пустого пространства зеленый бордюр;

запросто заменяются обычным вызовом подпрограммы с параметром:

    Вызвать Бордюр(к);

    Вызвать Бордюр(з);

Таким образом, вместо проекта первого уровня получается готовая главная программа.

Давайте теперь четко сформулируем, что же должен сделать Паркетчик, выполнив подпрограмму Бордюр.

Уточняющая дополнительная задача:

Паркетчик стоит на частично закрашенном поле произвольных размеров так, как это показано на рис. 26 . Требуется выложить очередной внутренний слой плиток заданным цветом (полученным из главной программы с помощью передачи параметров) и оказаться на исходной клеточке (потому как это необходимо для безошибочной работы главной программы).

Казалось бы, задача выеденного яйца не стоит. Достаточно четырежды написать нечто вроде:

Делать пока ((не справа стена) и (не К) и (не З))
{ Положить (ц);
Шаг вправо
}

и дело сделано.

Однако все не так просто, как это кажется на первый взгляд. Дело в том, что Паркетчик умеет проверять, находится ли справа от него стена, однако не умеет впрямую проверять, находится ли справа от него красная плитка. Стало быть, первый бордюрчик будет выложен правильно, а вот с последующими выйдет накладка.

Посмотрите внимательно: выкладывая все бордюры, кроме первого, Паркетчик выйдет из написанного выше цикла тогда, когда будет стоять на зеленой или красной плитке. Значит, сразу бежать вверх и выкладывать очередную вертикальную полоску нельзя.

Другими словами, если Паркетчик при выкладывании полоски наткнется не на стену, а на какие-нибудь цветные плитки, необходимо сделать еще кое-какие действия.

Будем надеяться, они не окажутся для вас тайной за семью печатями и вы сможете дописать подпрограмму до конца.

Вопросы и задания

(в том числе для повторения)

1. Допишите подпрограмму Бордюр и заставьте Паркетчика выполнить очередной заказ.

2. Используя пункт меню Паркетчика Установки, сделайте поле с нечетным количеством строк и запустите свою программу. Что получилось? Попытайтесь исправить программу так, чтобы она работала правильно и в этом случае.

3. Покрасьте поле произвольного размера под "шахматную доску", чередуя зеленые и красные плитки.

4. Закрасьте поле неизвестного размера в красно-зеленую полоску. Проверьте работу программы для размеров поля 42х30, 35х19, 42х1, 1х20, 1х1 клеток.

5**. На поле Паркетчика достаточно далеко друг от друга и от краев поля расположены красные квадраты и прямоугольники. Требуется все квадраты перекрасить в зеленый цвет.


ПРАКТИКУМ №2
Иллюзия движения, или создаем простенький мультик

Сигнальная переменная, формальные и фактические параметры.

Наверняка все вы знаете, что иллюзия движения и в кино, и в компьютерных мультиках достигается за счет частой (24—25 раз в секунду) смены картинок.

Когда мы смотрим художественный фильм или телепередачу, то фактически просматриваем 24—25 неподвижных слайдов в секунду, отличающихся друг от друга небольшими смещениями объектов.

Значит, для того, чтобы сделать мультфильм, художникам тоже приходится рисовать 24 картинки на каждую секунду действия. В последнее время им на помощь приходят сложные компьютерные программы, способные рассчитать и вывести на экран все фазы движения какого-либо объекта.

Если вы помните, мы сами делали простенький мультик в седьмом классе, используя редактор сценариев. Но там речь шла либо о простой смене заранее подготовленных картинок, либо просто о перемещении объекта без изменения его внешнего вида.

Сегодня мы постараемся понять, как работают компьютерные программы, рассчитывающие движение объекта (например, шагающего робота) и создающие полноценный компьютерный мультфильм.

Итак, требуется создать простенький мультфильм, показывающий взлет птички. При этом мы задаем направление, в котором она будет взлетать. Мультфильм, повторяем, очень простенький, и меняться в нем будут всего два кадра, соответствующие двум положениям крыльев: крылья вверх и крылья расправлены (см. рисунок27).

Рис.27. Две фазы взлета птички. Показано исходное положение Паркетчика.

Сценарий мультимедиа выглядит следующим образом:

  • рисуем птичку с поднятыми крыльями;
  • стираем птичку с поднятыми крыльями;
  • рисуем на этом же самом месте птичку с расправленными крыльями;
  • стираем птичку с расправленными крыльями;
  • рисуем птичку с поднятыми крыльями чуть повыше и, быть может, чуть правее;
  • стираем птичку...

И так до тех пор, пока птичка не улетит за поле Паркетчика.

Давайте оформим этот сценарий в привычном для нас виде алгоритмического проекта:

Делать
от раз:=1 до 25
{Перейти на новое место;
Нарисовать птичку с поднятыми крыльями;
Стереть птичку с поднятыми крыльями;
Нарисовать птичку с расправленными крыльями;
Стереть птичку с расправленными крыльями;}

Давайте сначала займемся оператором

Перейти на новое место;

Введем переменные для хранения изменяющихся координат этого самого нового места. Тогда описание переменных будет выглядеть следующим образом:

цел: раз, столб, строка;

Кроме того, удобно задать смещения по вертикали и горизонтали, на которые будет передвигаться птичка с каждым следующим взмахом крыльев. Именно на величину этих смещений и будут меняться координаты. Стало быть, потребуются еще две переменные:

цел: раз, столб, строка, гор, верт;

Операторы, отвечающие за рисование и стирание птички, заменим, как обычно, вызовом соответствующих подпрограмм. Но, чтобы не плодить их в довольно-таки большом количестве (целых четыре штуки), воспользуемся еще одной программистской хитростью.

Итак, хотелось бы сделать так, чтобы за рисование или стирание одного и того же положения крыльев отвечала одна и та же подпрограмма. Спрашивается: каким образом, начиная работу в подпрограмме, Паркетчик узнает, что от него требуется — рисовать или стирать? Конечно, можно было бы пробежаться до того места, где должна располагаться хотя бы одна красная плитка, и если она есть — начать стирание рисунка. Если же плитки нет — это сигнал к тому, чтобы рисунок создать.

Но, как говорится, есть способ проще. Давайте закажем на складе еще одну переменную, содержимое которой и будет служить для Паркетчика необходимым сигналом для выполнения того или иного действия:

цел: раз, столб, строка, гор, верт, сигнал;

Договоримся, что надо нарисовать крылья, если содержимое коробочки сигнал равняется единице, и стереть — в противном случае.

Переменная, которая помогает Бездумному Исполнителю определить, в какой он оказался ситуации, называется сигнальной переменной.

Тогда основная программа будет выглядеть следующим образом:

Программа
цел: раз, столб, строка, гор, верт, сигнал;
{ верт:=1; (* смещение по вертикали *)
гор:=1; (* смещение по горизонтали *)
столб:=1; (* начальное положение по горизонтали *)
строка:=1; (* начальное положение по вертикали *)

    Делать от раз:=1 до 25
    { Перейти на (столб,строка);
    сигнал:=1;
    Вызвать Рисунок(столб,строка,сигнал);
    сигнал:=0;
    Вызвать Рисунок(столб,строка,сигнал);
    сигнал:=1;
    Вызвать Рисунок1(столб,строка,сигнал);
    сигнал:=0;
    Вызвать Рисунок1(столб,строка,сигнал);
    столб:=столб+гор;
    строка:=строка+верт;
    }
}

Заголовок подпрограммы может выглядеть следующим образом:

Подпрограмма Рисунок (короб: столб, строка,сигнал)
цел: столб,строка,сигнал;

Будем считать, что Паркетчик находится на плитках, соответствующих рисунку 27. А само тело подпрограммы выглядит следующим образом:

{Перейти на (столб,строка);
Если (сигнал=1) то {... (* здесь рисуются
                            крылья *)  }
иначе{... (* а здесь они стираются *)}
}

Кусочки подпрограммы, отвечающие за рисование крыльев и их стирание, практически не отличаются друг от друга. Просто оператор Положить(к); заменяется на Снять плитку;. Поэтому проще воспользоваться возможностями текстового редактора Паркетчика и сначала продублировать уже написанные строки, а уж затем слегка их подправить.

Для этого достаточно:

1. Нажать клавишу "Shift", не отпуская ее, с помощью клавиш управления курсором (известные вам стрелочки) выделить необходимые строки.

2. Нажать клавишу F10, перейти в верхнее меню и выбрать пункт Редактирование.

3. В пункте Редактирование выбрать подпункт Скопировать и нажать клавишу Enter. После этого выделенные строки окажутся в буфере обмена текстового редактора Паркетчика.

4. Поставить курсор на то место, в которое необходимо вклеить содержимое буфера обмена.

5. Аналогично п. 2. и п. 3 перейти в режим Редактирование верхнего меню и выбрать подпункт Вставить.

Надеемся, для вас не составит особого труда дописать подпрограмму Рисунок и не очень-то отличающуюся от нее подпрограмму Рисунок1.


ПРАКТИКУМ № 2
Алгоритмы сортировки. Часть 1.
Выбираем максимальное значение

Давайте вспомним ваш седьмой класс. Конкретнее, уроки информатики, посвященные базам данных. Именно там вы впервые встретились со словом "сортировка" в его узкоспециализированном смысле.

Конечно, будучи уже весьма образованными и культурными людьми, вы наверняка уже сталкивались с ним в своей повседневной жизни. Ну, например, требовалось разложить любимые марки по разным кучкам в соответствии с их тематикой. Или разобрать собранные в лесу грибы. На железной дороге есть даже специальные сортировочные станции, которые формируют из вагонов составы для дальнейшего движения.

В информатике же под термином "сортировка" понимается упорядочивание информации по возрастанию или убыванию значений ключей сортировки. Как вы помните, в случае базы данных "Школа" таким ключом может быть фамилия, и мы получим список учеников в алфавитном порядке. Можно объявить ключом, например, возраст, и мы получим список учеников, в котором чем старше ученик, тем ближе он к началу списка (или наоборот, если сортировка идет по возрастанию).

Для того чтобы облегчить работу с информацией, почти всегда необходимо ее отсортировать. Представьте себе, например, что в вашем классном журнале на каждой странице фамилии учеников написаны в разном порядке. Неудобно, но с этим как-то можно мириться. Ну а если в таком же произвольном порядке хранятся списки жителей города в адресном бюро? Такая, с позволения сказать, "база данных" была бы практически бесполезной в докомпьютерную эпоху.

Задача сортировки, таким образом, — это одна из стандартных задач информатики, и в этом практикуме мы познакомимся с самыми простыми алгоритмами, позволяющими ее решить.

Алгоритм 1
Выбираем максимальное значение

Предположим, мы задались целью получить итоговый протокол забегов на 60 метров, упорядочив участников по результатам. У нас имеется протокол, который был составлен прямо во время соревнований , и результаты в нем неупорядочены.

Самый простой способ достичь желаемого состоит в следующем:

  • находим самого быстрого бегуна;
  • заносим его в новый список под номером 1;
  • вычеркиваем из старого списка;
  • затем находим самого быстрого бегуна среди оставшихся;
  • заносим его в новый список под номером 2;
  • вычеркиваем из старого списка...
  • и так далее, пока в старом списке не останется фамилий.

Видимо, для вас не составит труда записать этот алгоритм с использованием стандартной конструкции Делать пока или, если количество бегунов точно известно, с использованием конструкции Делать от ... до ....

Давайте попробуем использовать этот алгоритм и помочь Паркетчику в решении следующей задачи:

Задача

На поле Паркетчика размером 30х20 стоит какое-то количество красных столбиков, образованных плитками (см. рис. 28).

Рис. 28 . Задача сортировки (поле уменьшено)

Требуется переставить столбики так, чтобы они располагались в порядке убывания размера так, как это показано на рис. 29.

Рис. 29. Конечное положение плиток после сортировки столбиков (поле уменьшено)

В соответствии со сформулированным выше алгоритмом нам требуется найти самый высокий столбик и поставить его на первое место, затем из оставшихся столбиков снова найти самый высокий и поставить на второе место, и так 29 раз подряд. (Находить самый высокий столбик из одного оставшегося и ставить его на 30-е место, очевидно, ни к чему.)

Вот тут-то нам как раз и потребуется оператор цикла Делать от ... до ... Будем считать, что все столбики имеют тот же номер, что и номер столбца, на котором они стоят. Кроме того, есть столбики и нулевой высоты, в которых нет ни одной плитки. Проект первого уровня мог бы тогда выглядеть так:

Делать от ИКС:=1 до 30
{Найти самый высокий столбик среди столбиков с номерами от ИКС до 30;
Поменять местами этот самый высокий столбик и столбик с номером ИКС.
}

Но, прежде чем писать программу, давайте подумаем: как Паркетчику быстрее всего найти самый высокий столбик?

Конечно, можно заставить его посчитать количество плиток в первом столбике, запомнить это число и номер столбца, затем посчитать количество плиток во втором столбике, сравнить это число с запомненным и т.д. В конце концов мы будем знать номер самого высокого столбца...

Но вы-то способны просто ткнуть пальчиком в самый высокий столбец, не занимаясь утомительными подсчетами! Разумеется, мы не раз убеждались в том, что Паркетчику далеко до наших способностей. Тем не менее все же существует более простой алгоритм нахождения самого высокого столбца.

Достаточно просто начать обегание поля с самой верхней строки, и, как только мы наткнемся на красную плитку, это и будет вершина самого высокого столбца!

Воспользуемся в полной мере тем, что мы знаем размеры поля, и напишем, как же осуществляется поиск самого высокого столбика среди оставшихся.

Делать от НОМ:=1 до 20
{Пробежаться по строке с номером 21-НОМ
(*чтобы обеспечить обход сверху вниз *);
В процессе обегания
Если(к) то {Переставить местами тот столбец, на котором находимся, и столбец с номером ИКС;
Перейти к следующему ИКС;}
}

Конечно, пробежаться по строке можно и старым привычным способом: используя оператор Делать пока, но тут важно запомнить номер столбца, на котором мы встретим красную плитку, для дальнейшей перестановки.

Итак, уточняя проект далее, можно записать:

Делать от НОМ:=1 до 20
{
    Делать от СТОЛБ:=ИКС до 30
    {Перейти на (СТОЛБ, 21-НОМ);
    Если (к) то {Переставить местами столбики с номерами ИКС и СТОЛБ;
    Перейти к следующему ИКС;}
    }
}

Переход к следующему ИКС легко осуществляется, если оформить поиск самого высокого столбика как подпрограмму.

Точно так же имеет смысл оформить в виде подпрограммы перестановку столбиков с разными номерами.

В конечном счете имеем

Подпрограмма Обмен(короб: ИКС,СТОЛБ)
{
....
}

Подпрограмма МАКСИМУМ(короб: ИКС)
{

    Делать от НОМ:= 1 до 20
    {
      Делать от СТОЛБ: = ИКС до 30
      {Перейти на (СТОЛБ,21-НОМ);
        Если (к) то {
        Вызвать> ОБМЕН (ИКС,СТОЛБ);
        Возврат;
        }
      }
    }
}

Программа
{
    Делать от ИКС := 1 до 30
    {
    Вызвать МАКСИМУМ(ИКС);
    }
}

Осталось только добавить, что, прежде чем начинать работу в программе и подпрограммах, Паркетчику необходимо сбегать на склад и заказать коробочки с написанными на них именами переменных.

Это делается с помощью операторов объявления переменных:

Программа
цел: ИКС;
{...
}
Подпрограмма МАКСИМУМ (короб: ИКС)
цел: ИКС, НОМ, СТОЛБ;
{...
}

Надеемся, что вы сможете самостоятельно написать подпрограмму перестановки двух столбиков, заказав на складе перед ее выполнением нужные коробочки.

Вопросы и задания

1. Напишите подпрограмму перестановки двух столбиков и запустите программу целиком, нарисовав предварительно красные столбики.


ПРАКТИКУМ №3
Алгоритмы сортировки. Часть 2.
"Пузырьковая" сортировка

Попробуйте напрячь свое воображение и представить, что числа, которые предстоит упорядочить, располагаются в наполненной жидкостью пробирке (см. рис. 30а).

а _________________ б

Рис. 30. Числа в пробирке в начальном положении (слева) и после первого "сортировочного" прохода (справа)

Нам требуется отсортировать числа таким образом, чтобы они шли в порядке убывания (самое маленькое – в самом верху).

Для этого проделаем следующую процедуру: просматриваем по два рядом стоящих числа начиная со дна пробирки и, если они располагаются в неправильном порядке (то, что побольше, находится сверху), меняем их местами;

  • так, вначале мы оставим на своих местах числа 6 и 3;
  • затем поменяем местами 3 и 8;
  • на следующем шаге сравниваются уже не 8 и 5 (восьмерка утонула, пропустив вперед тройку), а 3 и 5, естественно, мы снова меняем их местами.

Легко видеть, что тройка будет всплывать до тех пор, пока не столкнется с единицей.

Единица легче, и поэтому дальнейшее всплытие продолжит именно она.

После того как пробирка будет просмотрена целиком, числа в ней будут располагаться так, как изображено на рис. 30 б.

Понятно, что одним проходом ограничиться нельзя и придется повторить процедуру несколько раз.

Каждый проход обеспечивает всплытие самого "легкого" из оставшихся чисел до тех пор, пока оно не займет правильное положение в пробирке (т.е . выше него будут только меньшие числа).

За первый проход, таким образом, мы обеспечим правильное положение единицы, за второй – тройки. Проверьте, что третий проход завершит сортировку, поскольку четверка и пятерка встанут на свое место уже после второго прохода.

Видимо, вы уже поняли, почему такой способ сортировки называется сортировкой методом "пузырька". Важную роль, конечно, играет и то, что мы разбираемся с числами, начиная со дна пробирки. Если бы мы изменили направление просмотра, то за один просмотр добивались бы "затопления" самого тяжелого числа из оставшихся, а метод пришлось бы назвать методом "утопленника", что, разумеется, не добавляет оптимизма.

Вернемся к рис. 30 . К сожалению, далеко не во всех случаях для сортировки семи чисел методом "пузырька" требуется всего три прохода. Если бы числа располагались в порядке, изображенном на рис. 31, нам потребовалось бы уже шесть проходов.

Рис. 31 . Исходное расположение чисел, требующее шести проходов

Глядя на рис. 31, легко понять, что и в общем случае нам потребуется N–1 проход для того, чтобы отсортировать N чисел.

Вернемся теперь к задаче сортировки, поставленной перед Паркетчиком в предыдущем практикуме.

Попробуем расположить колонны, выложенные красными плитками, в правильном порядке, используя алгоритм сортировки "пузырьком".

Проект первого уровня для решения этой задачи мог бы, к примеру, выглядеть так:

Делать от ИКС:=1 до 29

    {Делать от ИГРЕК:=1 до 29
    {Сравнить столбики с номерами "ИГРЕК" и "ИГРЕК+1";
    Если (столбик "ИГРЕК" ниже столбика "ИГРЕК+1") то
    {Поменять местами эти столбики;}
    }
}

Конечно, доводка проекта до конкретной программы требует от нас довольно большой работы: совершенно непонятно, как реализовать на языке Паркетчика целых три оператора, составляющих сердцевину программы:

Сравнить столбики с номерами "ИГРЕК" и "ИГРЕК+1";

    Если (столбик "ИГРЕК" ниже столбика "ИГРЕК+1") то

    {Поменять местами эти столбики;}

Разумеется, несложно заставить Паркетчика подойти к "игрековому" столбику, но вот что делать дальше?

Давайте посмотрим на варианты расположения двух рядом стоящих столбиков (см. рис. 32).

a
б
в
г

Рис. 32. Варианты взаимного расположения двух рядом стоящих столбиков в задаче сортировки

Предположим, Паркетчик стоит на самой нижней клеточке левого столбика (как это показано на рис. 32). Как ему в общем случае узнать, надо ли менять местами два столбика или нет?

Конечно, можно посчитать количество красных плиток в каждом столбике, но можно вспомнить прием, который мы применили при поиске самого высокого столбика в алгоритме № 1.

А именно: достаточно добежать до вершины левого столбика, встать на одну клеточку выше самой верхней плитки и сделать шаг вправо. Если при этом мы окажемся на красной плитке, то это повод для начала операции по перестановке столбиков.

Если же справа красной плитки не окажется, все нужно оставить как есть.

Случаи, изображенные на рис. 31в и 31г, нисколько не меняют описанного алгоритма.

Принять же во внимание следует совсем другой случай. А именно – вовсе даже не всегда мы сможем встать выше самой высокой красной плитки столбика. А ну как столбик упирается в верхнюю стену?

После столь подробного обсуждения можно уже написать главную программу:

Программа
цел: ИКС, ИГРЕК;
{Делать от ИКС:=1 до 29

    {Делать от ИГРЕК:=1 до 29
      {Перейти на (ИГРЕК,1);
        Делать пока((К) И (НЕ сверху стена))
        {Шаг вверх;}
        Если ( (НЕ сверху стена) И (НЕ К)) то
    (* Это означает, что дальнейшие действия по проверке и, если надо, перестановке столбцов Паркетчик будет выполнять только в том случае, если он не попал на максимально высокий столбец, который, понятное дело, надо оставить в покое *)
        {Шаг вправо;
        Если (к) то {Вызвать Перестановка;}
        }

      } (* Закончились манипуляции с очередным столбиком *)

    } (* Закончился очередной просмотр *)

} (* Закончилась программа *)

Осталось понять, каким же образом переставлять столбики и, соответственно, написать подпрограмму Перестановка2.

Итак, перед выполнением подпрограммы «Перестановка» Паркетчик оказался в одном из двух положений (см. рис. 33а, б ).

a
б

Рис. 33а, б . Положение Паркетчика после того, как обнаружилось, что необходимо переставить местами два столбика

Легко видеть, что и в том, и в другом случае достаточно просто сдвинуть все красные плитки из правого столбца на одну клеточку влево. А начинать надо с той, на которой стоит Паркетчик.. Именно это и будет содержанием подпрограммы Перестановка, которую, мы уверены, вы легко сможете написать самостоятельно.

Вопросы и задания.

1. Почему описанный выше способ сортировки называется сортировкой методом "пузырька"?

2. Почему в общем случае необходимо не менее N–1 проходов, чтобы отсортировать N объектов этим методом? Нарисуйте, к примеру, как будет выглядеть ряд чисел, изображенный на рис. 31 , после второго прохода.

3. Как ни странно, но третье задание дословно повторяет первое из предыдущего практикума. . Напишите подпрограмму перестановки двух столбиков и запустите программу целиком, нарисовав предварительно красные столбики.

4. Сравните два способа сортировки. Какой из них вам больше нравится? Какие у них есть плюсы и минусы?


ПРАКТИКУМ №4 .
Алгоритмы сортировки. Часть 3.
Сортировка в особых случаях

Если при выполнении задания 4 из предыдущего практикума вы сравнили, какой же из двух способов сортировки работает быстрее, то наверняка обнаружили, что работают они примерно одинаково медленно.

И первый, и второй способы в общем случае требуют N–1 просмотров столбиков, расположенных на поле.

Есть, конечно, и более быстрые универсальные способы сортировки, и, возможно, вы встретитесь с ними в будущем, а пока давайте рассмотрим следующую задачу:

Задача. 10 000 чисел принимают лишь пять значений: 1, 2, 3, 4 и 5. Требуется отсортировать эти числа по возрастанию.

Конечно, можно решить эту задачу, используя любой из двух универсальных алгоритмов, которые мы изучили. Но представляете, каково почти десять тысяч раз просматривать столько чисел! Задача не из приятных даже и для быстродействующего БИ.

Между тем данная конкретная задача может быть решена гораздо быстрее. Достаточно использовать специфику сортируемых чисел. А именно то, что они принимают не так уж много значений.

Для каждого из пяти значений можно завести коробочку-счетчик и, просмотрев числа ровно один раз, пересчитать, сколько нам встретится единичек, двоек, троек и т.д. Затем останется только взять первую коробочку и извлечь из нее число. Оно как раз и покажет, сколько чисел начиная с первого должно быть равно 1. Потом надо взять вторую коробочку и вслед за единичками расположить столько двоек, каково содержимое этой самой коробочки...

Как видите, некоторые совершенно конкретные задачи сортировки могут решаться очень быстро. Правда, способы их решения не являются, к сожалению , универсальными.

Снова вспомним задачу сортировки красных столбиков, которую вот уже дважды решал Паркетчик.

А нельзя ли и для нее придумать какой-нибудь быстродействующий алгоритм?

Давайте посмотрим еще раз на исходное расположение плиток (см. рис. 34 ):

Рис. 34 . Исходное положение плиток

А теперь представьте, что поле Паркетчика быстро перевернули на 90° против часовой стрелки (см. рис. 34а ):

Рис. 34а . Вид поля после поворота на 90° против часовой стрелки

Еще немного напрягите воображение и представьте, что все красные плитки на рис. 34а осыпались вертикально вниз (см. рис. 35):

Рис. 35 . Вид поля после "осыпания" плиток вниз

Получается именно то, что нам необходимо, а именно — отсортированная последовательность столбиков.

Конечно, переворачивать поле Паркетчик не умеет. Но, поняв принцип этого решения, несложно написать алгоритм, более приближенный к возможностям нашего исполнителя:

Обежать все строки;
В каждой строке сдвинуть все красные плитки до упора влево;

В такой формулировке задачу можно было бы решить и не пользуясь вновь обретенным даром Паркетчика считать1. Но дальнейшее уточнение алгоритма в этом случае будет довольно-таки громоздким и не очень-то простым.

Давайте приведем другую формулировку алгоритма, пользуясь тем, что Паркетчик может просто-напросто пересчитать все красные плитки в строке:

Делать от строка:=1 до 30
{Пробежать по строке, снимая плитки и считая их количество в переменной "красные";

    Делать от раз:=1 до красные
    {Перейти на (раз, строка);
    Положить (к);
    }
}

Немного подробнее остановимся на том, как Паркетчик будет считать количество красных плиток в строке.

Конечно, перво-наперво он побежит на склад и возьмет там коробочку, на которую наклеит этикетку "Красные".

Далее, пробегая по строке и встречая красную плитку, он будет снимать эту плитку, а в коробочку кидать бусинку.

Естественно, он должен быть уверен в том, что изначально в коробочке ничего нет.

Этот алгоритм описывается следующим образом:

красные:=0; (* вытряхнули коробочку, чтобы к началу выполнения программы в ней было пусто *)
Делать от раз:=1 до 42
{Перейти на (раз,строка);

    Если (к) то {красные:=красные+1;
    Снять плитку;}
}

Вот теперь, надеемся, для вас не осталось темных пятен в программе и вы без труда ее напишете.

Вопросы и задания

1. Напишите программу целиком и запустите ее, нарисовав предварительно красные столбики. Сравните, насколько быстрее работает этот алгоритм по сравнению с двумя предыдущими.


ПРАКТИКУМ №1.

Обучаем Паркетчика играть в "Жизнь"

Начнем с некоторого уточнения правил игры. Паркетчик, как известно, работает вовсе не на бесконечном поле, и поэтому мы будем прослеживать эволюцию колонии клеток только до тех пор, пока она расположена достаточно далеко от границ поля.

А теперь вспомним, как мы в самый первый раз играли в "Жизнь".

1. Вначале желтым цветом мы отметили те пустые клетки, на которых должна родиться новая плитка. Если бы мы сразу положили на них красные плитки, то запросто бы запутались в том, какие плитки следует снимать из-за перенаселенности или недостатка общения.

2. Далее для определенности мы перечеркивали те плитки, которые нужно снять.

3. И лишь после этого на желтые клетки были положены красные плитки, а с перечеркнутых - плитки снимались.

Давайте попробуем представить, как мог бы Паркетчик со своей Системой Команд выполнить такие же действия.

Конечно, вместо желтых Паркетчик способен с таким же успехом раскладывать зеленые плитки, а вот дополнительно перечеркивать клетки поля, с которых плитки необходимо снять, ему не под силу.

А, собственно говоря, зачем их перечеркивать? Нельзя ли сразу же после выкладывания зеленых плиток начать убирать красные плитки, у которых больше трех или меньше двух соседей?

Рис. 43 . Пример колонии клеток

Для того чтобы разобраться в этом вопросе, посмотрим на рис. 43. Как вы знаете, Паркетчик обегает поле последовательно: либо по горизонтали , либо по вертикали. Предположим, он делает это по горизонтали сверху вниз и слева направо. Тогда, как только он снимет плитку, отмеченную на рисунке желтой стрелочкой, у плиток, отмеченных синей стрелочкой, станет меньше четырех соседей, и они выживут, поскольку Паркетчик будет рассматривать их судьбу после "желтой" плитки. Когда мы вручную играли на бумаге, и "желтая", и "синие" клетки перечеркивались, и таких проблем не возникало. А здесь, какой бы способ обегания мы ни выбрали, наверняка встретится похожая ситуация.

Как же быть? Ведь у Паркетчика нет возможности выкладывать плитки еще какого-нибудь цвета и метить вымирающие клетки, например, синим или черным цветом.

Задача кажется неразрешимой для Паркетчика, однако выход существует, и он достаточно прост: надо заиметь точную копию эволюционирующей колонии плиток, проверять количество соседей каждой плитки именно на этой неизменной копии, а операции смерти-рождения проводить на самой колонии.

Теперь об этом же, но более подробно.

Разделим мысленно поле Паркетчика на две части размером 30х21. В левой части будет находиться колония плиток, эволюцию которой нам бы хотелось проследить. Правая же часть служит Паркетчику как память: в ней находится неизменная копия этой самой колонии.

Паркетчик обегает правую часть поля, проверяя количество соседей каждой плитки, а если надо положить новую плитку или убрать старую, он перескакивает на левую часть и совершает эту операцию там. При таком подходе ему совсем не требуются даже и зеленые плитки.

Так, ситуация, рассмотренная на рис. 43 , будет обрабатываться Паркетчиком следующим образом:

1. На первой стадии он создает копию колонии в правой части поля (см. рис. 44 ):

Рис.44

2. Затем он обегает правую часть поля, ничего на ней не меняя, а выкладывает новые плитки или убирает старые на левой части поля. Понятно, что при такой постановке работы снимаются все проблемы, о которых мы говорили в начале этого практикума.

3. После того как левая колония перешла в следующий год своей жизни (то есть Паркетчик закончил обегание правой части поля), ее точная копия переносится на правую часть поля – и весь процесс начинается заново.

Конечно, при этом "жизненное пространство" для колонии клеток уменьшается ровно в два раза, но такова цена "памяти" Паркетчика.

Теперь самое время написать проект программы и начать его разработку методом нисходящего проектирования.

Итак, первый уровень:

Сыграть в "Жизнь";

Естественно, такого оператора Паркетчик не понимает, и мы делаем его уточнение в соответствии с только что принятым стратегическим решением:

Делать от год:=1 до 100

    { Расчистить правую часть поля;
    Сделать копию колонии на правой части поля;
    Обежать правую часть поля, выкладывая и убирая плитки на левой части в соответствии с правилами игры "Жизнь";
    }

Думаем, для вас не составит особых проблем детализация первого оператора проекта второго уровня. Не забудьте только заказать на складе коробочки-переменные и то, что в правую часть поля входят столбцы с 22-го по 42-й и все строки.

Второй оператор расписывается следующим образом:

(* Сделать копию колонии на правой части поля; *)

Делать от столб:=1 до 21
{

    Делать от строка:=1 до 30
    {
    Перейти на(столб,строка);
      Если (к) то
      { Перейти на(столб+21,строка);
      Положить(к);}
    }
}

Прежде чем детализировать последний оператор:

Обежать правую часть поля, выкладывая и убирая плитки на левой части в соответствии с правилами игры "Жизнь";

– вспомним, что мы прослеживаем эволюцию колонии, расположенной на достаточном удалении от стенок. Иначе бы нам бы пришлось вводить новые правила игры, определяющие, что делать с клетками колонии на краю поля. Кроме того, и считать соседей у клеток на краю поля было бы довольно сложно.

Поэтому заголовок основного цикла детализации этого оператора выглядит следующим образом:

Делать от столб:=22 до 41 {
Делать от строка:=2 до 29 { ...

Далее после оператора

Перейти на (столб, строка);

необходимо заставить Паркетчика пробежаться по пути, изображенному на рис. 45 , который вам уже встречался в задаче о выращивании листочков и ягодок (см. §8 третьей главы):

Рис. 45

и посчитать соседей того поля, на котором он стоит, а затем, вернувшись на исходную плитку, принять решение, что делать с колонией в левой части поля:

Перейти на(столб, строка);
Если ((не к) и (соседи=3)) то
{ Перейти на(столб-21,строка);Положить(к)}
Если ((к) и ((соседи>3)или (соседи <2) )) то
{ Перейти на(столб-21,строка);
Снять плитку;}

Собственно говоря, на этом программа и кончается. Если вы выполнили небольшое упражнение к предыдущему параграфу, вам ничего не стоит дописать все операторы, которых не хватает в проекте третьего уровня, и сыграть с Паркетчиком в "Жизнь".

Когда вы допишете программу до конца, проследите с ее помощью эволюцию колонии "Чеширский кот". У вас может возникнуть недоуменный вопрос: зачем это надо, ведь мы про нее и так все знаем?

Это и хорошо. Значит, будет с чем сравнить работу Паркетчика, и если вдруг в программе возникнет ошибка — мы сразу же ее увидим. Такой прием очень часто применяется программистами и называется расчетом контрольного варианта.

Вопросы и задания

1. Допишите программу "Игра «Жизнь»" и для начала проследите эволюцию колонии "Чеширский кот".

2. Проследите с помощью написанной вами программы эволюцию следующих колоний клеток.

Рис. 46 а).

Рис. 46 б).

Рис. 46 в).

Рис. 46 г).

3. Придумайте свои собственные конфигурации колоний и проследите их эволюцию.

4. Определите, какие конфигурации клеток устойчивы, какие - периодические (то есть, через несколько лет эволюции они возвращаются к исходному варианту).

5. Попробуйте найти в библиотеке книгу М.Гарднера "Математические досуги" (М.: "Мир", 1972), прочитать главу, посвященную игре "Жизнь", и решить с помощью вашей программы задачи из нее.


ПРАКТИКУМ № 2. Стрельба по движущейся мишени

В §1 этой главы мы с вами разработали и написали интерактивную программу первого типа. Для ощущения полной завершенности нам осталось только написать интерактивную программу второго типа. Итак:

Задача: По экрану монитора летает окружность, «отражаясь» от его границ. Кроме того, с помощью клавиш управления курсором по экрану можно передвигать перекрестье прицела.

Если в какой-то момент нажимается клавиша «огонь» (обычно, это клавиша пробела) и перекрестье прицела оказывается в окружности, то ее полет на время останавливается, а к счетчику попаданий добавляется 1.

По завершении программы (нажатием на клавишу ESC)игроку сообщается количество попаданий и общее количество выстрелов.

Фактически, эта программа не представляет из себя ничего нового: задача о летающем шарике разобрана в §5, а с управлением объектом с помощью клавиатуры мы имели дело в §7. Теперь осталось лишь очень аккуратно объединить и немного изменить написанное раньше. И поможет нам в этом конечно же ЯПП.

Проект первого уровня, как обычно, крайне прост:

Запустить окружность и, перемещая перекрестье прицела с помощью клавиатуры, постараться ее сбить.

Вспоминая упомянутые выше задачи о полете окружности и управлении объектом, можно конкретизировать первый уровень:

Делать пока (не нажата клавиша ESC)

    {Нарисовать белым цветом перекрестье прицела с центром в PX, PY;
    Нарисовать окружность белым цветом с центром в CX, CY;
    Сделать паузу; (* посмотреть на рисунки *);
    Нарисовать черным цветом перекрестье прицела с центром в PX, PY;
    Нарисовать окружность черным цветом с центром в CX, CY;
    Изменить координаты окружности;
    Опросить клавиатуру;
    Если (нажаты клавиши смещения прицела) то {изменить координаты центра прицела}
    Если (нажата клавиша «огонь») то {
      Если (есть попадание) то {Нарисовать окружность красным цветом;
      Сделать паузу;
      Нарисовать окружность черным цветом; (* можно и не рисовать. Тогда на поле останутся красные «трупики» подбитых окружностей. *)
      Добавить к счетчику попаданий 1;
      } (*конец «Если (есть попадание)» *)
    Добавить к счетчику выстрелов 1;
    } (* Конец «Если (нажата клавиша «огонь») *)
} (*Конец главнейшего цикла*)
Сообщить количество выстрелов и количество попаданий;

Теперь можно подумать и о переменных, необходимых для работы нашей программы.

PX - координаты прицела по X;
PY - координаты прицела по Y;
CX - координаты окружности по X;
CY - координаты окружности по Y;
DPX - смещение прицела по Х (т.е., насколько быстро он перемещается по горизонтали);
DPY - смещение прицела по Y (т.е., насколько быстро он перемещается по вертикали);
DCX - смещение окружности по Х (т.е., насколько быстро она перемещается по горизонтали);
DCY - смещение окружности по Y (т.е., насколько быстро она перемещается по вертикали);
R - радиус окружности;
ZALP - счетчик выстрелов;
URA - счетчик попаданий;
I - переменная цикла (для задержки, если понадобится).

Если внимательно присмотреться к операторам ЯПП, то легко понять, что почти все из низ мы уже переводили на конкретный язык программирования. Исключением является оператор

Если (есть попадание)

Чтобы не связываться со сложными формулами, будем считать, что мы попали в цель, если перекрестье прицела попало не в саму окружность, а в описанный вокруг нее квадрат (см. рис. 51)

Рис. 51

Конечно, в ситуации, изображенной на этом рисунке, должен быть промах, но пока что, в первом приближении, будем считать, что выстрел удачен.

Тогда условие попадания записывается довольно просто:

Если ( |CX-PX|

где вертикальные палочки означают модуль, известный вам по урокам математики.

Уточним теперь все вышесказанное в проекте третьего уровня:

Описать и проинициализировать необходимые для работы переменные;
Делать пока (не нажата клавиша ESC)

    {Вызвать Прицел (PX,PY,14) (* 14 - номер белого цвета *);
    Окружность (СX, CY, R, 14);
    Сделать паузу; (* посмотреть на рисунки *);
    Вызвать Прицел (PX,PY,0) (* 0- номер черного цвета - цвета фона) *);
    Окружность (СX, CY, R, 0);

    (* Изменяем координаты окружности: *)
    СX:=СX+DСX; СY:=СY+DСY;
    Если (СY+R> 479 или СY-R<0) то {DСY:= — DСY};
    Если (СX+R>639 или СX-R<0) то {DСX:= — DСX};

    (* Опрос клавиатуры: *)
    Опросить клавиатуру, поместить скан-код нажатой клавиши в переменную SCAN;
    Выбор (SCAN)
    { код "стрелочка вверх": { PY=PY–DPY}
    код "стрелочка вниз": { PY=PY+DPY}
    код "стрелочка влево": { PX=PX–DPX}
    код "стрелочка вправо": { PX=PX+DPX}
    код "пробел":
      {Если ( |CX-PX| то
        { Окружность (СX, CY, R, 12); (* 12 - красный цвет *);
        Сделать паузу;
        Окружность (СX, CY, R, 0); (* можно и не рисовать. Тогда на поле останутся красные «трупики» подбитых окружностей. *)
        URA:=URA+1 попаданий 1;
        } (*конец «Если (есть попадание)» *)
      ZALP:=ZALP+1;
      } (* Конец «кода "пробел" *)
    } (* конец Выбора *)
} (*Конец главнейшего цикла*)
Сообщить «Количество залпов:», ZALP, «Из них в цель:», URA;

Надеемся, проекта третьего уровня вполне достаточно, чтобы вы смогли перевести эту программу на выбранный язык программирования.

Вопросы и задания

1. Переведите рассмотренную нами программу на один или несколько языков программирования, отладьте ее и запустите.

2. На рис.51 прицел нарисован не очень красиво. Измените подпрограмму «Прицел» и сделайте его рисунок более похожим на настоящий.

3. Попробуйте программу в работе. Измените, если необходимо, время задержки, скорость перемещения прицела и окружности.

4. В случае попадания добавьте рисунок и звук взрыва.


ПРЕДИСЛОВИЕ

УВАЖАЕМЫЕ ВОСЬМИКЛАССНИКИ!

В прошлом году вы начали знакомство с информатикой. Вы научились, используя компьютер, рисовать картинки, редактировать текст, производить вычисления в электронной таблице, искать информацию в базе данных, создавать гипертекстовые документы...

Давайте вспомним самое начало седьмого класса. Делая обзор компьютерных чудес, мы говорили, что и электронный будильник, и телефон с автоответчиком, и видеомагнитофон, и самый современный компьютер имеют свой мозг, называемый процессором. И за всеми широчайшими возможностями компьютерных технологий стоит эта небольшая и с виду невзрачная, но такая важная деталь...

Теперь немного отвлечемся и представим, что вы решили съездить в туристическую поездку за границу. Любой грамотный человек, не желающий оказаться в смешной или, того хуже, опасной ситуации, сначала прочитает инструкцию, в которой кратко описываются обычаи и нравы той страны , куда вы собрались. Скажем, в Болгарии кивают, когда хотят сказать «нет», а в Таиланде ни в коем случае нельзя погладить какого-нибудь ребенка по голове - это сочтут за смертельное оскорбление.

Ну а если вы решили прожить в другой стране довольно длительное время, то вам очень не помешает значительно более полное описание того, что обычно называют «национальной спецификой восприятия мира». Фактически, речь идет о том, что каждая нация имеет свою логику жизни. И не зная ее, совершенно невозможно разобраться в причинах тех или иных поступков ее жителей.

Конечно, человек неизмеримо сложнее любого компьютера, но и компьютер неизмеримо сложнее, например, велосипеда. А ведь и к велосипеду необходимо приноровиться. Можно, например, отлично кататься на горном его варианте, и чувствовать себя «не в своем седле» за рулем гоночного.

В случае такого сложного изделия, как процессор, вполне можно говорить о «компьютерной специфике восприятия мира», или о компьютерной логике. А поскольку волею судьбы мы живем в мире, наводненном процессорами и микропроцессорами, то нам просто необходимо понять логику их работы и освоить их язык, основанный на алгоритмическом мышлении.

И совершенно неважно, что вы не собираетесь в дальнейшем становиться профессиональными программистами. В современном обществе вы просто не сможете обойтись без компьютерных технологий, и лучше все-таки знать правила , законы и язык этого технологического мира.