Hallo Claudia,
function pruefen (zahl: Integer):Boolean;
VAR i, test: Integer;
begin
i := 1;
pruefen := true;
repeat
i := i+1;
test := zahl mod i;
if test = 0 then pruefen := false;
//die Schleife wird so lange durchlaufen, bis i gleich zahl
ist,
//oder ein Teiler gefunden wurde
until ((i = zahl-1) or (pruefen = false));
end;
das „pruefen“ in der „until“-Zeile ist doppeldeutig.
Bedeutung 1: Die Speicherstelle, in der das Ergebnis der
Funktion abgelegt wird (wäre beim Delphi-Compiler äquivalent
zu „Result“); Bedeutung 2: Der Bezeichner der von Dir
geschriebenen Funktion „pruefen“. Hängt vom Compiler ab, wie
derselbe das interpretiert.
Also in der Hilfe hab ich gelesen, dass er das innerhalb der Funktion als normale Variable nutzt und erst außerhalb als Funktionsaufruf.
Von einem guten Compiler würde
ich fast erwarten, dass er diese Zeile anmeckert. Aber egal –
wegen dieser Doppeldeutigkeit ist die Zeile in jedem Fall
faul. So programmiert man einfach nicht.
Mein Vorschlag:
function ZahlIstPrim (zahl: Integer): Boolean;
VAR
i: Integer;
teilergefunden: Boolean;
begin
i := 1;
teilergefunden := false;
repeat
i := i+1;
teilergefunden := ((zahl mod i) = 0);
until (i = zahl-1) or teilergefunden;
ZahlIstPrim := not teilergefunden
end;
Den Kommentar hab ich gelöscht, weil die „until“-Zeile hier m.
E. nach keinen mehr benötigt. In der letzten Zeile findet die
„Ergebniszuweisung“ statt. Um Bugs von vornherein zu
vermeiden, empfiehlt es sich, das immer so zu machen.
Ok, ich merk es mir und ändere die anderen Funktionen.
Falls
Du mit Delphi programmierst, kannst Du das „ZahlIstPrim“ auch
noch durch „Result“ ersetzen.
wo ist der Unterschied zwischen Result und Funktionsname?
Und noch ein Hinweis: Die Funktion liefert für das Argument 2
ein falsches Ergebnis zurück, nämlich false, obwohl 2 eine
Primzahl ist.
Danke für den Hinweis. Ich schau mal, was ich da machen kann.
Außerdem ist diese Funktion sehr ineffizient. Es reicht, i in
Zweierschritten hochzuzählen, denn wenn man weiß, dass
eine Zahl nicht durch 2 teilbar ist, dann ist es unsinnig, sie
noch auf Teilbarkeit durch 8 oder 56 oder 292 oder irgendeine
andere gerade Zahl zu testen.
Tolle Idee. Dann prüf ich erst, ob sie gerade ist, dann fang ich ab 3 an in 2-er Schritten zu zählen, und zum Schluss prüfe ich, ob es sich um die Drei handelt, weil er dann bei der drei false zurückgeben würde.
Außerdem muss i nicht bis zahl
- 1 laufen, sondern nur bis zur Quadratwurzel von zahl
(Funktion „sqrt“). Denn wenn die Zahl einen Teiler größer als
√zahl hat, dann wäre der zugehörige andere Teiler
kleiner als √zahl und wäre schon gefunden worden.
Auf die Idee bin ich gar nicht gekommen. Danke auch dir.
Gruß
Martin
Gruß Claudia.