Autor |
Beitrag |
luckyluc
      
Beiträge: 103
|
Verfasst: 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 :
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
      
Beiträge: 19315
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Do 08.01.09 21:47
|
|
jfheins
      
Beiträge: 918
Erhaltene Danke: 158
Win 10
VS 2013, VS2015
|
Verfasst: 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
      
Beiträge: 1654
Erhaltene Danke: 244
WIN10,PuppyLinux
FreePascal,Lazarus
|
Verfasst: 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 
      
Beiträge: 103
|
Verfasst: 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
      
Beiträge: 918
Erhaltene Danke: 158
Win 10
VS 2013, VS2015
|
Verfasst: Fr 09.01.09 17:09
|
|
jaenicke
      
Beiträge: 19315
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Fr 09.01.09 17:15
|
|
baka0815
      
Beiträge: 489
Erhaltene Danke: 14
Win 10, Win 8, Debian GNU/Linux
Delphi 10.1 Berlin, Java, C#
|
Verfasst: 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
      
Beiträge: 918
Erhaltene Danke: 158
Win 10
VS 2013, VS2015
|
Verfasst: 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
      
Beiträge: 19315
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Fr 09.01.09 17:36
|
|
Xentar
      
Beiträge: 2077
Erhaltene Danke: 2
Win XP
Delphi 5 Ent., Delphi 2007 Prof
|
Verfasst: Fr 09.01.09 17:45
_________________ PROGRAMMER: A device for converting coffee into software.
|
|
luckyluc 
      
Beiträge: 103
|
Verfasst: 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.
      
Beiträge: 1876
Erhaltene Danke: 129
Win 8.1, Xubuntu 15.10
|
Verfasst: Sa 10.01.09 14:21
|
|
luckyluc 
      
Beiträge: 103
|
Verfasst: 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.
      
Beiträge: 1876
Erhaltene Danke: 129
Win 8.1, Xubuntu 15.10
|
Verfasst: 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
      
Beiträge: 1654
Erhaltene Danke: 244
WIN10,PuppyLinux
FreePascal,Lazarus
|
Verfasst: 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  )
Gruß Horst
|
|
luckyluc 
      
Beiträge: 103
|
Verfasst: Sa 10.01.09 20:17
danke ihr habt mir weiter geholfen
|
|