Не могу выполнить инструкцию 10-й строки после внутреннего цикла FOR - PullRequest
0 голосов
/ 17 октября 2018

Я изучал «Алгоритмы и структуры данных» Н. Вирта.Он кодирует свои алгоритмы на языке, который он создал: Оберон.Я закончил книгу, но у меня есть одно сомнение по поводу этого алгоритма страницы 19, закодированного в Обероне:

PROCEDURE Power (VAR W: Texts.Writer; N: INTEGER);
    VAR i, k, r: INTEGER;
    d: ARRAY N OF INTEGER;
    BEGIN
        FOR k := 0 TO N-1 DO
            Texts.Write(W, "."); r := 0;
            FOR i := 0 TO k-1 DO
                r := 10*r + d[i]; d[i] := r DIV 2; r := r MOD 2;
                Texts.Write(W, CHR(d[i] + ORD("0")))
            END;
            d[k] := 5; Texts.Write(W, "5"); Texts.WriteLn(W)
        END
    END Power

The resulting output text for N = 10 is
.5
.25
.125
.0625
.03125
.015625
.0078125
.00390625
.001953125
.0009765625

Я не понимаю, что делает инструкция в строке 10 d[k] := 5; Texts.Write(W, "5"); Texts.WriteLn(W):

1) Зачем вам d[k] := 5?программа уже распечатала все требуемые выходные данные (d[0] to d[k-1]).

2) зачем вам печатать 5 после этого?(Texts.Write(W, "5"))

1 Ответ

0 голосов
/ 04 ноября 2018

В вычислении используется тот факт, что последней цифрой всегда будет пять.

  1. Если выполнение не завершено, переменная d[k] считывается при следующем обороте внешнего цикла, когда r становится 10*r + d[i] в последнем обороте внутреннего цикла
  2. Оператор Texts.Write(W, "5") требует (незначительно) меньших вычислений, чем Texts.Write(W, d[i]).
...