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
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  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-1DO
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 user profile iconChristian S.: Topic aus Gemeinschaftsprojekte verschoben am Do 18.11.2010 um 21:37
Moderiert von user profile iconChristian 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:
user profile iconpaperwings hat folgendes geschrieben Zum zitierten Posting springen:

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?


jaenicke - 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...
http://crashkurs.christian-stelzmann.de
und die neue Version speziell ab Turbo Delphi:
http://www.christian-stelzmann.de/index_tutorials_crashkurs_reloaded.html

Speziell den Teil zu Prozeduren und Funktionen:
http://www.christian-stelzmann.de/artikel/CrashkursReloaded/#_Toc180058867


Dude566 - Do 18.11.10 22:50

Hier solltest du mal dringend schauen: http://www.christian-stelzmann.de/artikel/crashkurs.htm

Edit: zu langsam :x


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):

user profile iconpaperwings hat folgendes geschrieben Zum zitierten Posting springen:

Delphi-Quelltext
1:
2:
FOR teiler := 2 TO (p_Zahl-1DO
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

user profile iconF34r0fTh3D4rk hat folgendes geschrieben Zum zitierten Posting springen:
4. Offensichtlich geht das mit einem probabilistischem Algorithmus [http://de.wikipedia.org/wiki/AKS-Primzahltest#Der_Algorithmus] sogar in polynomieller Laufzeit.


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.

user profile iconF34r0fTh3D4rk hat folgendes geschrieben Zum zitierten Posting springen:
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

user profile iconpaperwings hat folgendes geschrieben Zum zitierten Posting springen:


Delphi-Quelltext
1:
2:
3:
4:
5:
  p_primzahl: boolean;

[...]

p_primzahl.Text := IntToFloat ;


Dir ist schon klar, was ein boolean ist? :D