hodza/BlackBox.Shkola.2014 huggingface dataset:
ADru/Mod/S37_OptSelection.odc

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

MODULE  ADruS37_OptSelection;  (* Задача об оптимальном выборе, раздел 3.7. *)
	IMPORT  Log := StdLog,  In := i21sysIn,  Math;

	CONST n = 10;
	
	(* фрагмент из текста, с.163: ***********************************)
	TYPE Object = RECORD value, weight: INTEGER END;
	VAR a: ARRAY n OF Object;
		limw, totv, maxv: INTEGER;
		s, opts: SET;
	
	PROCEDURE LogResult; (* процедура добавлена для печати результатов *)
		VAR  i: INTEGER;
	BEGIN
		FOR  i := 0  TO  n - 1  DO
			Log.Tab;
			IF  i IN opts  THEN  Log.Char('*')  END;
		END;
		Log.Tab;  Log.Int( maxv );  Log.Ln
	END LogResult;
	
	PROCEDURE Try ( i, tw, av: INTEGER ); (* более чистая обработка окончания по сравнению с вариантом в книге *)
		VAR  tw1, av1: INTEGER;
	BEGIN
		IF  i = n  THEN
			ASSERT( tw <= limw );
			(* av = ценность s *)
			IF  av > maxv  THEN
				maxv := av;  opts := s
			END
		ELSE
			(*проверка включения*)
			tw1 := tw + a[ i ].weight; 
			IF  tw1 <= limw  THEN
				s := s + { i };
				Try( i+1, tw1, av );
				s := s - { i }
			END;
			(*проверка исключения*)
			av1 := av - a[ i ].value; 
			IF  av1 > maxv  THEN
				Try( i+1, tw, av1 )
			END
		END;
	END Try;
	
	PROCEDURE Selection ( weightInc, weightLimit: INTEGER );
		VAR  i: INTEGER;
	BEGIN
		limw := 0;
		REPEAT
			limw := limw + weightInc;
			s := {};  opts := {};  maxv := 0;
			Try( 0, 0, totv );
			LogResult;
		UNTIL  limw >= weightLimit
	END Selection;
	(* конец фрагмента *******************************************)
	
	PROCEDURE  Do*; (* команда для вызова *)
		VAR  i, x: INTEGER;
	BEGIN
		In.Open;  ASSERT( In.done );
		FOR  i := 0  TO  n - 1  DO
			In.Int( x );  ASSERT( In.done );
			a[ i ].weight := x;
		END;
		totv := 0;
		FOR  i := 0  TO  n - 1  DO
			In.Int( x );  ASSERT( In.done );
			a[ i ].value := x;
			totv := totv + x
		END;
		
		Selection( 10, 120 )
	END Do;

END ADruS37_OptSelection.


Для вызова кликнуть по черному командиру:

ADruS37_OptSelection.Do
10	11	12	13	14	15	16	17	18	19
18	20	17	19	25	21	27	23	25	24


Для форматирования таблички в рабочем журнале перед выдачей вставить линейку (Ctrl+J) и наставить в ней позиций табуляции, кликая мышкой в нужных местах.
Чтобы спрятать/показать линейку (вместе с серыми прямоугольниками -- это символы табуляции), нажимать Ctrl+H.
Стереть/копировать ее можно как букву.

См. модуль TextRulers, линейки, .
ADru/Mod/S432_List.odc

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

MODULE  ADruS432_List;  (* Простейшая процедура поиска с включением в линейный список (алфавитный частотный словарь), раздел 4.3.2. *)

	IMPORT  Log := StdLog,  In := i21sysIn,  Math,  Texts := ADruS174_Texts;
	
	(* фрагмент из текста, с.180: **********************)
	TYPE
		Word = POINTER TO RECORD
			key, count: INTEGER;  next: Word  
		END;

	VAR  W: Texts.Writer;  root: Word;
	
	PROCEDURE search ( x: INTEGER;  VAR root: Word );
		VAR  w: Word;
	BEGIN
		w := root;
		WHILE (w # NIL) & (w.key # x) DO  w := w.next  END;
		(* (w = NIL) OR (w.key = x) *)
		IF  w = NIL  THEN  (* новый элемент *)
			w := root;
			NEW( root );  root.key := x;  root.count := 1;  root.next := w
		ELSE
			INC( w.count )
		END
	END search;

	PROCEDURE PrintList ( w: Word );
	BEGIN
		(* используется глобальный объект записи W *)
		(* простой проход по списку: *)
		WHILE  w # NIL  DO
			Texts.WriteInt( W, w.key, 8 );  Texts.WriteInt( W, w.count, 8 ); 
			Texts.WriteLn( W );
			w := w.next
		END
	END PrintList;
	(* конец фрагмента ********************************)
	
	PROCEDURE Do*;
		VAR  n: INTEGER;
	BEGIN
		Texts.OpenWriter( W, Texts.log, Texts.Length( Texts.log ) );
		
		(* читаем и обрабатываем поток чисел: *)
		In.Open; ASSERT( In.done );
		In.Int( n );
		WHILE  In.done  DO
			search( n, root ); 
			In.Int( n )
		END;
		PrintList( root );
	END Do;
	
END  ADruS432_List.

ADruS432_List.Do 4 6 6 9  2 4 1 1 1 0 1 0 1
ADru/Mod/S432_List2.odc

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

MODULE  ADruS432_List2;  (* Процедура поиска с включением в линейный список, вариант с использованием барьера, раздел 4.3.2. 
Модификации по сравнению с простейшим вариантом показаны красным. *)

	IMPORT  Log := StdLog,  In := i21sysIn,  Math,  Texts := ADruS174_Texts;
	
	TYPE
		Word = POINTER TO RECORD
			key, count: INTEGER;  next: Word  
		END;

	VAR  W: Texts.Writer;  root, sentinel: Word;
	
	(* фрагмент из книги, с.180: ******************************)
	PROCEDURE search ( x: INTEGER;  VAR root: Word );
		VAR  w: Word;
	BEGIN
		w := root;  sentinel.key := x;
		WHILE w.key # x DO  w := w.next  END;
		(* (w = NIL) OR (w.key = x) *)
		IF  w = sentinel  THEN  (* новый элемент *)
			w := root;
			NEW( root );  root.key := x;  root.count := 1;  root.next := w
		ELSE
			INC( w.count )
		END
	END search;
	(* конец фрагмента **************************************)
	
	PROCEDURE PrintList ( w: Word );
	BEGIN
		(* используется глобальный объект записи W *)
		(* простой проход по списку: *)
		WHILE  w # sentinel  DO
			Texts.WriteInt( W, w.key, 8 );  Texts.WriteInt( W, w.count, 8 ); 
			Texts.WriteLn( W );
			w := w.next
		END
	END PrintList;
	
	PROCEDURE Do*;
		VAR  n: INTEGER;
	BEGIN
		NEW( sentinel );  root := sentinel;
		
		Texts.OpenWriter( W, Texts.log, Texts.Length( Texts.log ) );
		
		(* читаем и обрабатываем поток чисел: *)
		In.Open; ASSERT( In.done );
		In.Int( n );
		WHILE  In.done  DO
			search( n, root ); 
			In.Int( n )
		END;
		PrintList( root );
	END Do;
	
END  ADruS432_List2.

ADruS432_List2.Do 4 6 6 9  2 4 1 1 1 0 1 0 1
ADru/Mod/S432_List3.odc

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

MODULE  ADruS432_List3;  (* Процедура поиска с включением в упорядоченный линейный список, раздел 4.3.2. *)

	IMPORT  Log := StdLog,  In := i21sysIn,  Math,  Texts := ADruS174_Texts;
	
	TYPE
		Word = POINTER TO RECORD
			key, count: INTEGER;  next: Word  
		END;

	VAR  W: Texts.Writer;  root: Word;
	
	(* фрагмент из книги, с.182: **********************************)
	PROCEDURE search ( x: INTEGER;  VAR root: Word );
		VAR  w1, w2, w3: Word;
	BEGIN
		w2 := root;  w1 := w2.next;
		WHILE (w1 # NIL) & (w1.key < x) DO
			w2 := w1;  w1 := w2.next
		END;
		(* (w1 = NIL) OR (w1.key >= x) *)
		IF  (w1 = NIL) OR (w1.key > x)  THEN  (* новый элемент *)
			NEW( w3 );  w2.next := w3;
			w3.key := x;  w3.count := 1;  w3.next := w1
		ELSE
			INC( w1.count )
		END
	END search;
	(* конец фрагмента ******************************************)

	PROCEDURE PrintList ( w: Word );
	BEGIN
		(* используется глобальный объект записи W *)
		(* простой проход по списку: *)
		WHILE  w # NIL  DO
			Texts.WriteInt( W, w.key, 8 );  Texts.WriteInt( W, w.count, 8 ); 
			Texts.WriteLn( W );
			w := w.next
		END
	END PrintList;
	
	PROCEDURE Do*;
		VAR  n: INTEGER;
	BEGIN
		NEW( root );  root.next := NIL;
		
		Texts.OpenWriter( W, Texts.log, Texts.Length( Texts.log ) );
		
		(* читаем и обрабатываем поток чисел: *)
		In.Open; ASSERT( In.done );
		In.Int( n );
		WHILE  In.done  DO
			search( n, root ); 
			In.Int( n )
		END;
		PrintList( root.next );
	END Do;
	
END  ADruS432_List3.

ADruS432_List3.Do 4 6 6 9  2 4 1 1 1 0 1 0 1
ADru/Mod/S432_List4.odc

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

MODULE  ADruS432_List4;  (* Процедура поиска с включением в линейный список с переупорядочением, раздел 4.3.2. *)

	IMPORT  Log := StdLog,  In := i21sysIn,  Math,  Texts := ADruS174_Texts;
	
	TYPE
		Word = POINTER TO RECORD
			key, count: INTEGER;  next: Word  
		END;

	VAR  W: Texts.Writer;  root, sentinel: Word;
	
	(* фрагмент из книги, с.183: **********************************)	

	PROCEDURE search ( x: INTEGER;  VAR root: Word );
		VAR  w1, w2: Word;
	BEGIN
		w1 := root;  sentinel.key := x;
		IF  w1 = sentinel  THEN  (* первый элемент *)
			NEW( root );  root.key := x;  root.count := 1;  root.next := sentinel
		ELSIF  w1.key = x  THEN
			INC( w1.count )
		ELSE  (* поиск *)
			REPEAT  w2 := w1;  w1 := w2.next
			UNTIL w1.key = x;
			IF w1 = sentinel THEN  (* новый элемент *)
				w2 := root;
				NEW( root );  root.key := x;  root.count := 1;  root.next := w2
			ELSE  (* нашли, переупорядочиваем *)
				INC( w1.count );
				w2.next := w1.next;  w1.next := root;  root := w1
			END
		END
	END search;		(* конец фрагмента *******************************************)

	PROCEDURE PrintList ( w: Word );
	BEGIN
		(* используется глобальный объект записи W *)
		(* простой проход по списку: *)
		WHILE  w # sentinel  DO
			Texts.WriteInt( W, w.key, 8 );  Texts.WriteInt( W, w.count, 8 ); 
			Texts.WriteLn( W );
			w := w.next
		END
	END PrintList;
	
	PROCEDURE Do*;
		VAR  n: INTEGER;
	BEGIN
		NEW( sentinel );  root := sentinel;
		
		Texts.OpenWriter( W, Texts.log, Texts.Length( Texts.log ) );
		
		(* читаем и обрабатываем поток чисел: *)
		In.Open; ASSERT( In.done );
		In.Int( n );
		WHILE  In.done  DO
			search( n, root ); 
			In.Int( n )
		END;
		PrintList( root );
	END Do;
	
END  ADruS432_List4.

ADruS432_List4.Do 4 6 6 9  2 4 1 1 1 0 1 0 1
ADru/Mod/S433_TopSort.odc

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

MODULE  ADruS433_TopSort;  (* Топологическая сортировка, раздел 4.3.3. *)
	IMPORT  Log := StdLog,  In := i21sysIn,  Texts := ADruS174_Texts;

	TYPE  (* определения типов, с.187 *******************)
		Leader = POINTER TO LeaderDesc;
		Trailer = POINTER TO TrailerDesc;
		LeaderDesc = RECORD
			key, count: INTEGER;
			trail: Trailer;
			next: Leader
		END;
		TrailerDesc = RECORD
			id: Leader;
			next: Trailer
		END;
	
	VAR  W: Texts.Writer;
	
	(* фрагмент из книги, с.189: **********************************)
	VAR  head, tail: Leader;  n: INTEGER;

	PROCEDURE find ( w: INTEGER ): Leader;
		VAR  h: Leader;
	BEGIN
		h := head;  tail.key := w;  (* барьер *)
		WHILE  h.key # w  DO  h := h.next  END;
		IF  h = tail  THEN
			NEW( tail );  INC( n );
			h.count := 0;  h.trail := NIL;  h.next := tail
		END;
		RETURN  h
	END find;

	PROCEDURE TopSort ( VAR S: Texts.Scanner );
		VAR p, q: Leader;  t: Trailer;  (* используется глобальный объект записи W *)
			x, y: INTEGER;
	BEGIN
		(* инициализировать список ведущих фиктивным элементом-барьером *)
		NEW( head );  tail := head;  n := 0;
		
		(* фаза ввода *)
		Texts.Scan( S );
		WHILE  S.class = Texts.Int  DO
			x := S.i;  Texts.Scan( S );  y := S.i;  p := find( x );  q := find( y );
			NEW(t);  t.id := q;  t.next := p.trail;
			p.trail := t;  INC( q.count );  Texts.Scan( S )
		END;
		
		(* поиск ведущих без предшественников *)
		p := head;  head := NIL;
		WHILE  p # tail  DO
			q := p;  p := q.next;
			IF  q.count = 0  THEN  (* включить q в новую цепочку *)
				q.next := head; head := q
			END
		END;

		(* фаза вывода *) 
		q := head;
		WHILE  q # NIL  DO
			Texts.WriteLn( W );  Texts.WriteInt( W, q.key, 8 );  DEC( n );
			t := q.trail;  q := q.next;
			WHILE  t # NIL  DO
				p := t.id;  DEC( p.count );
				IF  p.count = 0  THEN  (* включить p в список ведущих *)
					p.next := q; q := p
				END;
				t := t.next
			END
		END;
		IF  n # 0  THEN
			Texts.WriteString( W, "Набор не является частично упорядоченным" )
		END;
		Texts.WriteLn( W )
	END TopSort;
	(* конец фрагмента **********************************)
	
	PROCEDURE Do*;
		VAR  S: Texts.Scanner;
	BEGIN
		Texts.OpenInput;
		Texts.OpenWriter( W, Texts.log, Texts.Length( Texts.log ) );
		Texts.WriteString( W, 'TopSort' );  Texts.WriteLn( W );
		Texts.OpenScanner( S, Texts.input, 0 );  (* читается тот же текст, что и при In.Open *)
		
		TopSort( S );
	END Do;

END  ADruS433_TopSort.


ADruS433_TopSort.Do 	1  2	2  4	4  6	2  10	4  8	6  3	1  3  
	3  5	5  8	7  5	7  9	9  4	9  10
ADru/Mod/S441_BalancedTree.odc

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

MODULE  ADruS441_BalancedTree;  (* Построение идеально сбалансированного дерева, раздел 4.4.1. *)

	IMPORT  Log := StdLog,  In := i21sysIn,  Texts := ADruS174_Texts;
	
	(* фрагмент из книги, с.196: ******************************)
	TYPE
		Node = POINTER TO RECORD
			key: INTEGER;
			left, right: Node          
		END;
	
	VAR  R: Texts.Reader;  W: Texts.Writer;  root: Node;

	PROCEDURE Tree ( n: INTEGER ): Node;
		VAR  new: Node;
			x, nl, nr: INTEGER;
	BEGIN
		(* построить идеально сбалансированное дерево с n узлами *)
		IF  n = 0  THEN
			new := NIL
		ELSE
			nl := n DIV 2;  nr := n-nl-1;
			NEW( new );  Texts.ReadInt( R, x );
			new.key := x;  new.left := Tree( nl );  new.right := Tree( nr )
		END;
		RETURN new 
	END Tree;

	PROCEDURE PrintTree ( t: Node;  h: INTEGER );
		VAR  i: INTEGER;
	BEGIN
		(* распечатать дерево t с h отступами *)
		IF  t # NIL  THEN
			PrintTree( t.left, h+1 );
			FOR  i := 1  TO  h  DO  Texts.WriteTab( W )  END;
			Texts.WriteInt( W, t.key, 3 );  Texts.WriteLn( W );
			PrintTree( t.right, h+1 )
		END
	END PrintTree;
	(* конец фрагмента **************************************)
	
	PROCEDURE Do*;
		VAR  root: Node;
	BEGIN
		(* приготовление ввода-вывода: *)
		Texts.OpenWriter( W, Texts.log, Texts.Length( Texts.log ) );
		(* будем читать из входного потока после командира 
			(точнее, из потока, определяемого по правилам i21sysIn) *)
		Texts.OpenInput;  Texts.OpenReader( R, Texts.input, 0 );
		
		(* собственно вычисления: *)
		root := Tree( 21 );
		PrintTree( root, 0 );
	END Do;
	
END  ADruS441_BalancedTree.

ADruS441_BalancedTree.Do 8  9  11  15  19  20  21  7  3  2  1  5  6  4  13  14  10  12  17  16  18
ADru/Mod/S444_Deletion.odc

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

MODULE  ADruS444_Deletion;  (* Удаление ключа из дерева, раздел 4.4.4. *)

	IMPORT  Log := StdLog,  In := i21sysIn,  Texts := ADruS174_Texts;
	
	TYPE
		Node = POINTER TO RECORD
			key, count: INTEGER;
			left, right: Node
		END;
	
	VAR  S: Texts.Scanner;  W: Texts.Writer;
		root: Node;  (* дерево, которое строится *)
	
	PROCEDURE PrintTree ( t: Node;  h: INTEGER);
		VAR  i: INTEGER;
	BEGIN
		(* распечатать дерево t с h отступами *)  
		IF  t # NIL  THEN     
			PrintTree( t.left, h+1 );
			FOR  i := 1  TO  h  DO
				Texts.WriteTab( W )
			END;
			Texts.WriteInt( W, t.key, 6 );  Texts.WriteLn( W );
			PrintTree( t.right, h+1 )
		END
	END PrintTree;

	PROCEDURE search ( x: INTEGER;  VAR p: Node );
	BEGIN      
		IF p = NIL THEN (* x в дереве нет; вставить *) 
			NEW( p );  p.key := x;   p.count := 1;   p.left := NIL;   p.right := NIL      
		ELSIF  x < p.key  THEN  search( x, p.left )
		ELSIF  x > p.key  THEN  search( x, p.right )
		ELSE  INC( p.count )
		END
	END search;
	
	(* то, что выше, взято из ADruS443_Tree *)

	(* фрагмент из книги, с.206: *************************************)
	PROCEDURE delete ( x: INTEGER;  VAR p: Node );
		PROCEDURE del ( VAR r: Node );
		BEGIN
			IF  r.right # NIL  THEN  del( r.right )      
			ELSE
				p.key := r.key;  p.count := r.count;             
				r := r.left 
			END
		END del;
	BEGIN (* удалить *)
		IF  p = NIL  THEN  (* слова в дереве нет, удалять нечего *)
		ELSIF  x < p.key  THEN  delete( x, p.left )
		ELSIF  x > p.key  THEN  delete( x, p.right )
		(* в каждой из трёх веток удалить p^: *)
		ELSIF  p.right = NIL  THEN  p := p.left
		ELSIF  p.left   = NIL  THEN  p := p.right
		ELSE  del( p.left )
		END
	END delete;
	(* конец фрагмента *******************************************)
	
	PROCEDURE Build*; (* Tree443.Do, переназвано *)
	BEGIN
		root := NIL;
		(* будем читать из входного потока после командира 
			(точнее, из потока, определяемого по правилам i21sysIn) *)
		Texts.OpenInput;  Texts.OpenScanner( S, Texts.input, 0 );
		
		(* собственно вычисления: *)
		Texts.Scan( S );
		WHILE  S.class = Texts.Int  DO
			search( S.i, root );
			Texts.Scan( S );
		END;
		
		Texts.OpenWriter( W, Texts.log, Texts.Length( Texts.log ) );
		PrintTree( root, 0 );
	END Build;
	
	PROCEDURE Delete*;
	BEGIN
		Texts.OpenWriter( W, Texts.log, Texts.Length( Texts.log ) );
		Texts.OpenInput;  Texts.OpenScanner( S, Texts.input, 0 );
		
		Texts.Scan( S );
		WHILE  S.class = Texts.Int  DO
			delete( S.i, root );
			PrintTree( root, 0 );
			Texts.Scan( S );
		END;
	END Delete;
	
END  ADruS444_Deletion.

Данные для воспроизведения картинок на рис. 4.28.
Клик по первому командиру строит дерево из чисел, показанных зеленым.
Клик по второму удаляет числа, показанные красным.

ADruS444_Deletion.Build 10 5 3 8 15 13 18 
ADruS444_Deletion.Delete 13 15 5 10 

Интересный случай:
ADruS444_Deletion.Build   10 5 3 8 7 12  
ADruS444_Deletion.Delete  10
ADru/Mod/S48_PrioritySearchTrees.odc

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

MODULE  ADruS48_PrioritySearchTrees;  (* Приоритетные деревья поиска, раздел 4.8. *)

	IMPORT  Log := StdLog,  In := i21sysIn,  Texts := ADruS174_Texts;
	
	CONST  min = 0;  max = 1000;
	
	TYPE  (* определение типа, с.249 *)
		Node = POINTER TO RECORD
			x, y: INTEGER;
			left, right: Node
		END;
		
	VAR  root: Node;
	
	PROCEDURE report ( x, y: INTEGER );
	BEGIN
		Log.Int( x );  Log.Int( y );  Log.Ln;
	END report;
	
	(* фрагмент из книги, с.249: ************************************)
	PROCEDURE insert (VAR p: Node;  X, Y, xL, xR: INTEGER );
		VAR  xm, t: INTEGER;
	BEGIN
		IF  p = NIL  THEN (* нет в дереве, вставить *)
			NEW( p );  p.x := X;  p.y := Y;  p.left := NIL;  p.right := NIL
		ELSIF  p.x = X  THEN (* найден; не вставлять *) 
		ELSE
			IF  p.y > Y  THEN
				t := p.x;  p.x := X;  X := t;
				t := p.y;  p.y := Y;  Y := t
			END;
			xm := ( xL + xR ) DIV 2;
			IF  X < xm  THEN  insert ( p.left,   X, Y, xL, xm )
			ELSE                    insert ( p.right, X, Y, xm, xR )
			END
		END
	END insert;
	(* конец фрагмента ****************************************)

	(* фрагмент из книги, с.250: *********************************)
	PROCEDURE enumerate ( p: Node;  x0, x1, y1, xL, xR: INTEGER );
		VAR  xm: INTEGER;
	BEGIN
		IF  p # NIL  THEN
			IF ( p.y <= y1 ) & ( x0 <= p.x ) & ( p.x < x1 ) THEN
				report( p.x, p.y )
			END;
			xm := ( xL + xR ) DIV 2;
			IF  x0 < xm  THEN  enumerate ( p.left,   x0, x1, y1, xL, xm )  END;
			IF  xm < x1  THEN  enumerate ( p.right, x0, x1, y1, xm, xR )  END
		END
	END enumerate;
	(* конец фрагмента ****************************************)
	
	PROCEDURE Create*;
		VAR  x, y: INTEGER;
	BEGIN
		In.Open;  In.Int( x );
		WHILE  In.done  DO
			In.Int( y );         Log.Tab;  Log.Int( x );  Log.Tab;  Log.Int( y );  Log.Ln;
			insert( root, x, y, min, max );
			In.Int( x );
		END;
		
	END Create;
	
	PROCEDURE List*;
		VAR  x0, x1, y1: INTEGER;
	BEGIN
		In.Open;  In.Int( x0 );  In.Int( x1 );  In.Int( y1 );
		enumerate( root, x0, x1, y1, min, max ) 
	END List;
END  ADruS48_PrioritySearchTrees.


ADruS48_PrioritySearchTrees.Create
	1	100
	10	999
	230	87
	23	876
	999	8754
	888	1
	99	88
	111	111


ADruS48_PrioritySearchTrees.List  10 200 200
Comm/Docu/ObxStreamsClient.odc

CommObxStreamsClient

DEFINITION CommObxStreamsClient;

	PROCEDURE SendTextSelection;

END CommObxStreamsClient.


This module acts as a client for CommObxStreamsServer. The command sends the current text selection to the server, which opens it in a new TextView. The server is expected to run on the same machine and to be started first. It may, however, run in a BlackBox process separate from the one in which the client runs.

Try (after starting the server and selecting some text):
 CommObxStreamsClient.SendTextSelection

PROCEDURE SendTextSelection
Sends a text selection to the server.

opensource
Comm/Docu/ObxStreamsServer.odc

CommObxStreamsServer

DEFINITION CommObxStreamsServer;

	PROCEDURE Start;
	PROCEDURE Stop;

END CommObxStreamsServer.


This module provides an example of how to program a server using CommStreams. A sample client is provided by the module CommObxStreamsClient.

The server waits for a connect. Whenever a client requests a new connection a separate TextView is opened by the server and everything received through this connection is displayed in the TextView.

Per machine only one server is permitted to run at a time.

Try - to start / stop the server:
 CommObxStreamsServer.Start
 CommObxStreamsServer.Stop


PROCEDURE Start
Starts the server.

PROCEDURE Stop
Stops the server.

opensource
Comm/Docu/TCP.odc

CommTCP

Driver for CommStreams.
It implements TCP/IP streams, using the operating system's sockets interface. It provides the NewListener and NewStream factory functions as needed for CommStreams. Do not import CommTCP directly; instead, use CommStreams and specify "CommTCP" as the protocol name.

Parameters localAdr and remoteAdr:
The CommStreams procedures NewStream and NewListener feature string parameters remoteAdr and localAdr. The interpretation of the strings passed depends on the implementation of the actual driver module. For CommTCP the following holds.

The remoteAdr (only used with NewStream) must be either an IP address or a host's name, followed by a colon (":") and a port number. (Examples: "127.0.0.1:2", "loopback:2".)

The parameter localAdr identifies the port on which a listener is established (NewListener) or from which a remote connection is attempted (NewStream). Valid values are
-	an empty string
-	an IP address or a host's name (Examples: "127.0.0.1", "loopback")
-	an IP address or a host's name followed by a colon (":") and a port number
(Examples: "127.0.0.1:2", "loopback:2")
-	a port number (Example: "2")
For unspecified parts, IP addresses / host's names or port numbers respectively, a wildcard is used, directing the operating system to choose freely. If in a call to NewListener neither IP address nor host name is specified for localAdr, the listener will check on all IP numbers available on the local machine.
Note: Certain operating systems (e.g. Microsoft Windows Server 2003) do not accept an empty string or just a port number as valid values for localAdr. Use the values "0.0.0.0:0" or "0.0.0.0:<port number>" (e.g. "0.0.0.0:2") instead.
Comm/Docu/ru/ObxStreamsClient.odc

CommObxStreamsClient
(C) Перевод на русский язык: Чернышов Л.Н., 2005.
(с) Редакция перевода: Ф.В.Ткачев, 2009-10-04; 2012-09-17

DEFINITION CommObxStreamsClient;

	PROCEDURE SendTextSelection;

END CommObxStreamsClient.

Этот модуль является клиентом для CommObxStreamsServer. Команда посылает выделенный текст серверу, который открывает его в новом текстовом окне (TextView). Ожидается, что сервер будет запущен на той же самой машине, причем до клиента. Однако он может работать в другой копии Блэкбокса.

Попробуйте выполнить (после запуска сервера и выделив какой-нибудь фрагмент текста):
 CommObxStreamsClient.SendTextSelection

PROCEDURE SendTextSelection
Отсылает выделенный текст серверу.

открытьисходник
Comm/Docu/ru/ObxStreamsServer.odc

CommObxStreamsServer
(C) Перевод на русский язык: Чернышов Л.Н., 2005.
(с) Редакция перевода: Ф.В.Ткачев, 2009-10-04

DEFINITION CommObxStreamsServer;

	PROCEDURE Start;
	PROCEDURE Stop;

END CommObxStreamsServer.

Этот модуль дает пример того, как программируется сервер, использующий CommStreams. Простой пример реализации клиента дан в модуле CommObxStreamsClient.

Сервер ожидает соединения. Всякий раз, когда подключается новый клиент, на сервере открывается отдельный TextView, и все, полученное через это соединение, отображается в TextView.

На машине можно одновременно запустить только один сервер.

Попытайтесь запустить / остановить сервер:
 CommObxStreamsServer.Start
 CommObxStreamsServer.Stop


PROCEDURE Start
Запустить сервер.

PROCEDURE Stop
Остановить сервер.

opensource