i := 1;
WHILE ~(i > Last) & ~(Found(haystack[i], Needle)) DO
i := i + 1
END;
IF ~(i > Last) THEN
Out.String("found :-)");
ELSE
Out.String("not found :-(");
END;
也就是说,在伪代码中:
установка_начала_цикла();
ПОКА НЕ (конец_цикла()) И НЕ (найден_элемент()) ЦИКЛ
следующая_ступень_цикла();
КОНЕЦ;
ЕСЛИ НЕ (конец_цикла()) ТО
элемент_найден();
ИНАЧЕ
элемент_не_найден();
КОНЕЦ;
MODULE Ex;
IMPORT Out;
PROCEDURE Example*;
VAR m: ARRAY 100 OF INTEGER;
i: INTEGER; (*бегунок по массиву*)
x: INTEGER; (*что ищем*)
BEGIN
(*Сначала как-то заполняется массив и x: *)
m[6] := 23;
x := 23;
(*Затем ищем x в m: *)
i := 0;
WHILE (i # LEN(m)) & (m[i] # x) DO INC(i) END;
(*после того, как цикл закончится,
либо i будет равен LEN(m),
либо m[i] будет равен x *)
IF i # LEN(m) THEN
(*фокус в том, что здесь непременно m[i] = x*)
Out.String("Нашли x на позиции ");
Out.Int(i, 0)
ELSE
Out.String("x не найден")
END;
Out.Ln
END Example;
BEGIN
Example
END Ex.
(取自OberonCore.Ru)。
使用以下结构:
也就是说,在伪代码中:
消除多个非结构转换的决定是正确的。除了极少数例外,这甚至会对性能产生不良影响,更不用说逻辑了。可以在 Knuth 中找到何时可以通过非结构转换更快地完成此操作的示例。但我仍然宁愿不这样做。使用特殊的布尔类型循环继续标记进行线性搜索是正确的。如果需要多个嵌套循环,那么根据 Steve McConnell 在他的名著中的建议,嵌套循环应该安排为单独的过程。这既更具可读性,也更简单,最终更容易测试。
具体例子。在数组中查找一个数字。可以在 Free Oberon 系统上编译和运行。(见freeoberon.su)