Показаны различия между двумя версиями страницы.
Предыдущая версия справа и слева Предыдущая версия Следующая версия | Предыдущая версия Следующая версия Следующая версия справа и слева | ||
cp:edu-school [2022/07/02 19:30] iadenisov |
cp:edu-school [2022/07/02 19:53] iadenisov |
||
---|---|---|---|
Строка 1: | Строка 1: | ||
====== Компонентный Паскаль в школьном курсе информатики ====== | ====== Компонентный Паскаль в школьном курсе информатики ====== | ||
- | Тезис пионера советской информатики академика А.П. Ершова | + | Тезис пионера советской информатики академика А.П. Ершова |
Однако в школьной информатике сегодня наблюдается определенный отход от направления, | Однако в школьной информатике сегодня наблюдается определенный отход от направления, | ||
- | Автор семейства языков профессор Н.Вирт говорит: | + | Автор семейства языков профессор Н. Вирт говорит: |
- | Конечной целью образования должно быть искусство конструктивного мышления. Именно в таком контексте становится важным наличие хорошо спроектированного языка программирования …хороший дизайн должен быть в центре нашего преподавания. Но как нам учить образцовому дизайну с помощью инструментов и языков, | + | Конечной целью образования должно быть искусство конструктивного мышления. Именно в таком контексте становится важным наличие хорошо спроектированного языка программирования …хороший дизайн должен быть в центре нашего преподавания. Но как нам учить образцовому дизайну с помощью инструментов и языков, |
Происходящий сегодня перевод российских школ на свободное ПО дает еще один повод серьезно подумать о том, что взять на перспективу в качестве бесплатной современной учебной среды для преподавания основ алгоритмизации и программирования. К сожалению, | Происходящий сегодня перевод российских школ на свободное ПО дает еще один повод серьезно подумать о том, что взять на перспективу в качестве бесплатной современной учебной среды для преподавания основ алгоритмизации и программирования. К сожалению, | ||
- | Среда не требует установки, | + | Среда не требует установки, |
Российские специалисты приняли активное участие в развитии и русификации среды [3]. Дополнительные удобства для преподавания предоставляет серия подсистем под общим названием Info21 Ф.В. Ткачева. | Российские специалисты приняли активное участие в развитии и русификации среды [3]. Дополнительные удобства для преподавания предоставляет серия подсистем под общим названием Info21 Ф.В. Ткачева. | ||
Строка 67: | Строка 67: | ||
+ | В цикле FOR появилась возможность указывать величину шага, отличную от единицы, | ||
- | оригинал https://inf.1sept.ru/ | + | 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, | ||
+ | | SET | подмножество из 0 .. 31 | | ||
+ | |||
+ | Способ объявления переменных не изменился: | ||
+ | |||
+ | < | ||
+ | ch: CHAR;</ | ||
+ | | ||
+ | Работа с массивами изменилась, | ||
+ | |||
+ | < | ||
+ | |||
+ | Для определения длины массива в программе используется стандартная процедура LEN(d). Например, | ||
+ | |||
+ | < | ||
+ | |||
+ | или | ||
+ | |||
+ | < | ||
+ | |||
+ | WHILE i < LEN(d) DO d[i]:= 0; INC(i) END;</ | ||
+ | |||
+ | Для объявления двухмерного массива используется конструкция следующего вида: | ||
+ | |||
+ | < | ||
+ | |||
+ | или | ||
+ | |||
+ | < | ||
+ | |||
+ | Узнать размер многомерного массива по любому измерению можно так: | ||
+ | |||
+ | i := LEN(table, 0); (* i = 3, число строк в массиве table *) | ||
+ | |||
+ | k := LEN(table, 1); (* k = 15, число столбцов в массиве table *) | ||
+ | |||
+ | Компонентный Паскаль корректно работает с многомерными динамическими массивами. Динамический массив объявляется с помощью указателя: | ||
+ | |||
+ | < | ||
+ | |||
+ | VAR b: POINTER TO ARRAY OF ARRAY OF REAL;</ | ||
+ | |||
+ | Непосредственно перед использованием массива его необходимо разместить в памяти специальным оператором, | ||
+ | |||
+ | NEW(a, n); NEW(b, x, y); | ||
+ | |||
+ | В остальном приемы работы с динамическими и статическими массивами совпадают, | ||
+ | |||
+ | При объявлении функций не используется ключевое слово function, вместо этого процедурам разрешено возвращать значение с помощью оператора RETURN. | ||
+ | |||
+ | ^ Turbo Pascal ^ Компонентный Паскаль ^ | ||
+ | | < | ||
+ | begin | ||
+ | sqr := a*a | ||
+ | end;</ | ||
+ | BEGIN | ||
+ | | ||
+ | END Sqr;</ | ||
+ | |||
+ | Обратите внимание, | ||
+ | |||
+ | ===== Программный модуль ===== | ||
+ | |||
+ | |||
+ | Строительными блоками программ являются модули, | ||
+ | |||
+ | |||
+ | < | ||
+ | |||
+ | 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(" | ||
+ | L.Ln | ||
+ | END | ||
+ | END Делать; | ||
+ | |||
+ | END МоиПример.</ | ||
+ | |||
+ | {{: | ||
+ | |||
+ | Вместо ключевого слова uses в Компонентном Паскале используется слово IMPORT, после которого перечисляются имена используемых модулей. При импорте длинному имени модуля можно задать краткий синоним-замену. В нашем примере имени StdLog мы назначили замену “L”. Этот прием может быть очень полезен потому, | ||
+ | |||
+ | Компиляция и выгрузка модуля в школьной версии Блэкбокса производится нажатием клавиши F8 или выбором пункта “Компилировать и выгрузить” в меню “Разработка”. Выгрузка нужна для того, чтобы при успешной компиляции старая версия машинного кода модуля была заменена в памяти на новую. Компиляция происходит очень быстро, | ||
+ | |||
+ | |||
+ | Хотим особо подчеркнуть, | ||
+ | |||
+ | Рабочий журнал Блэкбокса — это универсальное средство вывода, | ||
+ | |||
+ | Ввод-вывод обычно осуществляется с помощью библиотечных процедур, | ||
+ | |||
+ | Начинающему программисту на первое время будет достаточно основных процедур вывода в журнал: | ||
+ | |||
+ | StdLog.Int (вывод целочисленного значения), | ||
+ | |||
+ | StdLog.Real (вывод вещественного значения), | ||
+ | |||
+ | StdLog.String (вывод строки), | ||
+ | |||
+ | StdLog.Ln (перевод строки). | ||
+ | |||
+ | Ввод данных из входного потока осуществляется с помощью одноименных “обратных” процедур модуля In: | ||
+ | |||
+ | In.Int (ввод целочисленного значения), | ||
+ | |||
+ | In.Real (ввод вещественного значения), | ||
+ | |||
+ | In.String (ввод строки). | ||
+ | |||
+ | При прогоне программы на различных наборах входных данных в Turbo Pascal последние приходится либо каждый раз вводить с клавиатуры, | ||
+ | |||
+ | |||
+ | ===== Среда разработки ===== | ||
+ | |||
+ | Блэкбокс — среда разработки программ, | ||
+ | |||
+ | Рис. 1. Иллюстрация возможностей Блэкбокса по встраиванию сторонних объектов | ||
+ | |||
+ | Текст документа может быть оформлен весьма разнообразно. Допускается использование разных шрифтовых оформлений — гарнитура, | ||
+ | |||
+ | — открывающий коммандер, | ||
+ | |||
+ | — закрывающий коммандер; | ||
+ | |||
+ | — командная кнопка, | ||
+ | |||
+ | — штамп даты-времени и номера версии, | ||
+ | |||
+ | — часы, отображают текущее время; | ||
+ | |||
+ | — текстовая складка, | ||
+ | |||
+ | — линейка для форматирования текста, | ||
+ | |||
+ | < | ||
+ | |||
+ | — действующая гиперссылка на другой документ, | ||
+ | |||
+ | < | ||
+ | |||
+ | <1>1. Введение<> | ||
+ | |||
+ | — действующая мишень. | ||
+ | Структура папок Блэкбокса | ||
+ | |||
+ | По соглашению, | ||
+ | |||
+ | Исходный модуль сохраняется в папке Mod подсистемы. Имя файла соответствует имени модуля, | ||
+ | |||
+ | Модули, | ||
+ | |||
+ | Модули, | ||
+ | |||
+ | Каждая папка подсистемы может содержать следующие вложенные папки (см. таблицу). | ||
+ | |||
+ | Code | ||
+ | Папка с исполняемыми кодовыми файлами. Расширение имен у таких файлов: | ||
+ | Docu | ||
+ | |||
+ | Папка с полностью документированными интерфейсами и другими документами. Например, | ||
+ | Mod Папка с исходными модулями. Например, | ||
+ | Rsrc | ||
+ | |||
+ | Папка с ресурсными документами подсистемы: | ||
+ | Sym | ||
+ | |||
+ | Папка с символьными файлами. Расширение имен у таких файлов: | ||
+ | |||
+ | Пользователям настоятельно рекомендуется сохранять свои модули в собственной подсистеме, | ||
+ | В этом случае нам потребуется создать папку Школа, внутри которой расположить указанные (пустые) папки. В таком случае модуль с именем Привет будет иметь полное имя ШколаПривет и будет располагаться в файле Школа\Mod\Привет.odc. | ||
+ | Сетевая работа | ||
+ | |||
+ | При использовании Блэкбокса в компьютерном классе можно выполнить серверную установку. | ||
+ | В этом случае на сервер устанавливается одна копия среды, и папка с ней открывается на доступ только для чтения. Для каждого пользователя создается локальная папка на рабочем месте, в которую помещается ярлык для запуска Блэкбокса. Например, | ||
+ | |||
+ | H: | ||
+ | |||
+ | Объект (Target): H: | ||
+ | |||
+ | Рабочая папка (Start in): C: | ||
+ | |||
+ | Этот ярлык можно поместить куда угодно, | ||
+ | |||
+ | Такая сетевая установка защищает файлы среды от разрушительных действий пользователя, | ||
+ | |||
+ | Аналогичную “сетевую” установку можно провести локально, | ||
+ | |||
+ | В случае сетевой установки подсистему с рабочими файлами учащегося следует разместить в папке C: | ||
+ | |||
+ | В простейшем случае достаточно просто распаковать архив Блэкбокса на диск и можно сразу начинать им пользоваться. | ||
+ | Гибкость | ||
+ | |||
+ | Продолжим разговор об эргономических преимуществах Блэкбокса. Еще одной отличительной чертой является его гибкость. Среду легко настроить так, чтобы было удобно работать разным категориям пользователей. Например, | ||
+ | |||
+ | i INTEGER 4 байта -2147483648 .. | ||
+ | +2147483647 | ||
+ | r REAL 8 байт | ||
+ | ±1.797693134862316E±308, | ||
+ | m заготовка модуля | ||
+ | if IF условие THEN ... END; | ||
+ | iff IF условие THEN ... ELSE ... END; | ||
+ | f FOR := TO DO ... END; | ||
+ | w WHILE условие DO ... END; | ||
+ | rep | ||
+ | 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. Этот модуль легко поддается модификации даже учащимися. | ||
+ | |||
+ | Вызов справки можно добавить в инструментальную панель, | ||
+ | Строки | ||
+ | |||
+ | В Блэкбоксе имеются достаточно богатые средства для работы со строками. Строки в КП описываются как символьные массивы: | ||
+ | |||
+ | VAR строка: | ||
+ | VAR str: ARRAY 30 OF CHAR; | ||
+ | |||
+ | Цепочки или отдельные символы можно заносить в массив разными способами: | ||
+ | |||
+ | Строка как цепочка символов должна быть задана либо в одинарных апострофах ‘’, либо в двойных кавычках “”. Например: | ||
+ | |||
+ | In.Open; In.String(str); | ||
+ | строка := " | ||
+ | str := ' | ||
+ | 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, | ||
+ | |||
+ | В рабочий журнал будет выдано: | ||
+ | |||
+ | ----3.142E-3 | ||
+ | ООП | ||
+ | |||
+ | Компонентный Паскаль поддерживает полноценное объектно-ориентированное программирование. Покажем это на примере графического объекта Круг, имеющего такие свойства, | ||
+ | |||
+ | MODULE МоиМетод; | ||
+ | | ||
+ | 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: Круг) РисКруг, | ||
+ | BEGIN | ||
+ | (* задание цвета заливки круга *) | ||
+ | Gr.SetFillColor(p.цвет); | ||
+ | (* рисование круга в виде эллипса с равными полуосями *) | ||
+ | Gr.FillEllipse(p.x, | ||
+ | END РисКруг; | ||
+ | |||
+ | PROCEDURE Делать*; | ||
+ | VAR k1, k2: Круг; s, p: REAL; | ||
+ | BEGIN | ||
+ | Gr.Clear; | ||
+ | k1.r := 60; k1.Площадь(s); | ||
+ | L.String(" | ||
+ | L.Real(s); L.Ln; | ||
+ | k1.x := 80; k1.y := 80; | ||
+ | Gr.SetBkColor(14); | ||
+ | k1.ЦветКруга(1); | ||
+ | k2.r := 50; k2.Периметр(s); | ||
+ | L.String(" | ||
+ | L.Real(s); L.Ln; | ||
+ | k2.x := 200; k2.y := 60; | ||
+ | k2.ЦветКруга(7); | ||
+ | k2.x := 220; k2.y := 100; | ||
+ | k2.r := 40; | ||
+ | k2.ЦветКруга(11); | ||
+ | Gr.Open | ||
+ | END Делать; | ||
+ | |||
+ | END МоиМетод. | ||
+ | |||
+ | МоиМетод.Делать | ||
+ | |||
+ | Рис. 2. Результат работы процедуры МоиМетод.Делать | ||
+ | |||
+ | Выдача в рабочем журнале: | ||
+ | |||
+ | площадь 1-го круга = 11309.73355292326 | ||
+ | |||
+ | периметр 2-го круга = 314.1592653589793 | ||
+ | “Длинная” арифметика | ||
+ | |||
+ | Встречаются задачи, | ||
+ | |||
+ | Модуль Integers реализует абстрактный тип данных Integer для представления целых чисел произвольной точности. Он содержит также наиболее важные арифметические операции для таких чисел и набор операций преобразования. Арифметические операции включают сложение, | ||
+ | |||
+ | Что касается присваивания и параметров процедур, | ||
+ | Диалог | ||
+ | |||
+ | Диалоговые средства Блэкбокса очень просты в использовании и достаточно богаты по ассортименту. Для взаимодействия с программой в диалоге необходимо подключить специальный модуль Dialog, изменить операторы ввода-вывода на диалоговые, | ||
+ | |||
+ | Чтобы значения переменных были видны на форме, в их описаниях добавляется специальный признак: | ||
+ | |||
+ | Многое станет ясно из примера программы-калькулятора. | ||
+ | |||
+ | MODULE МоиКалькулятор; | ||
+ | | ||
+ | |||
+ | VAR x*, y*, результат: | ||
+ | |||
+ | PROCEDURE Сложить*; | ||
+ | BEGIN результат := x + y; | ||
+ | | ||
+ | END Сложить; | ||
+ | |||
+ | PROCEDURE Вычесть*; | ||
+ | BEGIN результат := x - y; | ||
+ | | ||
+ | END Вычесть; | ||
+ | |||
+ | (* для экономии места некоторые процедуры не приведены *) | ||
+ | |||
+ | BEGIN x := 0; y := 0; | ||
+ | END МоиКалькулятор. | ||
+ | |||
+ | После компиляции приведенного модуля возможно автоматическое построение диалоговой формы. Для этого необходимо в меню “Диалоги” выбрать пункт “Новая форма…”. В поле ввода появившегося окна нужно ввести имя модуля: | ||
+ | |||
+ | Будет создана форма следующего вида: | ||
+ | |||
+ | Форма для полнофункциональной программы “Калькулятор” после редактирования может выглядеть более приятно и удобно: | ||
+ | |||
+ | |||
+ | |||
+ | ===== Заключение ===== | ||
+ | |||
+ | Преподавание программирования на основе Компонентного Паскаля/ | ||
+ | |||
+ | |||
+ | |||
+ | ===== Литература ===== | ||
+ | |||
+ | 1. Вирт Н. Преподавание информатики: | ||
+ | |||
+ | 2. Жилин С.А., Жилина И.Б. Малые компонентные среды и языки программирования в школьном информационном образовании // Информатика и образование, | ||
+ | |||
+ | 3. Электронный ресурс: | ||
+ | |||
+ | |||
+ | оригинал https:// | ||
+ | А. С. Ильин, | ||
+ | технический директор “Amadeus IT Solutions”, | ||
+ | А. И. Попков, | ||
+ | директор по образовательным проектам ГК |