Entwickler-Ecke
Delphi Language (Object-Pascal) / CLX - Primzahlanzeige
paperwings - Do 18.11.10 22:32
Titel: Primzahlanzeige
Hey Leute, ein Freund und ich entwickeln ein Programm, mit dem man durch die eingabe einer Zahl herausfindet ob es eine Primzahl ist oder nicht.
->
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44:
| unit prim;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;
type TForm1 = class(TForm) LTitel: TLabel; LFrage: TLabel; EPrimzahl: TEdit; BBerechne: TButton; procedure BBerechneClick(Sender: TObject); private public end;
var Form1: TForm1; p_primzahl: boolean;
implementation
procedure Primzahlprobe_1 (p_Zahl:integer;var p_primzahl:boolean); var teiler:integer; begin p_primzahl := true; FOR teiler := 2 TO (p_Zahl-1) DO IF (p_Zahl MOD teiler) = 0 THEN p_primzahl := false end; {$R *.dfm}
procedure TForm1.BBerechneClick(Sender: TObject); begin Primzahlprobe_1; p_primzahl.Text := IntToFloat ;
end;
end. |
Wir bekommen leider den Fehler 'nicht genügend wirkliche Parameter' angezeigt, wissen aber nicht was wir falsch gemacht haben, kann uns jemand helfen?
LG
Moderiert von
Christian S.: Topic aus Gemeinschaftsprojekte verschoben am Do 18.11.2010 um 21:37
Moderiert von
Christian S.: Delphi-Tags hinzugefügt
Delete - Do 18.11.10 22:41
Das ist jetzt nicht dein Ernst oder? Du schreibst die Funktion selber und kannst sie nicht aufrufen?
Prozedur: procedure Primzahlprobe_1 (p_Zahl:integer;var p_primzahl:boolean);
Dein Aurfruf: Primzahlprobe_1;
Und warum so umständlich mir dem var-Parameter? Da bietet sich doch eigentlich eine Funktion an.
jaenicke - Do 18.11.10 22:42
Hallo und :welcome:
Außerdem:
paperwings hat folgendes geschrieben : |
Delphi-Quelltext 1:
| p_primzahl.Text := IntToFloat ; | |
Was soll denn IntToFloat machen (wenn es das geben würde)? Eine Zahl in eine Zahl umwandeln? :gruebel:
paperwings - Do 18.11.10 22:46
Ja sry ich bin totaler Neuling haben das grade ind er schule und ich verstehs ehrlich egsagt kaum :D
Kann mir eienr genau sagen was ich machen soll?
paperwings - Do 18.11.10 22:52
Ja dann bedank ich mich ich werd mich da mal durcharbeiten...
Delphi-Laie - Fr 19.11.10 20:07
Auch wenn Du Neuling bist (aller Anfang ist schwer), so möchte ich doch auf drei wahrlich grottenschlechte Dinge gleich hinweisen (die man nämlich auch, wenn man das ganze "manuell" bzw. "zu Fuß" berechnen würde, nie täte bzw. besser unterlassen sollte):
paperwings hat folgendes geschrieben : |
Delphi-Quelltext 1: 2:
| FOR teiler := 2 TO (p_Zahl-1) DO IF (p_Zahl MOD teiler) = 0 THEN p_primzahl := false | |
1. Es ist nicht nötig, den Divisor bis p_zahl-1, sondern nur bis zur Wurzel der Zahl laufen zu lassen.
2. Der kleinste Divisor ist 2 (gerade Primzahl, das kann man allerdings mit der Delphi-Funktion "odd" auch herausbekommen), der nächstkleinste bzw. nächstkleinere wäre 3 und dann der nächstsinnvolle die 5 (denn es gibt nach der 2 keine geraden Primzahlen mehr), und dann den Divisor gleich in 2er-Schritten laufen zu lassen (7, 9 usw. auch wenn in der Menge der ungeraden natürlichen Zahlen immer weniger Primzahlen enthalten sind, je höher man kommt).
3. Das ganze ist in einer bedingungsbehafteten Schleife (while-do oder repeat-until) besser als in einer Zählschleife aufgehoben, weil die Nichtprimeigenschaft ja in einem der Schleifendurchläufe festgestellt werden kann und dann weitere Schleifendurchläufe überflüssig sind.
F34r0fTh3D4rk - Sa 20.11.10 02:01
4. Offensichtlich geht das mit einem
probabilistischem Algorithmus [
http://de.wikipedia.org/wiki/AKS-Primzahltest#Der_Algorithmus] sogar in polynomieller Laufzeit.
Was ich damit sagen will, ist dass ich von einem Programmier-Anfänger solche Optimierungen nicht erwarten würde. Schon gar nicht wenn der Algorithmus noch nicht einmal kompiliert. Als "wahrlich grottenschlecht" würde ich das also nicht bezeichnen. Schön wäre es natürlich, wenn die Schleife abbricht, sobald feststeht, dass es keine Primzahl sein kann, aber zunächst zählt nun mal nur das Ergebnis.
Die von dir genannten Optimierungen machen bei Betrachtung des asymptotischen Verhaltens auch gar nicht so viel aus (auch wenn es hier vermutlich nicht um riesige Primzahlen geht), aber als Anfänger setzt man sich nun mal nicht mit Laufzeiten auseinander, außer vielleicht man ist Mathematiker. :roll:
Delphi-Laie - Di 23.11.10 00:11
Na, das wäre von mir aber nicht gekommen, denn das war mir neu.
Allerdings steht dort bereits am Artikelanfang, daß es sich um einen
deterministischen Algorithmus handelt. Wenn man sich schon auf dieses Amateurlexikon bezieht, dann muß so etwas substantielles unbedingt und richtig mit entnommen werden.
F34r0fTh3D4rk hat folgendes geschrieben : |
| Die von dir genannten Optimierungen machen bei Betrachtung des asymptotischen Verhaltens auch gar nicht so viel aus (auch wenn es hier vermutlich nicht um riesige Primzahlen geht), aber als Anfänger setzt man sich nun mal nicht mit Laufzeiten auseinander, außer vielleicht man ist Mathematiker. :roll: |
Man muß kein Mathematiker sein, um auch für einen Nichtmathmatiker erkennbar unsinnige Divisionen auszuschließen.
Die Anzahl der Divisionen zunächst zu halbieren und dann auch noch - im Vergleich zur vorigen Anzahl - auf die (Quadrat-)Wurzel zu beschränken, mögen zwar vom Aspekt der Komplexität(sklasse) her keine Größenordnungen sein (beides polynomial, also kein Wechsel der Komplexitätsklasse), sind aber - wie im übrigen alle Optimierungen - durchaus relevant, können erheblich sein und bis auf riesige Unterschiede anwachsen.
Xion - Di 23.11.10 12:39
paperwings hat folgendes geschrieben : |
Delphi-Quelltext 1: 2: 3: 4: 5:
| p_primzahl: boolean;
[...]
p_primzahl.Text := IntToFloat ; | |
Dir ist schon klar, was ein boolean ist? :D
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!