Free Pascal- Obsługa plików tekstowych


(alabama1) #1

Cześć. Zaczynam teraz pracę z obsługą plików tekstowych. Chcę zrobić program, który pobierze z pliku liczby (dwie) i wykona 4 podstawowe działania matematyczne. Mój problem polega na tym, że nie wiem, jak zidentyfikować liczbę z pierwszego wersa i z drugiego wersa.

program wczytaj;

uses crt;

var

f:text;

s:longint;

i:integer;

begin

        clrscr;

        ASSIGN(f, 'C:\Users\Administrator\Desktop\Moje programy z Pascala\abtekst.txt');

        reset(f);

        i:=1;

        while not eof(f) do begin

        readln(f,s);

        writeln('Zawarto† pliku to ',s);

        writeln('Suma ',s,' i ',s,' wynosi ',(s+s));

        i:=i+1;

        end;

        close(f);

        readln;

end.

Przy tym kodzie wyświetla się tak: “Zawartość pliku to {i tu jest pierwsza liczba}. Suma {pierwszej liczby i pierwszej liczby} wynosi {liczba}”.

I to samo dla drugiej liczby.


(Rolek0) #2

Z każdej linii wczytujesz jedna liczbę i obliczasz jej podwojoną wartość.

Liczba linii powiększona o 1 jest Ci do czegoś potrzebna? (zmienna i)

Ps. Starałbyś się wcinać blok podrzędny względem nadrzędnego. Tutaj wciąłeś tylko główny blok programu a blok pętli jest na tym samym poziomie. W bardziej skomplikowanych przypadkach pisanie wszystkiego na tym samym poziomie znacznie utrudnia czytanie kodu.


(alabama1) #3

Nie, niepotrzebna. A jak wczytać z każdego wersetu liczbę? O to mi chodzi.


(Rolek0) #4

Kolejne wywołania readln wczytują dane z kolejnych linii.


(alabama1) #5

Ale w którym miejscu? Dałem po readln(f,s), to nie tu.


(Rolek0) #6

Co dałeś po readln(f,s)?


(alabama1) #7

readln


(Rolek0) #8

Ale samo readln;? Czy np. readln(f, s2);? :wink:


(alabama1) #9

No samo. Ale co, mam wprowadzać nową zmienną? Bo teraz pokazuje, że nie ma takiego identyfikatora.


(Rolek0) #10

A wiesz co robi samo readln;? :wink:

No druga zmienna by się przydała na drugą liczbę, nie sądzisz?


(alabama1) #11

readln czyta i schodzi o linię w dół :stuck_out_tongue:

Ale co, gdybym miał 100000 linii, w każdej jedna liczba, to bym musiał wprowadzać tyle zmiennych? Na ubiegłorocznej maturze tyle było.


(Rolek0) #12

A jak nie podasz mu żadnego pliku to domyślnie czyta ze standardowego wejścia (najczęściej konsoli). Jeśli nie podasz mu żadnych zmiennych, do których ma zapisać wczytane dane to do żadnych zmiennych nie zostaną zapisane :wink:

Gdybyś potrzebował ich wszystkich naraz to tak (najlepiej w tablicy). Jednak nie spotkałem się jeszcze z takim zadaniem maturalnym z dużą ilością danych, gdzie wszystkie dane do operacji byłyby potrzebne w tej samej chwili.


(alabama1) #13

Bo na maturze było 1000 liczb naturalnych(oczywiście, nie 100000), trzeba było zrobić program podający, ile liczb parzystych występuje w pliku. Jaki by był twój pomysł?


(Rolek0) #14

W tym przypadku nie potrzeba tych wszystkich liczb na raz. Możesz wczytywać po jednej, sprawdzać czy jest parzysta i jeśli tak to zwiększać licznik parzystych.

Natomiast w przypadku dodawania potrzeba co najmniej dwóch składników.


(alabama1) #15

Czyli wtedy byłaby jedna zmienna na oznaczenie kilku?


(Rolek0) #16

Jedna zmienna <=> jedna wartość.

Przykład liczenia parzystych:

uses crt;


var

        ile_parzystych, liczba : longint;

        plik : text;

begin

        assign(plik, 'plik.txt');

        reset(plik);    

        ile_parzystych := 0;

        while not eof(plik) do

        begin

                readln(plik, liczba);

                if (liczba mod 2) = 0 then

                        ile_parzystych := ile_parzystych + 1;

        end;

        close(plik);

        writeln('Parzystych liczb jest: ', ile_parzystych);

end.

(alabama1) #17

Aha, rozumiem. Dzięki. Wydaje się proste. Zobaczymy, jak mi jutro pójdzie. Będę wiedział, na jakim etapie jestem.