home *** CD-ROM | disk | FTP | other *** search
/ Power-Programmierung / CD1.mdf / modula2 / library / modula1 / divide.mod < prev    next >
Text File  |  1987-06-11  |  1KB  |  43 lines

  1. (* Divide an integer by a natural number, using operations of
  2.    addition, subtraction    , doubling and halving only.  Repeat
  3.    reading pairs of integers, until you encounter a 0.  For each pair,
  4.    print dividend, divisor, quotient, and remainder.  Indicate
  5.    invariant of loop.*)
  6.  
  7. MODULE divide;
  8. FROM Terminal IMPORT WriteString, WriteLn;
  9. FROM InOut    IMPORT ReadInt,WriteInt;
  10.  
  11. VAR a,b,q,r:INTEGER;
  12.  
  13. PROCEDURE divide(x,y: INTEGER; VAR z,a:INTEGER);
  14. VAR q,r,w: INTEGER;
  15.  
  16. BEGIN
  17.   r := x; w := y; q := 0;
  18.   WHILE w <= r DO w := 2*w END;
  19.   WHILE w # y DO
  20.     w := w DIV 2;
  21.     q := 2*q;
  22.     IF w <= r THEN
  23.       r := r-w; INC(q);
  24.     END
  25.   END;
  26.   z := q; a := r;
  27. END divide;
  28.  
  29. BEGIN
  30.   WriteString('Enter dividend> ');
  31.   ReadInt(a);
  32.   WHILE a # 0 DO
  33.     WriteString('Enter divisor> ');
  34.     ReadInt(b);
  35.     divide(a,b,q,r);
  36.     WriteInt(a,3); WriteInt(b,3);
  37.     WriteInt(q,3); WriteInt(r,3);
  38.     WriteLn;
  39.     WriteString('Enter dividend> ');
  40.     ReadInt(a);
  41.   END
  42. END divide.
  43.