Тезис пионера советской информатики академика А.П. Ершова «Программирование — вторая грамотность» не потерял своей актуальности и в наши дни. Более того, быстрое развитие высоких технологий в мире и в России увеличивает спрос на ИТ-специалистов высшей квалификации.
Однако в школьной информатике сегодня наблюдается определенный отход от направления, заданного А.П. Ершовым, подмена программирования курсом ИКТ. А там, где программирование все же преподается, нередко используются либо безнадежно устаревшие языки и среды, либо неимоверно тяжеловесные коммерческие системы.
Автор семейства языков профессор Н. Вирт говорит: «Как профессионалы в информатике, мы обязаны поднять свои голоса против традиции, приравнявшей компьютерную грамотность к знанию темных деталей языка программирования, используемого в индустрии.
Конечной целью образования должно быть искусство конструктивного мышления. Именно в таком контексте становится важным наличие хорошо спроектированного языка программирования …хороший дизайн должен быть в центре нашего преподавания. Но как нам учить образцовому дизайну с помощью инструментов и языков, которые делают нас посмешищем? К нашему сожалению, индустрия программирования сделала не много, чтобы помочь нам, преподавателям, преодолеть наши трудности» [1].
Происходящий сегодня перевод российских школ на свободное ПО дает еще один повод серьезно подумать о том, что взять на перспективу в качестве бесплатной современной учебной среды для преподавания основ алгоритмизации и программирования. К сожалению, российские разработчики трансляторов пока ничего достойного в этом плане не предлагают. Придется обратиться к мировому опыту. Однако и здесь, как справедливо отмечает Н.Вирт, тоже негусто. Но по крайней мере одно удачное решение уверенно можно назвать. Это язык Компонентный Паскаль (Component Pascal) и среда его реализации Блэкбокс (BlackBox Component Builder) швейцарской фирмы Oberon Microsystems [2]. Среда идеально подходит для сквозного курса программирования, начиная со средних классов школы и заканчивая средними курсами университетов. Распространяется бесплатно вместе с исходными текстами.
Среда не требует установки, допускает модификацию, дополнение, расширение и полную перекомпиляцию. Работает под управлением Windows и Linux.
Российские специалисты приняли активное участие в развитии и русификации среды [3]. Дополнительные удобства для преподавания предоставляет серия подсистем под общим названием Info21 Ф.В. Ткачева.
Разработана облегченная, школьная версия Блэкбокса. Ее основное отличие заключается в отсутствии некоторых подсистем, использование которых в школе не представляется возможным. И включено три полезных, на наш взгляд, подсистемы, не входящих в базовую поставку: инструментальная панель с пиктограммами, исполнитель “черепашка” и просмотрщик файлов. Кроме того, внесен ряд изменений в настройки для обеспечения большего удобства начинающим пользователям. Имеется русскоязычная документация, меню, диалоговые формы и сообщения компилятора. В архивированном виде среда занимает всего около 5 Мб.
Новосибирской фирмой Excelsior разработан профессиональный оптимизирующий компилятор XDS языков Modula-2/Oberon-2, с 2005 года ставший бесплатным и полноценно работающий на платформах Windows и Linux (https://www.excelsior.ru/products/xds).
Язык Component Pascal представляет собой немного дополненный Oberon-2. Для подавляющего большинства школьных учебных примеров исходные тексты программ на этих языках идентичны.
В сети Интернет есть несколько сайтов, на которых размещены обсуждаемые материалы:
— Блэкбокс можно скачать с сайта разработчиков: https://blackbox.oberon.org;
— сайт общественного проекта, посвященного обновлению основ преподавания программирования в школах и вузах: https://informatika-21.ru/. Здесь можно найти версии Блэкбокса для школ и для вузов, статьи ученых и преподавателей, адреса коллег;
— сайт поддержки Блэкбокса в России (г. Орел) https://www.oberoncore.ru и форум для вопросов и обсуждений https://forum.oberoncore.ru;
— коллекция алгоритмов и программных компонентов: https://www.zinnamturm.eu
В школьной версии Блэкбокса представлена новая реализация известного исполнителя “черепашка”, выполненная на Компонентном Паскале. Программа управления черепашкой пишется полностью на нем же, что принципиально отличается от подхода, принятого в “ЛогоМирах”. Это является большим преимуществом ввиду острой нехватки учебных часов, выделяемых на изучение азов алгоритмизации, поскольку при переходе от работы с исполнителем к изучению “настоящего”, более абстрактного программирования ученикам не придется осваивать новый язык и среду разработки. Кроме того, учащиеся становятся в силах сами расширять ассортимент команд черепашки, что существенно повышает интерес к занятиям.
Покажем основные особенности Компонентного Паскаля в сравнении с Turbo Pascal.
Все ключевые слова пишутся в верхнем регистре (большими буквами). Большие и маленькие (прописные и строчные) буквы везде различаются, т.е. в именах переменных, констант, типов, процедур и модулей. Например, INTEGER и Integer — это разные имена.
Оператор присваивания ничем не отличается. Основные алгоритмические конструкции изменились мало и стали удобнее. При написании блочных операторов больше не требуется ключевое слово begin.
Turbo Pascal | Компонентный Паскаль |
---|---|
if ... then begin ... end else begin ... end | IF ... THEN ELSE END |
while ... do begin ... end | WHILE ... DO ... END |
for i := 1 to 10 do begin ... end | FOR I := 1 TO 10 DO ... END |
Появилась возможность соединять несколько IF-ов в цепочку с помощью ELSIF:
IF … THEN … ELSIF … THEN … ELSIF … THEN … ELSE … END
В цикле FOR появилась возможность указывать величину шага, отличную от единицы, с помощью ключевого слова BY:
FOR i := 0 TO -10 BY -2 DO … END.
Цикл REPEAT … UNTIL не изменился.
Основные типы и их диапазоны:
Тип | Диапазон значений |
---|---|
BOOLEAN | FALSE … TRUE |
CHAR | 0X .. 0FFFFX |
BYTE | -128 .. 127 |
INTEGER | -2147483648 .. -2147483647 |
LONGINT | -9223372036854775808 .. -9223372036854775807 |
REAL | -1.797693134862316E+308 … 1.797693134862316E+308, INF |
SET | подмножество из 0 .. 31 |
Способ объявления переменных не изменился:
VAR a, b: REAL; i, k: INTEGER; ch: CHAR;
Работа с массивами изменилась, но незначительно. Первый элемент массива всегда имеет индекс 0. При объявлении массива указывается не диапазон индексов, а количество элементов:
VAR d: ARRAY 20 OF INTEGER;
Для определения длины массива в программе используется стандартная процедура LEN(d). Например, чтобы обнулить массив d, можно воспользоваться следующим циклом:
FOR i := 0 TO LEN(d)-1 DO d[i]:= 0 END;
или
i := 0; WHILE i < LEN(d) DO d[i]:= 0; INC(i) END;
Для объявления двухмерного массива используется конструкция следующего вида:
VAR table: ARRAY 3, 15 OF INTEGER;
или
VAR table: ARRAY 3 OF ARRAY 15 OF INTEGER;
Узнать размер многомерного массива по любому измерению можно так:
i := LEN(table, 0); (* i = 3, число строк в массиве table *)
k := LEN(table, 1); (* k = 15, число столбцов в массиве table *)
Компонентный Паскаль корректно работает с многомерными динамическими массивами. Динамический массив объявляется с помощью указателя:
VAR a: POINTER TO ARRAY OF INTEGER; VAR b: POINTER TO ARRAY OF ARRAY OF REAL;
Непосредственно перед использованием массива его необходимо разместить в памяти специальным оператором, указывая нужный в данный момент размер:
NEW(a, n); NEW(b, x, y);
В остальном приемы работы с динамическими и статическими массивами совпадают, в том числе производится автоматический контроль выхода индексов за границы.
При объявлении функций не используется ключевое слово function, вместо этого процедурам разрешено возвращать значение с помощью оператора RETURN.
Turbo Pascal | Компонентный Паскаль |
---|---|
function sqr (a: real):nreal; begin sqr := a*a end; | PROCEDURE Sqr (a: REAL): REAL; BEGIN RETURN a*a END Sqr; |
Обратите внимание, что имя процедуры должно быть повторено после завершающего END.
Строительными блоками программ являются модули, пришедшие на смену unit’ам. Модуль — это единица компиляции и загрузки/выгрузки, расположенная, как правило, в отдельном файле. Общий вид исходного текста модуля покажем на примере:
MODULE МоиПример; IMPORT In, L := StdLog; PROCEDURE Делать*; VAR x, n: INTEGER; a: ARRAY 25 OF INTEGER; BEGIN In.Open; In.Int(n); IF n < LEN(a) THEN FOR x := 0 TO n - 1 DO In.Int(a[x]) END; FOR x := n - 1 TO 0 BY -1 DO L.Int(a[x]) END ELSE L.String("Слишком большое n."); L.Ln END END Делать; END МоиПример.
МоиПример.Делать 6 0 -58 39 14 2 3
Вместо ключевого слова uses в Компонентном Паскале используется слово IMPORT, после которого перечисляются имена используемых модулей. При импорте длинному имени модуля можно задать краткий синоним-замену. В нашем примере имени StdLog мы назначили замену “L”. Этот прием может быть очень полезен потому, что в Компонентном Паскале (в отличие от Turbo Pascal) всякий вызов процедуры, импортированной из другого модуля, должен сопровождаться указанием модуля-экспортера. Необходимость указания имени модуля исключает возможную путаницу с одинаковыми именами процедур (или переменных), находящихся в разных модулях.
Компиляция и выгрузка модуля в школьной версии Блэкбокса производится нажатием клавиши F8 или выбором пункта “Компилировать и выгрузить” в меню “Разработка”. Выгрузка нужна для того, чтобы при успешной компиляции старая версия машинного кода модуля была заменена в памяти на новую. Компиляция происходит очень быстро, поэтому ее рекомендуется использовать для постоянного самоконтроля при написании программы. Сообщения об ошибках выводятся в строку состояния и рабочий журнал, а в исходном тексте программы места ошибок отмечаются серыми перечеркнутыми квадратиками: .
Хотим особо подчеркнуть, что тексты сообщений об ошибках компиляции выдаются на русском языке. Это очень важно для начинающих программистов!
Рабочий журнал Блэкбокса — это универсальное средство вывода, пришедшее на смену текстовой консоли Turbo Pascal. Это особый текстовый документ, расположенный на экране в отдельном окне, озаглавленном “Рабочий журнал” (в англоязычной версии — Log). Обычно это окно автоматически открывается при запуске Блэкбокса. Здесь отображаются результаты компиляции и данные, выведенные с помощью процедур модуля StdLog. Журнал можно очистить, нажав клавишу F7 на клавиатуре либо выбрав пункт «Очистить журнал» в меню «Инфо». Если окно рабочего журнала не видно, то его можно вызвать нажатием клавиши F6 либо выбором пункта «Открыть журнал» в меню «Инфо».
Ввод-вывод обычно осуществляется с помощью библиотечных процедур, размещенных в модулях In, StdLog. Документацию по модулю можно получить, выделив его имя в тексте и выбрав пункт «Документация» в контекстном меню. (Контекстное меню вызывается щелчком правой кнопки мыши.)
Начинающему программисту на первое время будет достаточно основных процедур вывода в журнал:
StdLog.Int (вывод целочисленного значения),
StdLog.Real (вывод вещественного значения),
StdLog.String (вывод строки),
StdLog.Ln (перевод строки).
Ввод данных из входного потока осуществляется с помощью одноименных “обратных” процедур модуля In:
In.Int (ввод целочисленного значения),
In.Real (ввод вещественного значения),
In.String (ввод строки).
При прогоне программы на различных наборах входных данных в Turbo Pascal последние приходится либо каждый раз вводить с клавиатуры, либо читать из файлов. В Блэкбоксе предусмотрен более удобный способ работы. Наборы данных помещаются в отдельные командные строки, которые располагаются сразу после конца модуля и хранятся на диске в одном файле с ним. При желании командные строки с данными можно поместить в отдельный документ. В любом случае на экране одновременно присутствует текст программы вместе с исходными данными и рабочий журнал с протоколом трансляции и результатами работы программы. Такая организация «рабочего места» существенно повышает производительность, сокращая объем необходимых манипуляций с материалом.
Блэкбокс — среда разработки программ, поддерживающая создание составных и гипертекстовых документов. Это означает, что он позволяет вставлять в документы гиперссылки, рисунки, таблицы, формулы, документы MS Word, Excel и т.д. (см. рис. 1).
Рис. 1. Иллюстрация возможностей Блэкбокса по встраиванию сторонних объектов
Текст документа может быть оформлен весьма разнообразно. Допускается использование разных шрифтовых оформлений — гарнитура, размер, наклон, жирность, цвет. Это дает значительные эргономические преимущества. Например, можно выбрать атрибуты шрифта в соответствии с возрастом и индивидуальными пожеланиями учащихся. Полезно каким-либо образом выделять временные фрагменты текста и комментарии. Возможности разнообразить текст программы этим не ограничиваются. Благодаря встраиваемым объектам документ может становиться активным и интерактивным. Блэкбокс содержит набор стандартных объектов и позволяет создавать новые. Примеры стандартных объектов:
— коммандер, при щелчке левой кнопкой мыши вызывает выполнение указанной после него экспортированной процедуры; если процедура ожидает входных данных, их следует указать после имени процедуры;
— командная кнопка, обычно используется на диалоговой форме (см. раздел “Диалог”) для запуска экспортированных процедур;
— штамп даты-времени и номера версии, отображает общее количество и дату последнего сохранения документа, может использоваться для отслеживания развития программного проекта;
— часы, отображают текущее время;
— текстовая складка, позволяет временно спрятать часть текста; допускаются складки, вложенные в другие складки;
— линейка для форматирования текста, позволяет задать абзацный отступ, выравнивание текста, межстрочный интервал, позиции табуляции и пр.;
<StdCmds.OpenBrowser('Docu/en/CP-Lang','CP-Lang')>ENGLISH<> — исходный текст гиперссылки на другой документ, превращается в действующую гиперссылку нажатием комбинации клавиш + ;
— действующая гиперссылка на другой документ, при щелчке левой кнопкой мыши открывает указанный документ в новом окне;
<StdLinks.ShowTarget('1')>1. Введение<> — исходный текст гиперссылки на “мишень” в текущем документе, превращается в действующую нажатием комбинации + ;
<1>1. Введение<> — исходный текст “мишени”, превращается в действующую мишень при выборе пункта “Создать мишень” в меню “Инструменты”;
— действующая мишень.
По соглашению, принятому в Блэкбоксе, полное имя модуля состоит из двух частей: первая часть означает имя подсистемы (папки), в которой расположен модуль, вторая часть означает собственно имя модуля. В приведенном выше модуле имя подсистемы — Мои, а имя модуля — Пример.
Исходный модуль сохраняется в папке Mod подсистемы. Имя файла соответствует имени модуля, но без префикса подсистемы; например, модули ObxPhoneDB и ObxPhoneUI сохранены как Obx\Mod\PhoneDB и Obx\Mod\PhoneUI соответственно. Для каждого исходного файла может быть соответствующий символьный файл, например, Obx\Sym\PhoneDB; соответствующий кодовый файл Obx\Code\PhoneDB; и соответствующий файл документации, например, Obx\Docu\PhoneDB. Также может быть 0 или более ресурсных документов в подсистеме, например, Obx\Rsrc\PhoneUI. Причем нет необходимости в соотношении 1:1 между модулями и ресурсами, хотя обычно для простоты рекомендуется использовать имя модуля как часть имени ресурса.
Модули, чьи имена имеют форму SubMod, такие, как ObxRandom или StdLog, сохраняются в их соответствующих подсистемах, заданных префиксами имен, например, Obx или Std. Имя подсистемы начинается с заглавной буквы, и далее могут идти несколько заглавных и затем несколько строчных букв или цифр. Первая заглавная буква после этого обозначает отдельный модуль в подсистеме.
Модули, которые не принадлежат подсистеме, т.е. модули, имена которых не имеют формы SubMod, сохраняются в специальной подсистеме, названной System. Базовая библиотека Блэкбокса и ядро каркаса принадлежат к этой категории, это модули Math, Dialog, Integers, Strings, In, Dates и др.
Каждая папка подсистемы может содержать следующие вложенные папки (см. таблицу).
Code | Папка с исполняемыми кодовыми файлами. Расширение имен у таких файлов: ocf |
Docu | Папка с полностью документированными интерфейсами и другими документами. Например, для модуля Integers там есть файл System\Docu\Integers.odc. Для модуля, который используется только внутренне (для служебных целей Блэкбокса), его файл документации не поставляется. Часто есть общие файлы документации, которые не относятся к отдельному модулю подсистемы. Такие файлы содержат один или более дефисов в их именах, например, Docu\CP-Lang_rus. Типичными файлами являются: Sys-Map (обзор гиперссылок на другие документы этой подсистемы); User-Man (руководство пользователя); Dev-Man (руководство разработчика) |
Mod | Папка с исходными модулями. Например, для модуля МоиПример там есть файл Мои\Mod\Пример.odc |
Rsrc | Папка с ресурсными документами подсистемы: диалоговые формы, меню, тексты для локализации. Например, для модуля СборникКалькулятор там есть файл Сборник\Rsrc\Калькулятор.odc. Может быть ноль, один или более ресурсных файлов для одного документа. Если есть несколько файлов, второй получает суффикс “1”, третий — суффикс “2” и так далее. Например, Сборник\Rsrc\Калькулятор.odc, Сборник\Rsrc\Калькулятор1.odc, Сборник\Rsrc\Калькулятор2.odc и т.д. Часто есть добавочные файлы, которые не относятся к отдельному модулю подсистемы. Типичными файлами являются: Strings.odc (строковые ресурсы для локализации этой подсистемы; не путать с одноименным модулем для работы со строками); Menus.odc (меню этой подсистемы) |
Sym | Папка с символьными файлами. Расширение имен у таких файлов: osf. Например, для модуля СборникКалькулятор там есть файл Сборник\Sym\ Калькулятор.osf. Для модуля, который используется только внутренне, его символьный файл не поставляется |
Пользователям настоятельно рекомендуется сохранять свои модули в собственной подсистеме, не смешивать их со стандартными модулями среды. Например, будем работать в подсистеме Школа. В этом случае нам потребуется создать папку Школа, внутри которой расположить указанные (пустые) папки. В таком случае модуль с именем Привет будет иметь полное имя ШколаПривет и будет располагаться в файле Школа\Mod\Привет.odc.
При использовании Блэкбокса в компьютерном классе можно выполнить серверную установку. В этом случае на сервер устанавливается одна копия среды, и папка с ней открывается на доступ только для чтения. Для каждого пользователя создается локальная папка на рабочем месте, в которую помещается ярлык для запуска Блэкбокса. Например, пусть Блэкбокс установлен на сетевом диске H: в папке H:\BlackBox, а локальная папка пользователя расположена на диске C: и называется C:\Иванов Петя. В этом случае необходимо создать ярлык для файла
H:\BlackBox\BlackBox.exe со следующими параметрами:
Объект (Target): H:\BlackBox\BlackBox.exe /USE “C:\Иванов Петя”
Рабочая папка (Start in): C:\Иванов Петя
Этот ярлык можно поместить куда угодно, например, на рабочий стол или в папку C:\Иванов Петя. Обратите внимание на двойные кавычки: они необходимы для корректной работы Windows в том случае, если имя папки содержит пробел.
Такая сетевая установка защищает файлы среды от разрушительных действий пользователя, предотвращает захламление папок пробными файлами и позволяет сэкономить дисковое пространство, но приводит к повышению нагрузки на сеть.
Аналогичную “сетевую” установку можно провести локально, на домашнем компьютере. При попытке открыть какой-либо документ Блэкбокс будет сначала искать его в папке пользователя, и только затем в папке, куда он установлен (на “сервере”).
В случае сетевой установки подсистему с рабочими файлами учащегося следует разместить в папке C:\Иванов Петя.
В простейшем случае достаточно просто распаковать архив Блэкбокса на диск и можно сразу начинать им пользоваться.
Продолжим разговор об эргономических преимуществах Блэкбокса. Еще одной отличительной чертой является его гибкость. Среду легко настроить так, чтобы было удобно работать разным категориям пользователей. Например, для программистов, делающих самые первые шаги в программировании, может быть полезной справка об основных типах и конструкциях, которая появляется в отдельном окне при запуске либо вызывается специальной кнопкой. Благодаря компактности языка КП такая справка легко поместится в одно окно и даже без прокрутки. Составить справку сможет любой учитель либо поручит учащимся. Например, можно создать ее в начале курса и далее пополнять по мере изучения материала. Мы бы предложили такое содержание справки:
i INTEGER 4 байта -2147483648 .. +2147483647 r REAL 8 байт ±1.797693134862316E±308, INF m заготовка модуля if IF условие THEN ... END; iff IF условие THEN ... ELSE ... END; f FOR := TO DO ... END; w WHILE условие DO ... END; rep REPEAT ... UNTIL условие; ar ARRAY OF ; p PROCEDURE имя*; VAR ... ; BEGIN ... END имя; ret RETURN v VAR In.Open; In.Int( ); In.Real( ); L.Int( ); L.Real( ); L.String(' '); L.Ln; IMPORT L := StdLog, In, Math, Dialog, Strings, Integers;
В первом абзаце приведены сокращения для быстрого набора. Для программирования “черепашки” приведенный список сокращений существенно дополнен. Подстановка вместо сокращений полных конструкций выполняется по нажатию клавиши • модулем Edit подсистемы Info21sys. Этот модуль легко поддается модификации даже учащимися.
Вызов справки можно добавить в инструментальную панель, чтобы он происходил в одно касание мышью. Для этого в файл меню Toolbar/Rsrc/ Menus.odc надо добавить строку: “toolbar/rsrc/question.bmp” “” “StdCmds.OpenBrowser(‘Мои/Rsrc/Подсказка’, ‘Подсказка’)” “”. Она добавляет кнопку на панель инструментов с картинкой из файла toolbar/rsrc/question.bmp. Строки
В Блэкбоксе имеются достаточно богатые средства для работы со строками. Строки в КП описываются как символьные массивы:
VAR строка: ARRAY 50 OF CHAR; VAR str: ARRAY 30 OF CHAR;
Цепочки или отдельные символы можно заносить в массив разными способами: чтением из входного потока, чтением из файла, переносом из другого массива, кодированием или непосредственным присваиванием. Детальный разбор особенностей работы со строками заслуживает отдельного разговора. Здесь мы ограничимся упоминанием лишь самых основных.
Строка как цепочка символов должна быть задана либо в одинарных апострофах ‘’, либо в двойных кавычках “”. Например:
In.Open; In.String(str); L.String(str); строка := "это пример строки"; str := 'Здравствуй, world!'; str := str+' — '+строка; L.String(str);
Текущую длину цепочки символов в массиве можно определить через процедуру LEN(str$), указав сразу после имени знак доллара. Конец символьной цепочки в массиве отмечается специальным нулевым кодом, который в программе записывается 0X. Длину (размер) символьного массива выдает та же процедура, если знак доллара отсутствует:
k := LEN(строка);
К элементам символьного массива можно обращаться обычным образом:
FOR i := 0 TO LEN(str) – 1 DO L.Char(str[i]) END; строка[4] := "П"; k := ORD(str[13]); str[10] := CHR(50);
Процедуры модуля Strings позволяют находить, извлекать и заменять подстроки в строках, преобразовывать целые и вещественные в строки и обратно как с форматированием, так и без него. Например:
r := 0.0031416;
Strings.RealToStringForm(r, 4, 12, 1, '-', str); L.String(str)
В рабочий журнал будет выдано:
—-3.142E-3
Компонентный Паскаль поддерживает полноценное объектно-ориентированное программирование. Покажем это на примере графического объекта Круг, имеющего такие свойства, как координаты центра, радиус и цвет заливки. Поведение объекта (его методы) описывается процедурами подсчета периметра и площади круга, а также отрисовки круга в отдельном графическом окне. Используем графические средства модуля Info21sysTPGraphics Ф.В. Ткачева.
MODULE МоиМетод; IMPORT L := StdLog, Math, Gr := Info21sysTPGraphics; TYPE (* создаем объект Круг *) Круг = RECORD x, y,(*координаты центра круга*) r, (*радиус круга *) цвет (*номер цвета по упро щенной цветовой модели *) : INTEGER END; (* определяем методы объекта Круг *) (* метод, вычисляющий площадь круга*) PROCEDURE (VAR p: Круг) Площадь (VAR s: REAL), NEW; BEGIN s := Math.Pi()*p.r*p.r END Площадь; (*метод, вычисляющий периметр круга*) PROCEDURE (VAR p: Круг) Периметр (VAR s: REAL), NEW; BEGIN s := 2*Math.Pi()*p.r END Периметр; (* метод, задающий цвет круга *) PROCEDURE (VAR p: Круг) ЦветКруга (c: INTEGER), NEW; BEGIN p.цвет := c END ЦветКруга; (* метод, рисующий круг в графическом окне*) PROCEDURE (VAR p: Круг) РисКруг, NEW; BEGIN (* задание цвета заливки круга *) Gr.SetFillColor(p.цвет); (* рисование круга в виде эллипса с равными полуосями *) Gr.FillEllipse(p.x, p.y, p.r, p.r) END РисКруг; PROCEDURE Делать*; VAR k1, k2: Круг; s, p: REAL; BEGIN Gr.Clear; k1.r := 60; k1.Площадь(s); L.String("площадь 1-го круга ="); L.Real(s); L.Ln; k1.x := 80; k1.y := 80; Gr.SetBkColor(14); k1.ЦветКруга(1); k1.РисКруг; k2.r := 50; k2.Периметр(s); L.String("периметр 2-го круга ="); L.Real(s); L.Ln; k2.x := 200; k2.y := 60; k2.ЦветКруга(7); k2.РисКруг; k2.x := 220; k2.y := 100; k2.r := 40; k2.ЦветКруга(11); k2.РисКруг; Gr.Open END Делать; END МоиМетод.
Рис. 2. Результат работы процедуры МоиМетод.Делать
Выдача в рабочем журнале:
площадь 1-го круга = 11309.73355292326
периметр 2-го круга = 314.1592653589793
Встречаются задачи, в которых требуется выполнять стандартные арифметические операции над очень большими — “длинными” целыми числами. Такие числа не помещаются ни в один целый тип, предусмотренный в языке и поддерживаемый системой команд процессора. Приходится искать обходные пути. Специально для этого в Блэкбоксе предусмотрен модуль Integers, который позволяет работать с целыми числами произвольной разрядности (длины).
Модуль Integers реализует абстрактный тип данных Integer для представления целых чисел произвольной точности. Он содержит также наиболее важные арифметические операции для таких чисел и набор операций преобразования. Арифметические операции включают сложение, умножение, возведение в степень, вычисления частных, разностей и наибольших общих делителей.
Что касается присваивания и параметров процедур, то переменные типа Integers.Integer могут быть использованы тем же образом, что и переменные числовых типов, встроенных в язык. Конечно, чтобы выполнять операции над такими переменными, необходимо вызывать специальные процедуры модуля Integers. Обычные операции +, –, *, DIV, MOD и т.п. использоваться не могут. То же самое касается и сравнений.
Диалоговые средства Блэкбокса очень просты в использовании и достаточно богаты по ассортименту. Для взаимодействия с программой в диалоге необходимо подключить специальный модуль Dialog, изменить операторы ввода-вывода на диалоговые, создать полностью автоматически или вручную диалоговую форму.
Чтобы значения переменных были видны на форме, в их описаниях добавляется специальный признак: “–” — только для чтения, или “*” — для ввода. Разным типам переменных назначаются разные виды элементов управления. Можно также добавлять элементы оформления — рамки и надписи.
Многое станет ясно из примера программы-калькулятора.
MODULE МоиКалькулятор; IMPORT Dialog; VAR x*, y*, результат: REAL; PROCEDURE Сложить*; BEGIN результат := x + y; Dialog.UpdateReal(результат) END Сложить; PROCEDURE Вычесть*; BEGIN результат := x - y; Dialog.UpdateReal(результат) END Вычесть; (* для экономии места некоторые процедуры не приведены *) BEGIN x := 0; y := 0; END МоиКалькулятор.
После компиляции приведенного модуля возможно автоматическое построение диалоговой формы. Для этого необходимо в меню “Диалоги” выбрать пункт “Новая форма…”. В поле ввода появившегося окна нужно ввести имя модуля:
Будет создана форма следующего вида:
Форма для полнофункциональной программы “Калькулятор” после редактирования может выглядеть более приятно и удобно:
Преподавание программирования на основе Компонентного Паскаля/Блэкбокса в порядке эксперимента началось в России в 2002 году. Накопленный к сегодняшнему дню самый положительный опыт, как личный, так и коллег, позволяет рекомендовать эту среду к массовому использованию в школе и вузе. Приведенной нами информации уже достаточно для успешного начала работы. Подробный рассказ о подсистемах школьного Блэкбокса, показ техники программирования будет дан в следующих статьях.
1. Вирт Н. Преподавание информатики: потерянная дорога. Информатика, № 23, 2007. 2. Жилин С.А., Жилина И.Б. Малые компонентные среды и языки программирования в школьном информационном образовании Информатика и образование, № 7, 2006.
3. Электронный ресурс: https://informatika-21.ru/
оригинал https://inf.1sept.ru/article.php?ID=200800100
А. С. Ильин,
технический директор “Amadeus IT Solutions”, г. Томск ;
А. И. Попков,
директор по образовательным проектам ГК