![]() |
Bruchrechnung und das kürzen...
Hi,
Ich habe ein Problem ich wollte/muss eine Art Bruch-Taschenrechner programmieren der die Zahlen auch kürzt...nun habe ich ein Problem ich habe alles fertig bis auf das kürzen, die ggt funktion ist auch schon geschrieben... nur muss man sie ja auch irgendwie einbinden um so einen bruch als gemischte zahl angeben zu können. Wie mach ich das??? Hier das programm:
Delphi-Quellcode:
unit Unit1;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) Zaehler1Edit: TEdit; Nenner1Edit: TEdit; OperatorEdit: TEdit; Zaehler2Edit: TEdit; Nenner2Edit: TEdit; RechnenButton: TButton; ErgebnisZaehlerEdit: TEdit; ErgebnisNennerEdit: TEdit; GanzzahlEdit: TEdit; EndeButton: TButton; procedure EndeButtonClick(Sender: TObject); procedure RechnenButtonClick(Sender: TObject); procedure ErgebnisZaehlerEditChange(Sender: TObject); private { Private-Deklarationen } public { Public-Deklarationen } end; var Form1: TForm1; implementation {$R *.dfm} function ggT(a, b:Integer):Integer; var res:Integer; begin repeat res := a mod b; a:=b; b:=res; until b <> 0; end; {* procedure B_kuerzen(..); <------ soll auch verwendet werden } procedure B_multiplizieren(var z1,z2,n1,n2,zerg,nennerg:real); begin zerg:= z1*z2; nennerg:=n1*n2; end; procedure B_dividieren(var z1,z2,n1,n2,zerg,nennerg:real); begin zerg:= z1*n2; nennerg:=n1*z2; end; procedure b_addieren(var z1,z2,n1,n2,zerg,nennerg:real); begin zerg:=(z1*n1)+(z2*n1); nennerg:=n1*n2 end; procedure B_subtrahieren(var z1,z2,n1,n2,zerg,nennerg:real); begin zerg:=(z1*n1)-(z2*n1); nennerg:=n1*n2 end; procedure TForm1.EndeButtonClick(Sender: TObject); begin close end; procedure TForm1.RechnenButtonClick(Sender: TObject); var z1,z2,n1,n2,zerg,nennerg:Real; begin z1:=strtofloat(Zaehler1Edit.text); z2:=strtofloat(Zaehler2Edit.text); n1:=strtofloat(nenner1edit.text); n2:=strtofloat(nenner2edit.text); if operatoredit.text = '*' then B_multiplizieren(z1,z2,n1,n2,zerg,nennerg); if operatoredit.text = '/' then B_dividieren(z1,z2,n1,n2,zerg,nennerg); if operatoredit.text = '+' then B_addieren(z1,z2,n1,n2,zerg,nennerg); if operatoredit.text = '-' then B_subtrahieren(z1,z2,n1,n2,zerg,nennerg); // Ausgabe ErgebnisZaehlerEdit.text:=Floattostr(zerg); ErgebnisNennerEdit.text:=Floattostr(nennerg); end; procedure TForm1.ErgebnisZaehlerEditChange(Sender: TObject); begin end; end. |
Re: Bruchrechnung und das kürzen...
Zunächst: Deine Funktion ggT leifert nix zurück (nein falsch: die liefert irgendeinen Integer, was halt grad im Speicher steht). Also entweder res durch Result ersetzen oder Result:=res ans Ende einfügen.
Zum Kürzen: ggt mit Zähler und Nenner aufrufen und danach beide durch das Ergebnis von ggt teilen. |
Re: Bruchrechnung und das kürzen...
also der ggt sollte eigentlich funktionieren hab das in nem anderen programm schon benutzt deswegen seh ich da kein problem oder doch?
Zitat:
Delphi-Quellcode:
procedure B_kuerzen(var z1,z2,n1,n2,zerg,nennerg,ganerg:real);
begin ganerg:= (ggt(a,b)/z1)7(ggt(a,b)/z2) //so? end; |
Re: Bruchrechnung und das kürzen...
Hai,
Delphi-Quellcode:
was für einen wert soll result (also das ergebnis haben ???)
function ggT(a, b:Integer):Integer;
var res:Integer; begin repeat res := a mod b; a:=b; b:=res; until b <> 0; end; wenn ich die Funktion sosehe dann wohl : result := res; :drunken: |
Re: Bruchrechnung und das kürzen...
Zitat:
Warum hast du nicht TBruch als einen Record deklariert?
Delphi-Quellcode:
und jetz:
TBruch = record
Zahler, Nenner: Integer; end;
Delphi-Quellcode:
procedure kurzen(Ausgangsbruch, Ergebnisbruch: Tbruch);
begin Ergebnisbruch.zahler:=Round(Ausgangsbruch.zahler div ggt(Ausgangsbruch.zahler,Ausgangsbruch.nenner)); Ergebnisbruch.nenner:=Round(Ausgangsbruch.nenner div ggt(Ausgangsbruch.zahler,Ausgangsbruch.nenner)); end; |
Re: Bruchrechnung und das kürzen...
Zitat:
Zitat:
|
Re: Bruchrechnung und das kürzen...
Aber ich hoffe du verstehst meine Vorgehensweise hier:
Delphi-Quellcode:
So geht das nämlich => dürfte ja selbsterklärend sein :wink:
procedure kurzen(Ausgangsbruch, Ergebnisbruch: Tbruch);
begin Ergebnisbruch.zahler:=Round(Ausgangsbruch.zahler div ggt(Ausgangsbruch.zahler,Ausgangsbruch.nenner)); Ergebnisbruch.nenner:=Round(Ausgangsbruch.nenner div ggt(Ausgangsbruch.zahler,Ausgangsbruch.nenner)); end; Und jetzt kannst du deine eigene Prozedur mit deinen 100 Variablen schreiben, oder nicht? |
Re: Bruchrechnung und das kürzen...
Zitat:
Delphi-Quellcode:
ICh hoffe du verstehst mein Problem :gruebel:
ganzezahl:= ???? div ???
|
Re: Bruchrechnung und das kürzen...
Zitat:
"Round" rundet Zahlen immer zu einer Ganzzahl, es gibt also eine Ganzzahl wieder. Und wenn ich das hier verwende:
Delphi-Quellcode:
wird eine Ganzahl zurückgeliefert... es kommt also zu keinem Problem.
Round(Ausgangsbruch.zahler div ggt(Ausgangsbruch.zahler,Ausgangsbruch.nenner));
Falls ich dich wirklich falsch verstanden habe, einfach nochmal genauer fragen :wink: |
Re: Bruchrechnung und das kürzen...
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:
Ich hab mal ein Bild angehangen wie ich es meine ( mit den Ausgabe werten) |
Re: Bruchrechnung und das kürzen...
Liste der Anhänge anzeigen (Anzahl: 1)
Informatik Klasse 11???
Ich hab so was auch mal gemacht (siehe Anhang). Ich bin auch dumm ... :oops: Man muss ja gar nicht mehr runden (rein theoretisch) => es kommt ja ne Ganzzahl raus (wegen ggt). Aber ob der Compiler das auch weis kann ich jetzt gar nicht sagen... Hast du noch ein Problem oder funkt das jetzt so? PS: Zitiere bitte nicht immer ganze Posts (wegen übersichtlichkeit und Platz) |
Re: Bruchrechnung und das kürzen...
Jop info klasse 11 genau so ein programm sollten wir schreiben...
Wenn ich bei mir jetzt 15/15 * 15/15 bekomme ich ein error mit dem fehler division durch 0...Irgendwas ist noch faul ;) |
Re: Bruchrechnung und das kürzen...
dann musst du mal Haltepunkte in dein Prog einfügen und wenn es dann unterbrochen wurde, musst du mit F7 jede Zeile einzeln weiterrücken und gucken an welcher stelle genau dein Prog den Error verursacht! Und wenn du dir das nicht erklären kannst warum, dann poste die Stelle, die nicht geht!
|
Re: Bruchrechnung und das kürzen...
wie macht man denn die haltepunkte?
|
Re: Bruchrechnung und das kürzen...
bei einer Quelltextzeile links auf den grauen rand klicken, da dürfte dann so ein roter punkt erscheinen
|
Re: Bruchrechnung und das kürzen...
das problem liegt beim ggt?! :gruebel:
Delphi-Quellcode:
result:= a mod b;
und hier nochmal der Code wie er jetzt ist...
Delphi-Quellcode:
// Z1 ist der 1. Zähler
// Z2 der 2. Zähler // n1 der erste nenner // n2 der zweite nenner // zerg Zählerergebnis //nenner Nennerergebnis //ganerg Ganzzahlenergebnis unit mBruchrechnen; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) Zaehler1Edit: TEdit; Nenner1Edit: TEdit; OperatorEdit: TEdit; Zaehler2Edit: TEdit; Nenner2Edit: TEdit; RechnenButton: TButton; ErgebnisZaehlerEdit: TEdit; ErgebnisNennerEdit: TEdit; GanzzahlEdit: TEdit; EndeButton: TButton; procedure EndeButtonClick(Sender: TObject); procedure RechnenButtonClick(Sender: TObject); private { Private-Deklarationen } public { Public-Deklarationen } end; var Form1: TForm1; implementation {$R *.dfm} // GGT Bestimmung function ggT(a, b:integer):integer; begin repeat result:= a mod b; a:=b; b:=result; until b <> 0; end; //Kürzen procedure B_kuerzen(var z1,z2,n1,n2,zerg,nennerg,ganerg:integer); begin zerg:=zerg div(ggt(zerg,nennerg)); nennerg:=nennerg div (ggt(zerg,nennerg)); end; // Brüche Multiplizieren procedure B_multiplizieren(var z1,z2,n1,n2,zerg,nennerg:integer); begin zerg:= z1*z2; nennerg:=n1*n2; end; // Brüche Dividieren procedure B_dividieren(var z1,z2,n1,n2,zerg,nennerg:integer); begin zerg:= z1*n2; nennerg:=n1*z2; end; // Brüche addieren procedure b_addieren(var z1,z2,n1,n2,zerg,nennerg:integer); begin zerg:=(z1*n1)+(z2*n1); nennerg:=n1*n2 end; // Brüche subtrahieren procedure B_subtrahieren(var z1,z2,n1,n2,zerg,nennerg:integer); begin zerg:=(z1*n1)-(z2*n1); nennerg:=n1*n2 end; procedure TForm1.EndeButtonClick(Sender: TObject); begin close end; procedure TForm1.RechnenButtonClick(Sender: TObject); var z1,z2,n1,n2,zerg,nennerg,ganerg:integer; begin //eingabe z1:=strtoint(Zaehler1Edit.text); z2:=strtoint(Zaehler2Edit.text); n1:=strtoint(nenner1edit.text); n2:=strtoint(nenner2edit.text); // Abfrage des Operators und ausführen der jeweiligen Funktion if operatoredit.text = '*' then B_multiplizieren(z1,z2,n1,n2,zerg,nennerg); if operatoredit.text = '/' then B_dividieren(z1,z2,n1,n2,zerg,nennerg); if operatoredit.text = '+' then B_addieren(z1,z2,n1,n2,zerg,nennerg); if operatoredit.text = '-' then B_subtrahieren(z1,z2,n1,n2,zerg,nennerg); // Kürzen B_kuerzen(z1,z2,n1,n2,zerg,nennerg,ganerg); // Ausgabe GanzzahlEdit.text:=inttostr(ganerg); ErgebnisZaehlerEdit.text:=inttostr(zerg); ErgebnisNennerEdit.text:=inttostr(nennerg); end; end. |
Re: Bruchrechnung und das kürzen...
Hallo Anigmos,
ich fürchte du verwendest den ![]() Freundliche Grüße |
Re: Bruchrechnung und das kürzen...
Hier mal als Referenz meine ggt-Funktion!
Delphi-Quellcode:
Edit: die habe ich verstanden, aber vorher auch nur von dsdt.info kopiert :wink:
function ggT(a,b: integer):integer;
var x :integer; begin if b <> 0 then repeat x:=a mod b; a:=b; b:=x; until x = 0; result := abs(a); //falls a, oder b negativ end; |
Re: Bruchrechnung und das kürzen...
Liste der Anhänge anzeigen (Anzahl: 1)
Ich habe mal ein kleines Beispiel zum Thema Brüche kürzen angehängt, weis aber nicht, ob du sowas meintest.
|
Re: Bruchrechnung und das kürzen...
So noch langem hin und her hab ich 1. den fehler bei meinem algorithmus gefunden hab anstatt b = 0 b <> 0 gehabt :wall: Tja aber nun ist noch das problem mit der Ausgabe wie kann ich diese einbinden??
|
Re: Bruchrechnung und das kürzen...
du hast doch deine Edits schon so angeordnet, dass die Ausgabe kein Problem mehr darstellt (ich erinnere an den Screenshot).
Willst du jetzt noch wissen, wie du die Ganzzahl rausbekommst und den Rest als Bruch darstellst, oder was? Das solltest du aber eigentlich auch mit Mathematik-Kenntnissen der (was weis ich... auf jeden Fall einer Klasse die vor der 11. kommt) selber hinkriegen :wink: |
Re: Bruchrechnung und das kürzen...
Das Problem ist, ich kann es, kann es aber nicht schreiben :gruebel: ...
|
Re: Bruchrechnung und das kürzen...
Und wo konkret ist jetzt dein Problem?
|
Re: Bruchrechnung und das kürzen...
Wie kann ich nun die ganzzahl und den bruch ausgeben??
Ich hasse es mathe zu programmieren ich programmier alles lieber modifikationen für spiele eigene addons die mir das verwalten erleichtern ALLES nur kein mathe :wall: |
Re: Bruchrechnung und das kürzen...
Zitat:
|
Re: Bruchrechnung und das kürzen...
Er macht irgendwas falsch... es kommt bei 13/2 * 13/2 0 ganze und 52/1 raus das stimmt nicht so ganz^^"
|
Re: Bruchrechnung und das kürzen...
Zitat:
|
Re: Bruchrechnung und das kürzen...
Also Anigmos:
Ich hatte es ja schonmal geschrieben! Mit dieser Formel bekommst du Zähler und Nenner des gekürzten Bruches!
Delphi-Quellcode:
Um das jetzt noch so aufzusplitten, dass man eine Ganzzahl erhält, fällt mir auf die schnelle nur das hier ein:
procedure kurzen(Ausgangsbruch, Ergebnisbruch: Tbruch);
begin Ergebnisbruch.zahler:=Ausgangsbruch.zahler div ggt(Ausgangsbruch.zahler,Ausgangsbruch.nenner); Ergebnisbruch.nenner:=Ausgangsbruch.nenner div ggt(Ausgangsbruch.zahler,Ausgangsbruch.nenner); end;
Delphi-Quellcode:
So und sag jetzt nicht, dass du es nicht kapierst!!!! :evil:
var GDE{GanzzahlDesErgebnisbruchs}, RDE: word;
DivMod(ErgebnisBruch.zahler, Ergebnisbruch.Nenner, GDE, RDE); Ergebnisbruch.zahler:=RDE; GanzZahlEdit.text:=IntToStr(GDE); ZahlerEdit.text:=IntToStr(Ergebnisbruch.zahler); NennerEdit.text:=IntToStr(Ergebnisbruch.Nenner); Es ist denk ich mal einleuchtend! Das einzige, was du ändern musst (weil du sagtest ja mal ihr dürft nur StiNo-Variablen benutzen), ist, deine unzähligen Variablen zu benutzen (anstatt Ergebnisbruch.zahler und so)!!!!!! Aber wie schon gesagt, dürfte es dir nun ein Leichtes sein, das was ich geschrieben habe, auf deine Sache zu übertragen. Zitat:
Edit: Um dir die richtige ggt-Funktion nochmal zu zeigen kopiere dir die von Beitrag #18 von mir!!!!! |
Re: Bruchrechnung und das kürzen...
TonyR"
Delphi-Quellcode:
Warum übergibst Du den zu kürzenden Bruch zerpflückt in Zähler und Nenner?
Function Kuerzen(zaehler,nenner:integer):Tbruch;
(delphi]Ergebnisbruch.zahler:=Round(Ausgangsbruch.zahler div ggt(Ausgangsbruch.zahler,Ausgangsbruch.nenner)); [/delphi] Was soll das Round? Das Ergebnis von div ist schon ein Integer! Frage: Wird der ungekürzte Bruch wirklich noch gebraucht? Sonst
Delphi-Quellcode:
Dipl Phys Ernst Winter
procedure Kuerzen(var Bruch: TBruch);
|
Re: Bruchrechnung und das kürzen...
Liste der Anhänge anzeigen (Anzahl: 1)
Gegenüber dem Rechnen mit Gleitkommazahlen ist das Rechnen mit Brüchen frei von Rundungsfehlern.
Diese treten erst auf, wenn wir den Bruch in eine Gleitkommazahl konvertieren. Ich habe für euch eine Unit und ein Demo zur Bruchrechnung geschrieben |
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:19 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 by Thomas Breitkreuz