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;
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}
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 ! }
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.