Комментарии 5
Небольших поясняющих примеров кода в статье очень не хватает.
+4
НЛО прилетело и опубликовало эту надпись здесь
Пример с ELSIF и ( см."VAR j") объявлением переменной "по месту" в стиле Ada ( это же с WITH в примере с Heapsort) :
PROCEDURE GetData (alg: T) RAISES {Thread.Alerted} =
VAR
rand := NEW (Random.Default).init ();
BEGIN
WITH a = alg.a, N = alg.N, input = alg.data DO
N := FormsVBT.GetInteger(input, "data");
IF FormsVBT.GetBoolean(input, "increasing") THEN
FOR i := 1 TO N DO a[i] := i; END;
ELSIF FormsVBT.GetBoolean(input, "decreasing") THEN
FOR i := 1 TO N DO a[i] := N - i + 1; END;
ELSE
FOR i := 1 TO N DO alg.a[i] := i; END;
FOR i := N TO 2 BY -1 DO
VAR j := rand.integer (1, i); t := a[i];
BEGIN a[i] := a[j]; a[j] := t; END;
END;
END;
a[0] := 0;
a[N + 1] := N + 1;
SortIE.Init(alg, N, alg.passes());
FOR i := 1 TO N DO SortIE.SetVal(alg, i, a[i]); END;
END
END GetData;
Вложенные процедуры, LOOP + EXIT, FOR с "STEP -1", исключения ( RAISES):
(***************************** Heapsort *****************************)
PROCEDURE HeapNew (): Algorithm.T =
BEGIN
RETURN NEW(
HeapSort,
defaultN := 400,
data := ZeusPanel.NewForm("SortData.fv")).init()
END HeapNew;
PROCEDURE HeapPasses (alg: HeapSort): CARDINAL =
BEGIN
RETURN alg.N + alg.N DIV 2
END HeapPasses;
PROCEDURE HeapRun (alg: HeapSort) RAISES {Thread.Alerted} =
VAR H: INTEGER;
PROCEDURE SiftDown (k: CARDINAL) RAISES {Thread.Alerted} =
VAR j: CARDINAL; v: Sort.Key;
BEGIN
WITH a = alg.a DO
v := a[k];
LOOP
IF (k > H DIV 2) THEN EXIT; END;
j := k + k;
IF (j < H) THEN
IF a[j] < a[j + 1] THEN j := j + 1; END;
END;
IF v >= a[j] THEN EXIT; END;
SetVal(alg, k, a[j]);
k := j;
END;
SetVal(alg, k, v);
END
END SiftDown;
BEGIN
GetData (alg);
WITH N = alg.N DO
H := N;
FOR k := N DIV 2 TO 1 BY -1 DO
SortIE.StartPass(alg);
SiftDown(k);
END;
ZeusPanel.Pause(alg, "Heap made; ready to sort...");
FOR k := N TO 2 BY -1 DO
SortIE.StartPass(alg);
SwapElts(alg, 1, H);
H := H - 1;
SiftDown(1);
END;
END
END HeapRun;
+1
Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.
Modula-3 — Исторический контекст