Pliki Dotychczas operowaliśmy danymi, które zapamiętywane były w
Transkrypt
Pliki Dotychczas operowaliśmy danymi, które zapamiętywane były w
Pliki Dotychczas operowaliśmy danymi, które zapamiętywane były w pamięci operacyjnej komputera (RAM). Program Turbo Pascal umożliwia zapisywanie i odczyt danych, co zapewnia możliwość wielokrotnego ich wykorzystania. Zapamiętywanie danych odbywa się w tzw. plikach danych. Ze względu na typ zawartych w nich danych rozróżnia się trzy podstawowe rodzaje plików: • pliki tekstowe zawierające informacje czytelne, składające się z tekstów; • pliki elementowe (zwane również zdefiniowanymi), których elementami są najczęściej tablice, rekordy; • pliki beztypowe o nieokreślonej strukturze. Pliki tekstowe Pliki tekstowe zawierają informację niezakodowaną, bezpośrednio czytelną. W bloku deklaracyjnym plikowi należy przydzielić jednoznaczną zmienną plikową. Deklaracja zmiennej plikowej dla pliku tekstowego: VAR Nazwa_pliku : Text; Nazwa_pliku jest nazwą zmiennej plikowej. Zanim zostaną wykonane operacje na tekście zawartym w pliku na dysku należy najpierw przyporządkować nazwę pliku dyskowego do konkretnej zmiennej plikowej wykorzystywanej w programie. Do tego celu służy procedura standardowa ASSIGN. Wywołuje się ją tworząc zapis w postaci: ASSIGN (Nazwa_pliku, Nazwa_pliku_dyskowego); gdzie Nazwa_pliku jest nazwą zmiennej plikowej w programie, zaś Nazwa_pliku_ dyskowego jest nazwą rzeczywistą pliku na dysku. Następnie należy otworzyć plik za pomocą jednej ze standardowych procedur RESET, REWRITE lub APPEND. Odpowiednie zapisy tych procedur dla otwarcia pliku mają postać: RESET (Nazwa_pliku); lub REWRITE (Nazwa_pliku); lub APPEND (Nazwa_pliku); Procedura RESET otwiera tylko już istniejący plik. Natomiast procedura REWRITE otwiera nie tylko nowy plik, ale również plik istniejący. W tym drugim przypadku powoduje to skasowanie zapisu danych w tym pliku. Procedura APPEND powoduje otwarcie pliku wyłącznie do zapisu. Dane będą dopisywane na koniec pliku. Do zamykania pliku stosuje się procedurę CLOSE w postaci: CLOSE (Nazwa_pliku); Zapisywanie i odczytywanie danych z plików tekstowych dokonuje się za pomocą instrukcji Read, Readln, Write i Writeln uzupełnionych o Nazwa_pliku i Lista_argumentów. Po tej zmianie postać instrukcji jest następująca: Read (Nazwapliku, Lista_argumentów); Write (Nazwa_pliku, Listaargumentów); Przy wykorzystaniu funkcji Eof można określić, czy plik znajduje się w pozycji końcowej, tj. przed ostatnim znakiem (Ctrl-Z). Natomiast przy wykorzystaniu funkcji Eoln można określić, czy plik tekstowy znajduje się w pozycji końca wiersza. Obie te funkcje stosuje się w konstrukcji do czytania pliku „znak po znaku": VAR F : Text; CH : CHAR; ……………….. RESET (F); WHILE NOT Eof(F) DO BEGIN WHILE NOT Eoln(F) DO Read(F, CH); Readln(F) END; Do czytania pliku „wierszowo" można natomiast zastosować sekwencję: VAR F : Text; S : STRING; …………………………… RESET (F); WHILE NOT Eof(F) DO Read(F, S); Należy pamiętać, że przejścia do kolejnego wiersza w trakcie zapisu/odczytu dokonać można jedynie za pomocą Writeln i Readln. Ćwiczenie 111 Napisać program pozwalający zapisywać i odczytywać dane z pliku tekstowego. Do pliku należy wpisać liczby naturalne od 10 do 30. Program ma tytuł „Plik_tekstowy". Zapisać program na dysku w pliku txt_1.pas. W naszym programie przyjmuje się następujące oznaczenia: • f - zmienna plikowa, • Liczby.dan - nazwa pliku dyskowego. Załóżmy, że plik nie istnieje na dysku. Do pliku dyskowego należy zapisać liczby naturalne od 10 do 30. W bloku deklaracyjnym należy zadeklarować zmienną plikową f w postaci zapisu: f : TEXT; co oznacza, że plik jest plikiem tekstowym. Następnie należy skojarzyć zmienną plikową f z nazwą konkretnego pliku dyskowego Liczby.dan. Skojarzenie to będzie miało postać: ASSIGN (f, Liczby.dan); Zakładając, że plik uprzednio nie istniał, do utworzenia i jednocześnie otwarcia pliku należy skorzystać z procedury REWRITE w postaci zapisu REWRITE ( f ) ; Następnie należy do pliku zapisać liczby naturalne. Uzyskuje się to korzystając z poniższej konstrukcji: FOR i:=10 TO 30 DO Write (f, i:4); Instrukcja Write jest wzbogacona o zmienną plikową i ma postać: Write (f, i:4); Po zapisaniu danych należy zamknąć plik przez podanie CLOSE ( f). Liczby są więc zapisane w pliku dyskowym Liczby.dan znajdującym się na dysku. Pozostaje już tylko odczytać zawartość pliku. Ponieważ plik istnieje, do jego otwarcia należy wybrać procedurę RESET. Otwarcie pliku do odczytu ma postać: RESET ( f ) ; Odczytanie zawartości pliku umożliwi poniższa sekwencja: WHILE NOT Eof(f) DO BEGIN Read (f, i); Write (i:5); END; Instrukcja Read jest wzbogacona o zmienną plikową i ma postać: Read (f, i); Po odczytaniu danych należy zamknąć plik przez podanie CLOSE ( f). Cały program został przedstawiony poniżej: PROGRAM Plik_tekstowy; USES Crt; VAR f : TEXT; (* zmienna plikowa *) i : INTEGER; (******************************) BEGIN ClrScr; ASSIGN (f, 'Liczby.dan'); (* skojarzenie nazwy zmiennej plikowej ' f' z rzeczywista nazwa pliku na dysku Liczby.dan *) REWRITE(f); (* otwarcie pliku - zakładamy, ze nie istniał on uprzednio *) FOR i:=10 TO 30 DO Write (f, i:4); (* zapisanie liczby do pliku *) CLOSE (f); (* zamkniecie dostępu do pliku *) Writeln (' Plik "Liczby.dan" zawiera liczby od 10 do 30 co l'); REPEAT UNTIL KeyPressed; Writeln; Writeln (' Odczytanie pliku Liczby.dan '); Writeln; RESET (f); (* otwarcie pliku juz istniejącego *) WHILE NOT Eof(f) DO BEGIN Read (f, i); (* czytanie liczb z pliku *) Write (i:5); (* wyświetlanie liczby *) END; CLOSE (f) (* zamkniecie dostępu do pliku *) END. Ćwiczenie 112 Napisać program kopiujący zawartość jednego pliku tekstowego linia po linii do drugiego pliku tekstowego i dopisujący go na końcu istniejącego tekstu. Program ma tytuł „Plik_kopiujacy_liniami". Zapisać program na dysku w pliku o nazwie txt_2.pas. W programie wykorzystano procedurę APPEND otwierającą istniejący plik naz_2 i dopisującą dane na koniec tego pliku. Funkcja Eof podaje wartość TRUE, jeśli napotka koniec pliku. PROGRAM Plik_kopiujacy_liniami; (* kopiowanie danych tekstowych *) USES CrtVAR pierwszy, drugi : Text; linia naz_1, naz_2 : STRING[70]; : STRING[20]; (************************************************) PROCEDURE Kopiuj(naz_1, naz_2 : STRING); BEGIN ASSIGN (pierwszy, n a z _ 1 ) ; RESET (pierwszy); ASSIGN (drugi,naz_2); APPEND (drugi); WHILE NOT Eof (pierwszy) DO BEGIN Readln (pierwszy,linia); Writeln (drugi,linia); END; CLOSE (pierwszy); CLOSE (drugi); Writeln (' Skopiowano zawartość pliku: ',naz_1,' do pliku: ',naz_2); END; (*******************************************) BEGIN ClrScr; Writeln (' Kopiowanie danych tekstowych'); Writeln (' z pliku wejściowego i dopisywanie ich '); Writeln (' na końcu tekstu pliku wyjściowego '); Writeln; Write (' Podaj nazwę pliku wejściowego ...: '); Readln (naz_1); Write (' Podaj nazwę pliku wyjściowego ...: '); Readln (naz_2); Kopiuj (naz_1, naz_2); END. Ćwiczenie 113 Napisać program pozwalający kopiować zawartość jednego pliku tekstowego znak po znaku do drugiego pliku tekstowego. Program ma tytuł „Plik_kopiujacy_znakami". Zapisać program na. dysku w pliku txt_3.pas. Ćwiczenie 114 Napisać program tworzący na dysku plik tekstowy oraz umożliwiający odczytanie wprowadzonego do niego tekstu. Do pliku należy wpisać dowolny tekst. Program ma tytuł „Zakładanie_pliku_tekstowego". Program wykorzystuje wyłączanie dyrektywy kompilatora (*$I-*) oraz jej włączanie (*$I+*). Zapisać program na dysku w pliku txt_4.pas. W jednym z poprzednich ćwiczeń powstał program również zakładający plik tekstowy na dysku, ale do niego zostały wprowadzone dane w postaci ciągu liczbowego. Teraz należy napisać program umożliwiający wprowadzenie do niego tekstu. Program wykorzystuje wyłączanie dyrektywy kompilatora (*$I-*) oraz jej włączanie (*$I+*). Zmienna tekst kończy zapisywanie tekstu z chwilą wypisania ' *** '. Przy korzystaniu z procedury RESET w przypadku podania nieprawidłowej ścieżki dostępu do pliku (lub gdy plik nie istnieje), program zostaje przerwany z sygnalizacją błędu (błąd 2 - nie znaleziono pliku). Tym niepożądanym przerywaniom wykonywania programów można zapobiec stosując standardową funkcję IOResult. Dyrektywą kompilatora (*$I-*) wyłącza się kontrolę wykonywania operacji wejścia wyjścia. Oczywiście w przypadku wystąpienia błędu program będzie dalej wykonywany, co zostanie wychwycone przez funkcję IOResult. Dyrektywa kompilatora (*$I+*) włącza na nowo kontrolę przy każdej operacji we/wy. W poniższym programie FUNCTION Istnieje_plik sprawdza, czy istnieje plik o nazwie, która ma zostać przydzielona nowemu plikowi i informuje o wyniku sprawdzenia. Jeśli plik nie istnieje, to poleca go najpierw utworzyć. Jeśli zaś plik istnieje, informuje o możliwości utraty jego danych w przypadku jego ponownego „utworzenia" wraz z otwarciem. Dzięki wyłączonemu systemowi kontroli nie ma przerwania pracy programu. W programie uzyskano sygnał dźwiękowy dzięki wprowadzeniu znaku #7. Cały program został przedstawiony poniżej: PROGRAM Zakladanie_pliku_tekstowego; USES Crt; VAR f : Text; z : CHAR; n_plik : STRING[30]; tekst : STRING[80]; Nowy_plik : Boolean; Wybrany_klawisz : CHAR; TYPE Dostep = STRING[40]; (******************************************************) (* sprawdzenie czy plik juz istnieje *) FUNCTION Istnieje_plik (Nazwa_pliku : Dostęp): Boolean; BEGIN (*$I-*) (* wyłączenie systemu kontrolnego *) Assign(f, Nazwa_pliku); Reset (f); (*$I+*) (* uruchomienie systemu kontrolnego *) IF IOResult = 0 THEN BEGIN (* plik istnieje ! *) Close (f); Istnieje _ p l i k := TRUE END ELSE (* plik jeszcze nie istnieje ! *) Istniej e_plik := FALSE END; (****************************************************) BEGIN CIrScr; Writeln; Nowy_plik := TRUE; Writeln (' Zakładanie pliku tekstowego '); Writeln; Write (' Podaj nazwę zakładanego pliku ....: '); Writeln; Write (' ( Nie podasz - nazwa domyślna pliku :)'); Writeln (' t x t _ 1 . d a n '); Writeln; Write (' Nazwa pliku ....: '); Readln (n_plik); Writeln; IF LENGTH (n_plik)=0 THEN n_plik:= 'text_1.dan'; IF Istnieje_plik ( n _ p l i k ) THEN BEGIN (* plik istnieje - to czy zastąpić go nowym ? *) Writeln; Writeln (' Uwaga!!!*); Writeln (' Plik istnieje – ‘, #7#7#7,' Wszystkie ',+ ' dotychczasowe dane zostaną usunięte z pliku !'); Writeln; REPEAT Write (' Wykonywać dalej ? (T)ak / (N)ie : '); Readln (Wybrany_klawisz); UNTIL Wybrany_klawisz IN ['T',’t',’N',’n']; IF Wybrany_klawisz IN ['N',’n’] THEN Nowy_plik := FALSE (* nie tworzyć nowego pliku ! *) END; Writeln; IF Nowy_plik THEN BEGIN (* tworzenie nowego pliku *) ClrScr; ASSIGN (f, n_plik); REWRITE (f); Writeln (' Nowo utworzony plik nosi nazwę....: ', n_plik ); Writeln; Writeln (' Pisz tekst w każdym wierszu co najwyżej 70 znaków '); Writeln; Writeln (' Gdy koniec tekstu wciśnij < ENTER >,'); Writeln (' wpisz < *** > i ponownie wciśnij < ENTER >'); Writeln; Writeln; Readln (tekst); WHILE tekst<>’****' DO BEGIN Writeln (f, tekst); Readln (tekst); END; CLOSE (f); ClrScr; Writeln; Writeln (' Odczytanie tekstu z pliku ‘,n_plik ); Writeln; RESET(f); WHILE NOT Eof(f) DO BEGIN Readln (f, tekst); Writeln (tekst); END; REPEAT UNTIL KeyPressed; CLOSE (f); ClrScr; Write (' Nacisnij dowolny klawisz '); WHILE Keypressed DO z:=Readkey; END; END. Ćwiczenie 115 Napisać program obliczający liczbę stów w pliku tekstowym. Program ma tytuł „Obliczanie_liczby_slow". Zapisać program na dysku w pliku txt_5.pas. Uwaga: Zakładamy, że poszczególne słowa w pliku tekstowym są oddzielone znakiem spacji, tabulacji lub końcem linii. Między słowami występuje tylko jedna spacja. Ćwiczenie 116 Napisać program pozwalający drukować linię tekstu w kolejności odwrotnej. Program ma tytuł „Linia_odwrotnie". Zapisać program na dysku w pliku o nazwie txt_6.pas. Ćwiczenie 117 Napisać program porównujący dwa pliki tekstowe. Program ma tytuł „Porównywanie_ plików _txt". Zapisać program na dysku w pliku txt_7.pas. Uwaga: W programie sprawdza się równość znaków do końca krótszego pliku. W przypadku pozytywnego wyniku sprawdzamy długość plików. Ćwiczenie 118 . Napisać program wyświetlający na ekranie zawartość pliku tekstowego. Podczas wyświetlania będzie możliwość przewijania o jedną linię w dół lub w górę. Program ma tytuł „Przewijanie_plikujxt". Zapisać program na dysku w pliku txt_8.pas. Ćwiczenie 119 Napisać program wyszukujący w pliku tekstowym pytania, które następnie są wyświetlane na ekranie. Program ma tytuł „Szukanie_pytan". Zapisać program na dysku w pliku txt_9.pas. Ćwiczenie 120 Napisać program wyświetlający na ekranie zawartości pliku tekstowego, poczynając od wskazanej linii. Naciśnięcie klawisza Esc powinno kończyć wyświetlanie tekstu. Program ma tytuł „Wyświetlanie_tekstu_od_linii". Zapisać program na dysku w pliku txt_10.pas. Ćwiczenie 121 Napisać program usuwający z pliku tekstowego wszystkie nieparzyste słowa. Program ma tytuł „Usuwamy_nieparzyste_slowa". Zapisać program na dysku w pliku txt_11.pas. Pliki elementowe Pliki elementowe (zwane również zdefiniowanymi) są to pliki, w których przechowywana informacja występuje w postaci zakodowanej. Nie ma więc możliwości bezpośredniego ich odczytania. Deklaracja zmiennej plikowej: Nazwa_pliku : FILE OF Typ_złożony Nazwa_pliku jest nazwą zmiennej plikowej, zaś Typ_złożony jest typem prostym lub strukturalnym. Przyporządkowania nazwy pliku dyskowego do danej zmiennej plikowej dokonuje się za pomocą procedury ASSIGN (podobnie jak dla plików tekstowych). Do otwierania plików wykorzystuje się procedury RESET i REWRITE (bez APPEND). Plik zamyka się za pomocą procedury CLOSE Ćwiczenie 122 Napisać program pozwalający zapisywać dane do pliku elementowego w postaci ciągu liczb rzeczywistych od -10 do 10 z krokiem 0.5. Program ma tytuł „Plik_elementowy". Zapisać program na dysku w pliku elem_1l.pas. Cały program został przedstawiony poniżej: PROGRAM Plik_elementowy; USES Crt; VAR x : REAL; f : FILE OF REAL; nazwa : STRING[30]; Wybrany_klawisz : CHAR; Istnieje _ p l i k : Boolean; (********************************************************) BEGIN ClrScr; Writeln (' Zakładanie pliku elementowego na dysku’); Writeln (' i wprowadzenie do niego liczb rzeczywistych'); Istnieje plik := TRUE; Writeln; Writeln (' Podaj nazwę pliku ....:'); Write ('( Nie podasz - nazwa domyślna pliku :)'); Writeln (' rzecz_1.dan '); Readln (nazwa); Writeln; IF LENGTH (nazwa)=0 THEN nazwa: = 'rzecz_1.dan'; ASSIGN (f, nazwa); {$1-} RESET (f); {$1+} IF IOResult = 0 THEN BEGIN (* plik istnieje - to czy zastąpić go nowym ? *) Writeln (‘Uwaga!!!'); Writeln (' Plik istnieje - ',#7#7#7,' Wszystkie ',+ 'dotychczasowe dane zostaną usunięte z pliku !'); Writeln; REPEAT Write (‘Wykonywać dalej ? (T)ak / (N)ie : '); ReadLn(Wybrany_klawisz); UNTIL Wybrany klawisz IN ['T',’t',’N',’n']; IF Wybrany_klawisz IN ['N',’n'] THEN Istnieje_plik := FALSE (* nie tworzyć nowego pliku ! *) END; Writeln; IF Istnieje_plik THEN BEGIN (* tworzenie nowego pliku *) ASSIGN (f, nazwa); REWRITE (f); x:=-10.0; WHILE x<=10.0 DO BEGIN Write (f, x); x:=x+0.5 END; CLOSE (f); Writeln; Writeln (' Nowo utworzony plik nosi nazwę : ',nazwa ); Writeln; Readln; END; END. Ćwiczenie 123 Napisać program pozwalający wyznaczyć liczbę elementów w pliku elementowym. Program ma tytuł „Wyznaczenie_liczby_elementow_w_pliku". Zapisać program na dysku w pliku elem_2.pas. W programie wykorzystamy wcześniej poznaną konstrukcję, dostosowaną do wymagań zadania, do czytania pliku „znak po znaku": WHILE NOT Eof(f) DO BEGIN Read (f, x); ile:=ile+1; END; Czytanie pliku zostaje zakończone po przeczytaniu ostatniego elementu, a następnie zostaje wyświetlona zawartość licznika ile. Cały program został przedstawiony poniżej: PROGRAM Wyznaczenie_liczby_elementow_w_pliku; USES Crt; VAR ile : INTEGER; x : REAL; f : FILE OF REAL; nazwa (* ile elementów w pliku *) : STRING; (**************************************) BEGIN ClrScr; Writeln (' Wyznaczenie liczby elementów w pliku'); Writeln; Write (' Podaj nazwę pliku z danymi: '); Readln (nazwa); IF LENGTH (nazwa) =0 THEN nazwa:= 'rzecz_1.dan'; ASSIGN (f, nazwa); RESET (f); ile:=0; WHILE NOT Eof(f) DO BEGIN Read (f, x); ile:=ile+1; END; CLOSE(f); (* zamknij plik*) Writeln; Writeln ('W pliku :',nazwa,' jest ',ile,' liczb rzeczywistych'); Readln; END. Ćwiczenie 124 Napisać program pozwalający odczytać dane z pliku elementowego zawierającego ciąg liczb rzeczywistych. Program ma tytuł „OdczytanieJiczb_rzeczywistych"'. Zapisać program na dysku w pliku elem_3.pas. Ćwiczenie 125 Napisać program pozwalający wyznaczyć maksymalną i minimalną liczbę w pliku elementowym zawierającym liczby rzeczywiste. Program ma tytuł „Liczby_max_i_min". Zapisać program na dysku w pliku elem_4.pas. Ćwiczenie 126 Napisać program kopiujący plik elementowy zawierający liczby rzeczywiste. Program ma tytuł „Kopiowanie_pliku". Zapisać program na dysku w pliku elem_5.pas. Ćwiczenie 127 Napisać program pozwalający na utworzenie pliku elementowego przechowującego tablicę. Program ma tytuł „Tablica_w_pliku". Zapisać program na dysku w pliku elem_6.pas. Operacje na plikach elementowych Do wyboru określonego elementu z pliku elementowego służy tzw. wskaźnik pliku. Do ustawiania tego wskaźnika pliku na określonym elemencie służy procedura SEEK. Należy pamiętać, że elementy są numerowane od zera. Zapis procedury SEEK ma postać: SEEK (VAR f, poz: LONGINT); Przykładowy zapis: SEEK (f_1, 5); oznacza ustawienie wskaźnika pliku w pliku identyfikowalnym zmienną plikową f_1 na pozycji 6 (5+1). W celu określenia pozycji wskaźnika pliku w pliku identyfikowalnym zmienną plikową f stosuje się funkcję FilePos. Zapis funkcji FilePos ma postać: FilePos (VAR f) : LONGINT; Przykładowy zapis: Poz:=FilePos ( f_l); Przy określaniu liczby elementów w pliku identyfikowalnym zmienną plikową f pliku stosujemy funkcję FileSize. Zapis funkcji FileSize ma postać: FileSize (VAR f) : LONGINT; Przykładowy zapis: liczba :=FileSize (f_l ); Jeśli plik jest pusty to podawana jest wartość zero. Ćwiczenie 128 Napisać program pozwalający zapisywać dane do pliku elementowego w postaci ciągu liczb naturalnych od 1 do 10. Następnie zmienić wartość 3. elementu z tego ciągu. Program ma tytuł „Zmiana _w artosci". Zapisać program na dysku w pliku elem_7.pas. W pierwszej części programu liczby ciągu (elementy) wraz z ich numerem pozycji zostają zapisane do pliku. Dla zapisu pozycji liczb oraz ich wartości wykorzystuje się jedną zmienną, tj. x. Następnie ustawić należy wskaźnik pliku na 2. pozycji (Uwaga: pozycje numerowane są od 0), tj. na 3. elemencie, co przedstawia poniższy zapis: SEEK (f, 2); Przy ustawionej pozycji można dokonać odpowiedniej zmiany wartości tego elementu korzystając z instrukcji podstawienia: x:=23; Następnie w pliku zostaje dokonany zapis nowej wartości elementu. Write (f, x); Przed odczytaniem zawartości pliku wskaźnik pliku zostaje ustawiony na pierwszym elemencie: SEEK (f, 0); Do odczytania elementów pliku należy skorzystać z instrukcji FOR oraz dwóch zmiennych x i y. Wartość x określa numer pozycji elementu (liczby), zaś y wartość elementu położonego na tej pozycji. Sekwencja odczytująca elementy pliku ma postaci: FOR x:=l TO 10 DO BEGIN Read (f, y); Writeln (' ‘,x:2,' – ‘y:2); END; Cały program został przedstawiony poniżej: PROGRAM Zmiana_wartosci; USES Crt; VAR f : FILE OF INTEGER; x : INTEGER; y : INTEGER; ch : CHAR; (***************************************) BEGIN ClrScr; ASSIGN (f, 'plik.dok'); REWRITE (f); Writeln (' Zmiana wartości elementu'); Writeln (' Poz. Wartość '); FOR x:=1 TO 10 DO BEGIN Write (f, x); Writeln (' ‘,x:2,' - ', x:2); END; Writeln; (* wprowadzamy zmianę w 3. elemencie *) SEEK (f, 2); (* ustawienie wskaźnika na 3. elemencie *) x:=23; (* ustawienie nowej wartości *) Write (f, x); (* zapisanie do pliku *) SEEK (f, 0); (* ustawienie wskaźnika na pierwszym elemencie *) Writeln (' Po zmianie wartości na pozycji 3.'); FOR x:=1 TO 10 DO BEGIN Read (f, y); Writeln (' ',x:2,' - ', y:2); END; ch:=Readkey; END. Ćwiczenie 129 Napisać program pozwalający na utworzenie pliku elementowego przechowującego tablicę jednowymiarową. Zapisać do tablicy 10 liczb rzeczywistych. Następnie zmienić wartość 4. i 7. elementu w ten sposób, ze ich nowe wartości są dwukrotnie większe od poprzednich. Program ma tytuł „Zmiana_w_tablicy". Zapisać program na dysku w pliku elem_8.pas.