________

 Sysło(v)

________
PROCEDURE DrukEcho(VAR DanyPlik:Ksiegozbior);
{Procedura czyta i wyswietla kolejne elementy z pliku
DanyPlik.}
VAR El:Ksiazka;
BEGIN
{Skojarzenie pliku DanyPlik z plikiem fizycznym w pamieci
zostanie wykonane w tresci programu.}
RESET(DanyPlik);
{przetwarzanie kolejnych elementow pliku}
READ(DanyPlik,El);
WHILE El.Autor<Wartownik DO BEGIN
WRITELN(El.Autor,', ',El.Tytul);
READ(DanyPlik,El)
END; {WHILE}
WRITELN
END; {DrukEcho}
FUNCTION Identyfikacja:BOOLEAN;
{Funkcja przyjmuje wartosc TRUE tylko wtedy, gdy uzytkownik
zapytany o haslo poda to, ktore zostalo ukryte w stalej
MojeHaslo.}
{MojeHaslo jest stala globalna, ktorej wartosc okreslamy
w czesci definiujacej stale w programie.}
VAR Haslo:STRING;

BEGIN
{sprawdzanie dostepu do bazy danych}
WRITELN('Podaj haslo: ');
READLN(Haslo);
Identyfikacja:=Haslo=MojeHaslo
END; {Identyfikacja}

PROGRAM Polacz;
USES CRT;
{Program laczy pliki Katalog i Nabytki tworzac skorygowany
plik NowyKatalog.}
CONST Wartownik='zz'; {ostatni element w porzadku alfabetycznym}
TYPE Napis30 =STRING[30];
Napis50 =STRING[50];
Ksiazka =RECORD
Autor:Napis30;
Tytul:Napis50;
Jest :BOOLEAN
END;
Ksiegozbior=FILE OF Ksiazka;
VAR Katalog,Nabytki,NowyKatalog:Ksiegozbior;

PROCEDURE Start(Naglowek:STRING);
BEGIN
CLRSCR;
WRITE(Naglowek);
WRITELN; WRITELN
END; {Start}

PROCEDURE KojarzeniePliku(VAR Plik:Ksiegozbior;OpisPliku:STRING);
{Procedura kojarzy zmienna Plik z plikiem fizycznym
(NazwaPliku) w pamieci zewnetrznej. Nazwa pliku fizycznego
jest podawana przez uzytkownika.}
VAR NazwaPliku:STRING;
BEGIN
{Wartoscia napisu 'Podaj ... reprezentujacego ' + OpisPliku
jest ciag znakow: Podaj ... reprezentujacego , po ktorym
wystepuje ciag znakow bedacych wartoscia zmiennej OpisPliku.
Znak dodawania + oznacza tutaj konkatenacje (czyli laczenia)
dwoch napisow, polegajaca na dopisaniu drugiego bezposrednio
po pierwszym.}
WRITELN('Podaj nazwe pliku fizycznego reprezentujacego '
+ OpisPliku + '.');
READLN(NazwaPliku);
ASSIGN(Plik,NazwaPliku)
END; {KojarzeniePliku}

PROCEDURE Koniec;
BEGIN
WRITELN; WRITELN;
WRITELN('Nacisnij klawisz ENTER.');
READLN
END; {Koniec}

PROCEDURE Lacz(VAR Plik,Nabytki,NowyPlik:ksiegozbior);
{Procedura laczy niepuste uporzadkowane pliki Plik
i Nabytki w jeden plik NowyPlik, takze uporzadkowany.
Zmienne StaraKsiazka i NowaKsiazka zawieraja biezace
elementy laczonych plikow.}
{Dane:
Plik - podstawowy zbior ksiazek,
Nabytki - plik z nowo otrzymanymi ksiazkami;
Wynik:
NowyPlik - plik zawierajacy wszystkie ksiazki.}
VAR StaraKsiazka,NowaKsiazka:Ksiazka;

BEGIN
READ(Plik,StaraKsiazka);
READ(Nabytki,NowaKsiazka);
{porownanie i dolaczanie elementu wczesniejszego}
WHILE (StaraKsiazka.Autor<Wartownik) OR
(NowaKsiazka.Autor<Wartownik) DO
{znajdowanie elementu alfabetycznie wczesniejszego}
IF (StaraKsiazka.Autor+StaraKsiazka.Tytul)<
(NowaKsiazka.Autor+NowaKsiazka.Tytul) THEN BEGIN
WRITE(NowyPlik,StaraKsiazka);
READ(Plik,StaraKsiazka)
END {THEN}
ELSE BEGIN
WRITE(NowyPlik,NowaKsiazka);
READ(Nabytki,NowaKsiazka)
END; {IF, WHILE}
{kopiowanie wartownika}
WRITE(NowyPlik,StaraKsiazka)
END; {Lacz}

BEGIN
Start('Program laczy zawartosc plikow Katalog i Nabytki.');
KojarzeniePliku(Katalog,'Katalog');
KojarzeniePliku(Nabytki,'Nabytki');
KojarzeniePliku(NowyKatalog,'NowyKatalog');
{otwarcie plikow}
RESET(Katalog);
RESET(Nabytki);
REWRITE(NowyKatalog);
{polaczenie plikow Katalog i Nabytki}
Lacz(Katalog,Nabytki,NowyKatalog);
{zamkniecie plikow}
CLOSE(Katalog); CLOSE(Nabytki);
CLOSE(NowyKatalog);
WRITELN('Zakonczono laczenie plikow Katalog i Nabytki.');
Koniec
END. {Polacz}
PROCEDURE PrzetwPliki(VAR StaryKatalog,NowyKatalog:Ksiegozbior;
VAR Poprawki:Zmiany);
{Zgodnie ze zmianami zapisanymi w pliku Poprawki, procedura
modyfikuje plik StaryKatalog generujac uaktualniony plik
NowyKatalog.}
{Dane:
StaryKatalog - katalog ksiazek;
Poprawki - informacje o zmianach, ktore nalezy wy-
konac w pliku StaryKatalog;
Wynik:
NowyKatalog - uaktualniony katalog ksiazek.}
VAR BKlucz, {biezacy klucz}
SkKlucz, {klucz elementu odczytanego z
pliku StaryKatalog}
ZmKlucz:STRING[50];{klucz elementu z pliku Poprawki}
Sk,PSk :Ksiazka; {biezaca i pomocnicza informacja
o ksiazce z katalogu}
Zm :Zmiana; {pojedynczy element z pliku Poprawki}

BEGIN
{Skojarzenie plikow: StaryKatalog, Poprawki, NowyKatalog
z plikami fizycznymi powinno zostac wykonane w programie
wykorzystujacym te procedure.}
RESET(StaryKatalog); RESET(Poprawki);
REWRITE(NowyKatalog);
READ(StaryKatalog,Sk);
READ(Poprawki,Zm);
SkKlucz:=Sk.Autor+Sk.Tytul;
ZmKlucz:=Zm.Autor+Zm.Tytul;
WHILE (SkKlucz<Wartownik) OR
(ZmKlucz<Wartownik) DO BEGIN
IF SkKlucz<=ZmKlucz THEN BEGIN
BKlucz:=SkKlucz;
PSk:=Sk;
READ(StaryKatalog,Sk);
SkKlucz:=Sk.Autor+Sk.Tytul
END {THEN}
ELSE BEGIN {SkKlucz>ZmKlucz}
BKlucz:=ZmKlucz;
PSk.Autor:=Wartownik
END; {nadano wartosc zmiennej BKlucz}

WHILE ZmKlucz=BKlucz DO BEGIN
IF PSk.Autor<Wartownik THEN
CASE Zm.Zmien OF
Akt:PSk.Jest:=Zm.Jest;
Us :PSk.Autor:=Wartownik;
Wst:WRITELN('Niepoprawna zmiana')
END {CASE}
ELSE IF Zm.Zmien=Wst THEN BEGIN
PSk.Jest:=Zm.Jest;
PSk.Autor:=Zm.Autor;
PSk.Tytul:=Zm.Tytul
END; {THEN}
READ(Poprawki,Zm);
ZmKlucz:=Zm.Autor+Zm.Tytul
END; {WHILE}
{Wartosc klucza kolejnego elementu z pliku Poprawki
i pliku StaryKatalog jest wieksza niz BKlucz.}
IF PSk.Autor<Wartownik THEN WRITE(NowyKatalog,PSk)
END; {WHILE}
WRITE(NowyKatalog,Sk) {dopisanie wartownika}
END; {PrzetwPliki}
PROGRAM TworzeniePliku;
USES CRT;
CONST Wartownik='zz'; {ostatni element w porzadku alfabetycznym}
TYPE Napis30 =STRING[30];
Napis50 =STRING[50];
Ksiazka =RECORD
Autor:Napis30;
Tytul:Napis50;
Jest :BOOLEAN
END;
Ksiegozbior=FILE OF Ksiazka;
VAR Katalog:Ksiegozbior; {zmienna odpowiadajaca naszemu
ksiegozbiorowi}
Egz :Ksiazka; {reprezentacja pojedynczej ksiazki}

PROCEDURE Start(Naglowek:STRING);
BEGIN
CLRSCR;
WRITE(Naglowek);
WRITELN; WRITELN
END; {Start}

PROCEDURE KojarzeniePliku(VAR Plik:Ksiegozbior;
OpisPliku:STRING);
{Procedura kojarzy zmienna Plik z plikiem fizycznym
(NazwaPliku) w pamieci zewnetrznej. Nazwa pliku fizycznego
jest podawana przez uzytkownika.}
VAR NazwaPliku:STRING;
BEGIN
{Wartoscia napisu 'Podaj ... reprezentujacego ' + OpisPliku
jest ciag znakow: Podaj ... reprezentujacego , po ktorym
wystepuje ciag znakow bedacych wartoscia zmiennej OpisPliku.
Znak dodawania + oznacza tutaj konkatenacje (czyli laczenia)
dwoch napisow, polegajaca na dopisaniu drugiego bezposrednio
po pierwszym.}
WRITELN('Podaj nazwe pliku fizycznego reprezentujacego '
+ OpisPliku + '.');
READLN(NazwaPliku);
ASSIGN(Plik,NazwaPliku)
END; {KojarzeniePliku}

PROCEDURE Koniec;
BEGIN
WRITELN; WRITELN;
WRITELN('Nacisnij klawisz ENTER.');
READLN
END; {Koniec}

BEGIN {Program glowny}
Start('Program tworzy plik opisow ksiazek');
KojarzeniePliku(Katalog,'Katalog');
{otwarcie pustego pliku do zapisu}
REWRITE(Katalog);
{dolaczanie informacji katalogowych}
WRITE('AUTOR: '); READLN(Egz.Autor);
WHILE Egz.Autor<Wartownik DO BEGIN
WRITE('TYTUL: '); READLN(Egz.Tytul);
Egz.Jest:=TRUE;
{Dane o kolejnej ksiazce umieszczamy w pliku Katalog.}
WRITE(Katalog,Egz);
WRITE('AUTOR: '); READLN(Egz.Autor)
END; {Egz.Autor<Wartownik}
{dopisanie wartownika}
Egz.Autor:=Wartownik;
Egz.Tytul:='';
Egz.Jest:=FALSE;
WRITE(Katalog,Egz);
{zamkniecie pliku}
CLOSE(Katalog);
WRITELN('Koniec tworzenia katalogu.');
Koniec
END. {TworzeniePliku}
TYPE Napis30 =STRING[30];
Napis50 =STRING[50];
Ksiazka =RECORD
Autor:Napis30;
Tytul:Napis50;
Jest :BOOLEAN
END;
Ksiegozbior=FILE OF Ksiazka;
VAR Katalog:Ksiegozbior; {zmienna odpowiadajaca naszemu
ksiegozbiorowi}
Egz :Ksiazka; {reprezentacja pojedynczej ksiazki}

Uwaga! Brak wcięć i odstępów jest zamierzony:)