Poniższy program ma za zadanie z 200 elementów znaleźć liczby pierwsze i zapisać je do tablicy dynamicznej. Nie działa procedura do_tablicy. Proszę o pomoc
NAPEWNO BĘDZIE NAJ!

program sito_eratostenesa;
uses crt;

const n=201;

Type Ttablica = array [1..n] of Integer; // tablica przechowujaca liczby 2-201
var t:Ttablica;

Type Tdynamiczna = array of Integer; // tablica przechowujaca liczby pierwsze
var dyn:Tdynamiczna;

var licznik:integer;

(* ***************************************************** *)

Procedure liczby_pierwsze(var tab:Ttablica);
var
i,j:integer;

begin


for j:=2 to n do

begin

i:=j*2;

while i<=n do

begin

tab[i]:=1;
i:=i+j;
// licznik:=licznik+1;

end;

end;


end;

(* ***************************************************** *)

Procedure pomiar(var tab:Ttablica);
var
i:integer;

begin


for i:=2 to n do

if tab[i]=0 then licznik:=licznik+1;

{ mierzy ile liczb jest pierwszych }


end;


(* ***************************************************** *)

Procedure do_tablicy(var tab:Ttablica; var d:Tdynamiczna);
var
i,k:integer;

begin

clrscr;

k:=0;

for i:=2 to n do
begin

k:=k+1;

if tab[i]=0 then

begin

i:=d[k];
write(d[i],' ');

end;

end;

//repeat until keypressed;

end;

(* ***************************************************** *)

BEGIN
clrscr;

liczby_pierwsze(t);

pomiar(t);

setlength(dyn,licznik);

do_tablicy(t,dyn);

readkey;

END.

1

Odpowiedzi

2010-04-14T10:59:00+02:00
Przeanalizujmy :)

program sito_eratostenesa;
uses crt;

const n=201;

Type Ttablica = array [1..n] of Integer; // tablica przechowujaca liczby 2-201
{ jakim cudem od 2 do 201, skoro deklaracja jest od 1 do 201 ?? }

var t:Ttablica;

Type Tdynamiczna = array of Integer; // tablica przechowujaca liczby pierwsze
var dyn:Tdynamiczna;

var licznik:integer;
{ zwróć uwagę, że ta zmienna NIGDZIE nie jest zainicjowana, tzn. nigdzie nie jest nadawana wartość początkowa - przyjmujesz domyślnie, że jest równa 0, a to nieprawda - może być dowolna}


(* ***************************************************** *)

Procedure liczby_pierwsze(var tab:Ttablica);
var
i,j:integer;

begin


for j:=2 to n do

begin

i:=j*2;

while i<=n do

begin

tab[i]:=1;
i:=i+j;
// licznik:=licznik+1;

end;

end;

{ Zastanów się, co robi ta procedura, a co powinna wg Ciebie robić. Co robi - już mówię:
w pierwszym przebiegu pętli for wpisuje wartość 1 do komórek tablicy statycznej o numerach 4, 6, 8, 10, 12, ..., 200
w drugim przebiegu pętli for wpisuje wartość 1 do komórek tablicy statycznej o numerach 6, 8, 10, 12, ..., 200
w trzecim przebiegu pętli for wpisuje wartość 1 do komórek tablicy statycznej o numerach 8, 10, 12, ..., 200
itd.
więc w konsekwencji wypełniasz komórki o parzystych indeksach wartością 1 (i to nie wszystkie, bo nie wypełniasz komórki o indeksie 2), zaś zawartość pozostałych komórek jest NIEOKREŚLONA}

end;

(* ***************************************************** *)

Procedure pomiar(var tab:Ttablica);
var
i:integer;

begin


for i:=2 to n do

if tab[i]=0 then licznik:=licznik+1;

{ mierzy ile liczb jest pierwszych }

{ NIEPRAWDA !!! Ta procedura zliczałaby, ile jest liczb równych zero, a nie pierwszych. Zliczałaby, gdyby zmienna licznik była zainicjowana !!! }

end;


(* ***************************************************** *)

Procedure do_tablicy(var tab:Ttablica; var d:Tdynamiczna);
var
i,k:integer;

begin

clrscr;

k:=0;

for i:=2 to n do
begin

k:=k+1;

if tab[i]=0 then

begin

i:=d[k];
write(d[i],' ');

end;

end;

//repeat until keypressed;

{ Ta procedura działa, ale nigdy się nie skończy !!! A to dlatego, że robisz rzecz NIEDOPUSZCZALNĄ !!! Otóż pod zmienną i, będącą zmienną sterującą pętli for podstawiasz wewnątrz pętli jakąś wartość (tak naprawdę 1 albo zero). Wyjście z pętli nastąpi po osiągnięciu przez zmienną i wartości 201, a to NIGDY nie nastąpi ! }

end;

(* ***************************************************** *)

BEGIN
clrscr;

liczby_pierwsze(t);

pomiar(t);

setlength(dyn,licznik);

do_tablicy(t,dyn);

readkey;

END.