aboutsummaryrefslogtreecommitdiff
path: root/challenge-333/deadmarshal/modula-3/Ch2/src/Ch2.m3
blob: 530a1d4cb3fe84e5dec59efa79c4ab3eef4ef398 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
MODULE Ch2 EXPORTS Main;

IMPORT SIO;

VAR
  A1 := ARRAY[0..7] OF INTEGER{1,0,2,3,0,4,5,0};
  A2 := ARRAY[0..2] OF INTEGER{1,2,3};
  A3 := ARRAY[0..3] OF INTEGER{1,2,3,0};
  A4 := ARRAY[0..3] OF INTEGER{0,0,1,2};
  A5 := ARRAY[0..4] OF INTEGER{1,2,0,3,4};

PROCEDURE DuplicateZeros(VAR A:ARRAY OF INTEGER) =
  VAR
    N := NUMBER(A);
    I := -1;
    K := 0;
    J := N-1;
  BEGIN
    WHILE K < N DO
      INC(I);
      IF A[I] > 0 THEN INC(K) ELSE INC(K,2) END
    END;
    IF K = N+1 THEN
      A[J] := 0;
      DEC(J);
      DEC(I)
    END;
    WHILE J >= FIRST(A) DO
      A[J] := A[I];
      IF A[I] = 0 THEN DEC(J); A[J] := A[I] END;
      DEC(I);
      DEC(J)
    END;    
  END DuplicateZeros;

PROCEDURE PrintArray(VAR A:ARRAY OF INTEGER) =
  BEGIN
    FOR I := FIRST(A) TO LAST(A) DO
      SIO.PutInt(A[I]);
      SIO.PutChar(' ')
    END;
    SIO.Nl()
  END PrintArray;
  
BEGIN
  DuplicateZeros(A1);
  DuplicateZeros(A2);
  DuplicateZeros(A3);
  DuplicateZeros(A4);
  DuplicateZeros(A5);
  PrintArray(A1);
  PrintArray(A2);
  PrintArray(A3);
  PrintArray(A4);
  PrintArray(A5);
END Ch2.