hodza/BlackBox.Shkola.2014 huggingface dataset:
i21edu/Docu.Знакомство/Простейшая программа.odc

MODULE Program0;
	IMPORT  Log;
	
BEGIN
	Log.String( 'Привет!' );  Log.Ln;
END Program0.

Выше показан пример простенькой программы на Компонентном Паскале с английскими ключевыми словами (можно использовать и русские ключевые слова, об этом позже). 
Первое отличие от старого Паскаля, которое бросается в глаза,  это написание ключевых слов заглавными буквами; это соглашение резко облегчает восприятие структуры программы и является обязательным.
Не надо пугаться того, что при наборе программы придётся переключаться с нижнего на верхний регистр и обратно, так как всю работу по оформлению заглавных букв редактор берёт на себя, . документ ОбF5вшкольнойверсии.
  (Program0, Log, String, ...)    .
     (   ,    Verdana, Arial, ,   ..).   ,        .
Для ясности программа выделена синим цветом; последняя точка в синем фрагменте  это и есть конец программы, и компилятор дальше этой точки не смотрит. Поэтому после текста программы удобно держать примеры входных данных, фрагменты кода, подсказки (см. Подготовказадач), объяснения (как здесь) и т.п.
Убедимся, что Рабочий журнал виден (если что, его можно в любой момент открыть командой школьного меню или сдвинуть другие окна). 
Убедимся, что окошко с программой  переднее (активное).
Чтобы проверить корректность программы, скомпилируем её нажатием Ctrl+K. 
В Рабочем журнале появится соответствующее сообщение. Можно понажимать Ctrl+K несколько раз.
(При написании программ полезно нажимать Ctrl+K почаще, чтобы пораньше находить опечатки. См. Некоторыезаповедиграмотногопрограммирования.)

Откомпилируем и выполним программу нажатием Ctrl+F9 (в Турбо Паскале эта комбинация используется для компиляции).
В Рабочем журнале появятся три новые строчки:
	первая  сообщение об успешной компиляции, числа сообщают о размере бинарника и блока глобальных переменных в байтах (чуть позже посмотрим, что происходит, когда в программе обнаруживаются ошибки);
	вторая  сообщение о выгрузке старой версии модуля с программой (как частный случай в памяти модуль может быть не найден, о чём так и будет сказано); 
	третья  это то, что напечатала вновь скомпилированная программа.
Сообщения в рабочем журнале о том, что старый модуль NNN выгружен, напоминают о том, что за кулисами кнопки Ctrl+F9 скрыт чуть более общий механизм, чем простое выполнение программы.
На самом деле только при решении простых задач годится такая схема работы, когда пишется программа, которая компилируется и выполняется. При решении более сложных задач обычно пишут не одну программу, а целую группу процедур (библиотеку, компонентный каркас).
И тогда более удобным становится режим работы, при котором модуль с процедурами загружается в память и остаётся там, пока идёт работа с процедурами (например, их совместное тестирование). И лишь когда программист примет решение, модуль удаляется из памяти  или заменяется новой версией. Это  основной, штатный режим работы в Блэкбоксе. 
Прочитать о нём можно здесь.
i21edu/Docu.Знакомство/Редактирование и форматирование.odc

Редактирование и форматирование

              ,       ,         
.   ,      ,  , продуманное    ..       ,      .           глупо отключать     .

  ,       :
	-,     Mac OS/MS Windows ( Shfit+    ,   Ctrl+X, Ctrl+C, Ctrl+V     ,  ..).
	-,     (Ctrl+Z   -> ),          ,           ->  (Ctrl+S).
	-,    .
	-,      ,    , ..            .


           . 
 ,   -   ,          (.   . ,     , , , 1985). 
Поэтому     -    ,     ,       .
Подробные инструкции об оформлении отступов см. документ Оботступах.
         
(Обоформлениипрограмм),          .

  
          .     .    , ,  Verdana,      (, 8         ,    ).              , 10 или 12 .
  ,       ,     1-Основное, ...,      ,      :


     ...      ( ).    ,  OK   .
       ""  ,      (    ,   Dev\Rsrc\Errors.odc).

        (    ).         ..,       ,    (  ,   , ,   ,  ..). 

   ..
       ,     "  ",    .  Обероне/               , ..     (.   здесь: Ключевыесловаизпрописныхбукв).         .
,     ,       . 
    ,  .. 
 (  , ,  ..)        (Шрифт,   ..).
 ,     ,         ,    RETURN  EXIT, ..        ,    .

  
,          (, , ,  ...),   ,        .      ( , , ,  MS Word):      (Ctrl+Shift+C,     -->  ),            (Ctrl+Shift+V   -->  ).    ,       .
Ещё один способ:
	выделить мышкой фрагмент, атрибуты которого нужно установить;
	сделать видимым текст, атрибуты которого нужно использовать (возможно, в другом окне);
	нажать Alt и мышкой бросить выделенный фрагмент на тот текст, атрибуты которого требуется использовать.

,           ( -->  ).           .   ,     ( ,     )      ;     поведения   .
i21edu/Docu.Знакомство/ТРАПы -- аварийные остановки.odc

ТРАПы  аварийные остановки

При выполнении программы может случиться какая-нибудь ошибка:
например, деление на нуль, или ошибки ввода, пойманные инструкциями ASSERT(In.done) или УБЕДИТЬСЯ(Ввод.сделано).
Если такая ошибка случается, то Блэкбокс ловит её и открывает окошко ТРАП/TRAP с важной информацией: там можно посмотреть, в какой инструкции исходника произошла ошибка и каково было при этом состояние переменных в программе.

ТРАП = TRAP = по-английски ловушка (например, траппер у Фенимора Купера  это охотник за пушным зверем, применяющий ловушки).

Два эквивалентных примера с русскими и английскими ключевыми словами (дальнейшие инструкции см. в исходниках):
	ТРАП(русс.)
	ТРАП(англ.)

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

Более сложный пример на эту тему  модуль i21примТрап; чтобы открыть исходник: двойной клик по имени модуля, Ctrl+0 (цифра нуль).

Упражнение. Написать программу, порождающую ТРАП при целочисленном делении на нуль (n DIV m или n MOD m). 

Внимание! При делении вещественных чисел на нуль трапа может не выйти, т.к. может получиться значение inf (бесконечность, причем со знаком) в соответствии со стандартом IEEE. Однако попробуйте поделить нуль на нуль.
i21edu/Mod/FilesTest.odc

MODULE i21eduFilesTest;  (* info21, 2003; последнее редактирование: 2010-09-28 *)
	IMPORT  Log := StdLog,  In := i21sysIn,  F := i21eduFiles;
	
	PROCEDURE New*;  (* попытка создания нового файла в текущей папке *)
	BEGIN
		F.New('test'); (* такого файла не должно существовать, иначе будет сообщение в Рабочий журнал *)
		(* че-нить туда запишем: *)
		F.WriteChar( "Ю" );  F.WriteInt( 155 );  F.WriteReal( 3.14 );  F.WriteString( "файлы" );
		F.Close;
	END New;
	
	PROCEDURE New2*; (* попытка создания другого нового файла в текущей папке *)
	BEGIN
		F.New('test'); F.WriteChar( "Ы" );  F.Close;
	END New2;
	
	PROCEDURE Read*; (* чтение файла с копированием содержимого в Log *)
		VAR  ch: CHAR; i: INTEGER; r: REAL; s: ARRAY 100 OF CHAR;
	BEGIN
		F.Open('test');
		F.ReadChar( ch );	Log.Char( ch );
		F.ReadInt( i );	Log.Int( i );
		F.ReadReal( r );	Log.Real( r );
		F.ReadString( s );	Log.String( s );
		Log.Ln;
		F.Close;
	END Read;
	
END i21eduFilesTest.

Последовательно кликая, проверяем работу:
Сначала полезно обеспечить отсутствие файлов в памяти:
DevDebug.UnloadThis i21eduFilesTest i21eduFiles
а также отсутствие создаваемого файла:
"i21eduFiles.Delete('test')"

Создаем новый файл test в текущей рабочей папке (на одном уровне с папкой i21sys):
i21eduFilesTest.New
Можно его проинспектировать внешними программами. На месте чисел там будет мусор.

Попытка немедленно создать новый файл с тем же именем не должна получаться:
i21eduFilesTest.New2
см. сообщение в Рабочем журнале

Прочтем файл test и скопируем содержимое в Рабочий журнал:
i21eduFilesTest.Read

Удалим файл:
"i21eduFiles.Delete('test')"
Можно проверить в каком-нить файловом менеджере, что файл пропал.

Теперь можно повторить попытку:
i21eduFilesTest.New2
Проверим, что файл появился, совсем короткий, пусть побудет.

Повторим попытку создания файла test:
i21eduFilesTest.New
Она должна закончиться неудачей.

Сменим папку:
"i21eduFiles.SetFolder('проверка')"

Повторим попытку создания файла test:
i21eduFilesTest.New
Может появиться просьба подтвердить создание папки. Подтвердить.
Уже в новой папке создастся знакомый "длинный" файл test.
Старый, "короткий" файл (созданный процедурой New2) в основной папке должен тоже оставаться.

Удалим "длинный" файл из папки "проверка":
"i21eduFiles.Delete('test')"

Удалим старый файл тоже, для чего сначала надо сменить папку на старую:
"i21eduFiles.SetFolder('');i21eduFiles.Delete('test')"
i21edu/Mod/In.odc

MODULE i21eduIn;
	IMPORT  Log := StdLog,  In := i21sysIn,  Math;
	
	PROCEDURE Char* (VAR ch: CHAR; VAR done: BOOLEAN);
		VAR
	BEGIN
		In.Char( ch );
		done := In.done;
	END Char;
	
	PROCEDURE Int* (VAR i: INTEGER; VAR done: BOOLEAN);
		VAR
	BEGIN
		In.Int( i );
		done := In.done;
	END Int;
	
	PROCEDURE Open* (VAR done: BOOLEAN);
		VAR
	BEGIN
		In.Open;
		done := In.done;
	END Open;
	
	PROCEDURE OpenCommander* (VAR done: BOOLEAN);
		VAR
	BEGIN
		In.OpenCommander;
		done := In.done;
	END OpenCommander;
	
	PROCEDURE OpenSelection* (VAR done: BOOLEAN);
		VAR
	BEGIN
		In.OpenSelection;
		done := In.done;
	END OpenSelection;
	
	PROCEDURE Real* (VAR x: REAL; VAR done: BOOLEAN);
		VAR
	BEGIN
		In.Real( x );
		done := In.done;
	END Real;
	
	PROCEDURE Restart* (VAR done: BOOLEAN);
		VAR
	BEGIN
		In.Restart;
		done := In.done;
	END Restart;
	
	PROCEDURE String* (VAR str: ARRAY OF CHAR; VAR done: BOOLEAN);
		VAR
	BEGIN
		In.String( str );
		done := In.done;
	END String;
	
END i21eduIn.
i21edu/Mod/Random.odc

MODULE  i21eduRandom; (* Информатика-21 2008-02-18 *)
(* Модуль-обертка датчика случайных чисел ObxRandom *)
	IMPORT ObxRandom;
	
	PROCEDURE InitSeed* ( seed: INTEGER );
	(* инициализация датчика *)
	BEGIN
		ObxRandom.InitSeed( seed )
	END InitSeed;

	PROCEDURE Real* (): REAL;
	(* генерация вещественного значения внутри диапазона 0...1 *) 
	BEGIN
		RETURN  ObxRandom.Uniform()
	END Real;
	
	PROCEDURE Int* ( n: INTEGER ): INTEGER;
	(* случайное целое в диапазоне 0 .. n-1 *) 
		VAR  res: INTEGER;
	BEGIN
		ASSERT( n > 0, 20 );
		res := SHORT( ENTIER( ObxRandom.Uniform() * n ) );
		ASSERT( res < n, 60 );
		RETURN  res
	END Int;
	
END  i21eduRandom.
i21edu/Mod/StdLogПример0.odc

MODULE i21eduStdLogПример0;    (* см. замечания внизу после текста модуля *)
	IMPORT  Log := StdLog, Math;
	
	VAR  n: INTEGER;  ch: CHAR;  r: REAL;
		string: ARRAY 100 OF CHAR; (* подобные массивы служат для хранения цепочек литер; в данный массив поместятся цепочки длиной не более 99 литер *)
		
BEGIN
	Log.Ln;	(* перевод дальнейшей печати на новую строку *)
	Log.String( '***********' );	(* чтобы легче найти начало печати в журнале *)
	Log.Ln;	
	
	(* вывод целых: *)
	Log.Int( 5 );	(* целая константа *)
	n := 17;
	Log.Int( n ); 	(* значение nелой переменной *)
	Log.Int( n - 25 ); 	(* выражение, дающее целый результат *)
	Log.Int( n DIV 2 ); 	(* деление DIV даёт целое, остаток отбрасывается *)
	Log.Int( n MOD 2 ); 	(* остаток от деления на 2 *)
	Log.Ln;
	
	(* вывод литер: *)
	Log.Char( "Ю" );	(* литера-константа *)
	ch := ";";
	Log.Char( ch );	(* значение литерной переменной *)
	Log.Ln;
	
	(* вывод литерных цепочек: *)
	Log.String( "два слова" );	(* цепочка-константа *)
	Log.String( '--можно и в одинарных кавычках' );
	string := "; ABC";	(* в массив заряжаем целиком цепочку *)
	Log.String( string );	(* цепочка из массива *)
	Log.Ln;
	Log.String( "два слова"+string );	(* цепочки можно складывать (конкатенация) *)
	Log.Ln;
	
	(* вывод вещественных чисел: *)
	Log.Real( 3.14 );	(* вещественная константа *)
	r := 100;
	Log.Real( r );	(* значение вещественной переменной *)
	Log.Real( - r * 00.1 );	(* вещественное выражение *)
	Log.Real( r / 3 );	(* деление дробью всегда даёт вещественный 
		результат *)
	Log.Real( Math.Sqrt( 100 ) );	(* значение функции квадратный корень от 100 *)
	Log.Ln;

END i21eduStdLogПример0.

Русскоязычный аналог примера i21eduВыводПример0.

Скомпилировать и выполнить: Ctrl+F9.

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

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

Напоминание:

Шпаргалку по средствам любого модуля можно получить, выделив имя модуля в любом текстовом документе (например, в Рабочем журнале/Log) и нажав Ctrl+D. Во вспомогательном окошке откроется список всех объектов, предоставляемых модулем (процедур, переменных, констант и типов)  но без подробных объяснений.

Полную документацию можно почитать, нажав Ctrl+Shift+D вместо Ctrl+D после выделения имени модуля (или через меню: Инфо, Документация).
Поскольку любые переводы чреваты ошибками, имеет смысл помнить о том, что последней инстанцией является английская версия документации; она открывается командой меню Инфо, Documentation.

Указанные выше комбинации быстрого вызова (Ctrl+Shift+D и т.п.) справедливы для школьных комплектов Блэкбокса от проекта Информатика-21. В других комплектах они могут быть другими.
i21edu/Mod/StdLogПример1.odc

MODULE i21eduStdLogПример1; 
(* Создание простой таблички средствами модуля StdLog. 
См. пояснения после текста модуля *)

	IMPORT  Log := StdLog;
	
	VAR
		
BEGIN
	Log.Ln;	(* перевод дальнейшей печати на новую строку *)
	Log.String( '***********' );	(* чтобы легче найти начало печати в журнале *)
	Log.Ln;	
	
	(* вывод заголовка таблицы: *)
	Log.String("Оценки за четверть");
	Log.Ln;
	Log.Ln; (* пропустим еще одну строку *)
	Log.Tab;   (* печать т.наз. символа табуляции; если нажать Ctrl+H (латинская H), то символы табуляции видны как серые прямоугольнички *)
	Log.Tab;
	Log.String("Математика");
	Log.Tab;
	Log.String("Информатика");
	Log.Tab;
	Log.String("Русский язык");
	Log.Ln;
	Log.Ln;
	
	(* вывод оценок для Маши: *)
	Log.Tab;
	Log.String("Маша");
	Log.Tab;
	Log.Int(5);
	Log.Tab;
	Log.Int(4);
	Log.Tab;
	Log.Int(3);
	Log.Ln;

	(* вывод оценок для Пети *)
	Log.Tab;
	Log.String("Петя");
	Log.Tab;
	Log.Int(3);
	Log.Tab;
	Log.Int(4);
	Log.Tab;
	Log.Int(5);
	Log.Ln;

END i21eduStdLogПример1.

Пример использования средств модуля StdLog для построения простой таблички с  помощью табуляций.
Русскоязычный аналог примера i21eduВыводПример1  там же объяснения.

Скомпилировать и выполнить: Ctrl+F9.
Результаты напечатаются в Рабочий журнал, в конце.
i21edu/Mod/Trap_en.odc

MODULE i21eduTrap_en; (* русскоязычный вариант: i21eduTrap_ru *)
	IMPORT  Log := StdLog,  In := i21sysIn;
	
	VAR  n: INTEGER;
	
BEGIN
	n := 13;
	In.Open; ASSERT( In.done );
	In.Int( n ); ASSERT( In.done );
END i21eduTrap_en.


Чтобы увидеть Трап:
	убедиться, что мышкой ничего не выделено;
	нажать Ctrl+F9.

Выскочит окошко ТРАП.
Это  аварийная остановка, произошедшая оттого, что попытка чтения целого (In.Int(n)/Ввод.Цел(n)) не удалась, т.к. поток ввода пуст. 
Не удалась, значит, переменная In.done/Ввод.сделано была выставлена в FALSE/НЕТ. 
А инструкция ASSERT/УБЕДИТЬСЯ выдаёт аварийную остановку, если выражение в скобках оказывается равно FALSE/НЕТ.

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

Насмотревшись  просто закрыть окошко ТРАПа.
i21edu/Mod/Trap_ru.odc

МОДУЛЬ i21eduTrap_ru; (* англоязычный вариант: i21eduTrap_en *)
	ПОДКЛЮЧИТЬ  Вывод := i21eduВывод,  Ввод := i21eduВвод;
	
	ПЕРЕМЕННЫЕ  n: ЦЕЛАЯ;
	
НАЧАЛО
	n := 13;
	Ввод.Открыть;  УБЕДИТЬСЯ( Ввод.сделано );
	Ввод.Цел( n );  УБЕДИТЬСЯ( Ввод.сделано );
КОНЕЦ i21eduTrap_ru.


Чтобы увидеть Трап:
	убедиться, что мышкой ничего не выделено;
	нажать Ctrl+F9.

Выскочит окошко ТРАП.
Это  аварийная остановка, произошедшая оттого, что попытка чтения целого (In.Int(n)/Ввод.Цел(n)) не удалась, т.к. поток ввода пуст. 
Не удалась, значит, переменная In.done/Ввод.сделано была выставлена в FALSE/НЕТ. 
А инструкция ASSERT/УБЕДИТЬСЯ выдаёт аварийную остановку, если выражение в скобках оказывается равно FALSE/НЕТ.

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

Насмотревшись  просто закрыть окошко ТРАПа.
i21edu/Mod/Ввод.odc

MODULE i21eduВвод; (** Русскоязычный модуль ввода для учебных целей. Фасад над i21sysIn **)
(** для проекта Информатика-21: info21, 2009-03-09 **)

	IMPORT  In := i21sysIn;

	VAR
		сделано-: BOOLEAN;

	PROCEDURE Открыть*;
	BEGIN
		In.Open;
		сделано := In.done;
	END Открыть;

	PROCEDURE Сначала*;
	BEGIN
		In.Restart;
		сделано := In.done;
	END Сначала;

	PROCEDURE Литера* (OUT л: CHAR);
	BEGIN
		In.Char( л );
		сделано := In.done;
		IF ~сделано THEN
			л := 0BFX (* вопрос вверх ногами *)
		END;
	END Литера;

	PROCEDURE Цел* (OUT ц: INTEGER);
	BEGIN
		In.Int( ц );
		сделано := In.done;
		IF ~сделано THEN
			ц := MIN( INTEGER )
		END;
	END Цел;

	PROCEDURE Вещ* (OUT в: REAL);
	BEGIN
		In.Real( в );
		сделано := In.done;
		IF ~сделано THEN
			в := MIN( REAL )
		END;
	END Вещ;

	PROCEDURE Цепочка* (OUT ц: ARRAY OF CHAR);
	BEGIN
		In.String( ц );
		сделано := In.done;
		IF ~сделано THEN
			ц[0] := 0BFX; (* вопрос вверх ногами *)
			ц[1] := 0X;
		END;
	END Цепочка;

END i21eduВвод.
i21edu/Mod/Ввод2.odc

MODULE i21eduВвод2; (** Русскоязычный модуль ввода для учебных целей. Фасад над i21eduIn **)
(** для проекта Информатика-21: info21, 2012-11-15 **)

	IMPORT  In := i21sysIn, i21eduRandom;

	PROCEDURE Открыть* (VAR сделано: BOOLEAN);
	BEGIN
		In.Open;
		сделано := In.done;
	END Открыть;

	PROCEDURE Сначала* (VAR сделано: BOOLEAN);
	BEGIN
		In.Restart;
		сделано := In.done;
	END Сначала;

	PROCEDURE Литера* (OUT л: CHAR; VAR сделано: BOOLEAN);
	BEGIN
		In.Char( л );
		сделано := In.done;
		IF ~сделано THEN
			л := 0BFX (* вопрос вверх ногами *)
		END;
	END Литера;

	PROCEDURE Цел* (OUT ц: INTEGER; VAR сделано: BOOLEAN);
	BEGIN
		In.Int( ц );
		сделано := In.done;
		IF ~сделано THEN
			ц := i21eduRandom.Int( 1000000000 )  - 500000000
		END;
	END Цел;

	PROCEDURE Вещ* (OUT в: REAL; VAR сделано: BOOLEAN);
	BEGIN
		In.Real( в );
		сделано := In.done;
		IF ~сделано THEN
			в := ( i21eduRandom.Int( 1000000000 )  - 500000000 ) / 11
		END;
	END Вещ;

	PROCEDURE Цепочка* (OUT ц: ARRAY OF CHAR; VAR сделано: BOOLEAN);
	BEGIN
		In.String( ц );
		сделано := In.done;
		IF ~сделано THEN
			ц[0] := 0BFX; (* вопрос вверх ногами *)
			ц[1] := 0X;
		END;
	END Цепочка;

END i21eduВвод2.
i21edu/Mod/ВводПример1.odc

(* Ввод с циклом. См. замечания внизу после текста модуля *)

МОДУЛЬ i21eduВводПример1;
	ПОДКЛЮЧИТЬ  Вывод := i21eduВывод,  Ввод := i21eduВвод;
	
	ПЕРЕМЕННЫЕ  очередное, всего, сумма: ЦЕЛЫЕ;
		
НАЧАЛО
	(* пройдемся по данным, чтобы посчитать и сложить числа: *)
	всего := 0;  сумма := 0;
	
	Ввод.Открыть;  УБЕДИТЬСЯ( Ввод.сделано );
	Ввод.Цел( очередное );          (* здесь проверку делает цикл *)
	ПОКА Ввод.сделано ДЕЛАТЬ   (* охрана цикла: пускает внуть, если ДА/TRUE *)
		всего := всего + 1;
		сумма := сумма + очередное;
		Ввод.Цел( очередное );       (* очередная попытка чтения; после неё -- охрана *)
	КОНЕЦ;

	Вывод.НовСтрока;
	Вывод.Цепочка("Всего введено чисел: ");
	Вывод.Цел( всего ); 
	Вывод.НовСтрока;
	Вывод.Цепочка("Сумма: ");
	Вывод.Вещ( сумма ); 
	Вывод.НовСтрока;
	
	(* мы точно знаем, что уже прочли все числа *)
	(* теперь встанем на начало и прочитаем их ещё раз: *)
	Вывод.НовСтрока;
	Вывод.Цепочка("Пройдёмся по числам ещё раз с начала: ");
	Вывод.НовСтрока;

	Ввод.Сначала;  (* Вывод встал в начало *)  УБЕДИТЬСЯ( Ввод.сделано );
	Ввод.Цел( очередное );          (* здесь проверку делает цикл *)
	ПОКА Ввод.сделано ДЕЛАТЬ   (* охрана цикла: пускает внуть, если ДА/TRUE *)
		Вывод.Цел( очередное );
		Ввод.Цел( очередное );       (* очередная попытка чтения; после неё -- охрана *)
	КОНЕЦ;
	Вывод.НовСтрока;
	
	(* убедимся, что в ячейке памяти Ввод.сделано хранится значение НЕТ/FALSE *)
	Вывод.Логич( Ввод.сделано );
	Вывод.НовСтрока;
	
КОНЕЦ i21eduВводПример1.

Суть примера в том, что можно определять конец входных данных по значению логической переменной Ввод.сделано: если чтение дошло до конца входного потока, то очередная попытка чтения числа закончится неудачей и значение Ввод.сделано будет равно НЕТ/FALSE. И тогда охрана цикла (строка ПОКА), увидев это НЕТ, не пустит нас внутрь цикла, а отправит на его конец.

Теперь нужно выделить мышкой строку чисел, нажать Ctrl+F9 и посмотреть результат в Рабочем журнале:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16

Для упражнения: выделить мышкой цифры 21 в имени модуля и нажать Ctrl+F9.
i21edu/Mod/ВводПример2.odc

(* Ввод литерных цепочек и отдельных литер. См. замечания внизу после текста модуля *)

МОДУЛЬ i21eduВводПример2;
	ПОДКЛЮЧИТЬ  Вывод := i21eduВывод,  Ввод := i21eduВвод;
	
	ПЕРЕМЕННЫЕ  
		ц: МАССИВ 100 ИЗ ЛИТЕР;  (* массив для хранения литерных цепочек; в данном массиве могут храниться цепочки длиной не более 99  так как один элемент массива всегда нужен для хранения терминального символа 0X, отмечающего конец цепочки *)
		л: ЛИТЕРА;  (* отдельная литера *)
		
НАЧАЛО
	Вывод.НовСтрока;
	Вывод.Цепочка("***********************************");
	Вывод.НовСтрока;
	Вывод.Цепочка("Сначала потребуем прочессть цепочку целиком: "); 
	Вывод.НовСтрока;
	
	Ввод.Открыть;           УБЕДИТЬСЯ( Ввод.сделано );
	Ввод.Цепочка( ц );    УБЕДИТЬСЯ( Ввод.сделано );
	Вывод.Цепочка( ц );  Вывод.НовСтрока;

	Вывод.НовСтрока;
	Вывод.Цепочка("Теперь прочтём её по отдельным литерам и напечатаем их на отдельных строках: ");  
	Вывод.НовСтрока;

	Ввод.Сначала;  УБЕДИТЬСЯ( Ввод.сделано );
	Ввод.Литера( л );  
	ПОКА  Ввод.сделано  ДЕЛАТЬ
		Вывод.Литера( л );  Вывод.НовСтрока;
		Ввод.Литера( л );
	КОНЕЦ;

КОНЕЦ i21eduВводПример2.

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

Выделить мышкой красное слово и нажать Ctrl+F9.

Выделить мышкой зелёный фрагмент (включая вопросительный знак) и нажать Ctrl+F9:
    что?
Обратить внимание: когда сначала считывается цепочка целиком, вопросительный знак не считывается. Теперь выделить то же самое, но вместе с кавычками, и нажать Ctrl+F9:
    "что?"
Теперь вопросительный знак  часть цепочки и воспроизвёлся уже при первом её счтитывании.

Выделить мышкой синий фрагмент (включая обе кавычки) и нажать Ctrl+F9:
 "два слова  одна цепочка" 
Обратить внимание, что в Рабочем журнале кавычки не напечатаются.

Выделить мышкой любой из цветных фрагментов и нажать Ctrl+F9
(в синем фрагменте нужно выделить обе кавычки, в зелёном  выделить слово вмессте с вопросительным знаком):

Выделить мышкой любой из цветных фрагментов и нажать Ctrl+F9

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

Вот ещё фрагменты для упражнений:
  "одинарная кавычка ' внутри цепочки"
  'можно использовать и одинарные кавычки'
  'а внутри двойную: " -'