| Autor |
Beitrag |
paperwings
Hält's aus hier
Beiträge: 3
|
Verfasst: Do 18.11.10 22:32
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.
->
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
|
|
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: 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
      
Beiträge: 19346
Erhaltene Danke: 1754
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Do 18.11.10 22:42
|
|
paperwings 
Hält's aus hier
Beiträge: 3
|
Verfasst: Do 18.11.10 22:46
Ja sry ich bin totaler Neuling haben das grade ind er schule und ich verstehs ehrlich egsagt kaum
Kann mir eienr genau sagen was ich machen soll?
|
|
jaenicke
      
Beiträge: 19346
Erhaltene Danke: 1754
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Do 18.11.10 22:49
Die Parameter an die Prozedur übergeben, die diese bekommen soll.
Und wenn du nicht weißt was das ist, dann lese einmal die ersten Seiten hiervon...
crashkurs.christian-stelzmann.de
und die neue Version speziell ab Turbo Delphi:
www.christian-stelzm...shkurs_reloaded.html
Speziell den Teil zu Prozeduren und Funktionen:
www.christian-stelzm...oaded/#_Toc180058867
|
|
Dude566
      
Beiträge: 1592
Erhaltene Danke: 79
W8, W7 (Chrome, FF, IE)
Delphi XE2 Pro, Eclipse Juno, VS2012
|
Verfasst: Do 18.11.10 22:50
Hier solltest du mal dringend schauen: www.christian-stelzm...rtikel/crashkurs.htm
Edit: zu langsam 
_________________ Es gibt 10 Gruppen von Menschen: diejenigen, die das Binärsystem verstehen, und die anderen.
|
|
paperwings 
Hält's aus hier
Beiträge: 3
|
Verfasst: Do 18.11.10 22:52
Ja dann bedank ich mich ich werd mich da mal durcharbeiten...
|
|
Delphi-Laie
      
Beiträge: 1600
Erhaltene Danke: 232
Delphi 2 - RAD-Studio 10.1 Berlin
|
Verfasst: 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
      
Beiträge: 5284
Erhaltene Danke: 27
Win Vista (32), Win 7 (64)
Eclipse, SciTE, Lazarus
|
Verfasst: Sa 20.11.10 02:01
4. Offensichtlich geht das mit einem probabilistischem 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. 
Für diesen Beitrag haben gedankt: Kha
|
|
Delphi-Laie
      
Beiträge: 1600
Erhaltene Danke: 232
Delphi 2 - RAD-Studio 10.1 Berlin
|
Verfasst: 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.  |
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
      

Beiträge: 1952
Erhaltene Danke: 128
Windows XP
Delphi (2005, SmartInspect), SQL, Lua, Java (Eclipse), C++ (Visual Studio 2010, Qt Creator), Python (Blender), Prolog (SWIProlog), Haskell (ghci)
|
Verfasst: Di 23.11.10 12:39
_________________ a broken heart is like a broken window - it'll never heal
In einem gut regierten Land ist Armut eine Schande, in einem schlecht regierten Reichtum. (Konfuzius)
|
|
|