home *** CD-ROM | disk | FTP | other *** search
/ Turbo Toolbox / Turbo_Toolbox.iso / 1989 / 02 / tricks / zahlensy.pas < prev   
Encoding:
Pascal/Delphi Source File  |  1988-10-06  |  6.1 KB  |  224 lines

  1. (* ------------------------------------------------------ *)
  2. (*                    ZAHLENSY.PAS                        *)
  3. (*     Binär <-> Dezimal <-> Hexadezimal <-> Binär        *)
  4. (*      (c) 1988 by Christian Ramsauer & TOOLBOX          *)
  5. (* ------------------------------------------------------ *)
  6. (*            Compiler: Turbo Pascal 3.0                  *)
  7. (* ------------------------------------------------------ *)
  8. PROGRAM Zahlensysteme;
  9.  
  10. TYPE Zahl = STRING[252];
  11.  
  12. VAR     ch: CHAR;
  13.         i : INTEGER;
  14.  
  15. (* ------------------------------------------------------ *)
  16. (*             Addition zweier Zahlenketten               *)
  17.  
  18. FUNCTION Summe(x, y: Zahl): Zahl;
  19. VAR b       : zahl;
  20.     i, z, u : INTEGER;
  21. BEGIN
  22.   b := '';
  23.   u := 0;
  24.   WHILE Length(x) > Length(y) DO y := '0'+ y;
  25.   WHILE Length(x) < Length(y) DO x := '0'+ x;
  26.   FOR i := Length(x) DOWNTO 1 DO BEGIN
  27.     z := Ord(x[i]) + Ord(y[i]) - 96 + u;
  28.     u := z DIV 10;
  29.     b := Chr(48 + (z MOD 10)) + b;
  30.   END;
  31.   IF u = 1 THEN b := '1' + b;
  32.   Summe := b;
  33. END;
  34.  
  35. (* ------------------------------------------------------ *)
  36. (*               Hexadezimal -> dezimal                   *)
  37.  
  38. FUNCTION hd(a: Zahl): zahl;
  39. VAR b, z    : Zahl;
  40.     j, p, i : INTEGER;
  41. BEGIN
  42.   z := '1';
  43.   b := '';
  44.   FOR i := Length(a) DOWNTO 1 DO BEGIN
  45.     IF a[i] IN ['0'..'9'] THEN p := Ord(a[i]) - 48
  46.                           ELSE p := Ord(a[i]) - 55;
  47.     FOR j := 1 TO p DO b := Summe(b, z);
  48.     FOR j := 1 TO 4 DO z := Summe(z, z);
  49.   END;
  50.   IF b = '' THEN hd := '0' ELSE hd := b;
  51. END;
  52.  
  53. (* ------------------------------------------------------ *)
  54. (*                   Dezimal -> Binär                     *)
  55.  
  56. FUNCTION db(a: Zahl): Zahl;
  57. VAR b, c    : Zahl;
  58.     u, i, z : INTEGER;
  59. BEGIN
  60.   b := '';
  61.   REPEAT
  62.     c := a;
  63.     a := '';
  64.     u := 0;
  65.     FOR i := 1 TO Length(c) DO BEGIN
  66.       z := Ord(c[i]) - 48 + (u*10);
  67.       u := z MOD 2;
  68.       z := z DIV 2;
  69.       a := a + Chr(48 + z);
  70.     END;
  71.     IF a[1] = '0' THEN Delete(a, 1, 1);
  72.     b := Chr(48 + u) + b;
  73.   UNTIL Length(a) = 0;
  74.   db := b;
  75. END;
  76.  
  77. (* ------------------------------------------------------ *)
  78. (*                Binär -> Hexadezimal                    *)
  79.  
  80. FUNCTION bh(a: Zahl): Zahl;
  81. VAR   b       : zahl;
  82.       z, i, u : INTEGER;
  83. CONST bi      : ARRAY[1..4] OF INTEGER = (8,4,2,1);
  84.  
  85. BEGIN
  86.   b := '';
  87.   WHILE Length(a) MOD 4 <> 0 DO a := '0' + a;
  88.   REPEAT
  89.     z := 0;
  90.     FOR i := 1 TO 4 DO
  91.       z := z + ((Ord(a[i]) - 48) * bi[i]);
  92.     Delete(a, 1, 4);
  93.     IF z < 10 THEN b := b + Chr(48 + z)
  94.               ELSE b := b + Chr(55 + z);
  95.   UNTIL Length(a) = 0;
  96.   bh := b;
  97. END;
  98.  
  99. (* ------------------------------------------------------ *)
  100. (*                Dezimal -> Hexadezimal                  *)
  101.  
  102. FUNCTION dh(a: Zahl): Zahl;
  103. VAR b, c    : Zahl;
  104.     u, i, z : INTEGER;
  105. BEGIN
  106.   b := '';
  107.   REPEAT
  108.     c := a;
  109.     a := '';
  110.     u := 0;
  111.     FOR i := 1 TO Length(c) DO BEGIN
  112.       z := Ord(c[i]) - 48 + (u*10);
  113.       u := z MOD 16;
  114.       z := z DIV 16;
  115.       a := a + Chr(48 + z);
  116.     END;
  117.     IF a[i] = '0' THEN Delete(a, 1, 1);
  118.     IF u < 10 THEN b := Chr(48 + u) + b
  119.               ELSE b := Chr(55 + u) + b;
  120.   UNTIL Length(a) = 0;
  121.   dh := b;
  122. END;
  123.  
  124. (* ------------------------------------------------------ *)
  125. (*                Hexadezimal -> Binär                    *)
  126.  
  127. FUNCTION hb(a: Zahl): Zahl;
  128. BEGIN
  129.   hb := db(hd(a));
  130. END;
  131.  
  132. (* ------------------------------------------------------ *)
  133. (*                   Binär -> Dezimal                     *)
  134.  
  135. FUNCTION bd(a: Zahl): Zahl;
  136. BEGIN
  137.   bd := hd(bh(a));
  138. END;
  139.  
  140. (* ------------------------------------------------------ *)
  141. (*                 Eingabefunktion                        *)
  142.  
  143. FUNCTION Eingabe(inp, outp: INTEGER): Zahl;
  144. TYPE  Menge  = SET OF CHAR;
  145. VAR   i, max : INTEGER;
  146.       ch     : CHAR;
  147.       m      : Menge;
  148.       b      : Zahl;
  149. CONST s      : ARRAY[1..3] OF STRING[20] =
  150.                  ('binäre','dezimale','hexadezimale');
  151. BEGIN
  152.   b := '';
  153.   CASE inp  OF 1: m := [#8,#13,'0','1'];
  154.                2: m := [#8,#13,'0'..'9'];
  155.                3: m := [#8,#13,'0'..'9','A'..'F'];
  156.   END;
  157.   CASE outp OF 1: IF inp = 3 THEN max := 63 ELSE max := 76;
  158.                2: IF inp = 3 THEN
  159.                     max := 209 ELSE max := 252;
  160.                3: max := 252;
  161.   END;
  162.   WriteLn('Geben Sie bitte die ',s[inp],' Zahl ein: ');
  163.   REPEAT
  164.     REPEAT
  165.       Read(kbd, ch);
  166.     UNTIL ch in m;
  167.     IF (ch = #8) AND (Length(b) > 0) THEN BEGIN
  168.       IF WhereX = 1 THEN BEGIN
  169.         GotoXY(80, WhereY - 1);
  170.         Write(#32);
  171.         GotoXY(80, WhereY - 1);
  172.       END ELSE
  173.         Write(#8, #32, #8);
  174.       Delete(b, Length(b), 1);
  175.     END;
  176.     IF ([ch]*[#8,#13]=[]) AND (Length(b) < max) THEN BEGIN
  177.       b := b + ch;
  178.       Write(ch);
  179.     END;
  180.   UNTIL (ch = #13) AND (Length(b) > 0);
  181.   Eingabe := b;
  182.   WriteLn;
  183.   Write('Die Zahl hat in ',s[outp]);
  184.   WriteLn('r Schreibweise folgende Form: ');
  185. END;
  186.  
  187. (* ------------------------------------------------------ *)
  188. (*                   Hauptprogramm                        *)
  189. BEGIN
  190.   ClrScr;
  191.   WriteLn;
  192.   WriteLn('*** Umwandlung zwischen Zahlensystemen ***');
  193.   WriteLn;
  194.   WriteLn('Welche Umwandlung wollen Sie vornehmen ?');
  195.   Write  ('Bin->Dez(1) Bin->Hex(2) Dez->Bin(3) ');
  196.   WriteLn('Dez->Hex(4) Hex->Bin(5) Hex->Dez(6)');
  197.   REPEAT
  198.     Write('Geben Sie bitte die entsprechende Ziffer ein: ');
  199.     REPEAT
  200.       Read(kbd, ch);
  201.     UNTIL ch in ['1'..'6'];
  202.     WriteLn(ch);
  203.     WriteLn;
  204.     CASE ch OF '1': WriteLn(bd(Eingabe(1,2)));
  205.                '2': WriteLn(bh(Eingabe(1,3)));
  206.                '3': WriteLn(db(Eingabe(2,1)));
  207.                '4': WriteLn(dh(Eingabe(2,3)));
  208.                '5': WriteLn(hb(Eingabe(3,1)));
  209.                '6': WriteLn(hd(Eingabe(3,2)));
  210.     END;
  211.     WriteLn('Wollen Sie eine weitere Umwandlung (J/N) ? ');
  212.     Read(kbd, ch);
  213.     FOR i := 20 DOWNTO 6 DO BEGIN
  214.       GotoXY(1,i);
  215.       DelLine;
  216.     END;
  217.   UNTIL ch in ['n','N'];
  218. END.
  219. (* ------------------------------------------------------ *)
  220. (*                Ende von ZAHLENSY.PAS                   *)
  221.  
  222.  
  223.  
  224.