[ Pobierz całość w formacie PDF ]

" wyprowadzenie zawartości wybranego rekordu na ekran;
" zbadanie i zmianę zawartości pola Wypozyczajacy wybranego rekordu;
" wyszukanie rekordu zawierającego zadany ciąg znaków w polu Tytul;
" posortowanie tablicy rekordów według zadanego kryterium (tytuł lub nazwisko
autora);
" wyszukanie rekordu o najmniejszej i największej zawartości pola Licznik.
Powyższa lista może zostać bezpośrednio przetłumaczona na zestaw podstawowych
procedur tworzących program (rzecz jasna, trzeba będzie jeszcze dorzucić kilka proce-
dur pomocniczych, no i oczywiście część operacyjną). Z formalnego punktu widzenia
wymagany jest jeszcze schemat blokowy lub przynajmniej słowny zapis algorytmu, aby
jednak uniknąć przerostu formy nad treścią, ograniczymy się do ogólnego schematu
działania programu:
1. wyświetl menu dostępnych operacji
2. w zależności od wybranej opcji:
wprowadz nowy rekord (dodanie książki do katalogu), lub
zmień zawartość pola Wypozyczajacy (wypożyczenie książki), lub
wyszukaj rekord zawierający dany tytuł (wyszukiwanie książki), lub
86 Turbo Pascal  programowanie
wyświetl wszystkie rekordy uporządkowane według tytułów lub nazwisk autorów,
lub
zakończ pracę programu
3. wróć do punktu (1)
Jak widać, część operacyjna sprowadza się w zasadzie do wywoływania odpowiednich
procedur stosownie do wybranej przez użytkownika funkcji (doskonałe miejsce dla
instrukcji case). Ponieważ przedstawianie schematów poszczególnych procedur zajęło-
by zbyt dużo miejsca, poprzestaniemy na zaprezentowaniu ich zapisu w Pascalu. Meto-
da, którą wykorzystamy do tworzenia naszego programu, jest typowym przykładem
projektowania wstępującego: najpierw utworzymy zestaw odpowiednich procedur
(realizujących poszczególne zadania podrzędne), a następnie powiążemy je w całość,
czyli działający program.
Zanim jednak do tego dojdzie, zastanówmy się przez chwilę nad przekazywaniem
danych do i z odpowiednich procedur i funkcji. W myśl dobrej praktyki nie będziemy
do tego celu wykorzystywać efektów ubocznych, lecz stosownie zaprojektowane listy
parametrów. Rozważmy jako przykład procedurę wprowadzania zawartości rekordu
z klawiatury. Powinna ona przyjmować jako argument  pusty rekord i zwracać tenże
rekord wypełniony wpisanymi przez użytkownika danymi. Musimy więc wykorzystać
mechanizm przekazywania parametru przez nazwę. Ale jak zadeklarować sam para-
metr? Nagłówek w postaci:
procedure Wprowadz(var r : record
Tytul : string[30];
Autor : string[25];
Wypozyczajacy : string[25];
Licznik : word);
wygląda co najmniej podejrzanie. Istotnie: próba skompilowania podobnej konstrukcji
skończy się wyświetleniem komunikatu Type identifier expected (spodziewany
identyfikator typu).
Rozwiązaniem tego problemu zajmiemy się w następnym rozdziale. Znajdzie się w nim
również kilka słów o tak zwanych stałych symbolicznych.
Typy i stałe 87
Typy i stałe
Zajmiemy siÄ™ obecnie dwoma spokrewnionymi ze sobÄ… zagadnieniami: definiowaniem
własnych typów oraz stałymi symbolicznymi. Główny obszar zastosowań stałych i ty-
pów związany jest z wykorzystaniem typów strukturalnych (dlatego mówimy o nich
właśnie teraz); wykorzystanie definicji typów pozwala na ominięcie pewnych ogra-
niczeń w przekazywaniu parametrów (zobacz koniec poprzedniego rozdziału). Poza
tym używanie właściwie dobranych definicji typów i stałych polepsza czytelność i
estetykę programu oraz zmniejsza ryzyko błędów.
Pokazany na końcu poprzedniego rozdziału przykład ilustruje niezręczną próbę
przekazania do procedury parametru typu strukturalnego. Niestety, nasz zapis stanowi
próbę przemycenia opisu (definicji) typu w miejscu do tego nie przeznaczonym: na
liście parametrów formalnych procedury lub funkcji mogą znajdować się wyłącznie
identyfikatory parametrów i odpowiadające im identyfikatory (nie definicje!) typów.
Dopóki posługiwaliśmy się parametrami typu prostego, problem nie istniał, gdyż na
liście parametrów umieszczałeś po prostu nazwę odpowiedniego typu. W przypadku
typów strukturalnych sprawa się komplikuje. Nie dość, że na liście parametrów nie
wolno umieścić definicji typu (jak więc zdefiniować parametr strukturalny?), to jeszcze
identycznie wyglÄ…dajÄ…ce deklaracje tablic
var
t1 : array[1..100] of real;
t2 : array[1..100] of real;
wcale nie tworzą obiektów identycznego typu  każda z nich interpretowana jest jako
definicja nowego typu, co utrudnia niektóre operacje (nie można np. dokonać przypi-
sania całej tablicy t2 do t1). Na dobitkę okazuje się, że zgodność typów wymagana
jest również w przypadku przekazywania parametrów (co było zresztą łatwe do przewi-
dzenia).
Wyjściem z tego impasu jest zdefiniowanie identyfikatora typu, czyli nazwy będącej
synonimem danego typu strukturalnego. Identyfikator taki wykorzystamy następnie do
deklarowania zmiennych i parametrów dokładnie tak samo, jak czynilibyśmy to z iden-
tyfikatorem typu prostego. Aby zdefiniować identyfikator typu, musisz użyć słowa
kluczowego type (typ) w następującej konstrukcji:
type
nazwa-typu = opis-typu
88 Turbo Pascal  programowanie
(zwróć uwagę, że w definicji typu wykorzystuje się znak równości, a nie dwukropek).
Nazwa-typu określa definiowany identyfikator (i podlega wszystkim regułom doty-
czącym identyfikatorów), zaś opis-typu jest takim samym opisem, jaki stosowany
jest w deklaracjach zmiennych. Różnica polega tylko na tym, że w przypadku deklaracji
zmiennej kompilator tworzy odpowiedniÄ… strukturÄ™ danych i rezerwuje dla niej miejsce
w pamięci, natomiast zdefiniowanie typu powoduje jedynie utworzenie szablonu (nie
jest tworzony żaden fizyczny obiekt), który będzie wykorzystywany w deklaracjach
(dopiero wtedy kompilator będzie rezerwował miejsce na dane).
Przykładowa definicja typu rekordowego opisującego książkę (i deklaracja odpowied-
niej tablicy rekordów) będzie więc miała postać
type
Ksiazka = record { tak samo, jak w deklaracji zmiennej }
Tytul : string[30];
Autor : string[25];
Wypozyczajacy : string[25];
Licznik : word);
end;
var
Katalog : array[1..750] of Ksiazka;
Już na pierwszy rzut oka wygląda to ładniej (Katalog zawiera Ksiazki, a nie jakieś
rekordy, których przeznaczenia należy się dopiero domyślać), no a poza tym możliwe
jest wreszcie zadeklarowanie odpowiednich parametrów:
procedure Wprowadz(var r : Ksiazka);
Definiowanie nowych identyfikatorów typów ma zastosowanie głównie w programach
posługujących się strukturalnymi reprezentacjami danych, chociaż możliwe jest [ Pobierz całość w formacie PDF ]

  • zanotowane.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • gim12gda.pev.pl






  • Formularz

    POst

    Post*

    **Add some explanations if needed