Problem bei einem Programm : Pascal

S

Separate

Neues Mitglied
Thread Starter
Dabei seit
03.03.2008
Beiträge
7
Reaktionspunkte
0
Hallo Leute !.

Ich habe leider ein kleines Problem bei einem von mir geschriebenen Programm. Mein Programm rechnet von Dezimal in das Binäre Zahlensystem um und das ganze auch umgekehrt.

Das funktioniert alles ganz gut und jetzt hab ich versucht das programm mit einer Funktion die Arabische in Römische Zahlen darstellt zu erweitern.
Wenn ich das normal Ausführe funktioniert es nur in meinem Programm nicht.

Hier ist mein Programmcode.

Code:
PROGRAM Transform;
USES Crt;

PROCEDURE rahmen;
 VAR i:Integer;

 BEGIN
  ClrScr;
  Gotoxy(1,1);
  WRITE('É');
  FOR i:=1 TO 78 DO
   WRITE('Í');
  WRITE('»');
  FOR i:=2 TO 24 DO BEGIN
   Gotoxy(1,i);
   WRITE('º');
   Gotoxy(80,i);
   WRITE('º');
  END;
  Gotoxy(1,24);
  WRITE('È');
  FOR i:=1 TO 78 DO
   WRITE('Í');
  WRITE('¼');
 END;

(***********************************************************)
FUNCTION potenzen(basis,potenz:INTEGER) :INTEGER;

VAR  bas:INTEGER;

BEGIN
  IF (potenz=0) THEN potenz:=1  ELSE
  BEGIN
    IF (potenz=1) THEN potenz:=basis ELSE
    BEGIN
      bas:=basis;
      REPEAT
         basis:=basis*bas;
         Dec(potenz);
      UNTIL potenz=1;
      potenzen:=basis;
   END;
 END;
END;


FUNCTION IntToStr (zahl:INTEGER):STRING;
VAR wert:STRING;
Begin
  Str (zahl,wert);
  IntToStr:=wert;
END;


FUNCTION StrToInt(zeichen:STRING):INTEGER;
VAR wert,
    code:INTEGER;
BEGIN

 VAL (zeichen,wert,code);
 strtoint:=wert;
END;

(**************************************************************)
FUNCTION umrechnen_dez_dual(number:INTEGER) :STRING;
VAR rest,
    i,
    j,
    x:INTEGER;
    rval:STRING;
    zahl_dual:ARRAY[1..1000] of INTEGER;


BEGIN
    Clrscr;
    rval:='';
    i:=1;
    rahmen;
    Gotoxy(4,4);
    Writeln('Rechnung:');
    Gotoxy(4,5);
    Writeln;
    REPEAT
        x:= number DIV 2;
        rest:= number MOD 2 ;
        Gotoxy(4,45);
        zahl_dual [i]:=rest;
        Inc(i);
        Gotoxy(4,3+i); Write(number);
        Gotoxy(10,3+i); Write(' /2= ',x  );
        Gotoxy(25,3+i); Write('Rest:   ',rest);
        number:=x;
    UNTIL number = 0;
    FOR j:=i-1 DOWNTO 1 DO
    BEGIN
        rest:=zahl_dual[j];
        rval:=rval +IntToStr(rest);
    END;
    umrechnen_dez_dual := rval;
END;
(***************************************************************)


FUNCTION umrechnen_dual_dez(number:STRING) :INTEGER;

VAR exp,
    i,
    rval:Integer;
    z:STRING;
BEGIN
  Clrscr;
  exp:=0;
  rval:=0;
  i := length ( number );
  rahmen;
  Gotoxy(4,5);
  Writeln;
  Gotoxy(4,5);
  Writeln('Rechnung:');
  REPEAT
      z:=Copy(number,i,1);
      Gotoxy(5,Wherey); Write(rval);
      rval:=rval+StrToInt(z)*Potenzen(2,exp);
      Gotoxy(10,Wherey); Write(' + ',StrToInt(z));
      Gotoxy(20,Wherey); Write('* 2^',exp);
      Gotoxy(30,Wherey); Writeln('=',rval);
      Dec(i);
      Inc(exp);
  UNTIL i = 0;
  umrechnen_dual_dez := rval;
END;

(****************************************************************)
[COLOR="red"][/COLOR]FUNCTION transform(variable: INTEGER) : STRING;

 TYPE myPair = Record
  arab: INTEGER;
  rom: STRING;
 END;

  VAR divi, test, i, j:INTEGER;
  VAR result : STRING;
  VAR ende : BOOLEAN;

  CONST list : ARRAY[1..13] of myPair = ( (arab:1000; rom:'M'),
                                        (arab:900; rom:'CM' ),
                                         (arab:500; rom:'D' ),
                                          (arab:400; rom:'CD' ),
                                           (arab:100; rom:'C' ),
                                            (arab:90; rom:'XC' ),
                                            (arab:50; rom:'L' ),
                                            (arab:40; rom:'XL' ),
                                            (arab:10; rom:'X' ),
                                             (arab:9; rom:'IX' ),
                                              (arab:5; rom:'V' ),
                                               (arab:4; rom:'IV'),
                                                (arab:1; rom:'I') );

  BEGIN
  result := '';
  FOR i:=1 TO 13 DO
  BEGIN
   divi:= variable DIV list[i].arab;
   IF divi > 0 THEN
   BEGIN
    FOR j:=1 TO divi DO
    BEGIN
     result:=result+list[i].rom
     END;
    END;
    variable:= variable MOD list[i].arab;
    END;
    transform:=result;
    END;
[/COLOR]
(****************************************************************)

VAR dez,
    choice:INTEGER;
    dual:STRING;
BEGIN
    REPEAT
       Clrscr;
       rahmen;
       Gotoxy(4,4);
       writeln( '[1] Dec2Bin');
       Gotoxy(4,5);
       writeln( '[2] Bin2Dec');
       Gotoxy(4,6);
       writeln( '[3] Arab2Rom');
       Gotoxy(4,7);
       writeln( '[0] Programm beenden');
       Gotoxy(4,8);
       write( 'Ihre Wahl? ');
       read(choice);

       CASE choice OF
         1:BEGIN
             Gotoxy(7,10);
             Write('Bitte geben Sie die umzuwandelnde Dezimalzahl ein... ' );
             Readln(dez);
             Writeln;
             dual:=umrechnen_dez_dual(dez);
             Gotoxy(4,12);
             Writeln;
             Gotoxy(36,4);
             Writeln( '====> Binaerzahl: ',dual);
             Gotoxy(3,22);
             Writeln('Bitte Taste druecken');
             Readln;
           END;
         2:BEGIN
             Gotoxy(7,10);
             Write('Bitte geben Sie die umzuwandelnde Binaerzahl ein... ');
             Readln;
             Readln(dual);
             Writeln;
             dez:=umrechnen_dual_dez(dual);
             Gotoxy(4,12);
             Writeln;
             Gotoxy(36,5);
             Writeln( '====> Dezimalzahl: ',dez );
             Gotoxy(3,22);
             Writeln('Bitte Taste druecken');
             Readln;
           END;
         3:BEGIN
             Gotoxy(7,10);
             Write('Bitte geben Sie die umzuwandelnde Arabische Zahl ein...');
             Readln(test);
             Writeln('Ergebnis',transform(test)); [COLOR="Red"]<---Hier sagt er mir dann er kennt die variable test nicht ![/COLOR]
             Writeln('');
           END;
       END;                               

 UNTIL choice = 0;

END.

Was hab ich falsch gemacht ?. danke für eure Hilfe
 
Ich habe mir den Code noch nicht ganz angesehen, aber was mir sofort auffällt ist, dass du die Funktionen StrToInt und IntToStr selber geschrieben hast.
Kenns du SysUtils nicht? Das bringt nämlich jene beiden Funktionen schon mit: http://www.freepascal.org/docs-html/rtl/sysutils/index.html (Oben unter functions findest du alle Funktionen)
 
Hier ist mein Programmcode.
Code:
(****************************************************************)
FUNCTION transform(variable: INTEGER) : STRING;

 TYPE myPair = Record
  arab: INTEGER;
  rom: STRING;
 END;

[COLOR="Red"]  VAR divi, test, i, j:INTEGER;[/COLOR]
  VAR result : STRING;
  VAR ende : BOOLEAN;

[COLOR="Sienna"].
.
.[/COLOR]

(****************************************************************)

[COLOR="red"]VAR dez,
    choice:INTEGER;[/COLOR]
    dual:STRING;
BEGIN
[COLOR="Sienna"].
.
.[/COLOR]

             [COLOR="Red"]Readln(test);[/COLOR]
             Writeln('Ergebnis',transform(test)); [COLOR="Red"]<---Hier sagt er mir dann er kennt die variable test nicht ![/COLOR].
Mir scheint es so als hättest du deine integer-variable test an der falschen Stelle definiert. :)

Aber kanns du mir mal erzählen was das Programm eigentlich genau macht? Ich habs mal ausgeführt nachdem ich es "entbuggt" habe, also alle variable-fehldeklarationen usw. verbessert habe und foldendes kam dabei raus:
[6n\311\315\315\315\315\315\315\315\315\315\315\315\315\315\315\315\315\315\315\315\315\315\315\315\315\315\315\315\315\315\315\315\315\315\315\315\315\315\315\315\315\315\315\315\315\315\315\315\315\315\315\315\315\315\315\315\315\315\315\315\315\315\315\315\315\315\315\315\315\315\315\315\315\315\315\315\315\315ͻ\272\272\272\272\272\272\272\272\272\272\272\272\272\272\272\272\272\272\272\272\272\272\272\272\272\272\272\272\272\272\272\272\272\272\272\272\272\272\272\272\272\272\272\272\272\272\310\315\315\315\315\315\315\315\315\315\315\315\315\315\315\315\315\315\315\315\315\315\315\315\315\315\315\315\315\315\315\315\315\315\315\315\315\315\315\315\315\315\315\315\315\315\315\315\315\315\315\315\315\315\315\315\315\315\315\315\315\315\315\315\315\315\315\315\315\315\315\315\315\315\315\315\315\315ͼ[1] Dec2Bin[2] Bin2Dec[3] Arab2Rom[0] Programm beendenIhre Wahl?
 
Die Variable Test ist an der falschen Stelle deklariert. Das hat "TerminalX" ja schon schön deutlich gemacht.

@TerminalX: Dein Output kommt durch die Steuerzeichen. Das Programm versucht einen Rahmen zu zeichen, um darin ein Menü darzustellen. Das scheint nicht kompatibel mit deiner Terminal-Emulation zu sein. :D

Gruß
Dirk
 
Dein Output kommt durch die Steuerzeichen. Das Programm versucht einen Rahmen zu zeichen, um darin ein Menü darzustellen. Das scheint nicht kompatibel mit deiner Terminal-Emulation zu sein. :D
Sieht wirklich besser aus, wenn man das Programm im Terminal ausführt. :) Ich hatte es bloß in Xcode ausgeführt. Danke für den Hinweis.
 
Zurück
Oben Unten