ADru/Mod/S13.odc

(*  Общие сведения о примерах: Справка *)
(*  Исправления и подготовка примеров: (С) Ф.В.Ткачев, 2009, info21 AT inr.ac.ru *)

(*  В таких скобках со звездочками -- комментарии, они могут быть (*вложены,*) компилятор их игнорирует. Цвет компилятору не важен. Этим цветом оформляем комментарии и инструкции ASSERT, которые похожи на комментарии, ибо сообщают о предусловиях, инвариантах и т.п.
Первая инструкция исходника модуля  его заголовок  начинается ниже с ключевого слова MODULE, после которого стоит имя модуля. 
Завершается модуль строкой со словом END, после которого повторяется это имя. 
О вызове программ -- см. после текста модуля. *)

MODULE  ADruS13;  (* Примеры из раздела 1.3. *)
(* Соответствующий программный фрагмент в книге отмечен комментарием с именем модуля в первой строке примера справа, в данном случае такой комментарий имеет вид (* ADruS13 *).
В книге для краткости опущена сантехника, необходимая для полноценной работы примеров. 
В частности, нужна инструкция импорта, позволяющая использовать средства, экспортированные из других, в данном случае вывод в рабочий журал (Log) и ввод из текста: *)

	IMPORT  Log := StdLog,  In := i21sysIn;  (* можно вводить сокращения имен *)
	
	PROCEDURE Power*; (* возведение в степень из раздела 1.3.2 *)
		VAR  x0, x, y: REAL;  i, n: INTEGER;
	BEGIN
		(* ввод данных из входного потока (стоят после коммандера, см. в конце документа) *)
		In.Open;	ASSERT( In.done );
		In.Real( x0 );	ASSERT( In.done );
		In.Int( n );	ASSERT( In.done & ( n >= 0 ) );
		x := x0;  
		(* фрагмент из книги, с.24: *************************************)
		y := 1.0;  i := n;
		WHILE  i > 0  DO   (* x0n  =  xi * y *)
			IF  ODD(i)  THEN  y := y*x  END;
			x := x*x;  i := i DIV 2
		END;
		(* конец фрагмента *******************************************)
		
		(* вывод данных в рабочий журнал *)
		Log.Real( x0 );  Log.Int( n );  Log.Real( y );  Log.Ln;
	END Power;
	
END  ADruS13.   << Эта точка завершает текст модуля. 
Все, что стоит дальше, компилятор игнорирует,  здесь чулан. 
Поэтому не нужно ничего оформлять комментариями. 
И это всё могло бы храниться в другом документе.

Для выполнения процедуры Power кликнуть по черному коммандеру (Commander), результат будет виден в рабочем журнале (окошко Log; чтобы открыть, выполнить команду меню Info, Open Log) :

ADruS13.Power -3.12914  5 

Числа после имени процедуры  поток ввода, его читают инструкции, начинающиеся с In.  In.Open и т.д.
Второе число должно быть целым, без точки, т.к. процедура In.Int умеет читать только целые числа. (Однако есть и средства сканировать ввод и определять, что там стоит.)
Поток ввода служит функциональной заменой ввода данных с командной строки  но у нас здесь всё гораздо удобней (см. о мощной парадигме тексткакинтерфейс).

Черный треугольничек  после чисел ограничивает поток ввода, если поток не выделен мышкой.
Коммандер  вставляется с помощью Ctrl+Q, треугольничек   с помощью Ctrl+Shift+Q.
Для изменения входных данных нужно обычным образом поменять числа  при новом клике по коммандеру прочтутся новые данные.
Можно указать вводимые данные, выделяя их мышкой: например, можно выделить мышкой любую пару ниже (или написать свои)  и кликать по тому же коммандеру:

	2   8

	3.1415    7

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

А еще можно печатать в Log  и брать данные оттуда (обычным копированием) и снова использовать их в качестве ввода для других команд. Очень удобно и производительно.