Autor Beitrag
luckyluc
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 103



BeitragVerfasst: Do 08.01.09 21:31 
Hallo!
Ich bin neu hier und habe eine Frage an euch.
Wir sollen in der Schule ein Programm entwickeln, eo man eine gewisse Zahl eingibt und das Programm dann alle Primzahlen bis zu dieser Zahl ausgegeben werde. Ich weiß, dass bereits viele Themen hier darüber handeln habe so versucht mir zu helfen. Dies ist mir jedoch nicht gelungen. Deshalb zeige ich einfach ma meinen quelltext. ich glaub dass es total falsch ist, ich komme jedoch nicht auf den Fehler. Vlt. könnt ihr mir helfen. Bitte versteht mich nicht falsch, ihr sollt mir nicht einen Quelltext vorgeben, denn ich möchte einen selbst "entwickeln" und dabei entwas lernen :
ausblenden 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:
var
  Form1: TForm1;
  i, bel_zahl, teiler : Integer;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
bel_zahl:= StrToInt (Edit1.Text);
i:=0;
while i < bel_zahl do
begin
inc (i);
if i mod 2 = 1 then
begin
repeat
teiler:= 2;
inc (teiler);
until i mod teiler = 1;
if i mod teiler = 1 then StringGrid1.Cells[0,0]:= IntToStr(i);
end;
end;
end;
end.

Bitte habt Verständnis für meien simplen Quelltext, vlt. auch zu banalen Quelltext (wir hatten noch keine arrays und sonstige sachen).

Ich bedanke mch bei euch für eure hoffentlichen regen Antworten.

Moderiert von user profile iconNarses: Delphi-Tags hinzugefügt
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19315
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Do 08.01.09 21:47 
Hallo und :welcome:

Du solltest deinen Quelltext im Forum in Delphi-Tags setzen. Dann sieht der auch aus wie Delphi-Quelltext:
ausblenden Quelltext
1:
<span class="inlineSyntax"><span class="codecomment">{PROTECTTAG392f9bbdd22c11e32cee508830319298}</span></span>					


user profile iconluckyluc hat folgendes geschrieben Zum zitierten Posting springen:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
repeat
  teiler := 2;
  Inc (teiler);
until i mod teiler = 1;
Überlege mal was passiert. :gruebel:
teiler wird auf 2 gesetzt. teiler wird um eins erhöht. Bei until ist teiler also immer 3. Und jetzt läuft die Schleife bis i nicht durch 3 teilbar ist. Wenn es aber durch 3 teilbar ist, dann ist das eine Endlosschleife.
jfheins
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 918
Erhaltene Danke: 158

Win 10
VS 2013, VS2015
BeitragVerfasst: Do 08.01.09 22:45 
Schau dir mal das Sieb des Eratosthenes (de.wikipedia.org/wik...ieb_des_Eratosthenes) an ;)

Das ist ein einfacher, aber dennoch effizienter Algorithmus, um alle Primzahlen von 2 bis n zu ermitteln ;)
Horst_H
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1654
Erhaltene Danke: 244

WIN10,PuppyLinux
FreePascal,Lazarus
BeitragVerfasst: Fr 09.01.09 00:04 
Hallo,

das Sieb des Eratosthenes wäre ja nur mit Feldern zu lösen.

Aber es fehlen noch ein paar Dinge:
Alle Primzahlen ausser der zwei sind ungerade.
Ungerade Zahlen sind in Pascal mittels der Funktion ODD leicht zu testen.

Ein echter Teiler einer natürlichen Zahl n hat als Ergebnis von N mod TeilerVonN die 0, teilt also ohne Rest.
Bei Dir also:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
//Falls i ungerade
IF ODD(I) then
  begin....

//Falls Teiler Faktor von i ist
IF ( i mod Teiler = 0then
  i = keine Primzahl
//oder anders mit 
var
  //....
   KeinePrim : boolean 
//...
  KeinePrim := (i Mod Teiler)= 0

Dann man einfach solange prüfen, bis Teiler < i ist, denn i ist der letzte Teiler bei der eine natürliche Zahl herauskommt, nämlich die 1 Rest 0 .
Diese Abbruchbedingung fehlt bei Dir.
Du erhöhst den Teiler bis zum SNT (siehe SanktNimmerleinsTag )
Aber muss man bis Teiler= i-1 testen?.
Eine zusammengesetzte Zahl besteht mindestens aus zwei Faktoren.
Also i = a * b.
Ich setze mal voraus, das a<= b ist, sonst tauschen sie ihre Namen.
Wie lange kann ich a erhöhen, sodass b immer größer gleich a ist?
i = a * b => b = i/a,
wenn a= 1 ist b= i und bei a=b ist i = a*b = a*a
würde ich jetzt a erhöhen muss b < a sein und diese Zahl ist ja vorher getestet worden.

Lange Rede keinen Sinn.
Du musst nur solange bis (Teiler*Teiler > i ) oder KeinePrim testen.

Gruß Horst.
luckyluc Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 103



BeitragVerfasst: Fr 09.01.09 16:44 
Hallo
danke erstmal für eure Antworten. Das mit der Endlosschleife hab ich behoben. Das Programm wir kompiliert und wenn man eine Primzahl eingibt wird diese ausgegeben.Jedoch werden die anderen Prinzahlen nicht ausg. (Z.B. ich gebe 17 ein, gibt mir nur 17 aus, müsste eigentl. auch 5,11,13 ausgeen). 2.Problem wenn ich eine gerade zahl z.B. 20 eingebe, gibt das Programm gar nichts aus. (müsste die oben genannte Primzahlen ausgben). ich glaub, dass ich gar keine wirkliche äußere und innere schleife gemacht habe. (dies sollten wir aber). Vlt. könnt ihr mir (wieder) helfen.
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
procedure TForm1.Button1Click(Sender: TObject);
begin
bel_zahl:= StrToInt (Edit1.Text);
i:=0;
teiler:= 2;
while i < bel_zahl do

inc (i);

if i mod 2 = 1 then 

repeat
inc (teiler);
until (i mod teiler = 1or (i mod teiler = 0);

if i mod teiler = 1 then StringGrid1.Cells[0,0] := IntToStr(i);
end;

end.

Danke! :)
jfheins
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 918
Erhaltene Danke: 158

Win 10
VS 2013, VS2015
BeitragVerfasst: Fr 09.01.09 17:09 
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
procedure TForm1.Button1Click(Sender: TObject);
begin
bel_zahl:= StrToInt (Edit1.Text);
i:=0;
teiler:= 2// muss in die While Schleife
while i < bel_zahl do // kannst du auch ne for-schleife draus machen

inc (i);

if i mod 2 = 1 then // unnötig, aber macht nichts

repeat
inc (teiler); 
until (i mod teiler = 1or (i mod teiler = 0);

if i mod teiler = 1 then StringGrid1.Cells[0,0] := IntToStr(i);
end;// ^^^^^^ Da wird immer dfie erste Zelle überschriben 

end.


Ich würde es so machen:
ausblenden 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:
procedure TForm1.Button1Click(Sender: TObject);
var
  i,j: Integer;
  prim: Boolean;
begin
bel_zahl:= StrToInt (Edit1.Text);

for i := 2 to bel_zahl do
begin
  prim := true;

  for j := 2 to i - 1 do
    if i mod j = 0 then
    begin
      prim := false;
      break;
    end;

  if (prim)
    Memo1.Lines.Add(inttostr(i));
end;

end.
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19315
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Fr 09.01.09 17:15 
@user profile iconjfheins: Bei dir fehlt ein end;, das fehlende begin hast du automatisch geschrieben. ;-)

user profile iconluckyluc hat folgendes geschrieben Zum zitierten Posting springen:
ich glaub, dass ich gar keine wirkliche äußere und innere schleife gemacht habe. (dies sollten wir aber).
Das hast du ja auch nicht, vielleicht wird das deutlicher, wenn ich deinen Quelltext richtig einrücke. ;-)
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
procedure TForm1.Button1Click(Sender: TObject);
begin
  bel_zahl := StrToInt(Edit1.Text);
  i := 0;
  teiler := 2;

  while i < bel_zahl do
    inc (i);
  // Hier ist deine Schleife zu Ende

  if i mod 2 = 1 then 
    repeat
      inc (teiler);
    until (i mod teiler = 1or (i mod teiler = 0);

  if i mod teiler = 1 then
    StringGrid1.Cells[0,0] := IntToStr(i);
end;

end.
Wenn du mehrere Befehle in eine Schleife legen willst, musst du begin..end benutzen:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
  while i < bel_zahl do
  begin
    inc (i);

    if i mod 2 = 1 then 
      repeat
      ...
  end;

Eine Antwort hat user profile iconjfheins ja derweil geschrieben, deshalb schreibe ich mal erstmal nicht weiter. Dort fehlt nur nach Zeile 21 ein weiteres end; ;-).
baka0815
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 489
Erhaltene Danke: 14

Win 10, Win 8, Debian GNU/Linux
Delphi 10.1 Berlin, Java, C#
BeitragVerfasst: Fr 09.01.09 17:28 
Wobei es natürlich reicht zu prüfen ob (die zu testende Zahl mod (2 bis (zu testende Zahl / 2))) 0 ergibt, da eine Zahl nicht durch eine Zahl größerer ihrer eigenen Hälfte teilbar sein kann.

Beispiele:
5 / 3
7 / 4
10 / 6
etc.
jfheins
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 918
Erhaltene Danke: 158

Win 10
VS 2013, VS2015
BeitragVerfasst: Fr 09.01.09 17:32 
Es reicht aus, Zahlen bis zur Wurzel(zahl) zu prüfen, da alles über Wurzel(Zahl) einen Faktor unterhalb von Wurzel(zahl) braucht, damit das Produkt Zahl ergibt.

Aber das würde es noch komplizierter machen ;) (Man müsste z.B. noch Math einbinden ...)

Bei der 60 z.B. reicht es, bis wurzel(60) = 7 zu prüfen ;)

alles darüber wie z.B. 10 ergibt nur in der Kombination 10 * 6 = 60 und die 6 wurde ja bereits geprüft ;)
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19315
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Fr 09.01.09 17:36 
user profile iconjfheins hat folgendes geschrieben Zum zitierten Posting springen:
Aber das würde es noch komplizierter machen ;) (Man müsste z.B. noch Math einbinden ...)
Müsste man nicht. ;-)
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
// statt
if i <= Sqrt(Zahl) then

// teste doch einfach das, das ist sowieso viel schneller:

if i * i <= Zahl then
;-)
Xentar
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2077
Erhaltene Danke: 2

Win XP
Delphi 5 Ent., Delphi 2007 Prof
BeitragVerfasst: Fr 09.01.09 17:45 
user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
// statt
if i <= Sqrt(Zahl) then

// teste doch einfach das, das ist sowieso viel schneller:

if i * i <= Zahl then
;-)

nicht, wenn man sich einmal zu Beginn (außerhalb der Schleife) die Wurzel merkt, und dann nur noch damit vergleicht ;) *haare spalt*

_________________
PROGRAMMER: A device for converting coffee into software.
luckyluc Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 103



BeitragVerfasst: Sa 10.01.09 14:10 
Hallo
also ersteinmal nochmal an fettes DANKE an ALLE!
also ich hab jetzt den vorschlag von jfheins übernommen und noch ein wenig ummodelliert und vestanden! es funktioniert jetzt.
jedoch bin ich traurig :( , weil ich meine version gar nicht zu laufen bekomme, trotz eure vielen hilfreichen vorschläge. hab jeweil noch begin und end gesetzt und versch. andere vorschläge von euch mit eingebaut, funkt. jedoch nicht. denke dass, ich einen kompletten denkfehler bei meiner version habe. Naja!
Vielleicht hat noch jemand eine Idee , wie ich einen Timer einbauen kann. Also der Timer slls anzeigen wie lange er benötigt hat um alle primzahlen zu finden.
Danke!
Marc.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1876
Erhaltene Danke: 129

Win 8.1, Xubuntu 15.10

BeitragVerfasst: Sa 10.01.09 14:21 
user profile iconluckyluc hat folgendes geschrieben Zum zitierten Posting springen:
Vielleicht hat noch jemand eine Idee , wie ich einen Timer einbauen kann. Also der Timer slls anzeigen wie lange er benötigt hat um alle primzahlen zu finden.
Danke!

Sowas macht man nicht mit einem Timer, sonder mit GetTickCount oder alternativ mit QueryPerformanceCounter. :zwinker:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
var
  t1, t2, freq: Int64;
           res: Extended;
begin
  QueryPerformanceCounter(t1);
  // Code
  QueryPerformancrCounter(t2);
  QueryPerformanceFrequency(freq);
  res := (t2 - t1) / freq * 1000// ergibt die benötigte Zeit in ms

Grüße,
Marc
luckyluc Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 103



BeitragVerfasst: Sa 10.01.09 14:36 
und wo finde ich diesen queryperfomanecounter in der benutzeroberfläche von delphi?
wo muss dieser quellltext hin den du geschr. hast?
und wo gint er dann die zeit aus (muss ich dafür z.b. ein editfeld einfügen)?
danke
Marc.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1876
Erhaltene Danke: 129

Win 8.1, Xubuntu 15.10

BeitragVerfasst: Sa 10.01.09 14:41 
Am besten machst du dafür einen eigenen Thread auf, da das mit dem eigentlichen Thema ja nichts mehr zu tun hat. ;)
Aber vorab, es handelt sich dabei nicht um eine Komponente, sondern um eine Windowsfunktion, die dir über die Unit Windows bereitgestellt wird.
Horst_H
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1654
Erhaltene Danke: 244

WIN10,PuppyLinux
FreePascal,Lazarus
BeitragVerfasst: Sa 10.01.09 15:48 
Hallo,

@luckyluc:
Zitat:
jedoch bin ich traurig , weil ich meine version gar nicht zu laufen bekomme, trotz eure vielen hilfreichen vorschläge. hab jeweil noch begin und end gesetzt und versch. andere vorschläge von euch mit eingebaut, funkt. jedoch nicht. denke dass, ich einen kompletten denkfehler bei meiner version habe. Naja!

poste doch deinen Quelltext, damit man mal darüber schauen kann, was jetzt nicht funktioniert, bevor man die Zeit für was auch immer stoppt.
( Wielange das Programm nicht funktioniert :gruebel: )
Gruß Horst
luckyluc Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 103



BeitragVerfasst: Sa 10.01.09 20:17 
danke ihr habt mir weiter geholfen