MACIERZE PROCEDURY
program macierze;
{$APPTYPE CONSOLE}
uses
SysUtils;
type
macierz=array [1..100,1..100] of real;
var
A,B,C,D:macierz;
wA,kA,wB,kB,wC,kC,wD,kD,s,i:byte;
spr:boolean;
x:string;
-procedure wczytaj_macierz(opis:string;var Z:macierz; var wZ,kZ:byte);
var
i,j:byte;
begin
writeln(' Macierz ',opis);
Write('Podaj liczbe wierszy : '); Readln(wZ);
Write('Podaj liczbe kolumn : '); Readln(kZ);
for i:=1 to wZ do
begin
for j:=1 to kZ do
begin
writeln('Podaj wartosc macierzy ',opis,'[',i,',',j,']');
readln(Z[i,j]);
end;
end;
end;
-procedure wypisz_macierz(opis:string;var Z:macierz;var wZ,kZ:byte);
var
i,j:byte;
begin
writeln(' Macierz ',opis);
readln;
for i:=1 to wZ do
begin
for j:=1 to kZ do
write(Z[i,j]:10:2);
writeln;
end;
readln;
end;
-procedure dodaj_macierz( wZ,kZ:byte;var Z:macierz; wX,kX:byte;var X:macierz;var wY,kY:byte;var Y:macierz;var Spr:boolean);
var
i,j:byte;
begin
Spr:= (wZ=wX) and (kZ=kX);
if Spr then
begin
for i:=1 to wZ do
for j:=1 to kZ do
Y[i,j]:=Z[i,j]+X[i,j];
wY:=wZ;
kY:=kZ;
end
else
writeln('Macierze nie maja rownych wymiarow, dodawanie niemozliwe.');
readln;
end;
begin
wczytaj_macierz('A',A,wA,kA);
wypisz_macierz('A',A,wA,kA);
wczytaj_macierz('B',B,wB,kB);
wypisz_macierz('B',B,wB,kB);
dodaj_macierz(wA,kA,A,wB,kB,B,wC,kC,C,Spr);
wypisz_macierz('C',C,wC,kC);
Readln;
end.
-procedure mnozenie_macierz( wZ,kZ:byte; Z:macierz; wX,kX:byte; X:macierz;var wY,kY:byte;var Y:macierz;var Spr:boolean);
var
i,j,k:byte;
Cos:array [1..2,1..2] of real;
begin
Spr:= (kZ=wX) ;
if Spr then
begin
Cos[1,1]:=0;
for i:=1 to wZ do
for j:=1 to kX do
begin
Cos[1,1]:=0;
for k:=1 to kZ do
begin
Cos[1,1]:=Z[i,k]*X[k,j]+Cos[1,1];
Y[i,j]:=Cos[1,1];
end
end;
wY:=wZ;
kY:=kX;
end
else
writeln('Mnozenie niemozliwe.');
readln;
end;
1.Type macierz=Array[1..10,1..10] of real;
var j,I,n,k:byte;
A:macierz;
Begin
Writeln(`podaj wartość n'); readln(n);
Writeln(`podaj wartość k'); readln(k);
For i:=1 to n do
For j:=1 to k do
Writeln(`podaj wartość macierzy A[`,j,',',i,']');
Readln(A[j,i]);
End.
2.Wypisywanie macierzy
type macierz=array[1..10,1..10] of real;
var j,i,n,k:byte;
A:macierz;
Begin
Writeln(`podaj wartość n'); readln(n);
Writeln(`podaj wartość k'); readln(k);
For i:=1 to n do
For j:=1 to k do
Begin
Writeln(`podaj element macierzy A[`,j,',',i,']');
Readln(A[j,i]);
End;
3.Type Tablica=Array[1..10,1..10] of Real;
Var A,B,C:Tablica;
wA,kA,wB,kB,wC,kC:Byte;
procedure czytaj(var X:Tablica;var wX,kX:Byte);
var i,j:Byte;
begin
write(`liczba wierszy'); readln(wX);
write(`liczba kolumn'); readln(kX);
for i:=1 to wX do
for j:=1 to kX do
begin
write(`X[`,i,',',j,']= `);
readln(X[i,j]);
end;
end.
SORTOWANIE
ALGORYTMY SORTOWANIA TABLIC
Sortowaniem nazywamy proces ustawiania zbioru obiektów w określonym porządku. Spośród wielu algorytmów sortowania przedstawione będą tyko najprostsze. Wybór algorytmu zależy od struktury przetwarzanych danych. Najważniejszym wymaganiem stawianym metodom sortowania tablic jest oszczędne korzystanie z pamięci komputera oraz szybkość sortowania.
Sortowanie bąbelkowe
Algorytm sortowania bąbelkowego polega na porównywaniu i zamianie par sąsiadujących ze sobą elementów. Na przykład, w przypadku sortowania rosnącego, jeżeli element pierwszy jest większy od następnego, elementy zastępujemy miejscami, w przeciwnym wypadku elementy pozostawiamy bez zmian. Ponieważ w czasie sortowania elementy o najmniejszych wartościach „wypływają do góry” natomiast elementy o wartościach większych „opadają na dno”, stąd nazwa sortowania. Sortowanie bąbelkowe jest bardzo proste do zaprogramowania, ale metoda ta jest wolna.
const Max = 100;
type Wektor = Array[0..Max] of Integer;
var A : Wektor; N_elementow : Integer;
procedure Sortowanie_babelkowe(var A : Wektor);
var
i,j : Integer;
pamiec : Integer;
begin
for i:=2 to N_elementow do
for j:=N_elementow DownTo i do
if A[j-1]>A[j] then
begin
pamiec:=A[j-1];
A[j-1]:=A[j];
A[j]:=pamiec;
end;
end;
Sortowanie przez wstawianie
Metoda ta polega na tym, że przeglądamy po kolei całą tablicę. Jeżeli któryś z elementów nie znajduje się na swoim miejscu, wstawiamy go tam, gdzie powinien się znajdować w przypadku tablicy posortowanej.
Algorytm ten można przyśpieszyć stosując inna metodę ustalania miejsca wstawienia sortowanego elementu, np. metodę przeszukiwania połówkowego.
procedure Sortowanie_przez_wstawianie (var A : Wektor);
var
i,j : Integer;
pamiec : Integer;
begin
for i:=2 to N_elementow do
begin
pamiec:=A[i];
A[0]:=pamiec;
j:=i-1;
while pamiec<A[j] do
begin
A[j+1]:=A[j];
j:=j-1;
end;
A[j+1]:=pamiec;
end;
end;
Sortowanie przez wybieranie
Algorytm polega na wyszukaniu elementu o najmniejszej wartości i zamianie go miejscami z elementem, który znajduje się na pozycji pierwszej pierwszym przebiegu, drugiej w przebiegi drugim, itd.
procedure Sortowanie_przez_wybieranie(var A : Wektor);
var
i,k : Integer;
pamiec : Integer;
procedure Min(n:Integer; var k:Integer);
var
j:Integer;
x:Integer;
begin
x:=A[n];
k:=n;
for j:=n+1 to N_elementow do
if A[j]<x then
begin
x:=A[j];
k:=j
end;
end;
begin
for i:=1 to N_elementow-1 do
begin
Min(i,k);
pamiec:=A[i];
A[i]:=A[k];
A[k]:=pamiec
end
end;
unit sort;interface const Max = 100;
type Wektor = Array[0..Max] of Integer;
var A : Wektor; N_elementow : Integer;
procedure Sortowanie_babelkowe(var A : Wektor);
procedure Sortowanie_przez_wstawianie(var A : Wektor);
procedure Sortowanie_przez_wybieranie(var A : Wektor);
implementation
procedure Sortowanie_babelkowe(var A : Wektor);
var
i,j : Integer;
pamiec : Integer;
begin
for i:=2 to N_elementow do
for j:=N_elementow DownTo i do
if A[j-1]>A[j] then
begin
pamiec:=A[j-1];
A[j-1]:=A[j];
A[j]:=pamiec;
end;
end;
procedure Sortowanie_przez_wstawianie (var A : Wektor);
var
i,j : Integer;
pamiec : Integer;
begin
for i:=2 to N_elementow do
begin
pamiec:=A[i];
A[0]:=pamiec;
j:=i-1;
while pamiec<A[j] do
begin
A[j+1]:=A[j];
j:=j-1;
end;
A[j+1]:=pamiec;
end;
end;
procedure Sortowanie_przez_wybieranie(var A : Wektor);
var
i,k : Integer;
pamiec : Integer;
procedure Min(n:Integer; var k:Integer);
var
j:Integer;
x:Integer;
begin
x:=A[n];
k:=n;
for j:=n+1 to N_elementow do
if A[j]<x then
begin
x:=A[j];
k:=j
end;
end;
begin
for i:=1 to N_elementow-1 do
begin
Min(i,k);
pamiec:=A[i];
A[i]:=A[k];
A[k]:=pamiec
end
end;
end.
Inne metody sortowania
Shaker-sort
Jest to metoda oparta na sortowaniu bąbelkowym, przy czym elementy zamienia się miejscami przemiennie od początku i końca. Dzięki temu proces sortowania jest nieco szybszy w porównaniu z sortowaniem bąbelkowym.
Heap-sort
Przedstawione wyżej metody sortowania przetwarzają podczas każdego przebiegu tylko jeden element z listy. Naturalnie wywołuje to znaczne ograniczenie szybkości działania. Użycie pomocniczego pola numerycznego (heap), w którym podczas jednego przebiegu można zapamiętać od razu kolejność sortowania dla kilku elementów, znacznie zwiększa szybkość działania. Pole pomocnicze można uważać jako drzewo binarne, w którym elementy występują według ich uporządkowania. Przebieg sortowania odbywa się w dw6ch etapach: najpierw powstaje pole pomocnicze w postaci drzew a binarnego w wyniku porównania elementów listy. Następnie, po przetworzeniu tego drzewa, można element po elemencie przenieść do prawidłowej pozycji listy.
A.TYPY PROSTE PREDEFINIOWANE
• Typy całkowite
Typy całkowite są podzbiorami zbioru liczb całkowitych. W zależności od zakresu, z czym związana jest liczba bajtów pamięci rezerwowanych dla zmiennych danego typu, wyróżnia się typy:
Integer -32 768 do 32 767 (zmienna zajmuje 2 B pamięci)
ShortInt -128 do 127 (1 B)
LongInt -2 147 483 648 do 2 147 483 647 (4 B)
Byte 0 do 255 (1 B)
Word 0 do 655 535 (2 B)
• Typy rzeczywiste
Typy te są dyskretnym i skończonym podzbiorem zbioru liczb rzeczywistych.
W Pascalu korzystać można z pięciu typów rzeczywistych o określonym zakresie:
Real 2.9e-39 do 1.7e38 (11-12 cyfr znaczących) (6B)
Single 1.5e-45 do 3.4e38 ( 7-8 cyfr znaczących) (4B)
Double 5.0e-324 do 1.7e308 (15-16 cyfr znaczących) (8B)
Extended 3.4e-4932 do 1e4932 (19-20 cyfr znaczących) (10B)
Comp około -9.2e18 do 9.2e18 (8B)
• Typ logiczny
Boolean
Wartości tego typu są oznaczone za pomocą dwu predefiniowanych literałów (stałych) : FALSE i TRUE, oznaczających odpowiednio wartości logiczne fałsz i prawda, przy czym w sensie uporządkowania słała FALSE poprzedza stałą TRUE. Liczbami porządkowymi elementów typu Boolean są tylko 0 (False) i 1 (True). Typ Boolean jest jednym z typów wyliczeniowych, omówionych bliżej w punkcie B.
• Typ znakowy
Char - elementami tego typu są znaki ASCII, z których każdy pamiętany jest w
jednym bajcie pamięci.
B.TYPY PROSTE DEFINIOWANE PRZEZ PROGRAMISTE
• Typ wyliczeniowy
Jest stosowany zwykle dla zbiorów o niewielkiej liczbie elementów. Na elementach typu wyliczeniowego nie wykonuje się operacji arytmetycznych. Porządek w tym typie jest zgodny z kolejnością wyliczenia w definicji typu. Elementy typu wyliczeniowego posiadają liczby porządkowe odpowiednio 0,1,2, ..itd.
Definicja :
type identyfikator_typu = (lista_identyfikatorów);
Przykład poprawnych definicji typu wyliczeniowego
type
dni_tygodnia = (poniedzialek, wtorek, sroda, czwartek,
piatek, sobota, niedziela);
niewiadome = (x,y,z);
wspolrzedne = (x1,y1,x2,y2);
Przykłady błędnych definicji:
type
zbior_1 = (a,b,c,a); { powtórzony element a }
zbior_2 = (1,2,3a); { 1,2,3a nie są identyfikatorami)
zestaw_liter_1 = (a,b,c,d);
Edward Preweda KIOT WGGiIŚ AGH - 12 - Szkoła programowania w Pascalu
zestaw_liter_2 = (c,d);
{ dwa różne typy zawierają wspólne identyfikatory }
• Typ okrojony
Typ okrojony ogranicza zbiór wartości dowolnego z typów porządkowych,poprzez wyspecyfikowanie najmniejszej i największej dopuszczalnej wartości.
Typy okrojone sluzy do ograniczania zakresów wartości dowolnego z dotychczas przedstawionych typów porzadkowych.
Definicja:
type identyfikator_typu = stala_1 .. stala_2;
Obie stałe muszą należeć do tego samego typu porządkowego, zwanego typem bazowym. Stała_1 podaje ograniczenie dolne i nie może być większa od stałej_ 2 - podającej ograniczenie górne. Pierwsze wyrażenie stałe w definicji typu okrojonego nie może rozpoczynać się od nawiasu okrągłego otwierającego, tj. znaku(.
Przykłady
type
znaki = 'a'..'z';
{ typ okrojony znaki jest podzbiorem
standardowego typu Char }
przedzial = 1..10
const
x = 20;
y = 30;
type
zakres = x+y..10*(x+y);
type
sprzet = (XT, 286, 386, 486, Pentium, PentiumII );
dobry_sprzet = Pentium..PentiumII;
• Typ łańcuchowy
Typ łańcuchowy służy do przechowywania tekstów (napisów . nie można mylić z typem tekstowym Text). Elementami łańcucha mogą być dowolne znaki z bieżącej matrycy znaków komputera.
Definicja:
type identyfikator_typu : String;
identyfikator_typu : String[rozmiar];
Przykłady:
type
wiersz = String [72];
napis = String;
im_naz = String[40];
• Typy strukturalne
Typy te stosuje siê do opisu obiektów zlozonych.Kazdy z typów strukturalnych definiuje siê przez podanie typów elementów i metody strukturalizacji, która zarazem okresla sposób dostêpu do elementów.
Definicja :
type identyfikator_typu = opis_typu;
Wyróżnia takie typy strukturalne jak tablicowy, rekordowy, plikowy, zbiorowy,
obiektowy, wskaźnikowy .
• Typ tablicowy
Tablica jest zbiorem elementów tego samego typu. Dostęp do poszczególnych elementów tablicy następuje za pomocą indeksu (indeks w ogólności może być wyrażeniem). W przypadku tablic wielowymiarowych elementy tablicy identyfikowane są przez odpowiedni ciąg indeksów. W każdym przypadku indeks musi być typu porządkowego.
Definicja:
type
identyfikator_typu = Array[typ_indeksów] of typ_elementów;
Przykłady
type
wektor_1 = Array[1..10] of Real;
wektor_2 = Array[′a′..′d′] of Real;
macierz_1 = Array[0..10] of Array[30..40] of Integer;
macierz_2 = Array[1..10,30..40] of Integer;
• Typ rekordowy
Rekord składa się z elementów zwanych polami. Pola mogą być różnych typów, a dostęp do nich następuje poprzez wyspecyfikowanie odpowiednich identyfikatorów określonych w definicji typu rekordowego.Rekord może mieć kilka wariantów, z których każdy może posiadać różną liczbę pól. Dostęp do danego wariantu rekordu uzyskuje się na ogół poprzez wartość tzw. pola znacznikowego, wspólnego dla wszystkich wariantów.
Definicja:
type identyfikator_typu = record
lista_deklaracji_pól
end;
Przykłady
type data = record
dzien : 1..31;
miesiac : 1..12;
rok : Word
end;
type punkt =record
numer : Word;
x,y,z : Real;
opis : String[40]
end;
• Typ zbiorowy
Elementami zbioru są wszystkie podzbiory pewnego typu porządkowego,zwanego typem bazowym, określanego w definicji zbioru. Typ bazowy nie może przekraczać liczby 256 elementów. Na zbiorach można dokonywać operacji teoriomnogościowych.
Definicja:
type identyfikator_typu = set of typ_porządkowy;
Przykłady
type
weekend = (sobota, niedziela);
wyjazdy = set of dzien;
• Typ plikowy
Plik reprezentuje dane przechowywane w pamięci dyskowej. Plik jest ciągiem elementów tego samego typu. Dostęp do elementów typu plikowego jest sekwencyjny,w danej chwili dostępny jest tylko jeden element pliku.
Definicja:
type
identyfikator_typu = file;
type
identyfikator_typu = file of opis_typu_;
type
identyfikator_typu = Text;
Przykłady
type
dowolny_plik = File;
dane = Text;
znaki = file of Char;
daty = file of record
dzien :1..31;
miesiac : 1..12;
rok : Word;
end;
• Typ obiektowy
Obiekt jest strukturą składającą się ze stałej liczby elementów, z których każdy jest polem określonego typu (analogicznie jak w rekordzie) lub metodą (procedurą lub funkcją), która określa operacją wykonywaną na obiekcie. Typ obiektowy może dziedziczyć elementy innego typu obiektowego. Bliższe omówienie tego typu oraz dodatkowych pojęć z nim związanych znajduje się w punkcie [.]
• Typ wskaźnikowy
Typ wskaźnikowy jest związany z tzw. zmiennymi dynamicznymi.W języku Pascal występują dwa rodzaje zmiennych : statyczne i dynamiczne.Zmienne statyczne są to zmienne deklarowane w programie, posiadające określony identyfikator i istniejące w obrębie określonej części programu. Zmienne dynamiczne mogą być natomiast wygenerowane w wyniku realizacji jednej z instrukcji i nie posiadające identyfikatorów.
Definicja typu wskaźnikowego
Definicja typu wskaźnikowego ma postać:
type identyfikator_typu_wskaźnikowego = ^identyfikator_typu_bazowego;
Zmienne typu wskaźnikowego wskazują na dane typu bazowego.Identyfikator typu bazowego może być określony wcześniej lub w tym samym zdaniu type, w którym występuje definicja danego typu wskaźnikowego.
Przykłady:
a) type Macierz = Array[1..10, 1..10] of Byte;
Macierz_dynamiczna = ^Macierz;
b) type Lista_dynamiczna = ^Lista;
Lista = record
Lp : Byte
X,Y : Real;
end;
c) type Liczba = ^LongInt;
Zmienne wskaźnikowe
Po wprowadzeniu deklaracji:
var M : Macierz_dynamiczna;
L : Lista_dynamiczna;
zmiennej wskaźnikowej M można będzie w programie przypisywać adresy pamięci danych (zmiennych dynamicznych) typu Macierz,natomiast zmiennej wskaźnikowej L - adresy pamięci danych (zmiennych dynamicznych) typu Lista.
Deklaracja zmiennej wskaźnikowej
var x : Liczba
umożliwi przypisanie zmiennej x adresów pamięci danych (zmiennych dynamicznych) typu LongInt.
Zmienne wskaźnikowe można również zadeklarować następująco:
var M1 : ^Macierz; L1 : ^Lista; X1 : ^LongInt;
Zmienne dynamiczne pamiętane są segmencie pamięci o strukturze stosowej.
Typy proceduralne
type nazwa = procedure (lista_parametrów);
lub
type nazwa = function {lista_paramatrow} : typ_wartsci_funkcji;
W obu przypadkach lista parametrów może być pusta - procedury i funkcje mogą być bezparametrowe.
DEKLARACJA ZMIENNYCH
-Zmienne całościowe
Zmienne całościowe są najprostszym rodzajem zmiennych. Nazwa zmiennych całościowych składa się z samego identyfikatora.
Przykłady
var licznik : Integer;
znak : Char;
a,b,c : Real;
begin
licznik:=1;
znak:='x';
a:=2;
b:=5;
c:=a/b;
end.
- Zmienne indeksowane
Są to zmienna które służą do odwołania się do elementów zmiennej typu tablicowego oraz do odwoływania się do pojedynczych znaków zmiennych łańcuchowych. Indeks jest dowolnym wyrażeniem którego wartość jest zgodna z typem indeksowym. W przypadku odwoływania się do zmiennych łańcuchowych, zmienna indeksowana może posiadać tylko jeden indeks o wartości od 0 do n, gdzie n -zadeklarowana długość łańcucha. Wartość zmiennej indeksowanej jest w tym przypadku typu znakowego (Char).
Przykłady:
type
Wektor = Array[0..5] of Word;
Macierz = Array[0..10, 0..10] of Real;
Napis = String[20];
var
w : Wektor;
m : Macierz;
nazwa : Napis
element : Real;
znak : Char;
begin
{...}
w[0]:=0;
element:=m[1][8] := 10.23;
element:=m[1,2*4] := 10.23;
znak:=nazwa[2];
{...}
end.
- Zmienne rekordowe
Są to zmienne których wartości są typu rekordowego. Aby odwołać się do pola rekordu, należy za identyfikatorem zmiennej rekordowej podać tzw. desygnator pola postaci:
Przykłady:
type opis = record
Lp : Byte;
Imie, Nazwisko : String[20]
end;
wykaz = Array[1..N] of opis;
var i: : Integer;
student : opis;
lista : wykaz;
zbior : record
wydzial : record
kierunek : String;
rok : 1..5;
end;
grupa : wykaz;
end;
- Zmienne absolutne
Są to zmienne którym adres pamięci przydziela programista. Adres ten specyfikuje się w deklaracji zmiennej.
Przykład:
var tryb : Byte absolute $0080:$0089
Jest to deklaracja zmiennej bajtowej tryb, której przydzielono pamięć w segmencie o adresie $0080 począwszy od bajtu o adresie względnym $0089.
var bufor : Array[1..100] of record
Lp : Byte;
znak : Char;
end absolute $B050:$0000;
-ZMIENNA OBIEKTOWA
Zmienna, której wartosci sa typu klasowego,nazywamy zmienna obiektowa.W celu odwolania się do pola obiektu stosuje się,podobnie jak dla rekordu, desygnator pola.
W odowolaniu do wlasnosci stosujemy desygnator wlasnosci:
.identyfikator-wlasnosci
-ZMIENNA DYNAMICZNA
Wartooeci typów wskaznikowych, tj. wskazniki, określają adresy pamiêci zmiennych dynamicznych , którym pamiêc moze byc przydzielana i zwalniana w trakcie wykonywania programu. W celu odwolania siê do zmiennej pewnego typu, z którym zwiazano typ wskaznikowy, stosuje siê zmienne wskazywane postaci zmienna-wskaznikowa ^
Jezeli zmienna wskaznikowz oznaczymy przez w i zalozymy,ze jest ona zwiazana z typem T, to zmienna wskazywana w^ jest ta zmienna typu T, na która wskazuje w. Wartoscia zmiennej w^ jest więc pewien element typu T o adresie w.
var w : wskaznik;
-ZMIENNE PROCEDYRALNE
var identyfikator-zmiennej : typ-proceduralny;Zmiennej proceduralnej moga byc przypisywane wartosci
proceduralne , tzn.:
- identyfikatory funkcji i procedur, gdy zmienna jest ogólnego typu proceduralnego (ale nie funkcje
i procedury z modulu System oraz zaglębione, tj.opisane wewnatrz innej funkcji lub procedury),
- identyfikatory metod (z kwalifikacja obejmujaca nazwę zmiennej obiektowej), gdy zmienna jest obiektowego typu proceduralnego,
- wartosci innych zmiennych proceduralnych,
- adres pusty (nil).
var parsin : function sinus(x : Extended) : Extended;
-ZMIENNE INDEKSOWE
[-5..10] , [0..19, 0..19]
Do dowolnego elementu statycznej tablicy jednowymiarowej mozna odwołać siê za pomoca nazwy indeksowanej.W najprostszym przypadku nazwa taka sklada siê z nazwy tablicy, tj. identyfikatora zmiennej typu tablicowego, po której nastêpuje ujêty w nawiasy kwadratowe indeks. Indeks jest dowolnym wyrazeniem (bêdzie dalej), którego wartosc powinna być zgodna w sensie przypisania z typem indeksowym podanym w definicji typu tablicowego. Zmienne indeksowane sluza takze do odwolywania sie do pojedynczych znaków zmiennych typów lañcuchowych krótkich (moze posiadac tylko jeden indeks o wartosci od 0 do n, gdzie n oznacza zadeklarowana lub przyjmowana standardowo długość lañcucha.) i dlugich (powinna nalezec do przedzialu od 1 do m, gdzie m oznacza dynamiczna dlugosc lañcucha,). Zmienne indeksowane moga byc uzywane takze do odwolywania siê do elementów tablic dynamicznych.
DYREKTYWY
definiujące
taka dyrektywa definiuje pewną stałą, która umożliwia parametryzowanie kompilacji, poprzez kontrolę istnienia definicji w dyrektywach warunkowych, np. DEFINE, UNDEF
parametryczne
które przekazują informację do translatora, informacje te mogą dotyczyć środowiska, w którym następuje kompilacja, dostępność pamięci, zbiór, który ma być włączony do kodu źródłowego, np. C
atrybuty, I nazwa_zbioru,
warunkowe
umożliwiającą kompilację warunkową określonych sekcji kodu źródłowego (sekcja rozumiana jest jako tekst zawarty pomiędzy dyrektywą warunkową, a dyrektywą zamykającą blok dyrektywy warunkowej, porównaj: instrukcja warunkowa), może to dotyczyć np. uwzględnienia różnic systemów komputerowych i wiele innych zastosowań, np. IFDEF nazwa, IFNDEF nazwa, IFOPT przełącznik, ELSE, ENDIF,
przełącznikowe
ustalające sposób kompilacji, sposób ten może być różny dla różnych, nawet niewielkich fragmentów kodu, np. F+, F-, S+, S- i inne.
DEFINICJA LITERAŁÓW ZMIENNYCH
Literał zmienny jest pośrednim elementem pomiędzy stałą i zmienną. Literały zmienne mogą być w pewnym sensie uważane za zmienne którym nadano wartość początkową. W programie, literały zmienne mogą zmieniać swoją wartość podobnie jak zmienne. Różnica względem zmiennych polega na tym że w wyniku ponownego uruchomienia programu znajdującego się w pamięci operacyjnej zachowywane są wartości literałów zmiennych z poprzedniego wykonania. Również literały zmienne deklarowane w procedurach i funkcjach nie są reinicjowane.Oznacza, to że przy ponownym wywołaniu procedury lub funkcji literały zmienne posiadają wartości z poprzedniego wywołania.
- Wyrażenie stałe jest to wyrażenie, które może być obliczone przez kompilator.wyrażenie stałe nie może zawierać zmiennych, literałów zmiennych z wyjątkiem literałów którym przypisano stałe wyrażenia adresowe, wywołań funkcji za wyjątkiem niektórych funkcji standardowych oraz operatora adresowego @. W szczególności, wyrażenie stałe jest liczbą lub łańcuchem.
Przykład:
const
znak : Char = 'x';
napis : String[10] = 'Wtorek';
liczba : Byte = 21;
- Stała tablicowa jest w ogólności ciągiem stałych ujętych w nawiasy okrągłe.Poszczególne stałe oddzielane są przecinkami. Stałe tablicowe znakowe mogą być podane również jako łańcuchy ( łańcuch podajemy bez nawiasów okrągłych).
Przykład:
const znaki_1 : Array[1..5] of Char = ('1','a','b','$');
znaki_2 : Array[1..5] of Char = '12ab$';
-Stała rekordowa jest ciągiem elementów oddzielonych średnikami. Każdy element ma postać:
identyfikator_pola : stała_typowa;
Pola powinny być wyspecyfikowane w takiej kolejności jak występują w definicji danego typu rekordowego. Nie jest dozwolone nadawanie wartości literałom zmiennym typu rekordowego zawierającego pola typu plikowego.
Przykład:
type punkt = record
Nr : Byte;
x,y : Real;
end;
odcinek = Array[1..2] of punkt;
const dane : punkt = (Nr:12 ; x:20.20 ; y:30.30);
rysuj : odcinek =( ( Nr:1 ; x:1.0 ; y:1.0) ,
( Nr:2 ; x:20.0 ; y:30.0));
- Stała zbiorowa jest ujętym w nawiasy kwadratowe ciągiem elementów zbioru oddzielanych przecinkami. Definicja literału zmiennego typu zbiorowego może również określać zbiór pusty [ ].
Przykłady:
type
kolory : (zolty, niebieski, zielony);
barwa : set of kolory;
const
kolor : barwa = [niebieski, zielony];
nieznany_kolor : barwa = [ ];
INSTRUKCJE STRUKTURALNE
- Instrukcja złożona jest ciągiem instrukcji poprzedzonych słowem kluczowym begin i zakończonym słowem kluczowym end. Składnia Turbo Pascala wymaga często użycia jednej instrukcji, podczas gdy dla realizacji celu niezbędne jest wykonanie wielu instrukcji. W tych przypadkach korzysta się z instrukcji złożonej,która tworzy z ciągu instrukcji jedną instrukcję.
Przykład:
begin
a:=4.5;
x:=18;
dane:='macierz.txt'
end;
- Instrukcje warunkowe W przypadku nawet najprostszych zadań, algorytm bardzo często wymaga zastosowania rozgałęzień. Do realizacji tego zadania służą instrukcje warunkowe. W
Pascalu istnieją dwie instrukcje warunkowe: instrukcja instrukcja if (jeśli) oraz instrukcja case (wyboru).
- Instrukcja if ... then ... else ...;
Wartością wyrażenia jest wartość logiczna True lub False. Jeśli wartość wyrażenia jest True, to zostanie wykonana instrukcja podana po słowie then, w przeciwnym razie następna instrukcja, a jeżeli występuje słowo else - instrukcja po słowie else.
Przykłady:
if x>0 then y:=1;
if (x>0) or (y<1) then z:=3
else
begin
z:=2;
y:=z+1
end;
Instrukcje warunkowe if mogą być zagnieżdżane, tzn. po słowach then i/lub else mogą występować kolejne instrukcje jeśli.W instrukcji zagnieżdżonej, każda jednostka else jest przyporządkowana najbliższej poprzedzającej ją jednostce then, dla której jednostka else jeszcze nie wystąpiła.
Przykłady:
if x>0 then if y>0 then z:=1;
- Instrukcja case ... of ... else ...end;
W przypadku instrukcji wyboru, wykonanie konkretnych instrukcji jest uzależnione od wartości pewnej zmiennej (selektora).Wyrażenie (selektor) musi być typu porządkowego.
Instrukcje wyboru mogą być poprzedzone jedną lub kilkoma stałymi wyboru.Poszczególne stałe wyboru oddzielane są przecinkami. Stałe wyboru oddzielane są dwukropkiem od instrukcji wyboru.
Przykład
case znak of
'A'..'Z', 'a'..'z' : Writeln('litera');
'0'..'9' : Writeln('cyfra');
'+', '-', '*', '/' : Writeln('operator');
else
Writeln('znak specjalny');
end;
- Instrukcje iteracyjne służą do wielokrotnego wykonywania pewnych sekwencji instrukcji. Instrukcje iteracyjne mogą być stosowane zamiennie, co oznacza, że praktycznie
każdą .pętlę. można zapisać za pomocą dowolnie wybranej instrukcji. Nie oznacza to jednak, że polecam taki sposób programowania. Zastosowanie tej .najwłaściwszej jest prawdziwą sztuką, a zależy przede wszystkim od sposobu myślenia programisty.
- Instrukcja for..to, for...downto Stosowana jest najczęściej dla wielokrotnego wykonania grupy instrukcji gdy znana jest liczba powtórzeń.
Parametr zmienna oraz wartość inicjująca i kończąca instrukcję muszą należeć do
jednego z typów porządkowych.
Przykłady
for i := 1 to N do Writeln(i);
for i := 1 to 10 do
for j := 1 to 10 do
begin
x := 0;
for k := 1 to 10 do
x := x + macierz_1[i,j] * macierz_2[k,j];
macierz[i,j] := x
end;
for znak:='z' downto 'a' do Writeln(znak);
- Instrukcja repeat...until Instrukcja ta służy do wykonywania obliczeń iteracyjnych ze sprawdzaniem warunku na końcu instrukcji. Instrukcje zawarte pomiędzy repeat i until są sekwencyjnie wykonywane dopóki wyrażenie logiczne po słowie kluczowym until nie osiągnie wartości True. Ponieważ warunek sprawdzany jest na końcu instrukcji,instrukcje zamieszczone pomiędzy słowami kluczowymi repeat i until wykonają się zawsze przynajmniej jeden raz.
Przykłady
repeat
Readln(liczba)
until liczba=0;
repeat
Write('Wprowadź liczbę całkowitą: ');
Readln(liczba)
until (liczba >= 0) and (liczba <=9);
- Instrukcja while ...do ...; służy do opisywania iteracji ze sprawdzeniem warunku na początku instrukcji
Przykłady
while liczba <>0 do Readln(liczba);
while (liczba < 0) and (liczba >9) do
begin
Write('Wprowadź liczbę całkowitą: ');
Readln(liczba)
end;
- Instrukcja wiążąca with ... do ..;
Przykłady
with data[i] do
begin
miesiac := 1;
rok := rok + 1;
end;
PLIKI
PLIKI TEKSTOWE zapisują informacje jako ciąg znaków (kodów ASCII) . Można w nich zapisywać wielkości różnych typów oraz stosować formatowanie zapisu. Pliki te umożliwiają wyłącznie dostęp sekwencyjny do zawartych w nich danych. Oznacza to, że aby odczytać wartość określonego elementu, należy wcześniej przeczytać to co jest przed nim.
PLIKI ZDEFINIOWANE wykorzystują w zapisie reprezentację maszynową. W przypadku pliku zdefiniowanego możliwy jest zapis i odczyt wielkości wyłącznie jednego typu składowego. Pliki te są plikami o dostępie swobodnym, co oznacza, że w każdym momencie możliwy jest dostęp do dowolnego elementu pliku.
PLIKI NIEZDEFINIOWANE stosuje się w celu dostępu do fizycznych zbiorów danych zgodnie z ich wewnętrznym formatem lub w przypadku, gdy typ pliku nie jest istotny (np. podczas kasowania pliku z dysku).
W przetwarzaniu plików wyróżnia się następujące etapy:
• kojarzenie pliku z fizycznym zbiorem danych
• otwarcie pliku
• wykonanie operacji plikowych (przetwarzanie pliku)
• zamknięcie pliku
FUNKCJE I PROCEDURY OBSŁUGI DOWOLNYCH PLIKÓW
Assign(zmienna_plikowa, nazwa_zbioru_typu_łańcuchowego)
Procedura ta umożliwia skojarzenie zmiennej plikowej z fizycznym zbiorem danych o podanej ścieżce (max 79znaków) . W momencie wywołania powyższe procedury plik nie może być otwarty. Jeżeli jako drugi parametr podamy pusty łańcuch, zmienna plikowa zostanie skojarzona ze standardowymi urządzeniami wejścia i wyjścia- klawiaturą i monitorem.
• Rewrite(zmienna_plikowa)
lub
• Rewrite(zmienna_plikowa,rozmiar)
Procedura powoduje utworzenie nowego fizycznego zbioru danych o nazwie skojarzonej wcześniej z podaną zmienną plikową (otwarcie do zapisu). W przypadku gdy zbiór o takiej nazwie już istnieje, zostanie on usunięty a w jego miejscu zostanie utworzony nowy zbiór pusty. Zbiór po otwarciu ustawiany jest w pozycji początkowej. Druga postać wywołania procedury może być stosowana tylko w odniesieniu do plików niezdefiniowanych. W przypadku plików niezdefiniowanych, za pomocą parametru rozmiar (typu Word)można określić rozmiar tworzonych zapisów zewnętrznego zbioru danych. Pominięcie tego argumentu(parametru) oznacza przyjęcie rozmiaru domyślnego równego 128 bajtów.
• Reset(zmienna_plikowa)
lub
• Reset(zmienna_plikowa, rozmiar)
Procedura ta służy do otwarcia pliku skojarzonego z już istniejącym zbiorem. (Otwarcie do odczytu). Zbiór pootwarciu ustawiany jest w pozycji początkowej. Druga postać wywołania procedury może być stosowana tylkow odniesieniu do plików niezdefiniowanych.
• Release- zwalnia aktywne okno z pamięci. Warto używać przy wyjściu z programu
Procedura ta usuwa ze stosu zmienną dynamiczną wskazywaną zmienną_wskaźnikową oraz wszystkie zmienne następujące po niej.
• Close(zmienna_plikowa);
Procedura zamyka fizyczny zbiór danych skojarzony ze zmienną plikową.
• Eof(zmienna_plikowa);
lub
• Eof (gdy wywołanie dotyczy standardowego pliku wejściowego Input)
Funkcja ta przyjmuje wartość logiczną TRUE gdy plik znajduje się w pozycji przed ostatnim znakiem zbioru
(znakiem Ctrl-Z) lub gdy zbiór nie zawiera żadnych elementów. W przeciwnym wypadku ma wartość FALSE.
• Erase(zmienna_plikowa)
Procedura usuwa zbiór skojarzony ze zmienną plikową. Plik ten nie może być otwarty.
• Rename(zmienna_plikowa, łańcuch)
Procedura umożliwia zmianę nazwy zbioru dyskowego. Zbiorowi skojarzonemu ze zmienną plikową
nadawana jest nazwa określona przez łańcuch. Plik nie może być otwarty.
• ChDir(ścieżka)
Procedura umożliwiają zmianę bieżącego katalogu na katalog i/lub napęd określony przez ścieżkę, np.:
ChDir('C:');
ChDir(A:\PROGRAMY');
• GetDir(liczba, łańcuch)
Po wywołaniu tej procedury uzyskamy informacje o bieżącym katalogu w określonym napędzie.
liczba = 0 - napędem jest napęd bieżący
liczba = 1 - napęd A
liczba = 2 - napęd B, itd.
Nazwa bieżącego katalogu (dla napędu określonego liczbą) podstawiana jest pod zmienną łańcuch typu string.Dla przykładu, po wywołaniu procedury GetDir(3,katalog);
pod zmienną katalog podstawiana jest nazwa bieżącego katalogu na dysku C:
• MkDir(łańcuch)
Procedura powoduje utworzenie nowego podkatalogu określonego przez łańcuch (ścieżkę nowego
podkatalogu), np.;MkDir('A:\PASCAL\DANE');
• RmDir(ścieżka)
Procedura usuwa pusty podkatalog określony przez ścieżkę.
• IOResult
Jest to bezparametrowa funkcja typu Word podająca, w przypadku wyłączonej kontroli systemowej warunków wejścia wyjścia, status ostatnio wykonanej operacji wejścia-wyjścia. Jeżeli podczas wykonywania operacji wejścia wyjścia nie wystąpi żaden błąd to funkcja przyjmuje wartość 0, w przeciwnym wypadku zwraca kod błędu.
FUNKCJE I PROCEDURY PRZETWARZANIA PLIKÓW TEKSTOWYCH
Append(zmienna_plikowa)
Procedura otwiera plik skojarzony ze zmienną plikową i ustawia zbiór na pozycji końcowej (otwarcie do dopisywania).
• Eoln(zmienna_plikowa);
lub
• Eoln (gdy wywołanie dotyczy standardowego pliku wejściowego Input)
Funkcja, której wartość logiczna jest TRUE gdy plik znajduje się w pozycji znaku końca wiersza (tj. znakuCR) lub gdy wartością funkcji Eof dla tej samej zmiennej plikowej jest TRUE. W przeciwnym wypadku wartością funkcji jest FALSE.
• Flush(zmienna_plikowa)
Procedura ta powoduje dla pliku tekstowego otwartego wywołaniem procedury Rewrite lub Append wyzerowanie bufora wejścia. Przez ten bufor wprowadzane są zapisy do zewnętrznego zbioru danych.
• Read(zmienna_plikowa,lista_zmiennych)
lub
• Readln(zmienna_plikowa,lista_zmiennych)
Procedury te służą do czytania elementów z plików. Pierwszym parametrem tych procedur jest odpowiednia zmienna plikowa, po której następują oddzielone przecinkami nazwy czytanych zmiennych. Po każdorazowym odczytaniu wartości pojedynczej zmiennej następuje automatyczne przesunięcie wskaźnika do początku następnego elementu. W przypadku procedury Readln wskaźnik przesuwa się do początku następnego wiersza.
• Write(zmienna_plikowa,lista_argumentów)
lub
• Writeln(zmienna_plikowa,lista_argumentów)
Procedury powyższe umożliwają wprowadzanie elementów do plików. Podobnie jak w przypadku czytania,pierwszym parametrem tych procedur jest identyfikator odpowiedniej zmiennej plikowej, odpowiadającej otwartemu uprzednio plikowi. Wywołanie procedur powoduje zapisanie do fizycznego zbioru odpowiednich wielkości. Po każdorazowym zapisaniu wartości pojedynczej zmiennej następuje automatyczne przesunięcie
wskaźnika do początku następnego elementu. W przypadku procedury Writeln wskaźnik przesuwa się do początku następnego wiersza.
• SeekEof (zmienna_plikowa);
lub
• SeekEof
Funkcja ta daje takie same wyniki jak funkcja Eof, z tym że ignoruje najbliższe spacje, znaki tabulacji oraz znaki CR i LF.
• SeekEoln (zmienna_plikowa);
lub
• SeekEof
Funkcja ta daje takie same wyniki jak funkcja Eoln, z tym że ignoruje najbliższe spacje, znaki tabulacji oraz znaki CR i LF.
• SetTextBuf(zmienna_plikowa, bufor)
lub
• SetTextBuf(zmienna_plikowa, bufor, rozmiar)
Procedura ta przypisuje bufor wejścia wyjścia do danego pliku tekstowego. Bufor jest w tym przypadku dowolna zmienną. Zwiększając rozmiar bufora można uzyskać np. szybszy odczyt danych ze zbioru.
FUNKCJE I PROCEDURY DZIAŁAJĄCE WYŁĄCZNIE NA PLIKACH NIETEKSTOWYCH
FileSize(zmienna_plikowa)
Wartością funkcji jest rozmiar (LongInt) wyspecyfikowanego pliku
• FilePos(zmienna_plikowa)
Wartością funkcji jest liczba całkowita typu LongInt, podająca aktualną pozycje pliku skojarzonego ze zmienną plikową .Wartość funkcji jest równa 0 jeżeli plik znajduje się w pozycji początkowej, natomiast gdy plik znajduje się w pozycji końcowej wartość ta jest równa wartości funkcji FileSize.
• Seek(zmienna_plikowa, pozycja)
Procedura ta umożliwia przesunięcie aktualnego położenia pliku do elementu o podanej liczbie porządkowej,określonego parametrem pozycja typu LongInt.
• Truncate(zmienna_plikowa)
Procedura usuwa z pliku skojarzonego ze zmienną plikową wszystkie elementy począwszy od aktualnej pozycji do końca pliku.
1. program pliki;
{$APPTYPE CONSOLE}
uses
SysUtils;
var f:textfile;
g:file of real;
x,y,z: real;
begin
{ TODO -oUser -cConsole Main : Insert
code here }
assignfile(g,'b.dat');
reset(g);
assignfile(f,'c.txt');
rewrite(f);
while not eof (g) do
begin
read (g,x,y,z);
writeln (f,x:5:2,' ',y:5:2,' ',z:5:3);
end;
closefile(g);
closefile(f);
end.
2. program Project2;
{$APPTYPE CONSOLE}
uses
SysUtils;
var f:textfile;
g:file of real;
x,y,z: real;
begin
{ TODO -oUser -cConsole Main : Insert
code here }
assignfile(f,'a.txt');
reset(f);
assignfile(g,'b.dat');
rewrite(g);
while not eof (f) do
begin
readln (f,x,y,z);
write (g,x,y,z);
end;
closefile(f);
closefile(g);
end.
3. program rekordy;
{$APPTYPE CONSOLE}
uses
SysUtils;
type pkt=record
nr: integer;
X,Y,Z: real;
opis: string[20];
end;
var f: textfile;
g: file of pkt;
punkty:pkt;
begin
{ TODO -oUser -cConsole Main : Insert
code here }
assignfile(f,'a.txt');
assignfile(g,'b.dat');
reset(f);
rewrite(g);
while not seekeof(f) do
begin
readln(f, punkty.nr, punkty.X, punkty.Y, punkty.Z, punkty.opis);
write(g,punkty);
end;
closefile(f);
closefile(g);
end.
4. program rekordy2;
{$APPTYPE CONSOLE}
uses
SysUtils;
type pkt=record
nr: integer;
X,Y,Z: real;
opis: string[20];
end;
var f: textfile;
g: file of pkt;
punkty:pkt;
begin
{ TODO -oUser -cConsole Main : Insert
code here }
assignfile(g,'b.dat');
assignfile(f,'c.txt');
reset(g);
rewrite(f);
while not eof(g) do
begin
read(g,punkty );
writeln(f,punkty.nr,' ', punkty.X:5:2,' ',
punkty.Y:5:2,' ', punkty.Z:5:3,' ', punkty.opis);
end;
closefile(g);
closefile(f);
end.
5.PODAJ ELEMENTY TABLICY
type tab=array[1..30,1..30] of Real;
var A:tab; j,i,k,w:byte; a:textfile;
begin
Assign(a,'a.txt');
Reset(a);
Readln(a,w,k);
For i:=1 to w do
Begin
For j:=1 to k do
Read(a,A[i,j]);
Write(A[i,j]);
End;
Readln(a);
Writeln;
End;
Closefile(a);
PLIK
const
max=20; var H:integer; dane:textfile; i:byte;
begin assignfile(dane,'dane.txt'); reset(dane);
for i:=1 to max do begin writeln ('podaj Hpkt',i); readln (H); writeln (dane,i,H);
REKORD
const
max=20; TYPE punkty=record H:real; i: byte; end;
var H:real; dane:file of punkty; i:byte;
begin assignfile(dane,'dane.txt'); reset(dane);
for i:=1 to max do
begin write ('podaj H pkt',i); read (H); pkt:Nr:=i; write (dane,i,H); end; closefile (dane);
Przykład 1
Utwórz plik tekstowy skojarzony ze zbiorem
dane.txt i zapisz do niego wartości zmienny
ch x, y, z.
var dane : Text
{ ... }
Assign (dane, 'dane.txt'); { skojarzenie zmienne
j plikowej dane ze zbiorem .dane.txt. }
Rewrite (dane); { otwarcie pliku do zapisu }
Write (dane, x, y, z); { zapisanie wartości
zmiennych x, y, z }
Close (dane); { zamknięcie pliku }
{ ... }
Przykład 2
Do istniejącego pliku tekstowego .dane.txt.
dopisz wartości zmiennych x, y, z
var dane:Text
{ ... }
Assign (dane, 'dane.txt'); { skojarzenie
zmiennej plikowej dane ze zbiorem .dane.txt. }
Append (dane); { otwarcie pliku do .
dopisywania. }
Write (dane, x, y, z); { zapisanie wartości
zmiennych x, y, z }
Close (dane); { zamknięcie pliku }
{ ... }
Przykład 3
Do pliku zdefiniowanego (plik : file of Byte)
dane.dat, zapisz 10 przypadkowych liczb
całkowitych.
var plik : file of Byte;
{ ... }
Assign (plik, 'dane.dat');
Rewrite(plik);
Randomize;
for i:=1 to 10 do
begin
x:=Random(255);
Write(plik,x);
end;
Close(plik);
{ ... }
Przykład 4
Z pliku zdefiniowanego (plik : file of Byte)
dane.dat, odczytaj n-ty element.
var plik:file of Byte;
{ ... }
Write('Podaj numer kolejny elementu :');
Readln(numer);
Assign (plik, 'dane.dat');
Reset(plik);
if numer <= FileSize(plik) then { sprawdzamy,
czy istnieje element }
begin
Seek (plik, numer-1); { numer-1, ponieważ
pierwszy element ma numer 0 }
Read (plik, liczba);
end else Write('Brak elementu ',numer);
Close (plik);
{ ... }
Przykład 5
Na końcu pliku zdefiniowanego .dane.dat.
dopisz jeden element.
var plik:file of Byte;
x : Byte;
{ ... }
Assign (plik, 'dane.dat');
Reset (plik);
Seek (plik, FileSize(plik)); { porównaj z
procedurą Append }
Write (plik, x);
Close (plik);
{ ... }
Przykład 6
Odczytaj z pliku zdefiniowanego .dane.dat.
wszystkie elementy i wypisz je na
ekranie.
var plik : file of Byte;
x:Byte;
{ ... }
Assign (plik, 'dane.dat' );
Reset (plik);
while not Eof(plik) do { dopóki nie ma
końca
zbioru }
begin
Read (plik, x);
Writeln (x)
end;
Close (plik);
{ ... }
Przykład 7
Przykład programu korzystającego z
plików
tekstowych.
program pliki_tekstowe_macierze;
const max_W = 10;
max_K = 10;
var f : Text;
opis : String;
N_wierszy,N_kolumn : Word;
macierz : Array [1..max_W,1..max_K]
of
Real;
i,j : Integer;
-procedure czytaj;
begin
Assign(f,'dane.txt');
{ Skojarzenie zmiennej plikowej f z
fizycznym
zbiorem danych dane.txt }
Reset(f);
{ Otwarcie zmiennej plikowej (pliku dane.txt)
do odczytu }
Readln(f,opis);
{ Wczytanie 1-ego wiersza pliku dane.txt i
przejście do początku następnego wiersza }
Read(f,N_wierszy,N_kolumn);
{ Wczytanie liczby wierszy i liczby kolumn
macierzy }
Readln(f);
{ Przejście do początku następnego wiersza
pliku }
for i:=1 to N_wierszy do
begin
for j:=1 to N_kolumn do Read(f,macierz[i,j]);
{ Wczytanie elementów jednego wiersza
macierzy }
Readln(f);
{ Przejście do początku wiersza następnego }
end;
Close(f);
{ Zamknięcie zmiennej plikowej f (pliku
dane.txt) }
end; { procedury czytaj }
-procedure wypisz_na_ekran;
begin
for i:=1 to N_wierszy do
begin
for j:=1 to N_kolumn do Write(macierz[i,j]:6:2);
{ Wypisanie jednego wiersza macierzy na
ekranie monitora}
Writeln;
{ Przejście do początku wiersza następnego }
end;
end; { wypisz_na_ekran}
-procedure zapisz_do_pliku;
begin
Assign(f,'wyniki.txt');
{ Skojarzenie zmiennej plikowej f z fizycznym
zbiorem danych wyniki.txt }
Rewrite(f);
{ Otwarcie zmiennej plikowej f (pliku wyniki.txt)
do zapisu }
Writeln(f,opis+' pomnozona przez 2');
{ Zapis 1-ego wiersza w pliku wyniki.txt i
przejście do początku następ. wiersza }
Write(f,N_wierszy,' ',N_kolumn);
{ Zapisanie liczby wierszy i liczby kolumn
macierzy }
Writeln(f);
{ Przejście do początku następnego wiersza }
for i:=1 to N_wierszy do
begin
for j:=1 to N_kolumn do Write(f,2*macierz[i,j]:10
:2);
{ Zapisanie jednego wiersza macierzy }
Writeln(f);
{ Przejście do wiersza następnego }
end;
Close(f);
{ Zamknięcie zmiennej plikowej f (pliku
wyniki.txt) }
end; {wypisz_do_pliku}
-procedure dopisz_do_pliku;
begin
Assign(f,'wyniki.txt');
{ Skojarzenie zmiennej plikowej f z fizycznym
zbiorem danych wyniki.txt }
Append(f);
{ Otwarcie zmiennej plikowej f (pliku wyniki.txt)
do dopisywania }
Writeln(f,opis);
{ Dopisanie wiersza do pliku wyniki.txt i
przejście do początku następnego wiersza }
Write(f,N_wierszy,' ',N_kolumn);
{ Zapisanie liczby wierszy i liczby kolumn
macierzy }
Writeln(f);
{ Przejście do początku następnego
wiersza }
for i:=1 to N_wierszy do
begin
for j:=1 to N_kolumn do Write(f,macierz
[i,j]:10:2);
{ Zapisanie jednego wiersza macierzy }
Writeln(f);
{ Przejście do wiersza następnego }
end;
Close(f);
{ Zamknięcie zmiennej plikowej f (pliku
wyniki.txt) }
end; { dopisz_do_pliku }
begin { programu }
czytaj; { wywołanie procedury czytaj }
wypisz_na_ekran; { wywołanie procedur
y wypisz_na_ekran }
zapisz_do_pliku; { wywołanie procedury
zapisz_do_plikuj }
dopisz_do_pliku; { wywołanie procedury
dopisz_do_pliku }
end. { programu }
Przykład
If (a>10) Then
b=20
c=30
End If
lub
If (a>10) Then b=20 : c=30
Przykład:
If (a>10) Then
b=20
c=30
Else
b=40
c=50
End If
lub
If (a>10) Then b=20 : c=30 Else b=40 : c=50
Reset-procedura do odczytu,otwarcie
plikow.otwiera pliki na poczatku
Rewrite-zapisac
Append-dopisac za ostatnim elem.
Close-zamykanie plikow
Eof-czytaj tak dlugo az plik się skonczy
SeekEof-koniec pliku przy najbliższych
spacjach,tabulatorach