home *** CD-ROM | disk | FTP | other *** search
/ Turbo Toolbox / Turbo_Toolbox.iso / 1989 / 09 / tricks / zwandler.pas < prev   
Encoding:
Pascal/Delphi Source File  |  1989-06-15  |  5.6 KB  |  211 lines

  1. (* ------------------------------------------------------ *)
  2. (*                     ZWANDLER.PAS                       *)
  3. (*  Programm, das Zahlen zur  Basis 2, 3,..., 16 beliebig *)
  4. (*  ineinander umrechnet                                  *)
  5. (*  Eingabesysntax : <BASIS 1> <ZIFFERN> <BASIS 2>        *)
  6. (*                                                        *)
  7. (*         (c) 1989 Erich Cadario  &  TOOLBOX             *)
  8. (* ------------------------------------------------------ *)
  9. PROGRAM Zahlenwandler;
  10.  
  11. TYPE
  12.   SStrg  = STRING[255];
  13.   Menge  = SET OF CHAR;
  14.  
  15. VAR
  16.   Bezeichner, Ausdruck, Zahl, z  : SStrg;
  17.   ok                             : BOOLEAN;
  18.   Position, Lauf, x, Loop, h     : INTEGER;
  19.   m1, m2, m3, m4, m5, m6, m7, zm : Menge;
  20.   Basis1, Basis2, Help, w        : REAL;
  21.   a                              : ARRAY [0..80] OF INTEGER;
  22.   c                              : CHAR;
  23.  
  24.   PROCEDURE XWert2;
  25.    { zum Überbrücken von Blanks zwischen Basis und Ziffern }
  26.   BEGIN
  27.     x := Ord(Ausdruck[Position]);
  28.     WHILE (x=32) AND (Position < Length(Ausdruck)) DO BEGIN
  29.       Position := Position + 1;
  30.       x := Ord(Ausdruck[Position]);
  31.     END;
  32.   END;
  33.  
  34.   PROCEDURE Bezei(m : Menge);
  35.                { zur Analyse der eingelesenen Zeichenkette }
  36.   BEGIN
  37.     XWert2;
  38.     Bezeichner := '';
  39.     x := Ord(Ausdruck[Position]);
  40.     WHILE Chr(x) IN m DO BEGIN
  41.       Bezeichner := Bezeichner + Chr(x);
  42.       Position   := Position + 1;
  43.       Lauf       := Lauf + 1;
  44.       x := Ord(Ausdruck[Position]);
  45.     END;
  46.   END;
  47.  
  48.   PROCEDURE Eingabe;
  49.   VAR
  50.     i : INTEGER;
  51.   BEGIN
  52.     FOR i := 1 TO 255 DO BEGIN
  53.       Ausdruck[i]   := ' ';
  54.       Zahl[i]       := ' ';
  55.       z[i]          := ' ';
  56.       Bezeichner[i] := ' ';
  57.     END;
  58.     Ausdruck   := '';
  59.     z          := '';
  60.     Bezeichner := '';
  61.     Zahl       := '';
  62.     WriteLn('Bitte den Ausdruck eingeben');
  63.     ReadLn(Ausdruck);
  64.   END;
  65.  
  66.   PROCEDURE Zahlenwert(VAR Basis : REAL);
  67.  { Bestimmung der eingegebenen Basis und der Ziffernmenge, }
  68.  { die bei dieser Basis erlaubt ist                        }
  69.   VAR
  70.     q : INTEGER;
  71.   BEGIN
  72.     Val(Bezeichner, Basis, h);
  73.     q := Trunc(Basis);
  74.     CASE q OF
  75.       2..9 : ;
  76.       10   : zm := m1;
  77.       11   : zm := m2;
  78.       12   : zm := m3;
  79.       13   : zm := m4;
  80.       14   : zm := m5;
  81.       15   : zm := m6;
  82.       16   : zm := m7
  83.     ELSE
  84.       ok := FALSE;
  85.     END;
  86.   END;
  87.  
  88.   PROCEDURE Number;         { Bestimmung der zweiten Basis }
  89.   BEGIN
  90.     Bezei(m1);
  91.     Val(Bezeichner, Basis2, h);
  92.     IF (Basis2 < 2) OR (Basis2 > 16) THEN ok := FALSE;
  93.   END;
  94.  
  95.   PROCEDURE Base;    { Bestimmung der eingegebenen Ziffern }
  96.   BEGIN
  97.     Lauf := 0;
  98.     IF Basis1 < 11 THEN BEGIN
  99.       XWert2;
  100.       Bezeichner := '';
  101.       x          := Ord(Ausdruck[Position]);
  102.       WHILE (x < Basis1 + 48) AND (Chr(x) IN m1) DO BEGIN
  103.         Bezeichner := Bezeichner + Chr(x);
  104.         Lauf       := Lauf + 1;
  105.         Position   := Position + 1;
  106.         x          := Ord(Ausdruck[Position]);
  107.       END;
  108.       IF (Lauf > 80) OR (Lauf = 0) OR (x <> 32) THEN
  109.         ok := FALSE;
  110.       Zahl := Bezeichner;
  111.       IF ok = TRUE THEN Number;
  112.     END ELSE BEGIN
  113.       Bezei(zm);
  114.       IF (Lauf > 80) OR (Lauf = 0) OR (x <> 32) THEN
  115.         ok := FALSE;
  116.       Zahl := Bezeichner;
  117.       IF ok = TRUE THEN Number;
  118.     END;
  119.   END;
  120.  
  121.   PROCEDURE Zifferfilter;
  122.             { Dezimalwerte der einzelnen Ziffern bestimmen }
  123.   BEGIN
  124.     FOR Loop := 0 TO Length(Zahl)-1 DO BEGIN
  125.       c := Zahl[Length(Zahl)-Loop];
  126.       CASE Ord(c) OF
  127.         48..57  : a[Loop] := Ord(c) - 48;
  128.         65..70  : a[Loop] := Ord(c) - 55;
  129.         97..102 : a[Loop] := Ord(c) - 87;
  130.       ELSE;
  131.       END;
  132.     END;
  133.   END;
  134.  
  135.   FUNCTION in10er : REAL;      { Umwandeln ins 10er System }
  136.   VAR
  137.     Laenge, Loop : INTEGER;
  138.     Wert         : REAL;
  139.   BEGIN
  140.     Laenge := Length(Zahl);
  141.     Wert   := a[Laenge-1];
  142.     FOR Loop := Laenge-1 DOWNTO 1 DO
  143.       Wert := a[Loop-1] + Wert * Basis1;
  144.     in10er := Wert;
  145.   END;
  146.  
  147.   PROCEDURE inBasis2er(VAR Wert : REAL);
  148.              { Umwandlung ins eingegebene System (Basis 2) }
  149.   VAR
  150.     Loop              : INTEGER;
  151.     Rest, Hilf, Hilf1 : REAL;
  152.   BEGIN
  153.     Hilf := Int(Wert/Basis2);
  154.     Rest := Wert - Hilf * Basis2;
  155.     Wert := Hilf;
  156.     Loop := Trunc(Rest);
  157.     CASE Loop OF
  158.       0..9   : z := z + Chr(Loop + 48);
  159.       10..15 : z := z + Chr(Loop + 55)
  160.     ELSE;
  161.     END;
  162.     IF Wert <> 0 THEN inBasis2er(Wert);
  163.   END;
  164.  
  165. BEGIN
  166.   m1 := ['0'..'9'];
  167.   m2 := m1 + ['A', 'a'];
  168.   m3 := m2 + ['B', 'b'];
  169.   m4 := m3 + ['C', 'c'];
  170.   m5 := m4 + ['D', 'd'];
  171.   m6 := m5 + ['E', 'e'];
  172.   m7 := m6 + ['F', 'f'];
  173.   REPEAT
  174.     Eingabe;
  175.     IF (Ausdruck <> 'x') AND (Ausdruck <> 'X') THEN BEGIN
  176.       Position := 1;
  177.       Lauf     := 0;
  178.       ok       := TRUE;
  179.       Basis1   := 0;
  180.       Basis2   := 0;
  181.       XWert2;
  182.       CASE x OF
  183.         48..57 : BEGIN
  184.                    Bezei(m1);
  185.                    Zahlenwert(Basis1);
  186.                    IF ok = TRUE THEN Base;
  187.                  END;
  188.       ELSE ok := FALSE;
  189.       END;
  190.       IF ok = TRUE THEN BEGIN
  191.         Zifferfilter;
  192.         Help := in10er;
  193.         w    := Help;
  194.         inBasis2er(Help);
  195.         IF w >= 1.0E+10 THEN
  196.           WriteLn('ZU GROSS', ^G)
  197.         ELSE BEGIN
  198.           WriteLn('Im 10er: ', w);  WriteLn;
  199.           FOR Lauf := Length(z) DOWNTO 1 DO
  200.             Write(z[Lauf]);
  201.           WriteLn;  WriteLn;
  202.         END;
  203.       END ELSE WriteLn(^G);
  204.     END;
  205.   UNTIL (Ausdruck = 'x') OR (Ausdruck = 'X');
  206. end.
  207. (* ------------------------------------------------------ *)
  208. (*                Ende von ZWANDLER.PAS                   *)
  209.  
  210.  
  211.