liczby pierwsze zapisywane do pliku

0

Witam
Uczę się programować w pascalu. Znalazłem sobie takie zadanie:

Program, który wypisuje do pliku tekstowego c:\p.txt wszystkiego liczby pierwsze między 2 a 10000, po jednej w wierszu. Przy sprawdzaniu liczby n, czy jest pierwsza dzielić ją po kolei przez 2,3, ..., n-1.

Tylko niestety nie mogę go zrobić. Mam jak na razie coś takiego:

var pierwsza:boolean;
n,a,d:integer;
t:text;
begin
assign(t, 'C:\p.txt');
rewrite(t);

for n:=2 to 10000 do
begin
 pierwsza = true;
 d:=2;
 for n:=2 to 10000 do
 begin
 d:=n-1;
  if n mod d then pierwsza=false;

 if pierwsza then writeln(t,a);
 close(t);
 readln
end.

Proszę o pomoc.

0

1.Kompilator ?
2.Jaki błąd ?

0

A co to znaczy ?
....
pierwsza = true; // co to niby ma być ?
....

I to ?
if n mod d then pierwsza=false; // wtf ?

0

przypisanie jakiejś wartości odbywa się przez :=
pascal to nie jest c++ :)

0

rzeczywiście :) w pośpiechu musiałem zapomnieć o :
ale nadal nie działa...

0

Błędy:

  1. pierwsza = true;
    powinno być :=
  2. for n:=2 to 10000 do
    begin
    d:=n-1;
    if n mod d then pierwsza=false;

if pierwsza then writeln(t,a);
close(t);
readln

Gdzie jest nawias zamykający (end;)

  1. if n mod d then pierwsza=false;
    if n mod d, ale co n mod d musi być if n mod d = (lub jakiś inny znak mniejszości/większości/równości) liczbe.

  2. if pierwsza then writeln(t,a);
    if co pierwsza? Taki sam błąd jak w trzecim punkcie.

  3. for n:=2 to 10000 do
    begin
    pierwsza = true;
    d:=2;
    for n:=2 to 10000 do
    begin
    d:=n-1;
    if n mod d then pierwsza=false;

if pierwsza then writeln(t,a);
close(t);
readln
end.

Znowu brakuje nawiasu zamykającego (end;).

0

dobrze poddaje się, napisałem od nowa... mam tak:

var pierwsza:boolean;
        n,d:integer;
        t:text;
begin
        assign(t, 'C:\p.txt');
        rewrite(t);

        for n:=2 to 10000 do begin
        pierwsza:=false;
        d:=2;


        {jakas petla do sprawdzania podzielnosci}


        if pierwsza:=true then writeln(t,n);
        end;
end.

Jak będzie wyglądać ta pętla która będzie sprawdzać podzielność?

0

@Patryk27 też mi się ten zapis dobry wydawał, ale skoro @JumpSmerf napisał że jest to źle to napisałem inaczej.
to pomoże mi ktoś z tą pętlą? zacząłem tak:

for j:=1 to n-1 do begin
if i mod n-1 then writeln(n);
end;

ale to chyba nie to...

0

Tamten zapis był poprawny, o czym nie pamiętałem, bo ja tak nigdy nie piszę.
Ale tu: if i mod n-1 musi być if warunek, co oznacza, że co ma być =, <>, >, >=, <, <= i dalej jakaś liczba, lub zmienna.
Jest to warunek - musi być porównanie.

0

@JumpSmerf to jakbyś to napisał?
już mi się nie chce dalej próbować... lepiej chyba będzie jak przeanalizuje rozwiązanie...

0

to jak? mogę liczyć na waszą pomoc?

0

Chciałem, żebyś sam doszedł do rozwiązania, bo z tego co widać to w ogóle nie rozumiesz na czym polega instrukcja warunkowa i przypisanie.
To ja ci może lepiej wytłumaczę na czym to polega.

  1. Przypisanie:
    Przypisanie to zastąpienie wartości zmiennej inną wartością.
    Przypisanie w pascalu realizujemy instrukcją := (nie równa się).
    Np. i := i + 1 oznacza, że jeżeli i miało np. wartość 5 to po wykonaniu przypisania będzie miało wartość 6.
    Jeżeli zmienna jest typu boolean, to robimy analogicznie:
    zmienna := true;

  2. Instrukcja warunkowa:
    Instrukcja warunkowa polega na porównaniu jakiejś liczby, lub działania (może być też zmienna) do jakiejś liczby/zmiennej, może być też do działania.
    Wygląda to następująco:
    if warunek then instrukcja1 else instrukcja 2
    Np. if i < 3 then instrukcja, albo if a mod 2 = 0 then instrukcja.

  3. Jeżeli mamy warunek, lub pętlę to komputer po spełnieniu warunku wykonuje tylko jedną instrukcję, nie może wykonać więcej, jeżeli mu tego nie powiesz. Pamiętaj - komputer to maszyna, która potrafi wykonywać polecenia, ale jest głupia - musisz jej wszystko powiedzieć po kolei co ma zrobić.
    Jeżeli chcesz, żeby się wykonała więcej niż jedna instrukcja to na początku tej dłuższej instrukcji piszesz instrukcję begin, a w miejscu, w którym chcesz, żeby się skończyły obliczenia piszesz instrukcję end;
    Np.
    for i := 1 to n do
    begin
    instrukcja1;
    instrukcja2;
    instrukcja3
    end;

if i <> 0 then
begin
instrukcja1;
instrukcja2
end;

Jeżeli jeszcze czegoś po tym nie zrozumiesz, to nadal pytaj.

0

to co napisałeś wyżej - ja to wszystko wiem ale nadal nie potrafię odpowiednio ułożyć tej instrukcji i pętli tak żeby robiły to co jest w treści zadania...
możliwe że to przez to że jest tam zmienna typu logicznego boolean, sam jej tam nie dodałem, tzn. w książce była podpowiedź iż przyda mi się ten kawałek kodu " if zmienna_log then writeln(plik, a); " i to mnie zdezorientowało ...

0

przecież o liczbach pierwszych jest pełno w necie wystarczy trochę mózgu i google:
w 3 sekundy znalazłem i w 3 sekundy lekko podrasowałem:

 
var i,n,x: integer;
begin
i:= 1;
  repeat
    inc(i,2);
    x:=0;
    for n:=1 to i do if i mod n=0 then inc(x);
    if x=2 then
    writeln(i);
  until i > 1000;
readln;
end.

1 użytkowników online, w tym zalogowanych: 0, gości: 1