Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Primzahlen (https://www.delphipraxis.net/155250-primzahlen.html)

Romiox 14. Okt 2010 15:07

Delphi-Version: 7

Primzahlen
 
Hallo zusammen!

Ich hab hier ein Stück Code das nicht macht was es soll, und so langsam glaub ich, dass ich gedanklich festgefahren bin.
Ich weiss, es gibt hier viele Threads zu dem Thema, aber erstens habe ich so meine Probleme anderer Leute Code zu lesen (Übungssache, nehm ich an^^)
und zweitens interessiert mich eigentlich mehr woran genau mein Code krankt, weniger der eigentlich Lösungsweg ;)

Delphi-Quellcode:
function isprime (a: integer): integer;  //soll testen ob a eine Primzahl ist
var
    b,i: integer;
begin
    if a <= 1 then                      // schließt erstmal 0, 1 und negative aus (einfacher ^^)
        isprime:=0
    else
        begin
        b:=a;
        isprime:=1;                     // setzt den Rückgabewert auf 1 (ist eine Primzahl)
        while b > 1 do
            begin
            b:=b-1;
            i:= a mod b;
            if i = 0 then               // setzt den Rückgabewert wieder auf null (ist keine Primzahl) wenn ohne Rest teilbar
                isprime=0
            end
        end
end;
BTW; sollte ich als Rückgabe einen Boolschen Wert nehmen? Setz ich den dann auf 0/1 oder auf True/False?

Ich bin dankbar für jeden Kommentar zum Thema, hauptsächlich will ich aber wissen was ich falsch gemacht hab, nicht wies richtig geht :)

DeddyH 14. Okt 2010 15:11

AW: Primzahlen
 
Hallo und Willkommen in der DP :dp:,

Boolean als Rückgabewert wäre wirklich angebrachter, da es ja nur 2 Möglichkeiten gibt. Dein Fehler ist, dass die Schleife auch dann weiterläuft, wenn das Ergebnis bereits feststeht, dadurch wird dieses wieder überschrieben.

Romiox 14. Okt 2010 15:23

AW: Primzahlen
 
Danke für die schnelle Antwort :) ( :dp: /agree )

Ich bin nicht überzeugt ^^
Mal abgesehen von der Tatsache, das die Rückgabe Boolean sein sollte.

Mein Problem ist, das mir das Programm so immer 0 zurückgibt. Ja, die Schleife läuft weiter
(nicht unbedingt effektiv.. Jaja :) ) aber würde ja maximal wieder eine 0 setzen, das Ergebnis also
nicht verändern. Mein erster Gedanke war, das er noch durch 1 teilt, aber eigentlich sollte der Algorithmus
vorher terminieren (
Delphi-Quellcode:
while b > 1
).

Zum Thema Abbruch: Ein exit innerhalb der if-Verzweigung würde nur die Funktion abbrechen und den festgelegtenm Wert zurückgeben, oder?

ho.sch 14. Okt 2010 15:27

AW: Primzahlen
 
Dein while-Konstrukt wird einmal zu oft durchlaufen. Für den Durchlauf mit b=2 bekommst Du dann immer eine nicht-prime Zahl gemeldet, weil Du danach ja noch 1 subtrahierst ...

Romiox 14. Okt 2010 15:31

AW: Primzahlen
 
Hmm, :headdesk: gibts nicht? :lol:

Ja, danke. War meine Überlegung nicht so falsch, nur nicht ganz konsequent.

Danke auch beiden!

DeddyH 14. Okt 2010 15:31

AW: Primzahlen
 
Stimmt, hast Recht. Beim Debuggen ist es mir aufgefallen: Du hast als Bedingung b > 1, ziehst aber innerhalb der Schleife wieder 1 ab, so dass Du immer durch 1 teilst.

[edit] Wo war der rote Kasten? [/edit]

Romiox 14. Okt 2010 15:37

AW: Primzahlen
 
Roter Kasten? *confused*

Aber dank euch ists jetzt Version 1.1 ;D

DeddyH 14. Okt 2010 15:40

AW: Primzahlen
 
[OT] Der rote Kasten kommt normalerweise, wenn Du einen Beitrag senden willst, nachdem zwischenzeitlich bereits anderweitig im Thread geantwortet wurde. Du kannst dann überprüfen, ob Du wirklich noch neue Inhalte beisteuern kannst. [/OT]

[edit] Ich konnte es nicht lassen und habe Deine Funktion einmal etwas verkürzt:
Delphi-Quellcode:
function isprime(a: integer): Boolean; //soll testen ob a eine Primzahl ist
var Teiler: integer;
begin
  Result := a > 1;
  Teiler := Pred(a);
  while Result and (Teiler > 1) do
    begin
      Result := a mod Teiler <> 0;
      dec(Teiler);
    end;
end;
[/edit]

generic 14. Okt 2010 15:59

AW: Primzahlen
 
btw. auf dem T-Shirt was auf dem Delphi-Tagen 2010 verteilt wurde, ist etwas Quelltext, der Primzahlen berechnet - das sogar multithreaded.

implementation 14. Okt 2010 17:12

AW: Primzahlen
 
Zitat:

Zitat von Romiox (Beitrag 1055814)
Hmm, :headdesk: gibts nicht?

Meinst du :wall:?


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:58 Uhr.
Seite 1 von 2  1 2      

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