home *** CD-ROM | disk | FTP | other *** search
/ ftp.barnyard.co.uk / 2015.02.ftp.barnyard.co.uk.tar / ftp.barnyard.co.uk / cpm / walnut-creek-CDROM / CPM / LANGUAGS / MODULA2 / DIVIDE.MOD < prev    next >
Text File  |  2000-06-30  |  975b  |  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.