Autor Beitrag
Stinger47
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 102



BeitragVerfasst: Sa 01.12.07 19:52 
Hi,
hab mal versucht einen Primzahlentest zu schreiben (der noch erweitert wird), der einen Bereich auf Primzahlen prüft.
Funktioniert soweit auch, dass einzige was noch fehlt ist die Ausnahme 1.
Warum auch immer überspringt die Überprüfung falls i = 1 ist.
Hier einmal der Code.
Zeile 28-33 wird übersprungen und füngt 1 anstatt in Listbox2 in Listbox 3 ein.

ausblenden volle Höhe 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:
45:
46:
47:
48:
49:
50:
51:
procedure TForm1.SetMyPrimtest(VonZahl, BisZahl: Integer);
var
  i,k: Integer;
  FLAG: Boolean;
begin

  for I := VonZahl to BisZahl do
    begin

      FLAG    :=    TRUE;

      if not odd(i) then
        begin

          if i = 2 then
            Listbox3.Items.Add(IntToStr(i));

          Listbox1.Items.Add(IntToStr(i));
          FLAG    :=    FALSE;

        end
      else
        begin

          for k := 2 to TRUNC(i / 2do
            begin

              if i = 1 then
                begin
                  Listbox2.Items.Add(IntToStr(i));
                  FLAG    :=    FALSE;
                  EXIT;
                end;

              if (i mod k) = 0  then
                begin
                  Listbox2.Items.Add(IntToStr(i));
                  FLAG    :=    FALSE;
                  EXIT;
                end;

            end;

          if FLAG = TRUE then
            Listbox3.Items.Add(IntToStr(i));

        end;

    end;

end;


danke für antworten...:)
TGLDX
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 22



BeitragVerfasst: Sa 01.12.07 20:15 
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
for k := 2 to TRUNC(i / 2do  
begin  
  if i = 1 then  
  begin  
  ...

Das ergibt mit i=1 folgendes:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
for k := 2 to 0 do  // TRUNC( 1 / 2) = 0
begin  
  if i = 1 then  
  begin  
  ...

Eine For-Schleife von 2 bis 0 wird nicht durchlaufen.
Stinger47 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 102



BeitragVerfasst: Sa 01.12.07 20:31 
hmmm ok das hab ich behobe aber die Schleifen werden nicht vollständig durchlaufen.
Habe zwei Editfelder, in denen ich VonZahl und BisZahl auslese.
die Schleife wird allerdings immer nur bis 9 durchlaufen egal wie hoch ich BisZahl setze.
Setze ich VonZahl höher als 10 dann werden immer nur ein bis zwei Zahlen eingetragen.

Hier nun der behobene Code

ausblenden volle Höhe 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:
45:
46:
47:
48:
49:
50:
51:
52:
procedure TForm1.SetMyPrimtest(VonZahl, BisZahl: Integer);
var
  i,k: Integer;
  FLAG: Boolean;
begin

  for I := VonZahl to BisZahl do
    begin

      FLAG    :=    TRUE;

      if not odd(i) then
        begin

          if i = 2 then
            Listbox3.Items.Add(IntToStr(i));

          Listbox1.Items.Add(IntToStr(i));
          FLAG    :=    FALSE;
          //Anzahl eintragen

        end
      else
        begin

          for k := 2 to TRUNC(i / 2do
            begin

              if (i mod k) = 0  then
                begin
                  Listbox2.Items.Add(IntToStr(i));
                  FLAG    :=    FALSE;
                  EXIT;
                end;

            end;

          if i = 1 then
            begin
              Listbox2.Items.Add(IntToStr(i));
              FLAG    :=    FALSE;
            end;


          if FLAG = TRUE then
            Listbox3.Items.Add(IntToStr(i));

        end;

    end;

end;
TGLDX
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 22



BeitragVerfasst: Sa 01.12.07 20:48 
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
for k := 2 to TRUNC(i / 2do  
 begin  
  if (i mod k) = 0  then  
  begin  
    Listbox2.Items.Add(IntToStr(i));  
    FLAG    :=    FALSE;  
    EXIT;  
  end;

Bei i = 9 läuft die Schleife von 2 bis 4.
Wenn k = 3 , ist (i mod k) = 0
=> 9 wird zur ListBox2 hinzugefügt und dann wird die Prozedur mit exit verlassen .
Ich denke du willst nicht die Prozedur, sondern die For-Schleife verlassen,was man mit break erreicht.
Stinger47 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 102



BeitragVerfasst: Sa 01.12.07 21:44 
dankeschön funktioniert jetzt auch.
dachte die befehler liefen auf das selbe hinaus...wieder schlauer
danke noochmal...:)
BenBE
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: Sa 01.12.07 21:47 
In Bezug auf das Suchen von Primzahlen empfehle ich diesen alten Faden.

_________________
Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.