Temat: Opisz najczęściej używane moduły CRT - obsługa konsoli, DOS - wywołania systemowe i Graph - grafika.
Modułem w języku Pascal można nazywać plik z zawartym w nim kodem programu Mimo, że brzmi to dziwnie, jest jednak prawdziwe. Na początek można sobie wyobrazić, że moduł jest tylko dodatkowym plikiem, w którym umieszczamy swoje procedury i funkcje aby oddzielić je od programu i nie przewijać na ekranie 10 000 linii umieszczonych w jednym pliku, a przełączać się pomiędzy 10 plikami po 1000 linii. Takie jest wytłumaczenie sensu istnienia modułów. Ludzie szybko zauważyli, że dzięki nim mogą pogrupować raz napisane, lecz przydatne w wielu programach funkcje i procedury, a następnie wielokrotnie je wykorzystywać. Jeśli grupa funkcji jest powiązana tematycznie, to moduły je zawierające możemy nazywać biblioteką. W ten sposób np. w Pascalu została zdefiniowana biblioteka obsługi ekranu (w trybie znakowym crt, w trybie graficznym graph), czy też biblioteka udostępniająca polecenia systemu operacyjnego (dos).
Moduły mogą także zostać wykorzystane do podzielenia dużego programu na logiczne części (np. w jednym umieszczamy procedury interfejsu użytkownika, w drugim procedury obliczeniowe, w trzecim procedury komunikacji z urządzeniami zewnętrznymi itd.).
Moduł CRT
Jest to moduł, który ułatwia pracę w trybie tekstowym. Tryb tekstowy jest przydatny w obliczeniach i programach, które nie wymagają graficznego interfejsu . Moduł ten zawiera też obsługę głośniczka wbudowanego w komputer . Moduł CRT
zawiera dodatkowe funkcje uzupełniające bibliotekę SYSTEM o funkcje i procedury ekranowe - sam skrót CRT pochodzi od Cathode Ray Tube - czyli po prostu ekranu.
Funkcje i procedury modułu CRT:
ClrScr; -Procedura powodująca wyczyszczenie zawartości ekranu i ustawienie kursora graficznego w lewym górnym rogu.
ClrEol; -Procedura która czyści linię tekstu od pozycji kursora do końca lini.
Delay(czas) -Procedura, która czeka tyle milisekund (milisekunda=1/1000 sekundy) ile wynosi zmienna czas. Zmienna Czas musi być typu WORD (word to liczba całkowita od 0 do 65535).
DelLine; -Procedura czyści całą linie, w której znajduje się kursor
GotoXY(X,Y:byte); przenosi kursor do pozycji X i Y. Pozycja 1,1 oznacza lewy górny róg ekranu.
HighVideo; -Rozjaśnia kolory, tzn. jeżeli wpiszemy ciemny czerwony i coś chcemy nim narysować, będzie narysowane to jasnym czerwonym.
InsLine; Wstawia pustą linię tam, gdzie się znajduje kursor a resztę przenosi w dół.
KeyPressed - Funkcja która zwraca wartość TRUE jeżeli został naciśnięty klawisz lub FALSE jeżeli nie.
LowVideo -Przyciemnia kolory patrz HighVideo.
NormVideo -Przywraca normalne kolory.
NoSound; -Wyłącza dźwięk ze SPEAKERA (głośniczka wbudowanego w komputer).
ReadKey; -Wczytuje wciśnięty klawisz z klawiatury.
Sound(Hz:Word); -Włącza dźwięk w SPEAKERZE o częstotliwości Hz, np. aby wydać dźwięk o częstotliwości 200Hz należy wpisać: Sound(200); Najmniejszą liczbą jaka może być użyta jako dźwięk może być 60!
TextBackground(kolor:Byte); Ustawia kolor tła pod tekstem. Normalnie jest czarne.
TextColor(kolor:Byte); Ustawia kolor liter na wartość jaką przyjmuje zmienna kolor.
TextMode(mode:integer); Ustawia specyficzny tryb tekstowy. Normalny ma 80 znaków w pozycji X i 25 w pozycji Y. Instrukcja ta zmienia ten tryb.
WhereX; -Funkcja, która przyjmuje wartość typu Byte zawierającą pozycję poziomą (inaczej pozycja X) kursora tekstowego.
WhereY; -Funkcja przyjmuje pozycję Y kursora.
Window(X1,Y1,X2,Y2:Byte); Procedura ta ustawia w pamięci okno, w którym można pisać. Od tej pory każdy tekst będzie wypisywany w tym oknie. X1 oznacza od którego znaku w poziomie ma się zaczynać okno, Y1 -od którego ma się zaczynać okno w pozycji Y, a X2 i Y2 to współrzędne końcowe, np. Window(10,10,70,15); Pozycja 1,1 to górny lewy róg ekranu.
Moduł DOS zawiera wiele funkcji dostępnych w systemie DOS, które możemy użyć w naszym programie, są to m.in. funkcje i procedury:
pobierania i ustawiania daty i czasu
sprawdzania statusu dysków twardych, CD-ROMów, dyskietek i innych napędów
obsługi, wyszukiwania plików, ustawiania ich parametrów
obsługi przerwań z tablicy wektorów oraz przerwań programowych systemu DOS
obsługi procesów, wykonywania i podtrzymywania procesów systemu DOS
Moduł DOS
Zawiera procedury i funkcje służące do komunikowania się z systemem operacyjnym DOS i wykonywania operacji na zbiorach danych.
Typ czasowy DataTime jest stosowany w procedurach UnpackTime i PackTime do tworzenia wartości zawierającej datę i czas używanych w procedurach GetTime i SetTime
Type DateTime = record
Year, Month, Day, Hour, Min, Sec : Word
End;
Procedury związane z czasem
GetData (rok, miesiąc, dzień, dzień-tygodnia), określa bieżącą datę
GetTime(godzina, minuta, sekunda, setna część sekundy)określa bieżący czas
Gdzie wszystkie argumenty powinny być zmiennymi typu Word.
Zakresy wartości są następujące
Rok 19980 2099
Miesiąc 1..12
Dzień 1..31
Sekunda 0..59
Dzień_tygodnia 0..6 (0-niedziela, 1 - poniedziałek)
Godzina 0..23
Minuta 0..59
Setna_część_sekundy 0..99
SetData (rok, miesiąc, dzień, dzień-tygodnia),ustala nową bieżącą datę
SetTime(godzina, minuta, sekunda, setna część sekundy) ustala nowy bieżący czas
Argumenty dla tych funkcji muszą być z zakresu wartości podanych wyżej, inaczej procedura jest ignorowana. Procedury PackTime i UnpackTime przekształcają rekord typu czasowego na liczbę całkowitą Longint i odwrotnie. Wartość daty i czasu w postaci liczby jest wykorzystywana w procedurze SetFTime.
PackTime(zmienna_typu_czasowego, czas)
UnpackTime (czas, zmienna_typu_czasowego)
Do otrzymania daty zapisu zbioru dyskowego służy procedura
GetFTime(Zmienna_plikowa, czas) Plik skojarzony ze zmienną plikowa musi być otwarty. Na zmianę daty zapisu pliku na dysku pozwala funkcja
SetFTime (zmienna_plikowa, czas)
W przykładowym programie ustala się datę zapisu zbioru na 1998.12.01.
program stary_plik;
uses dos;
var rekordczas,rekord:datetime;
s100 : word;
czas,czas1 : longint;
plik : text;
begin
assign ( plik,'nazwa.pas'); {nalezy podać nazwę pliku z katalogu BIN} reset (plik); (otwarcie pliku do odczytu}
with rekordczas do
begin
gettime(hour, min, sec,s100);
year :=1986;
month :=12;
day :=1;
end;
packTime(rekordczas,czas);
SetFTime(plik,czas);
getftime(plik,czas1);
UnpackTime(czas1,rekord); {zmiana spakowanego czasu na rekord)
write('Oto',rekord.year,' ',d.month,' '‚rekord.day,' '‚ rekord.hour);
close(plik);
end.
Moduł Graph
Każda firma produkująca kompilatory Pascala dołącza do niego potężny zestaw gotowych już funkcji i procedur graficznych dostępnych w module Graph. Na pewno go mamy. Jeśli nie - można znaleźć go na wielu stronach i serwisach poświęconych programowaniu.
W pierwszym programiku wykorzystującym moduł Graph uruchomiam autotest a później zainicjuję tryb graficzny odpowiadający karcie graficznej.
Opiszę najważniejsze fragmenty programu:
Poniższa procedura wykrywa kartę oraz tryb graficzny, który obsługuje.
DetectGraph(Karta,Tryb); { karta 9 - VSA, tryb 2 - VGAHi }
Po detekcji jest inicjalizacja. Poniższa procedura stawia już tylko przysłowiową kropkę nad i. Trzecim parametrem jest katalog, w którym znajdują się sterowniki graficzne i czcionki.
InitGraph(Karta,Tryb,'c:\bp\bgi');
Spójrzmy na prostą detekcję karty graficznej i jej parametrów.
program detekcja;
uses graph;
var i,x,y : integer;
Karta, Tryb : Integer;
begin
DetectGraph(Karta,Tryb);
InitGraph(Karta,Tryb,'c:\bp\bgi');
{ jestesmy teraz 'wewnatrz' trybu graficznego }
x:= getmaxx;
y:= getmaxy;
CloseGraph;
writeln('Sterownik graficzny numer: ',Karta);
writeln('Tryb : ',Tryb);
writeln('Rozdzielczosc: ',x,' X ',y);
Readln;
end.
W kolejnym programie zaprezentuję procedurę PutPixel(z modułu Graph), jej parametrami są: pozycja X, pozycja Y, kolor zapisany jako łańcuch lub jako wartość liczbowa.
Program rysuje koło z wykorzystaniem funkcji sinus i cosinus.
Oczywiście w module Graph są gotowe funkcje rysujące koła , ale przedstawię na jakiej zasadzie są one tworzone - wszystkie bowiem figury są opisywane przez równanie matematyczne.
program kolo_sin_cos_biegunowo;
uses
graph,crt;
var i,x,y : integer;
Karta, Tryb : Integer;
begin
DetectGraph(Karta,Tryb); { karta 9 - VSA, tryb 2 - VGAHi }
InitGraph(Karta,Tryb,'c:\bp\bgi');
for i:=1 to 360 do
PutPixel(GetMaxX div 2+Round(SIN(i)*50), GetMaxY div 2+Round(COS(i)*50),Yellow);
Readln;
CloseGraph;
end.
5