Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Problem beim kürzen von Brüchen (https://www.delphipraxis.net/86575-problem-beim-kuerzen-von-bruechen.html)

Clobber the mob 15. Feb 2007 21:07


Problem beim kürzen von Brüchen
 
Delphi-Quellcode:
unit Bruchrechnung;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls, ExtCtrls, Buttons;

type
  TForm1 = class(TForm)
    EndeButton: TButton;
    RechnenButton: TButton;
    Zaehler1Edit: TEdit;
    Nenner1Edit: TEdit;
    OperatorEdit: TEdit;
    Zaehler2Edit: TEdit;
    Nenner2Edit: TEdit;
    GanzzahlEdit: TEdit;
    ErgebnisZaehlerEdit: TEdit;
    ErgebnisNennerEdit: TEdit;
    procedure EndeButtonClick(Sender: TObject);
    procedure RechnenButtonClick(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}

// function für die Berechnung des ggT

function ggT(a, b : Integer) : Integer;
var rest:integer;
begin
 repeat
       Rest := a MOD b;
       a := b;
       b := Rest;
 until Rest = 0;
       Result := a;
end;

// Alle Berechnungs-Prozeduren

procedure B_kuerzen (ggT, ErgebnisZaehler, ErgebnisNenner : Integer);
var ggTeiler:integer;
begin
 if (ErgebnisZaehler <> 0) AND (ErgebnisNenner <> 0) then
 begin
  ggTeiler := ggT(ErgebnisZaehler, ErgebnisNenner);
  ErgebnisZaehler := ErgebnisZaehler DIV ggTeiler;
  ErgebnisNenner := ErgebnisNenner DIV ggTeiler;
 end;
end;

procedure B_addieren(Zaehler1, Zaehler2, Nenner1, Nenner2 : Integer;
var ErgebnisZaehler, ErgebnisNenner: Integer);
begin
 ErgebnisZaehler := (Zaehler1 * Nenner2) + (Zaehler2 * Nenner1);
 ErgebnisNenner := Nenner1 * Nenner2;
end;

procedure B_subtrahieren(Zaehler1, Zaehler2, Nenner1, Nenner2 : Integer;
 var ErgebnisZaehler, ErgebnisNenner: Integer);
begin
 ErgebnisZaehler := (Zaehler1 * Nenner2) - (Zaehler2 * Nenner1);
 ErgebnisNenner := Nenner1 * Nenner2;
end;

procedure B_dividieren(Zaehler1, Zaehler2, Nenner1, Nenner2 : Integer;
 var ErgebnisZaehler, ErgebnisNenner: Integer);
begin
 ErgebnisZaehler := Zaehler1 * Nenner2;
 ErgebnisNenner := Nenner1 * Zaehler2;
end;

procedure B_multiplizieren(Zaehler1, Zaehler2, Nenner1, Nenner2 : Integer;
 var ErgebnisZaehler, ErgebnisNenner: Integer);
begin
 ErgebnisZaehler := Zaehler1 * Zaehler2;
 ErgebnisNenner := Nenner1 * Nenner2;
end;


procedure TForm1.FormCreate(Sender: TObject);
begin
  Zaehler1Edit.Text := '1';
  Zaehler2Edit.Text := '1';
  Nenner1Edit.Text := '1';
  Nenner2Edit.Text := '1';
  GanzzahlEdit.Text := '0';
  ErgebnisZaehlerEdit.Text := '0';
  ErgebnisNennerEdit.Text := '0';
  OperatorEdit.Text := '-';
end;

procedure TForm1.RechnenButtonClick(Sender: TObject);
 var Zaehler1, Zaehler2, Nenner1, Nenner2, ErgebnisZaehler, ErgebnisNenner, Ganzzahl, ggT, ggTeiler : integer;
begin

// Eingabe - einlesen der Werte
  Zaehler1 := StrToInt(Zaehler1Edit.Text);
  Zaehler2 := StrToInt(Zaehler2Edit.Text);
  Nenner1 := StrToInt(Nenner1Edit.Text);
  Nenner2 := StrToInt(Nenner2Edit.Text);

// Prüfung auf gültigen Operator
  begin if Zaehler1 = 0 then
    ShowMessage('Error: 0 ist ein ungültiger Wert')
  end;
  begin if Zaehler2 = 0 then
    ShowMessage('Error: 0 ist ein ungültiger Wert')
  end;
  begin if Nenner1 = 0 then
    ShowMessage('Error: 0 ist ein ungültiger Wert')
  end;
  begin if Nenner2 = 0 then
    ShowMessage('Error: 0 ist ein ungültiger Wert')
  end;

// Berechnung
  if OperatorEdit.Text = '+' then B_addieren(Zaehler1, Zaehler2, Nenner1, Nenner2, ErgebnisZaehler, ErgebnisNenner) else
  if OperatorEdit.Text = '-' then B_subtrahieren(Zaehler1, Zaehler2, Nenner1, Nenner2, ErgebnisZaehler, ErgebnisNenner) else
  if OperatorEdit.Text = '/' then B_dividieren(Zaehler1, Zaehler2, Nenner1, Nenner2, ErgebnisZaehler, ErgebnisNenner) else
  if OperatorEdit.Text = '*' then B_multiplizieren(Zaehler1, Zaehler2, Nenner1, Nenner2, ErgebnisZaehler, ErgebnisNenner)
  else ShowMessage('Error: Ungültiges Rechenzeichen');

  if ErgebnisZaehler = ErgebnisNenner then
  begin
   Ganzzahl := 1;
   ErgebnisZaehler := 0;
   ErgebnisNenner := 0;
  end;

// Hier sollte dann der Bruch gekürzt werden
  B_Kuerzen(ErgebnisZaehler, ErgebnisNenner, ggTeiler);

// Berechnung der Ganzzahl des Bruches
  Ganzzahl := ErgebnisZaehler DIV ErgebnisNenner;
  ErgebnisZaehler := ErgebnisZaehler MOD ErgebnisNenner;

// Ungültige Ergebnisse vermeiden
  if ErgebnisZaehler = 0 then
  ErgebnisNenner := 0;
  if ErgebnisNenner = 0 then
  ErgebnisZaehler := 0;



// Ausgebe der Werte(Ergebnisse)
  ErgebnisNennerEdit.Text := IntToStr(ErgebnisNenner);
  ErgebnisZaehlerEdit.Text := IntToStr(ErgebnisZaehler);
  GanzzahlEdit.Text := IntToStr(Ganzzahl);

end;


procedure TForm1.EndeButtonClick(Sender: TObject);
begin
 Close
end;

end.
Das einmal der Gesamte Code.
Der Fehler liegt hier:
Delphi-Quellcode:
ggTeiler := ggT(ErgebnisZaehler, ErgebnisNenner);
In dieser Zeile tritt der Fehler auf: Operator oder Semikolon fehlt.

Ich habe mir den Text etwas genauer angeschaut kann den fehler aber nicht entdecken?

TonyR 15. Feb 2007 21:22

Re: Problem beim kürzen von Brüchen
 
Wenn das wirklich dein Code ist, wie er in deinem Programm steht, dann fehlt an folgender Stelle ein Semikolon!
Delphi-Quellcode:
procedure TForm1.EndeButtonClick(Sender: TObject);
begin
Close
end;
Edit: Und ich weis auch nicht, ob es so super ist, dass es eine Variable gibt, die den selben Namen hat wie eine Funktion (in dem Falle "ggt")!!!

jakobwenzel 15. Feb 2007 21:26

Re: Problem beim kürzen von Brüchen
 
Vorm End darf man das Semikolon weglassen.

Aber das mit Variable/Funktion verursacht abgesehen von Verwirrung auf gerne Fehler.

TonyR 15. Feb 2007 21:35

Re: Problem beim kürzen von Brüchen
 
Ich habe deinen Code mal bei mir eingefügt und es jetzt komplett rausfinden können, wo der Fehler liegt!
Delphi-Quellcode:
procedure B_kuerzen (ErgebnisZaehler, ErgebnisNenner : Integer);
var ggTeiler:integer;
begin
if (ErgebnisZaehler <> 0) AND (ErgebnisNenner <> 0) then
begin
  ggTeiler := ggT(ErgebnisZaehler, ErgebnisNenner);
  ErgebnisZaehler := ErgebnisZaehler DIV ggTeiler;
  ErgebnisNenner := ErgebnisNenner DIV ggTeiler;
end;
end;
Jetzt gehts! Es liegt wirklich daran, dass eine Variable nicht gleich heißen darf, wie eine Funktion!

Edit: Ich hab mal diesen Parameter ganz weggenommen... den brauchst du doch gar nicht :gruebel:

Clobber the mob 15. Feb 2007 21:43

Re: Problem beim kürzen von Brüchen
 
danke jetzt klappt es.


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:03 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz