AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein ggT und KgV von 2 Zahlen berechnen - absolut keine Ahnung
Thema durchsuchen
Ansicht
Themen-Optionen

ggT und KgV von 2 Zahlen berechnen - absolut keine Ahnung

Ein Thema von Connor Temple · begonnen am 16. Nov 2010 · letzter Beitrag vom 23. Nov 2010
Thema geschlossen
Seite 5 von 9   « Erste     345 67     Letzte »    
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.858 Beiträge
 
Delphi 11 Alexandria
 
#41

AW: ggT und KgV von 2 Zahlen berechnen - absolut keine Ahnung

  Alt 20. Nov 2010, 22:05
If trunc(b) <> 0 then
Markus Kinzler
 
Benutzerbild von Bummi
Bummi

Registriert seit: 15. Jun 2010
Ort: Augsburg Bayern Süddeutschland
3.470 Beiträge
 
Delphi XE3 Enterprise
 
#42

AW: ggT und KgV von 2 Zahlen berechnen - absolut keine Ahnung

  Alt 20. Nov 2010, 22:21
@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
Thomas Wassermann H₂♂
Das Problem steckt meistens zwischen den Ohren
DRY DRY KISS
H₂ (wenn bei meinen Snipplets nichts anderes angegeben ist Lizenz: WTFPL)
 
Benutzerbild von Connor Temple
Connor Temple

Registriert seit: 16. Nov 2010
89 Beiträge
 
#43

AW: ggT und KgV von 2 Zahlen berechnen - absolut keine Ahnung

  Alt 20. Nov 2010, 22:32
Es funktioniert ja jetzt.
Mit Else hab ichs versucht, da werde ich aber nochmal dran arbeiten müssen, da das auch nicht hingehauen hat.
 
Benutzerbild von rollstuhlfahrer
rollstuhlfahrer

Registriert seit: 1. Aug 2007
Ort: Ludwigshafen am Rhein
1.529 Beiträge
 
Delphi 7 Professional
 
#44

AW: ggT und KgV von 2 Zahlen berechnen - absolut keine Ahnung

  Alt 20. Nov 2010, 22:56
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. 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.

Es funktioniert ja jetzt.
Optimal?
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 Variable := 0.0; , 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.

If trunc(b) <> 0 then
Nein, das ist leider nicht richtig. Was ist, wenn du durch 0,5 teilen willst? Trunc(0,5) ist 0 und somit meinst du, du teilst durch 0, was absolut nicht richtig ist.

Bernhard
Bernhard
Iliacos intra muros peccatur et extra!
 
Medium

Registriert seit: 23. Jan 2008
3.686 Beiträge
 
Delphi 2007 Enterprise
 
#45

AW: ggT und KgV von 2 Zahlen berechnen - absolut keine Ahnung

  Alt 21. Nov 2010, 00:02
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.
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)
 
Benutzerbild von Bummi
Bummi

Registriert seit: 15. Jun 2010
Ort: Augsburg Bayern Süddeutschland
3.470 Beiträge
 
Delphi XE3 Enterprise
 
#46

AW: ggT und KgV von 2 Zahlen berechnen - absolut keine Ahnung

  Alt 21. Nov 2010, 00:17
Hat der Thread überhaupt noch was mit dem Titel zu tun??
Thomas Wassermann H₂♂
Das Problem steckt meistens zwischen den Ohren
DRY DRY KISS
H₂ (wenn bei meinen Snipplets nichts anderes angegeben ist Lizenz: WTFPL)
 
Benutzerbild von Connor Temple
Connor Temple

Registriert seit: 16. Nov 2010
89 Beiträge
 
#47

AW: ggT und KgV von 2 Zahlen berechnen - absolut keine Ahnung

  Alt 21. Nov 2010, 09:08
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?
 
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#48

AW: ggT und KgV von 2 Zahlen berechnen - absolut keine Ahnung

  Alt 21. Nov 2010, 10:46
Versuche es doch mal mit der umgekehrten Methode aus #31

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 WeckZeit steht.

Code:
Umwandeln der Eingabe in WeckZeit in eine Uhrzeit, das merke ich mir in TempZeit
Ist TempZeit = AktuelleZeit dann
  Schreie ich den User an
In Delphi sieht das so aus
Delphi-Quellcode:
TempZeit := StrToTime( WeckZeit.Text );
if TempZeit = Trunc( now ) then
  ShowMessage( 'WECKEN!' );
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.
Bei der Umsetzung brauche ich dann nur zu recherchieren, wie man z.B. die aktuelle Zeit bekommt.

now liefert mir den aktullen Zeitpunkt mit Datum und Zeit

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 now und den bekommt man mit Trunc( X : Real ) Beide Informationen zusammengeführt ergeben Trunc( now ) liefert mir die aktuelle Uhrzeit

Genauso geht man bei der Programmierung vor.
Nur dann ist man in der Lage eine konkrete Frage zu stellen.
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
 
Klaus01

Registriert seit: 30. Nov 2005
Ort: München
5.768 Beiträge
 
Delphi 10.4 Sydney
 
#49

AW: ggT und KgV von 2 Zahlen berechnen - absolut keine Ahnung

  Alt 21. Nov 2010, 15:54
Zitat:
Beim euklidischen Algorithmus wird in aufeinanderfolgenden Schritten jeweils eine Division mit Rest durchgeführt, wobei der Rest im nächsten Schritt zum neuen Divisor wird. Der Divisor, bei dem sich Rest 0 ergibt, ist der größte gemeinsame Teiler der Ausgangszahlen. Beispiel:
1071 : 1029 = 1 Rest 42
1029 : 42 = 24 Rest 21
24 : 21 = 2 Rest 0
Somit ist 21 der größte gemeinsame Teiler von 1071 und 1029.
Aus der Erklärung: "in aufeinanderfolgenden Schritten"
Hört sich nach Schleife an.
Wir wissen aber nicht wie viele Schleifendurchgänge notwendig sind.
Daher kommt die For to Schleife nicht in Betracht.

Bleiben die repeat until und die while do Schleifen zu Auswahl.

Da wir mindestens einmal etwas berechnen müssen bietet sich die repeat until Schleife an.
Die Abbruchbedingung wird hier erst nach einem Schleifendurchlauf ermittelt.

Abbruchbedingung, aus der Erklärung "bei dem sich Rest 0 ergibt".

Delphi-Quellcode:
repeat

until rest = 0;
Was soll gemacht werden: "eine Division mit Rest durchgeführt"
Die Funktion die das in Delphi macht nennt sich Delphi-Referenz durchsuchenmod.

rest := zahl1 mod zahl 2; Die Berechnung bauen wir dann in die Schleife ein;
Delphi-Quellcode:
repeat
  rest := zahl1 mod zahl2;
until rest = 0;
Im nächsten Schritt soll dann zahl2 durch den rest geteilt werden.
Delphi-Quellcode:
repeat
  rest := zahl1 mod zahl2;
  zahl1 := zahl2;
  zahl2 := rest;
until rest = 0;
Bauen wir das Ganze nun in eine Funktion ein:
Delphi-Quellcode:
function ggt(zahl1,zahl2: Integer):Integer;
var
  rest : Integer;
begin
  repeat
    rest := zahl1 mod zahl2;
    zahl1 := zahl2;
    zahl2 := rest;
  until rest = 0;
end;
Nun benötigt die Funktion noch eine Ausgabe/Rückgabewert.

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:
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;
Da eine Division durch Null nicht zulässig ist,
muss zahl2 auf 0 geprüft werden.

Delphi-Quellcode:
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;
Ich hoffe der Lösungsweg ist einigermaßen verständlich.

Grüße
Klaus
Klaus

Geändert von Klaus01 (21. Nov 2010 um 19:16 Uhr)
 
wolfgang_SV

Registriert seit: 9. Nov 2007
Ort: Neumünster
39 Beiträge
 
#50

AW: ggT und KgV von 2 Zahlen berechnen - absolut keine Ahnung

  Alt 21. Nov 2010, 16:18
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 ....

Geändert von wolfgang_SV (21. Nov 2010 um 16:44 Uhr)
 
Thema geschlossen
Seite 5 von 9   « Erste     345 67     Letzte »    


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:38 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz