Implementierung Langzahlarithmetik

Für Fragen von Einsteigern und Programmieranfängern...
Neuling
Beiträge: 33
Registriert: Do 30. Dez 2021, 01:08
OS, Lazarus, FPC: Windows 10 (L 2.2.0 FPC 3.2.2)
CPU-Target: 64Bit

Implementierung Langzahlarithmetik

Beitrag von Neuling »

Hallo

Ich versuche mich zur Zeit an der Implementierung einer Langzahlarithmetik. Für die Addition ist mir das scheinbar auch gelungen.

Code: Alles auswählen

program Langzahlarithmetik_Addition_1_2;

uses
  Crt,Dos,SysUtils;

var
  zahl_1,zahl_2,summe,abbruch : String;

function LangzahlAddition(summand_1,summand_2: String): String;

var
  ziffer_summe,ziffer_1,ziffer_2,null : String[1];
  summe_1,diff_laenge : String;
  i,j,k,l_s_1,l_s_2,ueber,ziff_summ,ziff_summ_1,ziff_1,ziff_2,diff_laen : Integer;

begin
  ueber := 0;
  summe := '';
  summe_1 := '';
  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;
  Write(summand_1,' ');
  Write(summand_2);
   Readln;
  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 + ueber;
      ziffer_summe := IntToStr(ziff_summ_1);
      summe_1 := summe_1 + ziffer_summe;
      ueber := 1;
      if i = l_s_1 - 1 then begin
        summe_1 := summe_1 + '1';
      end;
    end else
    if ziff_summ = 9 then begin
      if ueber = 1 then begin
        ziff_summ_1 := ziff_summ - 10 + ueber;
        ziffer_summe := IntToStr(ziff_summ_1);
        summe_1 := summe_1 + ziffer_summe;
        ueber := 1;
        if i = l_s_1 - 1 then begin
          summe_1 := summe_1 + '1';
        end;
      end else
      if ueber = 0 then begin
        ziffer_summe := IntToStr(ziff_summ);
        summe_1 := summe_1 + ziffer_summe;
        ueber := 0;
      end;
    end else
    if ziff_summ < 9 then begin
      ziff_summ_1 := ziff_summ + ueber;
      ziffer_summe := IntToStr(ziff_summ_1);
      summe_1 := summe_1 + ziffer_summe;
      ueber := 0;
    end;
  end;
  for j := 0 to Length(summe_1) - 1 do begin
    summe := summe + summe_1[Length(summe_1) - j];
  end;
  exit(summe);
end;


begin
  repeat
    Writeln;
    Write('Summand1:');
    Readln(zahl_1);
    WriteLn;
    Write('Summand2:');
    ReadLn(zahl_2);
    Writeln;
    LangzahlAddition(zahl_1,zahl_2);
    WriteLn;
    Write(summe);
    ReadLn;
    WriteLn;
    Write('Programm abbrechen?: ');
    Readln(abbruch);
    ClrScr;
  until abbruch = 'j';
end.
Aber die Funktion ist ganz gewiss nicht gut oder gar schön. Bevor ich mich an die Operationen Subtraktion, Multiplikation, Division (div, mod) sowie < , > und = dransetze, könnte ich Rückmeldungen bezüglich eventuell noch vorliegender Fehler sowie Verbesserungsvorschläge gut gebrauchen. Der Quellcode des kleinen Programmes befindet sich im Anhang. Bei Kritik bitte beachten, dass ich ein Programmieranfänger mit ca. zwei Wochen Erfahrung bin. Ich danke schon einmal für Rückmeldungen und verbleibe

Mit freundlichen Grüßen

Neuling
Dateianhänge
Langzahlarithmetik_Addition_1_2.pas
(2.74 KiB) 42-mal heruntergeladen
Ich nehme jede berechtigte Kritik an. Es sei denn, diese fällt von oben herab vor meine Füße.
Programmieren macht Spaß.

siro
Beiträge: 730
Registriert: Di 23. Aug 2016, 14:25
OS, Lazarus, FPC: Windows 11
CPU-Target: 64Bit
Wohnort: Berlin

Re: Implementierung Langzahlarithmetik

Beitrag von siro »

Hallo Neuling,

wenn ich deinen Code richtig verstanden habe, dann möchtest Du zunächst die beiden Summanden auf die gleiche Länge bringen.
Dein Code ist nicht verkehrt, aber das kann man völlig ohne zusätzliche Variabeln tätigen:

Code: Alles auswählen

function LangzahlAddition(summand_1,summand_2: String): String;
begin
  while length(summand_1) < length(summand_2) do     // solange die Länge von summand_1 kleiner ist als die Länge von summand_2
    summand_1:='0'+summand_1;                        // eine 0 vorne an summand_1 ran setzen
                                                     // sollte summand_1 schon länger oder gleich lang wie summand_2 dann wird halt nix ausgeführt,
                                                     // weil die while Abfrage  als Ergebnis FALSE (also unwahr) ergibt

                                                     // das Gleiche machen wir nun umgekehrt:
  while length(summand_2) < length(summand_1) do     // solange die Länge von summand_2 kleiner ist als die Länge von summand_1
    summand_2:='0'+summand_2;                        // eine 0 vorne an summand_2 ran setzen

  Write(summand_1,' ');
  Write(summand_2);
  Readln;

//  .....hier folgt dann deine eigentliche Berechnung:, die auch noch wesentlich vereinfacht werden könnte
// zumindest musst Du jetzt aber noch die beiden Längen für deinen Code setzen

   l_s_1 := Length(summand_1); 
   l_s_2 := Length(summand_2);  

  for i := 0 to l_s_1 - 1 do begin 
     ..........................   
Grüße von Siro
Bevor ich "C" ertragen muß, nehm ich lieber Lazarus...

Neuling
Beiträge: 33
Registriert: Do 30. Dez 2021, 01:08
OS, Lazarus, FPC: Windows 10 (L 2.2.0 FPC 3.2.2)
CPU-Target: 64Bit

Re: Implementierung Langzahlarithmetik

Beitrag von Neuling »

Hallo siro

Danke für die verständliche Antwort. Ich lerne täglich dazu. Und so sollte es sein.
Ich nehme jede berechtigte Kritik an. Es sei denn, diese fällt von oben herab vor meine Füße.
Programmieren macht Spaß.

Benutzeravatar
fliegermichl
Lazarusforum e. V.
Beiträge: 1432
Registriert: Do 9. Jun 2011, 09:42
OS, Lazarus, FPC: Lazarus Fixes FPC Stable
CPU-Target: 32/64Bit
Wohnort: Echzell

Re: Implementierung Langzahlarithmetik

Beitrag von fliegermichl »

siro hat geschrieben:
Fr 7. Jan 2022, 12:31

Code: Alles auswählen

// zumindest musst Du jetzt aber noch die beiden Längen für deinen Code setzen

   l_s_1 := Length(summand_1); 
   l_s_2 := Length(summand_2);  
Wieso? Die hast du doch eben gerade auf die gleiche Länge gebracht?

siro
Beiträge: 730
Registriert: Di 23. Aug 2016, 14:25
OS, Lazarus, FPC: Windows 11
CPU-Target: 64Bit
Wohnort: Berlin

Re: Implementierung Langzahlarithmetik

Beitrag von siro »

Damit er seinen "unveränderten" folgenden Code verwenden kann:
hier benötigt er ja diese beiden Variablen:

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];

natürlich kann er das auch so machen:
l_s_1 := Length(summand_1);
l_s_2 := l_s_1;

ebenso kann er natürlich auch nur mit l_s_1 arbeiten, da ja beide Längen identisch sind.
for i := 0 to l_s_1 - 1 do begin
ziffer_1 := summand_1[l_s_1 - i];
ziffer_2 := summand_2[l_s_1 - i];
Grüße von Siro
Bevor ich "C" ertragen muß, nehm ich lieber Lazarus...

Neuling
Beiträge: 33
Registriert: Do 30. Dez 2021, 01:08
OS, Lazarus, FPC: Windows 10 (L 2.2.0 FPC 3.2.2)
CPU-Target: 64Bit

Re: Implementierung Langzahlarithmetik

Beitrag von Neuling »

Hallo,

dass ich die Variable aufgrund gleicher String Länge nur einmal brauche ist logisch. Der Code ist auch noch nicht fertig. Ich habe erst einmal die Operationen <, = und > implementiert. Und mit der Subtraktion angefangen. Ich werde nun auch negative Zahlen mit einbeziehen. Und die wirklich ungelenke Funktion Addition, so wie sie oben steht, noch einmal überarbeiten. Vor allem gefällt mir das "auffüllen" des kürzeren Strings nicht. Ich werde nach einer anderen Lösung suchen. Im folgenden der Code für <, = und >. Verbesserungsvorschläge erwünscht. Gruß an alle Leser und ein angenehmes Wochenende.

Code: Alles auswählen

var
  Zahl_1,Zahl_2 : String;

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
  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);
        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);
       end;
      end;
    end;
  end;
  exit(true);
end;

Code: Alles auswählen

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);
        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);
       end;
      end;
    end;
  end;
  exit(true);
end;
Ich nehme jede berechtigte Kritik an. Es sei denn, diese fällt von oben herab vor meine Füße.
Programmieren macht Spaß.

Neuling
Beiträge: 33
Registriert: Do 30. Dez 2021, 01:08
OS, Lazarus, FPC: Windows 10 (L 2.2.0 FPC 3.2.2)
CPU-Target: 64Bit

Re: Implementierung Langzahlarithmetik

Beitrag von Neuling »

Hallo

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.

Ich nehme jede berechtigte Kritik an. Es sei denn, diese fällt von oben herab vor meine Füße.
Programmieren macht Spaß.

Neuling
Beiträge: 33
Registriert: Do 30. Dez 2021, 01:08
OS, Lazarus, FPC: Windows 10 (L 2.2.0 FPC 3.2.2)
CPU-Target: 64Bit

Re: Implementierung Langzahlarithmetik

Beitrag von Neuling »

Ich habe die Funktion Kleiner korrigiert. Nun sollte es stimmen. Vielleicht entdeckt aber auch jemand einen Denkfehler. Ich sehe im Moment den Wald vor lauter Bäumen nicht.

Code: Alles auswählen

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;
  klein : Boolean;

begin
  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 klein := true;
          if ziff_1_int < ziff_2_int then begin
            if klein = false then exit(false);
          end;
        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 klein := true;
          if ziff_1_int > ziff_2_int then begin
            if klein = false then exit(false);
          end;
        end;
      end;
    end;
  end;
  exit(true);
end;
Ich nehme jede berechtigte Kritik an. Es sei denn, diese fällt von oben herab vor meine Füße.
Programmieren macht Spaß.

Neuling
Beiträge: 33
Registriert: Do 30. Dez 2021, 01:08
OS, Lazarus, FPC: Windows 10 (L 2.2.0 FPC 3.2.2)
CPU-Target: 64Bit

Re: Implementierung Langzahlarithmetik

Beitrag von Neuling »

Jetzt muss ich nur noch den Rest "rückanpassen". Schluss für heute.
Ich nehme jede berechtigte Kritik an. Es sei denn, diese fällt von oben herab vor meine Füße.
Programmieren macht Spaß.

Benutzeravatar
Winni
Beiträge: 1577
Registriert: Mo 2. Mär 2009, 16:45
OS, Lazarus, FPC: Laz2.2.2, fpc 3.2.2
CPU-Target: 64Bit
Wohnort: Fast Dänemark

Re: Implementierung Langzahlarithmetik

Beitrag von Winni »

Hi!

Als Anregung mal Folgendes:

Voraussetzung ist, das Du keine führenden Nullen hast:

* Bei gleichlangen Strings ist der Vergleich der Strings entsprechend der numerischen. Es gilt also
'456' > '123'

* Wenn beide die gleichen Vorzeichen haben, so ist der längere String
- bei + größer als der kürzere
- bei - kleiner als der kürzere

* Wenn die Vorzeichen ungleich sind, so ist der mit dem Minus immer der kleinere.

Vorgehensweise:

etwaige Vorzeichen löschen und den jeweilgen Wert (Positiv/Negativ) in einer boolschen Variablen merken.
etwaige führende Nullen löschen

Und dann die obigen Aktionen ausführen.

Winni

Neuling
Beiträge: 33
Registriert: Do 30. Dez 2021, 01:08
OS, Lazarus, FPC: Windows 10 (L 2.2.0 FPC 3.2.2)
CPU-Target: 64Bit

Re: Implementierung Langzahlarithmetik

Beitrag von Neuling »

Danke. Aber genau so habe ich es in den Funktionen <,=,> implementiert. Den Fehler habe ich schon korrigiert. Trotzdem Danke.
Ich nehme jede berechtigte Kritik an. Es sei denn, diese fällt von oben herab vor meine Füße.
Programmieren macht Spaß.

Neuling
Beiträge: 33
Registriert: Do 30. Dez 2021, 01:08
OS, Lazarus, FPC: Windows 10 (L 2.2.0 FPC 3.2.2)
CPU-Target: 64Bit

Re: Implementierung Langzahlarithmetik

Beitrag von Neuling »

Hallo

Ich habe die Fehler behoben. Solange keine führenden Nullen eingegeben werden läuft das Programm für Addition und Subtraktion von positiven und negativen Ganzzahlen. Da ich, sobald ich *, div und mod fertig habe, eine Unit machen werde, ist das bedeutungslos. Ich werde eine sicher Eingabe für die Langzahlen schreiben. Und da nach der Berechnung die führenden Nullen, die alles einfacher gemacht haben, aus dem String gelöscht werden, und da die Funktionen die Werte aneinander übergeben werden, sollten am Ende keine Probleme auftauchen. Nun bleibt nur folgendes Problem, das ich schon einmal ansprach: Wie kann ich erreichen, das zwei Funktionen sich gegenseitig aufrufen können? Mit der
"forward" Deklaration klappt das nicht. Deklariere ich die - im Code - erste Funktion als forward, dann werden die Variablen dieser Funktion nicht mehr erkannt. Muss ich einen zusätzlichen Compiler Befehl verwenden? Danke im Voraus.

Neuling

Code: Alles auswählen

program Lang_Add_Sub_fast_1;

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;
  klein : Boolean;

begin
  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 klein := true;
          if ziff_1_int < ziff_2_int then begin
            if klein = false then exit(false);
          end;
        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 klein := true;
          if ziff_1_int > ziff_2_int then begin
            if klein = false then exit(false);
          end;
        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;
  gross : Boolean;

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 gross := true;;
          if ziff_1_int > ziff_2_int then begin
            if gross = false then exit(false);
          end;
        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 gross := true;;
          if ziff_1_int < ziff_2_int then begin
            if gross = false then exit(false);
          end;
        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
  null := IntToStr(0);
  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;
  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
        subtrahend := zah_1;
        minuend := zah_2;
        ergeb_negat := true;
      end;
      if Kleiner(zah_1,zah_2) = false then begin
        subtrahend := zah_2;
        minuend := zah_1;
        ergeb_negat := false;
      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_2;
        minuend := zah_1;
        ergeb_negat := true;
      end else
      if Kleiner(zah_1,zah_2) = false then begin
        subtrahend := zah_1;
        minuend := zah_2;
        ergeb_negat := false;
      end;
      if Gleich(zah_1,zah_2) = true then begin
        subtrahend := zah_2;
        minuend := zah_1;
      end;
    end;
    delete(subtrahend,1,1);
    delete(minuend,1,1);
  end;
  diff_laen := Length(minuend) - Length(subtrahend);
  diff_laenge := '';
  for k := 1 to diff_laen do begin
    diff_laenge := diff_laenge + null;
  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;
  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);
    Writeln;
    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.   
Ich nehme jede berechtigte Kritik an. Es sei denn, diese fällt von oben herab vor meine Füße.
Programmieren macht Spaß.

Benutzeravatar
Winni
Beiträge: 1577
Registriert: Mo 2. Mär 2009, 16:45
OS, Lazarus, FPC: Laz2.2.2, fpc 3.2.2
CPU-Target: 64Bit
Wohnort: Fast Dänemark

Re: Implementierung Langzahlarithmetik

Beitrag von Winni »

Hi!

Erstens: Forward Deklaration geht einwandfrei unter fpc.

Zweitens: Üble Effekte bekommst Du, wenn Du globale Variablen in Deinen Funktionen benutzt. Solange es irgendwie geht: Definiere Deine Variablen lokal in der Function/Procedure. Und schon hast Du ne Menge Ärger weniger.

Drittens: Sich gegenseitig aufrufende Functionen sollte man nur dann benutzen, wenn es absolut notwendig ist. Schildere mal Dein Problem, und wir finden eine bessere Lösung.

Winni

Neuling
Beiträge: 33
Registriert: Do 30. Dez 2021, 01:08
OS, Lazarus, FPC: Windows 10 (L 2.2.0 FPC 3.2.2)
CPU-Target: 64Bit

Re: Implementierung Langzahlarithmetik

Beitrag von Neuling »

Danke für die Antwort. Das Problem habe ich oben beschrieben. Ich verwende tatsächlich bei diesen Funktionen eine globale Variable. Ein Bsp. für mein Problem. Die Funktion Subtraktion bekommt die Werte -5 und 5 übergeben. Also ist die Rechnung -5 - 5. Das ist aber -(5 + 5). Also eine Aufgabe für die Funktion Addition. Diese muss aber wissen, dass das Ergebnis negativ ist. Dafür habe ich diese Variable uebergabe definiert.
Ich nehme jede berechtigte Kritik an. Es sei denn, diese fällt von oben herab vor meine Füße.
Programmieren macht Spaß.

Socke
Lazarusforum e. V.
Beiträge: 3158
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: Implementierung Langzahlarithmetik

Beitrag von Socke »

Neuling hat geschrieben:
Mo 10. Jan 2022, 16:05
Die Funktion Subtraktion bekommt die Werte -5 und 5 übergeben. Also ist die Rechnung -5 - 5. Das ist aber -(5 + 5). Also eine Aufgabe für die Funktion Addition. Diese muss aber wissen, dass das Ergebnis negativ ist. Dafür habe ich diese Variable uebergabe definiert.
Das muss die Funktion Addition nicht wissen. Das Vorzeichen kann auch die Funktion Subtraktion einstellen.
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

Antworten