![]() |
AW: ggT und KgV von 2 Zahlen berechnen - absolut keine Ahnung
Delphi-Quellcode:
If trunc(b) <> 0 then
|
AW: ggT und KgV von 2 Zahlen berechnen - absolut keine Ahnung
@Wolfgang Mix
ich kann Deiner Aussage nicht folgen, wenn es etwas anderes als 0 eingibt ist die Rechenoperation gültig, ansonsten landet er im Else-Zweig. Die nicht Initialisiere Variable c auszugeben ist in jedem Fall Blödsinn |
AW: ggT und KgV von 2 Zahlen berechnen - absolut keine Ahnung
Es funktioniert ja jetzt.
Mit Else hab ichs versucht, da werde ich aber nochmal dran arbeiten müssen, da das auch nicht hingehauen hat. |
AW: ggT und KgV von 2 Zahlen berechnen - absolut keine Ahnung
Punkt 1 - Die Fließkommazahlen: Lehrer behelfen sich da ganz einfach mit Real. Das liegt wohl daran, weil "Delphi for Kids" das eben auch macht. Nur leider ist Real sehr unbestimmt, in Bezug auf die Genauigkeit. Selbst bei D7 kommt die Hilfe bei Real nicht auf den Punkt, auf wie viele Stellen man sich verlassen kann. Außerdem gibt es neben Real noch den Real48. Um hier aufzuräumen würde ich auch Single, Double und Extended verwenden.
Punkt 2 - Der ELSE-Zweig: Ja bitte, welcher Fehler kommt denn diesmal? - Man wird dir leiden nicht helfen können, wenn man dein Problem nicht kennt. Das ist so ähnlich, wie wenn du zum Arzt gehst und sagst, du hättest Schmerzen. Daran kann auch der allerbeste Arzt leider nicht feststellen, wo deine Schmerzen sind und was du haben könntest. :glaskugel: Das kann von Kopfschmerzen bis Herzinfarkt gehen. Übertragen auf deinen Code heißt das: Du hast entweder einen Syntax-Fehler oder du hast in Delphi einen Bug entdeckt. Wobei ich mir letzteres nicht vorstellen kann. Zitat:
Zu der Frage mit Fließkommazahlen und der Null: Die Null ist ein exakt definierter Wert. Leider ist dieser Wert so exakt definiert, dass man ihn normalerweise nicht genau erreichen kann. Selbst wenn du sagst
Delphi-Quellcode:
, dann ist diese Variable noch lange noch nicht 0. Sie ist nur auf 22 Nachkommastellen genau 0. Danach ist sie ungleich 0. Deshalb sollte man für Vergleiche auf 0 die Funktion IsZero() verwenden.
Variable := 0.0;
Zitat:
Bernhard |
AW: ggT und KgV von 2 Zahlen berechnen - absolut keine Ahnung
Real ist, zumindest bei meinem D7, als Double definiert, und somit sehr gut dokumentiert ;). Real48 ist der alte Real aus TP Zeiten, den es rein dafür gibt, damit man Portierungen von altem TP Code der sich auf die 48 Bit verlässt nicht zu arg umschreiben muss, wenn man es nicht will. (Und die meisten Lehrer nehmen denke ich bevorzugt Real, weil sie diesen noch aus TP kennen.)
Man kann per Optionen umschalten als was Real definiert sein soll, Standard ist eben Double. Damit ist es nichts weiter als ein Alias. |
AW: ggT und KgV von 2 Zahlen berechnen - absolut keine Ahnung
Hat der Thread überhaupt noch was mit dem Titel zu tun??
|
AW: ggT und KgV von 2 Zahlen berechnen - absolut keine Ahnung
Ich hab Delphi 3.
Sobald ich es mit Else versucht habe ist es mit ner Fehlermeldung, sobald ich durch null teilen wollte in den Quellcode zurückgegangen, beim nächsten Programmstart stand der auszugebende Text bei einer Division durch null trotzdem im Ergebnisfeld. Jetzt läuft es optimal. Jetzt aber, wie mehrfach erwähnt Back to Topic.^^ Da ist halt das Problem, dass ich nicht weiß, wie genau ich anfangen soll, die Textfelder benennen, okay, aber danach? |
AW: ggT und KgV von 2 Zahlen berechnen - absolut keine Ahnung
Versuche es doch mal mit der umgekehrten Methode aus #
![]() Schreibe mit einfachen Worten auf, was du machen würdest, wenn du das von Hand löst. Ausgangspunkt sind die Informationen aus der Form (speziell die Eingabefelder). Hier mal ein Beispiel für einen Wecker, wo die Weckzeit in einem Edit-Feld
Delphi-Quellcode:
steht.
WeckZeit
Code:
In Delphi sieht das so aus
Umwandeln der Eingabe in WeckZeit in eine Uhrzeit, das merke ich mir in TempZeit
Ist TempZeit = AktuelleZeit dann Schreie ich den User an
Delphi-Quellcode:
Wenn man erst mit dieser Pseudo-Programmierung in Textform anfängt, dann kann man sehr schön den Ablauf definieren ohne einen Delphi-Befehl zu kennen.
TempZeit := StrToTime( WeckZeit.Text );
if TempZeit = Trunc( now ) then ShowMessage( 'WECKEN!' ); Bei der Umsetzung brauche ich dann nur zu recherchieren, wie man z.B. die aktuelle Zeit bekommt.
Delphi-Quellcode:
liefert mir den aktullen Zeitpunkt mit Datum und Zeit
now
Wir brauchen aber nur die aktuelle Zeit, das Datum würde uns hier stören. Wenn man jetzt weitersucht, dann bekommt man den Hinweis, dass ein Datum in Delphi aus einem Gleitkommawert besteht. Die Zahl vor dem Komma Zeit den Tag an, die Zahl hinter dem Komma die Uhrzeit. Ah, sehr schön, wir benötigen also nur den Nachkommaanteil von
Delphi-Quellcode:
und den bekommt man mit
now
Delphi-Quellcode:
Beide Informationen zusammengeführt ergeben
Trunc( X : Real )
Delphi-Quellcode:
liefert mir die aktuelle Uhrzeit
Trunc( now )
Genauso geht man bei der Programmierung vor. Nur dann ist man in der Lage eine konkrete Frage zu stellen. |
AW: ggT und KgV von 2 Zahlen berechnen - absolut keine Ahnung
Zitat:
Hört sich nach Schleife an. Wir wissen aber nicht wie viele Schleifendurchgänge notwendig sind. Daher kommt die
Delphi-Quellcode:
Schleife nicht in Betracht.
For to
Bleiben die
Delphi-Quellcode:
und die
repeat until
Delphi-Quellcode:
Schleifen zu Auswahl.
while do
Da wir mindestens einmal etwas berechnen müssen bietet sich die
Delphi-Quellcode:
Schleife an.
repeat until
Die Abbruchbedingung wird hier erst nach einem Schleifendurchlauf ermittelt. Abbruchbedingung, aus der Erklärung "bei dem sich Rest 0 ergibt".
Delphi-Quellcode:
Was soll gemacht werden: "eine Division mit Rest durchgeführt"
repeat
until rest = 0; Die Funktion die das in Delphi macht nennt sich ![]()
Delphi-Quellcode:
Die Berechnung bauen wir dann in die Schleife ein;
rest := zahl1 mod zahl 2;
Delphi-Quellcode:
Im nächsten Schritt soll dann zahl2 durch den rest geteilt werden.
repeat
rest := zahl1 mod zahl2; until rest = 0;
Delphi-Quellcode:
Bauen wir das Ganze nun in eine Funktion ein:
repeat
rest := zahl1 mod zahl2; zahl1 := zahl2; zahl2 := rest; until rest = 0;
Delphi-Quellcode:
Nun benötigt die Funktion noch eine Ausgabe/Rückgabewert.
function ggt(zahl1,zahl2: Integer):Integer;
var rest : Integer; begin repeat rest := zahl1 mod zahl2; zahl1 := zahl2; zahl2 := rest; until rest = 0; end; Wir benötigen den Divisior wenn die Division (zahl1 mod zahl2) den Rest 0 ergibt. Wir merken uns immer den Divisior (zahl2), wenn der rest = 0 ist wird result nicht mehr überschrieben.
Delphi-Quellcode:
Da eine Division durch Null nicht zulässig ist,
function ggt(zahl1,zahl2: Integer):Integer;
var rest : Integer; begin repeat result := zahl2; rest := zahl1 mod zahl2; zahl1 := zahl2; zahl2 := rest; until rest = 0; end; muss zahl2 auf 0 geprüft werden.
Delphi-Quellcode:
Ich hoffe der Lösungsweg ist einigermaßen verständlich.
function ggt(zahl1,zahl2: Integer):Integer;
var rest : Integer; begin if zahl2 > 0 then repeat result := zahl2; rest := zahl1 mod zahl2; zahl1 := zahl2; zahl2 := rest; until rest = 0 else result := 0; end; Grüße Klaus |
AW: ggT und KgV von 2 Zahlen berechnen - absolut keine Ahnung
Du haßt hier was vergessen, was sehr wichtig ist !
Man muß sicherstellen,dass der Divisor die kleinere Zahl ist. Auf Null überprüfen reicht nicht. PS. braucht man doch nicht .. mod ist in dem Sinne keine echte Division... Sie liefert ja lediglich die Restklasse .... |
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:51 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