Entwickler-Ecke
Sonstiges (Delphi) - Alle Primzahlen in einem best. Breich ausgeben
luckyluc - Do 08.01.09 21:31
Titel: Alle Primzahlen in einem best. Breich ausgeben
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 :
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
Narses: Delphi-Tags hinzugefügt
jaenicke - Do 08.01.09 21:47
Titel: Re: Alle Primzahlen in einem best. Breich ausgeben
Hallo und :welcome:
Du solltest deinen Quelltext im Forum in Delphi-Tags setzen. Dann sieht der auch aus wie Delphi-Quelltext:
Quelltext
1:
| <span class="inlineSyntax"><span class="codecomment">{PROTECTTAG392f9bbdd22c11e32cee508830319298}</span></span> |
luckyluc hat folgendes geschrieben : |
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.
Horst_H - 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:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13:
| IF ODD(I) then begin....
IF ( i mod Teiler = 0) then i = keine Primzahl 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 - 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.
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 = 1) or (i mod teiler = 0);
if i mod teiler = 1 then StringGrid1.Cells[0,0] := IntToStr(i); end;
end. |
Danke! :)
jfheins - Fr 09.01.09 17:09
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 = 1) or (i mod teiler = 0);
if i mod teiler = 1 then StringGrid1.Cells[0,0] := IntToStr(i); end; end. |
Ich würde es so machen:
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 - Fr 09.01.09 17:15
@
jfheins: Bei dir fehlt ein end;, das fehlende begin hast du automatisch geschrieben. ;-)
luckyluc hat folgendes geschrieben : |
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. ;-)
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); if i mod 2 = 1 then repeat inc (teiler); until (i mod teiler = 1) or (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:
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
jfheins ja derweil geschrieben, deshalb schreibe ich mal erstmal nicht weiter. Dort fehlt nur nach Zeile 21 ein weiteres end; ;-).
baka0815 - 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 - 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 - Fr 09.01.09 17:36
jfheins hat folgendes geschrieben : |
Aber das würde es noch komplizierter machen ;) (Man müsste z.B. noch Math einbinden ...) |
Müsste man nicht. ;-)
Delphi-Quelltext
1: 2: 3: 4: 5: 6:
| if i <= Sqrt(Zahl) then
if i * i <= Zahl then |
;-)
Xentar - Fr 09.01.09 17:45
jaenicke hat folgendes geschrieben : |
Delphi-Quelltext 1: 2: 3: 4: 5: 6:
| if i <= Sqrt(Zahl) then
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*
luckyluc - 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. - Sa 10.01.09 14:21
luckyluc hat folgendes geschrieben : |
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:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9:
| var t1, t2, freq: Int64; res: Extended; begin QueryPerformanceCounter(t1); QueryPerformancrCounter(t2); QueryPerformanceFrequency(freq); res := (t2 - t1) / freq * 1000; |
Grüße,
Marc
luckyluc - 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. - 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 - 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 - Sa 10.01.09 20:17
danke ihr habt mir weiter geholfen
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 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!