Ich habe die Langzahlarithmetik für die Operationen + und - fast fertig. Die Operationen < und > enthalten noch einen dummen Fehler, den ich noch beseitigen werde. Deshalb liefert das Programm für einige Fälle noch falsche Ergebnisse. Ich habe das Rechnen mit negativen Zahlen inzwischen mit einbezogen. Das hat zu folgendem Problem geführt. Zwei Fälle der Addition lassen sich nur durch Subtraktion durchführen. n + (-m) = n - m und -n + m = m - n Ebenso ist es bei der Subtraktion. n - (-m) = n + m und -n - m = -(n +m). Ich habe daher in diese Fällen versucht, die Funktion Addition in der Funktion Subtraktion aufzurufen. Und Umgekehrt. Das funktioniert aber nur für die Funktion, die im Programmcode vor der Funktion steht, die diese aufruft. Hat da jemand eine Lösung anzubieten? Der Programmcode steht unten. Ich danke in Voraus für hilfreiche Antworten.
Code: Alles auswählen
program Langzahlarithmetik;
uses
Crt,Dos,SysUtils;
var
zahl_1,zahl_2,ergebnis,abbruch,a : String;
uebergabe : Boolean;
function Gleich(Zah_1,Zah_2: String): Boolean;
var
i : Integer;
ziff_zah_1,ziff_zah_2 : String[1];
begin
if Length(zah_1) < Length(zah_2) then exit(false);
if Length(zah_2) < Length(zah_1) then exit(false);
for i := 1 to Length(zah_1) do begin
ziff_zah_1 := zah_1[i];
ziff_zah_2 := zah_2[i];
if ziff_zah_1 <> ziff_zah_2 then exit(false);
end;
exit(true);
end;
function Kleiner(Zah_1,Zah_2: String): Boolean;
var
ziff_1_str,ziff_2_str : String;
i,j,ziff_1_int,ziff_2_int : Integer;
begin
Kleiner := false;
if Gleich(zah_1,Zah_2) = true then exit(false);
if zah_1[1] = '-' then begin
if zah_2[1] <> '-' then exit(true);
end;
if zah_2[1] = '-' then begin
if zah_1[1] <> '-' then exit(false);
end;
if zah_1[1] = '-' then begin
if zah_2[1] = '-' then begin
if Length(zah_1) > Length(zah_2) then exit(true);
if Length(zah_1) < Length(zah_2) then exit(false);
if Length(zah_1) = Length(zah_2) then begin
for i := 2 to Length(zah_1) do begin
ziff_1_str := zah_1[i];
ziff_2_str := zah_2[i];
ziff_1_int := StrToInt(ziff_1_str);
ziff_2_int := StrToInt(ziff_2_str);
if ziff_1_int < ziff_2_int then exit(false); // Blöder Fehler!
end;
end;
end;
end;
if zah_1[1] <> '-' then begin
if zah_2[1] <> '-' then begin
if Length(zah_1) < Length(zah_2) then exit(true);
if Length(zah_1) > Length(zah_2) then exit(false);
if Length(zah_1) = Length(zah_2) then begin
for j := 1 to Length(zah_1) do begin
ziff_1_str := zah_1[j];
ziff_2_str := zah_2[j];
ziff_1_int := StrToInt(ziff_1_str);
ziff_2_int := StrToInt(ziff_2_str);
if ziff_1_int > ziff_2_int then exit(false); //Dito
end;
end;
end;
end;
exit(true);
end;
function Groesser(Zah_1,Zah_2: String): Boolean;
var
ziff_1_str,ziff_2_str : String;
i,ziff_1_int,ziff_2_int : Integer;
begin
if Gleich(zah_1,Zah_2) = true then exit(false);
if zah_1[1] = '-' then begin
if zah_2[1] <> '-' then exit(false);
end;
if zah_2[1] = '-' then begin
if zah_1[1] <> '-' then exit(true);
end;
if zah_1[1] = '-' then begin
if zah_2[1] = '-' then begin
if Length(zah_1) > Length(zah_2) then exit(false);
if Length(zah_1) < Length(zah_2) then exit(true);
if Length(zah_1) = Length(zah_2) then begin
for i := 2 to Length(zah_1) do begin
ziff_1_str := zah_1[i];
ziff_2_str := zah_2[i];
ziff_1_int := StrToInt(ziff_1_str);
ziff_2_int := StrToInt(ziff_2_str);
if ziff_1_int > ziff_2_int then exit(false); //Ebenso
end;
end;
end;
end;
if zah_1[1] <> '-' then begin
if zah_2[1] <> '-' then begin
if Length(zah_1) < Length(zah_2) then exit(false);
if Length(zah_1) > Length(zah_2) then exit(true);
if Length(zah_1) = Length(zah_2) then begin
for i := 1 to Length(zah_1) do begin
ziff_1_str := zah_1[i];
ziff_2_str := zah_2[i];
ziff_1_int := StrToInt(ziff_1_str);
ziff_2_int := StrToInt(ziff_2_str);
if ziff_1_int < ziff_2_int then exit(false); //Und noch einmal
end;
end;
end;
end;
exit(true);
end;
function Addition(zah_1,zah_2: String): String;
var
ziffer_summe,ziffer_1,ziffer_2,null : String[1];
summe_1,diff_laenge,summand_1,summand_2,summe : String;
i,j,k,l,l_s_1,l_s_2,uebertrag,ziff_summ,ziff_summ_1,ziff_1,ziff_2,diff_laen : Integer;
ergeb_negat,null_str : Boolean;
begin
uebertrag := 0;
summe := '';
summe_1 := '';
ergeb_negat := false;
(*if zah_1[1] = '-' then begin
if zah_2[1] <> '-' then begin
Subtraktion(zah_1,zah_2);
exit(ergebnis);
end;
end else !!! Wie ruft man zwei Funktionen gegenseitig auf???
if zah_1[1] <> '-' then begin
if zah_2[1] = '-' then begin
Subtraktion(zah_1,zah_2);
exit(ergebnis);
end;
end;*)
if zah_1[1] = '-' then begin
if zah_2[1] = '-' then begin
delete(zah_1,1,1);
delete(zah_2,1,1);
ergeb_negat := true;
end;
end;
summand_1 := zah_1;
summand_2 := zah_2;
l_s_1 := Length(summand_1);
l_s_2 := Length(summand_2);
if l_s_1 < l_s_2 then begin
diff_laen := l_s_2 - l_s_1;
diff_laenge := '';
null := IntToStr(0);
for k := 1 to diff_laen do begin
diff_laenge := diff_laenge + null;
end;
summand_1 := diff_laenge + summand_1;
l_s_1 := Length(summand_1);
end else
begin
diff_laen := l_s_1 - l_s_2;
diff_laenge := '';
null := IntToStr(0);
for k := 1 to diff_laen do begin
diff_laenge := diff_laenge + null;
end;
summand_2 := diff_laenge + summand_2;
l_s_2 := Length(summand_2);
end;
for i := 0 to l_s_1 - 1 do begin
ziffer_1 := summand_1[l_s_1 - i];
ziffer_2 := summand_2[l_s_2 - i];
ziff_1 := StrToInt(ziffer_1);
ziff_2 := StrToInt(ziffer_2);
ziff_summ := ziff_1 + ziff_2;
ziff_summ_1 := 0;
if ziff_summ > 9 then begin
ziff_summ_1 := ziff_summ - 10 + uebertrag;
ziffer_summe := IntToStr(ziff_summ_1);
summe_1 := summe_1 + ziffer_summe;
uebertrag := 1;
if i = l_s_1 - 1 then begin
summe_1 := summe_1 + '1';
end;
end else
if ziff_summ = 9 then begin
if uebertrag = 1 then begin
ziff_summ_1 := ziff_summ - 10 + uebertrag;
ziffer_summe := IntToStr(ziff_summ_1);
summe_1 := summe_1 + ziffer_summe;
uebertrag := 1;
if i = l_s_1 - 1 then begin
summe_1 := summe_1 + '1';
end;
end else
if uebertrag = 0 then begin
ziffer_summe := IntToStr(ziff_summ);
summe_1 := summe_1 + ziffer_summe;
uebertrag := 0;
end;
end else
if ziff_summ < 9 then begin
ziff_summ_1 := ziff_summ + uebertrag;
ziffer_summe := IntToStr(ziff_summ_1);
summe_1 := summe_1 + ziffer_summe;
uebertrag := 0;
end;
end;
for j := 0 to Length(summe_1) - 1 do begin
summe := summe + summe_1[Length(summe_1) - j];
end;
null := IntToStr(0);
for i := 1 to Length(summe) do begin
if summe[i] = null then begin
null_str := true;
end else
if summe[i] <> null then begin
null_str := false;
break;
end;
end;
if null_str = true then begin
ergebnis := null;
exit(ergebnis);
end;
for l := 1 to Length(summe) do begin
while summe[l] = null do begin
if summe[l] <> null then break else
delete(summe,l,1);
end;
break;
end;
if uebergabe = true then summe := '-' + summe;
if ergeb_negat = true then summe := '-' + summe;
ergebnis := summe;
exit(ergebnis);
end;
function Subtraktion(Zah_1,Zah_2: String): String;
var
ziffer_minuend_str,ziffer_subtrahend_str,ziff_differenz_str,null : String[1];
diff_laenge,minuend,subtrahend,differenz_1,differenz : String;
i,j,k,l,l_str,uebertrag,ziff_differenz_int,ziff_minuend_int,ziff_subtrahend_int,diff_laen : Integer;
ergeb_negat,null_str : Boolean;
begin
uebertrag := 0;
differenz := '';
differenz_1 := '';
ergeb_negat := false;
uebergabe := false;
if zah_1[1] <> '-' then begin
if zah_2[1] = '-' then begin
delete(zah_2,1,1);
Addition(zah_1,zah_2);
exit(ergebnis);
end;
end else
if zah_1[1] = '-' then begin
if zah_2[1] <> '-' then begin
uebergabe := true;
delete(zah_1,1,1);
Addition(zah_1,zah_2);
exit(ergebnis);
end;
end;
if zah_1[1] = '-' then begin
if zah_2[1] = '-' then begin
if Kleiner(zah_1,zah_2) = true then begin
delete(zah_1,1,1);
delete(zah_2,1,1);
subtrahend := zah_2;
minuend := zah_1;
ergeb_negat := true;
end;
end;
end;
if zah_1[1] = '-' then begin
if zah_2[1] = '-' then begin
if Kleiner(zah_1,zah_2) = false then begin
delete(zah_1,1,1);
delete(zah_2,1,1);
subtrahend := zah_1;
minuend := zah_2;
end;
end;
end;
if zah_1[1] = '-' then begin
if zah_2[1] = '-' then begin
delete(zah_1,1,1);
delete(zah_2,1,1);
if Gleich(zah_1,zah_2) = true then begin
subtrahend := zah_2;
minuend := zah_1;
end;
end;
end;
if zah_1[1] <> '-' then begin
if zah_2[1] <> '-' then begin
if Kleiner(zah_1,zah_2) = true then begin
subtrahend := zah_1;
minuend := zah_2;
ergeb_negat := true;
end else begin
subtrahend := zah_2;
minuend := zah_1;
end;
end;
end;
diff_laen := Length(minuend) - Length(subtrahend);
diff_laenge := '';
for k := 1 to diff_laen do begin
diff_laenge := diff_laenge + '0';
end;
subtrahend := diff_laenge + subtrahend;
l_str := Length(minuend);
for i := 0 to l_str - 1 do begin
ziffer_minuend_str := minuend[l_str - i];
ziffer_subtrahend_str := subtrahend[l_str - i];
ziff_minuend_int := StrToInt(ziffer_minuend_str);
ziff_subtrahend_int := StrToInt(ziffer_subtrahend_str);
if ziff_minuend_int > (ziff_subtrahend_int + uebertrag) then begin
ziff_differenz_int := ziff_minuend_int - (ziff_subtrahend_int + uebertrag);
ziff_differenz_str := IntToStr(ziff_differenz_int);
differenz_1 := differenz_1 + ziff_differenz_str;
uebertrag := 0;
end else
if ziff_minuend_int = (ziff_subtrahend_int + uebertrag) then begin
ziff_differenz_str := IntToStr(0);
differenz_1 := differenz_1 + ziff_differenz_str;
uebertrag := 0;
end else
if ziff_minuend_int < (ziff_subtrahend_int + uebertrag) then begin
ziff_differenz_int := (ziff_minuend_int + 10) - (ziff_subtrahend_int + uebertrag);
differenz_1 := differenz_1 + IntToStr(ziff_differenz_int);
uebertrag := 1;
end;
end;
for j := 0 to Length(differenz_1) - 1 do begin
differenz := differenz + differenz_1[Length(differenz_1) - j];
end;
null := IntToStr(0);
for i := 1 to Length(differenz) do begin
if differenz[i] = null then begin
null_str := true;
end else
if differenz[i] <> null then begin
null_str := false;
break;
end;
end;
if null_str = true then begin
ergebnis := null;
exit(ergebnis);
end;
for l := 1 to Length(differenz) do begin
while differenz[l] = null do begin
if differenz[l] <> null then break else
delete(differenz,l,1);
end;
break;
end;
if ergeb_negat = true then differenz := '-' + differenz;
ergebnis := differenz;
exit(ergebnis);
end;
begin
repeat
uebergabe := false;
Writeln;
Write('Zahl 1:');
Readln(zahl_1);
WriteLn;
Write('Zahl 2:');
ReadLn(zahl_2);
Writeln;
Write('Fuer Addieren "a" druecken, sonst wird Subtrahiert:');
ReadLn(a);
if a = 'a' then Addition(zahl_1,zahl_2) else
Subtraktion(zahl_1,zahl_2);
WriteLn;
Write(ergebnis);
WriteLn;
WriteLn;
Write('Programm abbrechen?: ');
Readln(abbruch);
ClrScr;
until abbruch = 'j';
end.