AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Sieb des Eratosthenes

Ein Thema von Descole · begonnen am 27. Apr 2013 · letzter Beitrag vom 14. Mai 2013
Antwort Antwort
Seite 3 von 3     123   
Benutzerbild von sx2008
sx2008

Registriert seit: 16. Feb 2008
Ort: Baden-Württemberg
2.332 Beiträge
 
Delphi 2007 Professional
 
#21

AW: Sieb des Eratosthenes

  Alt 28. Apr 2013, 23:16
Das Problem ist wirklich, dass ich es bis Morgen brauche. Es ist ja nicht so, dass ich die ganze Woche lang faul rumgesessen hätte...
Ich kann dir nur soviel helfen, dass es gegenüber Anderen nicht unfair ist.
Schau mal das Wichtigste ist den den Algorithmus richtig umzusetzen.
Den Algo kannst du quasi 1:1 von Wikipedia abschreiben:
http://de.wikipedia.org/wiki/Sieb_de...mplementierung

Ok, nächster Schritt:
überlege dir was braucht der Algorithmus als Input und was kommt raus?
Inputparameter ist N (ein Integer)
der Output sind die Primzahlen.
Die Ausgabe fehlt bei deinem Code komplett.

Du hast einen Input und einen Output und so etwas kann man gut in eine Unterroutine verpacken:
Delphi-Quellcode:
procedure BerechnePrimZahlen(N:Integer; ausgabe:TStrings);
var gestrichen: array [2..50000] of boolean; // N darf maximal 50000 sein
begin
  { in dem Code auf Wikipedia steht: }
         // i ist prim, gib i aus
         print i; ", ";
  { aber statt dass du print aufrufst machst du das }
  ausgabe.Add(IntToStr(i)); // Primzahl zur Liste hinzufügen
end;
Die Prozedur nützt aber nichts ohne entsprechenden Aufruf:
Delphi-Quellcode:
procedure TForm1.BerechnenClick(Sender: TObject);
var
  a:Integer;
begin
  a:= StrtoInt(edtZahl.Text);
  BerechnePrimZahlen(a{=Parameter N}, mAusgabe.Lines)
end;
Eigentlich fehlt in deinem Code nur die Ausgabe der Primzahlen (also nur eine Zeile).
Du müsstest nur mAusgabe.Lines.Add(IntToStr(p)); an die richtige Stelle zu schreiben.
Welches die richtige Stelle ist, bekommst du raus wenn du deinen Code mit dem Code auf Wikipadia vergleichst.

Geändert von sx2008 (28. Apr 2013 um 23:19 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von info.noob
info.noob

Registriert seit: 15. Apr 2013
Ort: Brownien
23 Beiträge
 
Delphi 5 Standard
 
#22

AW: Sieb des Eratosthenes

  Alt 4. Mai 2013, 12:55
Also mein Lehrer hat uns jetzt mehr Zeit gegeben und die Primzahlen berechnet das Programm jetzt auch.
Das Problem ist jetzt aber, das keine Fehlermeldung mehr angezeigt wird, wenn nichts im Editfeld steht.
Auch wenn die Zahl größer ist als der angegebene Bereich (also bei mir array of[2..10001]) zeigt es zwar die Fehermeldung, rechnet aber trotzdem die Primzahlen bis 10006 aus. Wenn man dann 10006 eingibt wird die Fehlermeldung angezeigt und kurz danach stürzt das Programm ab.

Hier ist mein Quellcode:
Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls, Buttons, jpeg, ExtCtrls;

type
  TForm1 = class(TForm)
    Berechnen: TButton;
    mAusgabe: TMemo;
    edtZahl: TEdit;
    lblPrimzahl: TLabel;
    lblFehler: TLabel;
    lblUeberschrift: TLabel;
    Image1: TImage;
    Image2: TImage;
    btReset: TBitBtn;
    lblFehler2: TLabel;
    btSchliessen: TButton;
    lblFehler3: TLabel;
    procedure edtZahlKeyPress(Sender: TObject; var Key: Char);
    procedure BerechnenClick(Sender: TObject);
    procedure btSchliessenClick(Sender: TObject);
    procedure btResetClick(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.edtZahlKeyPress(Sender: TObject; var Key: Char);
begin

if not (Key in ['0'..'9',#08])then begin
Key:=#0;
Beep;
end;

end;

procedure TForm1.BerechnenClick(Sender: TObject);

var
a: integer;
zahl : array[2..10001] of boolean;
p,i,v: integer;
weiter : boolean;

begin
 if (edtZahl.Text='') then begin lblFehler.Visible:= true end
 else begin
 lblFehler.Visible:= false;

 a:= StrtoInt(edtZahl.Text);
 if (a > 10001) then begin ShowMessage('Die Zahl muss kleiner gleich 10001 sein!'); end;

 if (a < 2) then begin lblFehler2.Visible:= true end
 else
 lblFehler2.Visible:= false;
  end;

  for i := 2 to a do zahl[i] := true;
  p := 2;
  while p <= a do
  begin
    // es werden die Vielfachen von p getrichen
    v := 2*p; // v ist das 'Vielfache'
    while v <= a do
    begin
      zahl[v] := false;
      v := v+p;
    end;
    // es wird die nächste nicht gestrichene Zahl gesucht
    p := p+1;
    if p <= a then weiter := true; // 'weiter' ist ein logischer Schalter
    while weiter do
      if (p<=a) and (zahl[p] = false)
      then
        p := p+1
      else
        weiter := false;
     end;
for i := 2 to a do if zahl[i] then mAusgabe.lines.add(IntToStr(i)) end;// Hier wird dann gesagt das 'weiter' nicht initialisiert wurde

procedure TForm1.btSchliessenClick(Sender: TObject);
begin
Close();
end;

procedure TForm1.btResetClick(Sender: TObject);
begin
edtZahl.Clear;
mAusgabe.Clear;
end;

end.
Amanda Dermish-Knudsht
  Mit Zitat antworten Zitat
Benutzerbild von sx2008
sx2008

Registriert seit: 16. Feb 2008
Ort: Baden-Württemberg
2.332 Beiträge
 
Delphi 2007 Professional
 
#23

AW: Sieb des Eratosthenes

  Alt 4. Mai 2013, 23:18
Überleg mal was hier passiert:
Delphi-Quellcode:
 if (edtZahl.Text='') then
 begin
   lblFehler.Visible:= true
 end
 else
 begin
   lblFehler.Visible:= false;
 end;
Das Programm läuft doch einfach weiter; da fehlt ein Exit; für den Fall dass die Eingabe nicht korrekt ist.
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#24

AW: Sieb des Eratosthenes

  Alt 5. Mai 2013, 00:22
Wäre Dein Sourcecode ordentlich formatiert, sollte es eigentlich offensichtlich sein.
Zunächst solltest du mit TryStrtoInt die Obergrenze aus dem Edit übernehme.
Dann solltest du die Obergrenze auf Gültigkeit prüfen und dann erst rechnen.
Ob Du mit Exit abbrichst oder mit If..else arbeitest ist wahrscheinlich von den Vorlieben Deines Lehrers abhängig.

Gruß
K-H
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
Benutzerbild von info.noob
info.noob

Registriert seit: 15. Apr 2013
Ort: Brownien
23 Beiträge
 
Delphi 5 Standard
 
#25

AW: Sieb des Eratosthenes

  Alt 5. Mai 2013, 10:26
Überleg mal was hier passiert:
Delphi-Quellcode:
 if (edtZahl.Text='') then
 begin
   lblFehler.Visible:= true
 end
 else
 begin
   lblFehler.Visible:= false;
 end;
Das Programm läuft doch einfach weiter; da fehlt ein Exit; für den Fall dass die Eingabe nicht korrekt ist.
Stimmt! Das hab ich ja vollkommen vergessen! Jetzt funktioniert es auch, Danke!
Hier noch mal der Teil des Codes der verändert wurde:
Delphi-Quellcode:
begin
 if (edtZahl.Text='') then begin lblFehler.Visible:= true; Exit; end
 else begin
 lblFehler.Visible:= false;

 a:= StrtoInt(edtZahl.Text);
 if (a > 10000) then begin lblFehler3.Visible:= true ;Exit; end // Hab dann einfach 'Exit' hinzugefügt!
 else begin
 lblFehler.Visible:= false;
Sorry, dass ich jetzt noch etwas fragen muss, aber das ist jetzt wirklich die letzte Frage!
Bei der Memobox werden die Zahlen alle untereinander angezeigt, also eine Zahl eine Zeile. Ich würde es aber gern so haben, dass in jeder Zeile so viele Zahlen stehen, wie möglich, damit es übersichtlicher wird! Mein Lehrer hat was von nem String gesagt aber ich weiß nicht genau, was er meint...

Edit: Schon geklärt!^^ Habs hier gefunden!http://www.delphipraxis.net/159391-d...emo-box-2.html
Amanda Dermish-Knudsht

Geändert von info.noob ( 5. Mai 2013 um 13:09 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von info.noob
info.noob

Registriert seit: 15. Apr 2013
Ort: Brownien
23 Beiträge
 
Delphi 5 Standard
 
#26

AW: Sieb des Eratosthenes

  Alt 5. Mai 2013, 10:29
Wäre Dein Sourcecode ordentlich formatiert, sollte es eigentlich offensichtlich sein.
Zunächst solltest du mit TryStrtoInt die Obergrenze aus dem Edit übernehme.
Dann solltest du die Obergrenze auf Gültigkeit prüfen und dann erst rechnen.
Ob Du mit Exit abbrichst oder mit If..else arbeitest ist wahrscheinlich von den Vorlieben Deines Lehrers abhängig.

Gruß
K-H
Leider hatten wir das mit dem TryStrtoInt noch nicht. Nur eben Exit und if...else wie du sagst.
mit 'Exit' funktioniert's jetzt auch, hab's einfach vergessen!^^
Aber trotzdem Danke für deine Hilfe!
Amanda Dermish-Knudsht
  Mit Zitat antworten Zitat
Benutzerbild von Descole
Descole

Registriert seit: 27. Apr 2013
Ort: Das Tokio Hotel
9 Beiträge
 
Delphi XE4 Ultimate
 
#27

AW: Sieb des Eratosthenes

  Alt 5. Mai 2013, 15:46
Vielen Dank noch mal an euch alle für eure Hilfe!
Justin Bibarel
I like trains
  Mit Zitat antworten Zitat
Benutzerbild von sx2008
sx2008

Registriert seit: 16. Feb 2008
Ort: Baden-Württemberg
2.332 Beiträge
 
Delphi 2007 Professional
 
#28

AW: Sieb des Eratosthenes

  Alt 13. Mai 2013, 20:52
Wie verprochen kommt hier meine "Musterlösung" für das Sieb des Eratosthenes.
Primzahlen bis 10 Mio. zu errechnen benötigt ~ 1 Min.

Wer Spass an Mathe und Delphi hat kann ja mal versuchen eine neue Klasse für das Sieb von Atkin zu schreiben.

Und dann gibt es auch noch das Sieb von Sundaram... (etwas komplizierter als Eratosthenes aber einfacher als Atkin zu implementieren)
Angehängte Dateien
Dateityp: zip Primzahlen.zip (2,4 KB, 43x aufgerufen)
fork me on Github
  Mit Zitat antworten Zitat
Furtbichler
(Gast)

n/a Beiträge
 
#29

AW: Sieb des Eratosthenes

  Alt 14. Mai 2013, 08:20
Das Sieb von Atkin wurde in der DP bereits umgesetzt. Einfach mal suchen, allerdings nach 'Sieve of Atkins' (nicht Atkin).
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 3 von 3     123   


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:46 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz