КП-01: модуль Out и переменные
Это первый блок занятий по Компонентному Паскалю. Здесь мы научимся выводить данные.
Есть много способов это делать. Тут будет рассмотрен модуль Out. Он умеет выводить в журнал текст и числа.
вывод символа. (отступ делать табом!)
MODULE Study;
IMPORT Out;
BEGIN
Out.Char("t");
END Study.
вывод строки
MODULE Study;
IMPORT Out;
BEGIN
Out.String("привет мир!");
END Study.
вывод строк
MODULE Study;
IMPORT Out;
BEGIN
Out.String("привет мир!");
Out.String("привет мир!");
Out.String("привет мир!");
END Study.
перенос каретки
MODULE Study;
IMPORT Out;
BEGIN
Out.String("привет мир!");
Out.Ln;
Out.String("привет мир!");
Out.Ln;
Out.String("привет мир!");
Out.Ln;
END Study.
удобный синтаксис (после точки с запятой идёт пробел)
MODULE Study;
IMPORT Out;
BEGIN
Out.String("привет"); Out.Ln;
Out.String("привет"); Out.Ln;
Out.String("привет"); Out.Ln;
END Study.
1-разрядный вывод целого числа
MODULE Study;
IMPORT Out;
BEGIN
Out.Int(5,1);Out.Ln;
END Study.
многоразрядный вывод целого числа
MODULE Study;
IMPORT Out;
BEGIN
Out.Int(435,0);Out.Ln;
Out.Int(435,1);Out.Ln;
Out.Int(435,2);Out.Ln;
Out.Int(435,3);Out.Ln;
Out.Int(435,4);Out.Ln;
Out.Int(435,5);Out.Ln;
Out.Int(435,6);Out.Ln;
END Study.
многоразрядный вывод вещественного числа
(запятая — тоже разряд)
MODULE Study;
IMPORT Out;
BEGIN
Out.Real(356.45,5);Out.Ln;
Out.Real(356.45,6);Out.Ln;
Out.Real(356.45,7);Out.Ln;
END Study.
переменные CHAR, INTEGER, REAL
MODULE Study;
IMPORT Out;
VAR
a:CHAR;
b:INTEGER;
c:REAL;
BEGIN
a:="h";
b:=356;
c:=356.45;
Out.Char(a);Out.Ln;
Out.Int(b,6);Out.Ln;
Out.Real(c,6);Out.Ln;
END Study.
Строковый массив
Из-за некоторых особенностей языка,
в каждой строке на один символ больше, чем кажется.
Это спецсимвол, чтобы комп всегда видел конец строки.
Подробности:
В КП различают массивы литер и строки.
Строки бывают константы, а бывает — хранятся в массивах.
Строка в массиве заканчивается 0X — нулевой литерой.Если нуль в массив не влезает -это ошибка.
Изначально, когда комп выделяет память под массив, он её не чистит.
Поэтому, изначально, массив забит мусорными значениями.
Потом мы помещаем в него строку.
Но, дело в том, что строка может оказаться заметно короче длины массива.
Поэтому, после окончания строки, у нас будет ещё несколько ячеек, забитых «мусором».
Допустим VAR s, t: ARRAY N OF CHAR.
Тогда s := t означает присваивание всего массива, N элементов, а s := t$ означает скопировать строку, содержащуюся в t, массив s.
MODULE Study;
IMPORT Out;
VAR
a:ARRAY 4 OF CHAR;
BEGIN
a:="ggg";
Out.String(a);
END Study.
Искренняя благодарность Ивану Денисову и Антону Дмитриеву за подробные ответы.
КП-доп-1: формат чисел
*В задачах школьного курса, иногда нужно вывести число в форматированном виде. Особенно это касается вещественных чисел. Модуль Log имеет для этого нужные процедуры. Среди них — RealForm.
Рассмотрим на её примере оформление формата вывода чисел. Другие процедуры можно изучить самостоятельно. Выделите имя модуля Log и вызвав контекстное меню правой кнопкой мыши («Исходники», «Интерфейс» и «Документация»).
Процедура RealForm имеет пять аргументов.
1) число, которое нужно вывести. Тип данных REAL.
MODULE Study;
IMPORT Out,Log;
VAR x,y,z:REAL;
BEGIN
x:=1.111;
y:=2.222;
z:=3.333;
Log.RealForm(x,4,6,-4,' ');Out.Ln;
Log.RealForm(y,4,6,-4,' ');Out.Ln;
Log.RealForm(z,4,6,-4,' ');Out.Ln;
END Study.
2) Показатель «precision» («точность») — число допустимых десятичных позиций. Тип данных INTEGER.
MODULE Study;
IMPORT Out,Log;
VAR x:REAL;
BEGIN
x:=1.111;
Log.RealForm(x,1,6,-4,' ');Out.Ln;
Log.RealForm(x,2,6,-4,' ');Out.Ln;
Log.RealForm(x,3,6,-4,' ');Out.Ln;
Log.RealForm(x,4,6,-4,' ');Out.Ln;
Log.RealForm(x,5,6,-4,' ');Out.Ln;
END Study.
3) Показатель minW — минимальная длина представления в литерах. Тип данных INTEGER.
MODULE Study;
IMPORT Out,Log;
VAR x:REAL;
BEGIN
x:=1.111;
Log.RealForm(x,4,5,-4,' ');Out.Ln;
Log.RealForm(x,4,6,-4,' ');Out.Ln;
Log.RealForm(x,4,7,-4,' ');Out.Ln;
Log.RealForm(x,4,8,-4,' ');Out.Ln;
END Study.
4) Показатель expW — формат представления данных.
expW < 0: формат с фикс. точкой с -expW разрядами после точки. expW = 0: формат с фикс. или плав. точкой в зависимости от x. expW > 0: научный формат с не менее чем expW разрядами в экспоненте.
MODULE Study;
IMPORT Out,Log;
VAR x:REAL;
BEGIN
x:=1.111;
Log.RealForm(x,4,6,-4,' ');Out.Ln;
Log.RealForm(x,4,6,-3,' ');Out.Ln;
Log.RealForm(x,4,6,-2,' ');Out.Ln;
Log.RealForm(x,4,6,-1,' ');Out.Ln;
Log.RealForm(x,4,6,0,' ');Out.Ln;
Log.RealForm(x,4,6,1,' ');Out.Ln;
Log.RealForm(x,4,6,2,' ');Out.Ln;
Log.RealForm(x,4,6,3,' ');Out.Ln;
END Study.
5)Показатель-литера fillCh — именно ей, а не пробелами, заполняется пустое пространство при применении minW.
Вообще, пробел — это тоже литера.
MODULE Study;
IMPORT Out,Log;
VAR x:REAL;
BEGIN
x:=1.111;
Log.RealForm(x,4,5,-4,'q');Out.Ln;
Log.RealForm(x,4,6,-4,'q');Out.Ln;
Log.RealForm(x,4,7,-4,'q');Out.Ln;
Log.RealForm(x,4,8,-4,'q');Out.Ln;
END Study.
КП-02: ветвления и циклы.
Это второй блок занятий по Компонентному Паскалю. Здесь мы научимся ветвлениям и циклам
Простое ветвление
MODULE Study;
IMPORT Out;
VAR
x:INTEGER;
BEGIN
x := 5;
IF x = 5 THEN
Out.String("Отлично!");Out.Ln;
END;
END Study.
Ветвление с альтернативным вариантом
MODULE Study;
IMPORT Out;
VAR
school_grade:INTEGER;
BEGIN
school_grade := 5;
IF school_grade = 5 THEN
Out.String("Отлично!");Out.Ln;
ELSE
Out.String("Жаль, что не пятерка.");Out.Ln;
END;
END Study.
Ветвление с дополнительными вариантами
MODULE Study;
IMPORT Out;
VAR
school_grade:INTEGER;
BEGIN
school_grade := 5;
IF school_grade = 5 THEN
Out.String("пять!");Out.Ln;
ELSIF school_grade = 4 THEN
Out.String("четыре.");Out.Ln;
ELSIF school_grade = 3 THEN
Out.String("три.");Out.Ln;
ELSIF school_grade = 2 THEN
Out.String("два.");Out.Ln;
ELSIF school_grade = 1 THEN
Out.String("кол!");Out.Ln;
ELSE
Out.String("Это не отметка.");Out.Ln;
END;
END Study.
цикл While.
Кстати, если цикл завис — жмите Ctrl+Break или Ctrl+Fn+B
MODULE Study;
IMPORT Out;
VAR
count:INTEGER;
BEGIN
count := 0;
WHILE count < 5 DO
Out.String("Старт! ");
Out.Int(count,1);Out.Ln;
count := count + 1;
END;
END Study.
то же с обратным отсчетом
MODULE Study;
IMPORT Out;
VAR
count:INTEGER;
BEGIN
count := 3;
WHILE count > 0 DO
Out.String("Старт! ");
Out.Int(count,1);Out.Ln;
count := count - 1;
END;
END Study.
Цикл For
MODULE Study;
IMPORT Out;
VAR
count:INTEGER;
BEGIN
FOR count := 0 TO 3 DO
Out.String("Старт! ");
Out.Int(count,1);Out.Ln;
END
END Study.
то же с обратным отсчетом
MODULE Study;
IMPORT Out;
VAR
count:INTEGER;
BEGIN
FOR count := 3 TO 1 BY -1 DO
Out.String("Старт! ");
Out.Int(count,1);Out.Ln;
END
END Study.
КП-доп-2: консольное приложение
Блэкбокс может создавать как консольные, так и графические приложения. Это довольно непростой сборочный процесс. Для новичков он может быть сложен.
Школьная сборка Блэкбокс имеет специальный инструмент «Собрать Приложение»

Это сугубо учебный автоматизированный инструмент. Когда вы будете настоящими программистами, вы будете собирать приложения сами, используя различные модули. Здесь вы можете использовать только документы ODC, которые называются Study.odc. Приложение само соберется в файл .exe в папке Blackbox.
Вот простейшая программа. Обратим внимание на несколько особенностей:
1. Не импортирован модуль Out. Тут нет журнала, значит модуль Out не нужен
2. Есть переменная «x» массивового типа. Она нужна, чтобы принять строку, которую введёт пользователь. Дело в том, что в Обероне нет строки, как отдельного типа данных.
3. ReadLn(x) — команда, которая позволяет пользователю вводить данные. Она терпеливо ждёт, пока пользователь набирает текст. Этот эффект используется для остановки выполнения программы. Теперь она не закрывается и дает возможность нам разглядеть окно приложения. Если мы соберем приложение без этой команды, то оно откроется и тут же закроется. Это происходит, потому что компьютер гораздо быстрее человека
MODULE Study;
IMPORT Console;
VAR
x:ARRAY 4 OF CHAR;
BEGIN
Console.WriteStr("Hello");
Console.ReadLn(x);
END Study.
Теперь посложнее. Опробуем разные процедуры модуля Console. Отметим, что тут есть проблемы с вводом строк. В Обероне, длина строки на один символ больше, чем кажется (см. урок 1).
MODULE Study;
IMPORT Console;
VAR
x:ARRAY 8 OF CHAR;
BEGIN
Console.WriteStr("Введите слово:");
Console.ReadLn(x);
Console.WriteStr("Вы ввели: ");Console.WriteStr(x);Console.WriteLn;
Console.WriteStr("Нажмите Enter для выхода:");Console.ReadLn(x);
END Study.
В завершение, создадим консольное приложение для сложения чисел. Чтобы его понять, нужно знать о преобразовании данных и о поведении строк в консольном вводе (на 1 символ длиннее, чем кажется!)
MODULE Study;
IMPORT Out,Console,Strings;
VAR
сonsole_string_array:ARRAY 8 OF CHAR;
(*массив для консольного вывода*)
x,y,summ:INTEGER;
mistake:INTEGER;
BEGIN
x:=0;
y:=0;
summ:=0;
Console.WriteStr("Введите два целых числа, не более 99999 каждое.");
Console.WriteLn;
Console.WriteStr("Введите первое число:");
Console.ReadLn(сonsole_string_array);
Console.WriteLn;
Strings.StringToInt(сonsole_string_array,x,mistake);
Console.WriteStr("Введите второе число:");
Console.ReadLn(сonsole_string_array);
Console.WriteLn;
Strings.StringToInt(сonsole_string_array,y,mistake);
summ:=x+y;
Strings.IntToString(summ,сonsole_string_array);
Console.WriteStr('summ: '+сonsole_string_array);
Console.WriteLn;
Strings.IntToString(mistake,сonsole_string_array);
Console.WriteStr('mistake: '+сonsole_string_array);
Console.WriteLn;
Console.WriteStr("Нажмите Enter для выхода:");Console.ReadLn(сonsole_string_array);
END Study.
КП-03: встроенная графика
Сам по себе язык бывает скучным и не слишком наглядным. Чтобы помочь школьникам, был введён модуль учебной графики, i21eduTPGraphics. Он создаёт рисунки в специальном окне, которое называется «холст». Конечно, это не полноценный игровой движок. Однако, программировать с графическим отображением гораздо интереснее.
Вот простейший пример программы с использованием графики:
.Open открывает холст (вдруг он у вас не открыт, или же вы его закрыли перед запуском программы).
.Clear очищает холст. Это полезно, если он заполнен рисунками с прошлых запусков программы. Или вы просто хотите стереть всё, что программа нарисовала раньше.
.Circle рисует круги. У неё три параметра: координаты X, координаты Y и радиус. В данном примере мы рисуем круг радиусом в 10 пикселей, в месте с координатами (50,100).
Помните, что ось Y здесь направлена вниз, а не вверх. Начало координат — верхний левый угол холста.
MODULE Study;
IMPORT i21eduTPGraphics;
BEGIN
i21eduTPGraphics.Open;
i21eduTPGraphics.Clear;
i21eduTPGraphics.Circle (50, 100, 10);
END Study.

Подробнее ознакомиться с модулем i21eduTPGraphics можно в самом BlackBox. Для этого, нужно выделить 21eduTPGraphics прямо в коде, а потом кликнуть на нём же правой кнопкой. В появившемся меню выберите «исходники», «интерфейс» и «документация». Так вы сможете заглянуть «под капот» и ознакомиться с модулем подробно.
Пример применения: построение графика. Здесь же дан пример сокращенного именования модуля (писать каждый раз i21eduTPGraphics было бы утомительно).
(*G - придуманное мной краткое имя
модуля i21eduTPGraphics*)
MODULE Study;
IMPORT G := i21eduTPGraphics;
VAR
x,x_step,y_step,coff:INTEGER;
BEGIN
G.Open;
G.Clear;
x_step:=30;
y_step:=5;
x:=0;
WHILE x<10 DO
G.Circle (x*x_step, x*x*y_step, 10);
x:=x+1;
END;
END Study.

КП-доп-3: преобразование типов
Часто нам нужно поменять тип данных. Например, мы вводим в консоль число, но Оберон думает, что это текст. Или нам нужно превратить дробное число в целое. В таких ситуациях нам нужно знать об инструментах преобразования типов.
Оберон — язык с статической типизацией. Это значит, что переменная типа INTEGER всегда останется таковой. Строки из неё не получится. Значит нам надо взять её значение, изменить его тип, а потом засунуть в другую, заранее созданную переменную.
В примере ниже, мы превратим текст «777» в число «777».
Изначально текст жил в переменной x_array. Мы заранее создали переменную для целых чисел y_int (ведь 777 — целое число). Потом мы применили процедуру StringToInt из модуля Strings.
Обратите внимание, StringToInt использует ещё одну переменную — result. Создатели модуля Strings захотели иметь «индикатор», удалось ли преобразование или нет. Если всё прошло удачно — result=0. А если случилась ошибка — result=2. Отчего бывают ошибки? Например, «777» легко превратить в число. А вот «cats» превратить в число не получится.
MODULE Study;
IMPORT Out,Strings;
VAR
x_array:ARRAY 8 OF CHAR;
x_char:CHAR;
y_int:INTEGER;
result:INTEGER;
BEGIN
x_array:='777';
y_int:=0;
Strings.StringToInt(x_array,y_int,result);
Out.Int(y_int,1);
Out.Int(result,1);
END Study.
Конечно, здесь рассмотрен только один пример. Если вы желаете ознакомится с Strings подробнее — выделите слово Strings прямо в коде, щелкните на ней правой кнопкой. Выберите «документацию», «исходники» или «интерфейс».
КП-04: процедуры
Вот обычная программа «Hello World»:
MODULE Study;
IMPORT Out;
BEGIN
Out.String("Hello World!");Out.Ln;
END Study.
А это программа с процедурой.
MODULE Study;
IMPORT Out;
PROCEDURE Hello;
BEGIN
Out.String("Hello World!");Out.Ln;
END Hello;
BEGIN
Hello()
END Study.
Процедуру можно запускать много раз;
MODULE Study;
IMPORT Out;
PROCEDURE Hello;
BEGIN
Out.String("Hello World!");Out.Ln;
END Hello;
BEGIN
Hello();
Hello();
Hello();
END Study.
Процедур может быть несколько:
MODULE Study;
IMPORT Out;
PROCEDURE Hello;
BEGIN
Out.String("Hello World!");Out.Ln;
END Hello;
PROCEDURE Bye;
BEGIN
Out.String("Bye!");Out.Ln;
END Bye;
BEGIN
Hello();
Bye();
END Study.