pascal_19.pdf
(
79 KB
)
Pobierz
Obsługa klawiszy rozszerzonych i własne Menu
Turbo Pascal cześć 19
ver. 1
Na tej lekcji dowiesz się, jak utworzyć własną funkcję, jak sprawdzić długość zmiennej string, ale
przede wszystkim zajmiemy się tym, co najczęściej robi się w DOS-ie i co można również wykonać za pomocą
Pascalowych procedur tzn. tworzenie/usuwanie katalogów, zmiana aktualnego dysku/katalogu, sprawdzanie w
jakim katalogu akurat się znajdujemy i wyświetlanie aktualnej godziny/daty.
Pojęcie funkcji nie jest nam obce, wspomnę o niej kilka słów dla przypomnienia. Funkcje są podobne w
tworzeniu do procedur z tym, że funkcja zazwyczaj zwraca pewną wartość. Przykładowymi funkcjami są np.
pierwiastkowanie, sinus, cosinus ( funkcja nie musi koniecznie zwracać liczby, może to być każdy z typów
zmiennych, np. char z ReadKey ).
Zrobimy sobie teraz prostą funkcję, która będzie nam zwracała kod wciśniętego klawisza z tym, że jeżeli to
będzie klawisz rozszerzony to kod ten zostanie pomnożony przez 256. Dzięki temu klawisze zwykłe będą miały
zawsze kody poniżej 255 a rozszerzone powyżej.
Zadanie 1
Przepisz poniższy program I sprawdź jego działanie. Opisz co wykonują wskazane linijki kodu.
Uses CRT;
Var
kl:word;
FUNCTION GetKey:word; {1}
Var
a1,a2:Char;
Begin
Repeat Until Keypressed; {2}
a1:=ReadKey; {3}
If a1=Chr(0) Then a2:=ReadKey; {4}
If a1<>Chr(0) Then GetKey:=Ord(a1) Else GetKey:=256*Ord(a2); {5}
End;
Begin
Repeat
kl:=GetKey; {6}
WriteLn(kl); {7}
Until kl=27; {8}
End.
{1} ........................................................................................................................................................................
{2} ........................................................................................................................................................................
{3} ........................................................................................................................................................................
{4} ........................................................................................................................................................................
{5} ........................................................................................................................................................................
{6} ........................................................................................................................................................................
{7} ........................................................................................................................................................................
{8} ........................................................................................................................................................................
Zobacz teraz, na jakiej zasadzie jest zwracana wartość funkcji, a dzieje się to w linii {5}. Do nazwy funkcji jest
podstawiana liczba, która mieści się w zakresie typu word. A musi się w nim mieścić, gdyż zadeklarowaliśmy
w linii {1}, że właśnie taki typ zwróci nam funkcja. Ot i cała filozofia :)
Kolejną ciekawą funkcją jest Length, zwraca ona długość wskazanej zmiennej.
Length(S:string):integer;
Kurs opracował mgr Jarosław Teodorczuk
veljarek@poczta.gazeta.pl
1
Zadanie 2
Przepisz poniższy kod i sprawdź wynik jego działania.
Funkcja
Var
s:string;
Begin
s:='Turbo Pascal';
WriteLn('tekst: "',s,'" zawiera ',Length(s),' znakow');
End.
Zadanie 3
Napisz program w który wpisujemy tekst, a komputer liczy ile on ma znaków.
Jak już mówiłem zajmiemy się dziś obsługą katalogów. Stwórzmy teraz nasz pierwszy katalog dzięki Pascalowi
dzięki poleceniu MkDir, z biblioteki DOS, o składni
MkDir(nazwa:string);
Procedura tworzy w bieżącym katalogu podkatalog "nazwa". Jeżeli już istnieje plik lub katalog "nazwa" to
funkcja IOResult zwraca błąd 5 ( zabroniony dostęp do pliku ). Jeżeli katalog został utworzony bez problemu
IOResult=0.
Zadanie 4
Stwórz katalog o nazwie pascal
W tym wypadku, kiedy spróbujemy ponownie uruchomić program wyrzuci nam błąd "runtime error 5"
ponieważ taki katalog już istnieje, a my nie obsługujemy błędów, które mogą powstać w czasie operacji
dyskowych. Aby temu zaradzić należy wyłączyć kontrolę błędów przeprowadzaną przez system za pomocą
dyrektywy {$i}:
Uses DOS;
Begin
{$i-} {1}
MkDir('pascal'); {2}
If IOResult<>0 Then WriteLn('Wystapil blad'); {3}
{$i+} {4}
End.
{1} Wyłączam obsługę błędów operacji dyskowych za pomocą dyrektywy kompilatora.
{2} Utwórz katalog 'pascal'
{3} Jeżeli wystąpił jakiś błąd (np. katalog już istniał to wyświetl komunikat)
{4} Włącz spowrotem obsługę błędów
Kolejną ciekawą procedurą jest GetDir która określa w jakim katalogu się aktualnie znajdujemy. Składnia jej
jest następująca (pamiętaj że polecenie znajduje się w bibliotece DOS):
GetDir(D:byte; var S:string);
Procedura pobiera do zmiennej S, nazwę bieżącego katalogu na dysku określonym zmienną D. Zmienna D
przyjmuje wartości:
0 - dysk bieżący
1 - dysk A:
2 - dysk B:
3 - dysk C:
4 - dysk D:
itd.
Kurs opracował mgr Jarosław Teodorczuk
veljarek@poczta.gazeta.pl
2
Uwaga !
Jeżeli nie istnieje dysk określony zmienną D to procedura zwraca wartość jakby to był katalog główny
tego dysku.
Procedura o składni
ChDir(S:string);
z biblioteki DOS aktualny katalog i/lub dysk na ten, który był podany w
parametrze S.
Uwaga ! Jeżeli procedura nie zostanie wykonana prawidłowo (np. brak podanego dysku lub katalogu ) to
program zakończy się wyświetlając błąd "runtime error". Aby temu zaradzić ( podobnie jak w przypadku
MkDir ) należy wyłączyć obsługę błędów dyskowych. Jeżeli jednak to zrobimy to nie będziemy pewni, że
procedura wykonała się prawidłowo póki nie sprawdzimy zawartości funkcji IOResult
Dzięki tej procedurze możemy sprawdzić np. jakie dyski mamy aktualnie dostępne w systemie np.
Zadanie 5
Przepisz poniższy program i sprawdź efekt jego działania.
Uses DOS;
Var
t:byte;
s,stary:string;
Begin
GetDir(0,stary); {1}
{$i-} {2}
For t:=Ord('C') To Ord('Z') Do {3}
Begin
s:=Chr(t); {4}
ChDir(s+':'); {5}
If IOResult=0 Then Write(s,' + ') Else Write(s,' - '); {6}
End;
{$i+} {7}
Chdir(stary); {8}
End.
{1} zapisz w zmiennej "stary" aktualny katalog, aby wrócić do niego po skończeniu sprawdzania dysków
{2} wyłącz sprawdzanie błędów
{3} sprawdzaj wszystkie dyski od C do Z
{4} zamień liczbę na tekst, który będzie nazwą dysku
{5} dodaj do litery dysku znaczek ":" czyli np. 'C'+':'='C:' i przejdź na ten dysk
{6} jeżeli nie wystąpił błąd to wypisz nazwę dysku ze znaczkiem "+" a jeżeli wystąpił wyświetl nazwę dysku
ze znaczkiem "-"
{7} włącz obsługę błędów
{8} powróć do katalogu, który był bieżącym w momencie uruchamiania programu
Z funkcją RmDir trzeba się "obchodzić" szczególnie ostrożnie gdyż odpowiada ona za kasowanie katalogów,
ale UWAGA !!! KATALOG KONIECZNIE MUSI BYĆ PUSTY ! Jeżeli procedura nie zostanie wykonana
prawidłowo (np. brak podanego katalogu lub nie był on pusty ) to program zakończy się wyświetlając błąd
"runtime error". Aby temu zaradzić ( podobnie jak w przypadku MkDir i ChDir) należy wyłączyć obsługę
błędów dyskowych. Jeżeli jednak to zrobimy to nie będziemy pewni, że procedura wykonała się prawidłowo
póki nie sprawdzimy zawartości funkcji IOResult.
Składnia: RmDir(S:string); biblioteka: DOS
Uses DOS;
Var
blad:integer;
Begin
{$i-} {1}
RmDir('pascal'); {2}
Kurs opracował mgr Jarosław Teodorczuk
veljarek@poczta.gazeta.pl
3
blad:=IOResult; {3}
If blad=0 Then WriteLn('Katalog usunięty') Else {4}
If blad=3 Then WriteLn('Brak katalogu') Else {5}
If blad=5 Then WriteLn('Katalog nie jest pusty') Else {6}
WriteLn('Nieznany blad'); {7}
{$i+} {8}
End.
Zwróć teraz uwagę, że nie pobierałem tutaj za każdym razem informacji z funkcji IOResult tylko wstawiłem ją
w zmienną "blad". Zrobiłem to dlatego gdyż po odczytaniu kodu błędu z funkcji IOResult jest on kasowany i
przy powtórnym odczycie uzyskalibyśmy wartość 0.
{1} wyłącz sprawdzanie błędów
{2} skasuj katalog 'pascal'
{3} wstaw do zmiennej "blad" kod błędu
{4} jeżeli nie było błędu to wyświetl tekst 'Katalog usunięty', w przeciwnym wypadku...
{5} jeżeli wystąpił błąd 3 to wyświetl tekst 'Brak katalogu', w przeciwnym wypadku...
{6} jeżeli wystąpił błąd 5 to wyświetl tekst 'Katalog nie jest pusty', w przeciwnym wypadku...
{7} jeżeli wystąpił inny kod błędu ( czyli różny od 0,3 i 5 ) to wyświetl tekst 'Nieznany blad'
{8} włącz sprawdzanie błędów
Zadanie 6:
Napisz program, w którym można: zakładać katalogi, usuwać katalogi.
Kurs opracował mgr Jarosław Teodorczuk
veljarek@poczta.gazeta.pl
4
Kurs opracował mgr Jarosław Teodorczuk
veljarek@poczta.gazeta.pl
5
Plik z chomika:
bastiking
Inne pliki z tego folderu:
pascal_9.pdf
(100 KB)
pascal_8.pdf
(78 KB)
pascal_7.pdf
(77 KB)
pascal_6.pdf
(88 KB)
pascal_5.pdf
(83 KB)
Inne foldery tego chomika:
Algorytmy
Kurs VIDEO
Programowanie obiektowe
Zgłoś jeśli
naruszono regulamin