Program odczytujący cyfry z pliku do przecinka i sprawdzający czy sa cyframi pierwszymi.

0

Witam.

Zrobiłam program który odczytuje z pliku cyfry i zapisuje je do tablicy char, do przecinka.
Potem zamienia zamienia je ORD - 48 i wkłada do tablicy byte. Przekształca je w liczbę mnożąc ostatnią x1, następną x10 i dodając do siebie. Na końcu sprawdza czy liczba jest liczbą pierwszą i je wypisuje.

Sęk w tym, że tylko mi się tak wydaje ;P

Pierwsza wersja odczytywała wszystko jako 208, po kilku ulepszeniach odczytuje jako 208 i 252 na zmianę (i już jest sporo rzeczy pozmienianych bezsensownie bo zwątpiłam ;P). Nie są to liczby pierwsze więc ostatecznie nie wychodzi nic.

Odkryłam, ze coś nie tak jest ze zmienna która liczy ile cyfr jest w tablicy. A Bardzo dużo od niej zależy.

Ładnie proszę o rzucenie okiem. Pewno jakiś głupi błąd zrobiłam. :)

O to kod:
(Żeby działał trza zrobi jakiś pliks.txt o treści mniej więcej "11,2,3,4,5,6,22,33,15,17," i ścieżke zmienić(

program liczpierw;
uses crt;

var i,j,s1,s2,s3,d,l,m,x:byte; s:char; tab:array[1..10] of char;
    tab2:array[1..10] of byte; t:text;

BEGIN;
clrscr;
assign(t,'C:\pliks.txt');
reset(t);
s3:=0;
repeat
 l:=0;
 repeat
  read(t,s);
 if s<>',' then tab[i]:=s;
  l:=l+1;
 until s<>',';
 for i:=1 to l do begin;
  x:=ORD(tab[i])-48;
  tab2[i]:=x;
 end;
 {for i:=1 to l do write(s);}
 m:=1;
 s2:=0;
 for i:=l downto 1 do begin;
  s2:=s2+tab2[i]*m;
  m:=m*10;
 end;
 d:=0;
 for i:=1 to s2 do begin;
  if s2 mod i=0 then d:=d+1;
 end;
 if d=2 then begin;
  s3:=s3+1;
  {writeln(s3,' ',s2); to ostateczny wynik powinien być - s3 czyli ile jest tych pierwszych i s2 czyli te konkretne licbzy pierwsze z pliku}
 end;
until EoF(t);



close(t);
readkey;
END.
0

Sformatuj najpierw ten kod po ludzku, bo się czytać nie da. Jak nie umiesz sam to użyj: http://olesio.eu/delfor .

0

Zrobione:

(Po Twoim programie nie wydawało się łatwiejsze do odczytania, Na wszeli powciskiwałam kilka enetrów w kodzie :PP)

program liczpierw;
uses crt2;

var i, j, s1, s2, s3, d, l, m, x : byte; s : char; tab : array[1..10] of char;
tab2 : array[1..10] of byte; t : text;

begin;

clrscr;
assign(t, 'C:\pliks.txt');
reset(t);
s3 := 0;

repeat
l := 0;

repeat

  read(t, s);
  if s <> ',' then tab[i] := s;
  l := l + 1;
until s <> ',';

for i := 1 to l do begin;
  x := ORD(tab[i]) - 48;
  tab2[i] := x;
end;

m := 1;
s2 := 0;

for i := l downto 1 do begin;
  s2 := s2 + tab2[i] * m;
  m := m * 10;
end;

d := 0;

for i := 1 to s2 do begin;
if s2 mod i = 0 then d := d + 1;
end;

if d = 2 then begin;
s3 := s3 + 1;
{writeln(s3,' ',s2); to powinien być ostateczny wynik. s3 to licznik liczb pierwszych, a s2 to konkretna liczba}
end;

until EoF(t);

close(t);
readkey;
end.

0

Bez enterów i z wcięciami jakie zrobi program DelFor oraz w tagach delphi być może ktoś ogarnie i Tobie pomoże.

1

Do poprawiania było sporo, więc daję cały kod. Głównym błędem była pętla która wczytywała dane: nie zwiększałaś indeksu w tablicy tab oraz zły warunek wyjścia z tej pętli. Reszta zmian jest wynikiem poprawienia tej pętli, można to było zrobić inaczej i prościej (np. indeksować tablice od 1, a nie od 0), ale tak mi wyszło w trakcie i nie chce mi się tego już przerabiać.

Kod:

program liczpierw;

var
  i, j, s1, s2, s3, d, l, m, x : integer; 
  s : char; 
  tab : array[0..10] of char;
  tab2 : array[0..10] of integer; 
  t : file of char;

begin
  assign(t, 'plik.txt');
  reset(t);
  s3 := 0;
 
  repeat
    l := 0;

    repeat
      read(t, s);
      if s <> ',' then 
      begin
        tab[l] := s;
        l := l + 1;
      end;
    until s = ',';

    for i := 0 to l-1 do
    begin;
      x := ORD(tab[i]) - 48;
      tab2[i] := x;
    end;

    m := 1;
    s2 := 0;

    for i := l-1 downto 0 do 
    begin;
      s2 := s2 + tab2[i] * m;
      m := m * 10;
    end;

    d := 0;
 
    for i := 1 to s2 do
    begin;
      if s2 mod i = 0 then
        d := d + 1;
    end;
 
    if d = 2 then
    begin
      s3 := s3 + 1;
      writeln(s3,' ',s2); //to powinien być ostateczny wynik. s3 to licznik liczb pierwszych, a s2 to konkretna liczba}
    end;
  until EoF(t);
  close(t);
end.
0

Bardzo dziękuję.

Te błędy późniejsze, to wynikły z tego, że nie ogarnęłam, co jest źle i zmieniałam co się dało :P Bo robiłam ten program z myślą, że tam mi się zmienia, Tylko jakoś tak nie przemyślałam tego ;P
Jeszcze raz wielkie dziękuuuję.

0

Występujesz w konkursie na najgorzej ponazywane zmienne w kodzie? A, nie, fakt, są i dwuznakowe. Nie ma jak to wymyślić takie nazwy, a potem wyjaśnić je w komentarzu. Taki kod powinien mówić sam za siebie. Jakaś zmienna jest kluczem, indeksem, sumą, wynikiem - niech się tak nazywa.

0

Przecież są nazwane pierwszymi literkami tego co oznaczają. m - mnożnik, l - licznik, s - suma, a że sum mam tam sporo to i tak byłoby suma1, suma2 itepe, głupie byłoby nazywać zmienne "suma liczb pierwszych" albo "suma cyfr z tablicy pomnożonych o mnożnik". :>

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