UNIT-UL CRT
Unit-ul standard Crt implementeaza un numar de subprograme axate spre aplicatii in care ecranul este utilizat in mod caracter. Programele care utilizeaza aceste subprograme trebuie sa continue directiva uses Crt.
Subprogramele unit-ului Crt pot fI clasificate astfel:
de interes general;
subprograme destinate gestiunii ferestrelor;
subprograme orientate spre culori;
subprograme destinate generatorului de sunet si a intensitatii video.
In acceptiunea unit-ului Crt,coltul stanga sus are coordonatele (0,0). Val 939g65j orile x, sau coloanele cresc spre dreapta. Valorile y, sau liniile cresc in jos. Astfel, cu un echipament 80x25, coordonatele celor patru colturi sunt urmatoarele:
(0,0) (79,0)
(0,24) (79,24)
Sa consideram instructiunea
write('ABC');
In modul text, instructiunea precedenta de scriere va lasa cursorul in coloana care urmeaza dupa litera C. Daca litera C a fost scrisa in coloana 79, atunci cursorul va ajunge in coloana 0 a liniei urmatoare. Daca litera C a fost scrisa in coloana 79 a liniei 24, atunci intregul ecran va defila in sus cu o linie si cursorul va ajunge in coloana 0 a liniei 24.
Programe care folosesc unitul CRT
3.1. Descrierea programelor
In acest capitol sunt prezentate programe care folosesc unitul CRT oferit de TP. Acesta contine rutine pentru gestiunea ecranului in mod text, pentru tastatura si sunet. Sunt folosite numai o parte dintre aceste rutine, in programe simple cu rolul de a ajuta la o mai buna intelegere a functiilor si procedurilor unitului CRT.
3.1.1. Programul STEAG_01
Se dispune de N culori (3<=N<=7). Sa se scrie un program care afiseaza toate steagurile care se pot forma cu 3 culori distincte. Doua steaguri pot avea aceleaai culori, dar aranjate in ordine diferita.
Problema revine la a genera toate tripletele (I, J, K) cu 1<=I, J, K<= N, cu proprietatea ca K>J, J<>K, J<>K. Spre exemplu daca N=3 se vor genera:
23 l
3 2 l
Fiecarui astfel de triplet i se asociaza un steag, punand de fapt in corespondenta fiecare numar cu o culoare. Secventa de instructiuni care genereaza si afiseaza tripletele (I, J, K) impreuna cu steagurile corespunzatoare este urmatoarea:
for i: = 1 to n do
for j: = 1 to n do
for k: =1 to n do
if (i<>j) and (i<>k) and (j<>k) then
begin
write(i>'',j,'',k,'' textbackground (i);
write(' '); textbackground (j);
write(' '); textbackground (k);
write (' ');textbackground (black);
writeln;
end;
S-au folosit trei instructiuni FOR imbricate, urmate de conditia ca I, J si K sa fie distincte doua cate doua. Pentru a afisa steagurile s-a folosit procedura TEXTBACKGROUND care stabileste culoarea de fond a caracterelor ce urmeazs a fi scrise cu WRITE. Se afiseaza trei spatii alaturate, fiecare cu o alta culoare de fond. Limitarea numarului N la 7 se datoreaza faptului ca 7 reprezinta valoarea maxima a parametrului transmis lui TEXTBACKGROUND, existand numai 8 culori pentru fondul ecranului numerotate de la 0 Ia 7, prima fiind culoarea neagra care nu este folosita de program pentru colorarea steagurilor, deoarece aceasta culoare este utilizata pentru restul ecranului. Dupa fiecare steag afiaat pe ecran se stabileate culoarea neagra pentru fond, folosindu-se constanta BLACK a unitului CRT si se trece la linia urmatoare. Necesitatea limitarii inferioare a lui N la 3 este evidenta intrucat pentru generarea steagurilor formate din 3 culori distincte trebuie sa se dispuna de cel putin 3 culori.
Sugestie
Incercati sa realizati un program care sa afiseze steaguri alcatuite dintr-un numar oarecare de culori.
3.1.2. Programul STEAG
Se dispune de N culori (3<=N<=7), Sa se scrie un program care afiseaza toate steagurile care se pot forma cu 3 culori distincte, astfel incat oricare doua steaguri sa difere prin cel putin o culoare.
Si in acest caz se genereaza triplete (I, J, K), iar pentru a elimina cazurile cand un astfel de triplet este format din aceleasi valori ca si cele ale altuia deja afisat diferenta constand numai in ordinea valorilor ce compun respectivele triplete, se genereaza numai tripletele pentru care I<J<K. Spre exemplu pentru N=5 se vor genera:
Instructiunile care fac generarea si afisarea steagurilor sunt cele care urmeaza:
for i; = l to n - 2 do
for j:= i+ l to n - l do
for k:=j + l to n do
begin
write(i, ' ',j,'',k,'');
textbackground (i);
write (' ');
textbackgrouud (j);
write (' ');
textbackground (k);
write (' ');
tex tbaekground (black);
writeln; end;
Observatiile facute la programul precedent privind afisarea steagurilor raman valabile.
Sugestie
De asemenea, incercati o generalizare a problemei, numarul de culori ce intra in componenta, unui steag nemaifiind fixat la valoarea 3, ci putand fi dat de la tastatura.
3.1.3. Programul RANDCHAR
Sa se afiseze pe ecran 5000 de caractere aleatoare cu culori aleatoare.
In cazul acestui program, pentru stabilirea atributelor de culoare se va folosi variabila TEXTATTR a unitului CRT. Valoarea inscrisa in aceasta variabila este folosita de toate rutinele de afisare ale unitului CRT. Ea contine atributele de culoare folosite la stergerea ecranului cu CLRSCR, pe cele ale liniilor rezultate in urma apelurilor INSLINE si DELLINE.
De asemenea, cu atributele retinute in TEXTATTR se fac scrierile pe ecran cu procedurile WRITE sau WRITELN. Chiar si apelurile procedurilor TEXTCOLOR si TEXTBACKGROUND nu fac altceva decat sa modifice continutul lin TEXTATTR.
Initial se salveaza continutul lui TEXTATTR intr-o variabila de tip byte numita T. Se sterge ecranul cu CLRSCR si se initializeaza generatorul de numere aleatoare cu apelul lui RANDOMIZE. Apoi se executa de 5000 de ori instructiunile cuprinse intr-o bucla FOR. La fiecare iteratie variabilei X i se atribuie o valoare aleatoare cuprinsa intre 2 si 79. Acest lucru se realizeaza generand un numar aleator cuprins intre 0 si 77 cu ajutorul lui RANDOM si adaugand la acest numar valoarea 2. Analog se genereaza o valoare pentru Y cuprinsa intre 2 si 24. Perechea (X,Y) reprezinta coordonatele ecran (coloana si linia) la care se va face scriere a urmatorului caracter aleator. Cunoscand faptul ca ecranul are 25 de linii si 80 de coloane se constata ca pe prima si ultima linie, respectiv coloana nu se va scrie nimic. Se pozitioneaza cursorul la coordonatele (X,Y) cu GOTOXY pentru ca urmatoarea scriere cu WRITE sa se faca aici, se genereaza doua numere aleatoare cuprinse intre 0 si 255 inclusiv, reprezentand codul ascii respectiv atributele de culoare ale caracterului aleator. Acest caracter se afiseaza daca nu este #7 (caracterul cu codul ascii 7).
Atentie!
Afisarea caracterului #7 cu WRITE ar insemna, de fapt, generarea unui sunet in difuzorul calculatorului.
In final este asteptata apasarea unei taste apeland READKEY, este refacut continutul lui TEXTATTR cu valoarea sa initiala si este apelata CLRSCR pentru curatirea ecranului.
lata codul sursa al buclei FOR care realizeaza actiunile descrise mai inainte:
for i:= l to 5000 do begin
x : r an d o m (78) -H 2;
y : =: rand o m (23) + 2;
gotoxy (x,y);
ch : = chr (random (256));
textattr: = random (256);
if ch <>#7then
write (ch);
end;
3.1.4. Programul RANDWIN
Sa se afiseze pe ecran 500 de ferestre aleatoare, colorate aleator.
Acest program are o structura asemanatoare cu cel anterior. Se folosesc patru variabile numite X1, Y1, X2, Y2 carora li se atribuie valori aleatoare cuprinse intre l si 80 sau intre 1 si 25 Perechea (X1,Y1) reprezinta coordonatele coltului din stanga-sus al unei zone dreptunghiulare a ecranului, iar (X2,Y2) coltul dreapta-jos. Aceasta zona dreptunghiulara este numita 'fereastra', la un anumit moment existand o asa-zisa 'fereastra curenta'. Toate operatiile de afisare pe ecran, folosind rutine ale unitului CRT se vor face numai in aceasta zona a ecranului, iar coordonatele transmise acestor rutine vor fi relative la aceasta fereastra.
La fiecare iteratie se stabileste fereastra curenta cu ajutorul procedurii WINDOW intr-o zona aleatoare a ecranului, se stabileste o valoare aleatoare pentru TEXT ATTR si apoi se apeleaza CLRSCR pentru a. colora corespunzator fereastra.
Atentie!
In programele anterioare spuneam despre CLRSCR ca sterge ecranul deoarece fereastra curenta coincidea cu spatiul de afisare al ecranului.
In final se asteapta apasarea unei taste si se curata ecranul. Urmeaza instructiunile care genereaza si coloreaza aleator ferestrele:
for i: = l to 500 do
begin
x1 : = random (80) + 1;
y1 : = random (25) + 1;
x2 : = x1 + random (80)+1;
y2 : = y1 + random (25) + 1;
if x2>80 then
x2:= 80;
if y2>25 then
y2:=25;
window (x1,y1,x2,y2);
textattr := random (256);
clrscr;
end;
Modificati acest program astfel incat stabilirea atributelor de culoare aleatoare sa se faca prin apelul procedurilor TEXTCOLOR si TEXTBACKGROUND.
Atentie!
Deoarece nu se scrie nici un caracter pe ecran, ar fi fost suficienta numai stabilirea culorii de fond inaintea apelului lui CLRSCR.
3.1.5. Programul DELINSLN
Sa se realizeze defilarea continutului ecranului cu cate o linie in sus sau in jos in mod aleator pana cand este apasata tasta ESC.
Programul realizeaza defilarea in sus a ecranului pozitionand cursorul pe prima linie cu GOTOXY si stergerea acestei linii prin apelul rutinei DELLINE. Defilarea continutului ecranului in sens invers se face tot prin pozitionarea cursorului pe prima linie a ecranului, folosindu-se procedura INSLINE in locul lui DELLINE. Directia in care se face defilarea si atributele de culoare folosite pentru liniile de ecran rezultate in urma deplasarii continutului acestuia sunt stabilite in mod aleator.
Este folosita o bucla REPEAT a carei sursa urmeaza:
repeat
b := random (2);
c := random (8);
textbackground (c);
gotoxy (1,1);
if b = 0 then
insline
inslin e;
delay (100);
until keypressed and (readkey = #27);
La fiecare iteratie se asteapta 100 de milisecunde, fiind apelata procedura DELAY
Functia KEYPRESSED este apelata pentru a se verifica daca a fost apasata o tasta. In acest caz se apeleaza READKEY pentru a obtine caracterul determinat de codul acestei taste, iar daca acesta este #27 (27 este codul tastei ESC) se iese din bucla REPEAT.
Atentie!
Nu este corect sa se elimine apelul lui KEYPRESSED din conditia de oprire sau sa se inverseze ordinea apelurilor functiilor KEYPRESSED si READKEY, intrucat aceasta ar insemna asteptarea de catre program a
apasarii unei taste dupa fiecare iteratie (ceea ce nu se doreste).
3.1.6. Programul KEYCODE
Sa se conceapa un program care sa afiseze codurile tastelor apasate de utilizator.
In urma apasarii oricirei taste se genereaza un cod care poate fi aflat cu ajutorul functiei READKEY.
Atentie!
Nu trebuie sa se confunde codurile ascii ale caracterelor cu codurile tastelor.
Exista taste ale caror coduri sunt interceptate de sistem, fiind inaccesibile utilizatorului (ex : Pause, Num Lock, Shift, Ctrl, Alt, s.a.). Totusi tastele SHIFT, CTRL si ALT pot fi folosite impreuna cu alte taste, codurile generate fiind altele decat cele generate la o simpla actionare a respectivelor taste.
Unele dintre aceste coduri, spre exemplu cele asociate tastelor F1, F2, , F10, sunt formate din doi octeti, primul fiind 0. In cazul in care la apelul lui READKEY se returneaza #0 trebuie sa se mai apeleze inca o data aceasta functie pentru a obtine cel de-al doilea octet (returnat sub forma unui caracter) care formeaza codul.
Codurile tastelor alfanumerice generate la o simpla apasare a acestora sau impreuna cu SHIFT coincid cu codurile ascii ale caracterelor atasate respectivelor taste.
In cazul in care codul este format din doi octeti programul afiseaza mai intai 0, apoi cel de-al doilea octet al codului. Altfel se afiseaza caracterul returnat de READKEY urmat de codul sau ascii.
Programul foloseste o variabila numita CH, de tip char si afiseaza codurile tastelor apasate pana cand se intalneste cel al tasiei ESC (27), folosind o bucla REPEAT al carei cod sursa urmeaza:
repeat
ch : = readkey; ifch = #0 then
begin
ch : = readkey;
writeln ('' : 3,00 : 4, ord (ch) : 4);
end
else
writeln (ch : 3, '' : 4, ord (ch) : 4);
until ch = #27;
3.2. Sursele programelor
3.2.1. Sursa programului STEAG_01
program steag_01;
uses crt;
var i, i, j, k : byte;
begin
clrscr;
writeln ('Steag 01 '); write ('N = ');
readln (n);
for i: = l to n do
for j : = l to n do
for k : = l to n do
if (i <> j) and (i <> k) and (j <> k) then begin
write(i,' ',j,' '',k, ' ');
textbackground (i);
write (' ');
textbackground (j);
write (' ');
textbackground (k);
write (' ');
textbackground (black);
writeln;
end; end.
3.2.1 Sursa programului STEAG_02
program steag_02;
uses crt;
var i, i, j, k : byte;
begin
clrscr;
writeln (' Steag_02 ');
write ('N = '); readln (n);
for i : = l to n - 2 do
for j: = i + l to n - 1 do
for k : =j +1 to n do
begin
write(i,' ',j,' ',k,
textbackground (i);
write (' ');
textbackground (j);
write (' ');
textbackground (k);
write (' ');
textbackground (black);
writeln;
end;
end.
3.2.3. Sursa programului RANDCHAR
program randchar;
uses crt;
var
x, y, t; byte;
ch : char;
i : word;
begin
t:= textattr;
clrscr;
r andomize;
for i := l to 5000 do begin
x := random (78) + 2;
y : = r andom (23) + 2;
gotoxy (x,y);
ch := chr (random (256));
textattr := random (2^6);
if ch <> #7 then write (ch);
end;
ch := readkey;
textattr : = t;
clrscr;
end.
3.2.4 Sursa programului RANDWIN
program randwin; uses crt;
var
x1,y1,x2,y2,t:byte;
ch: ch ar;
begin
t:= textattr; clrscr; randomize;
for i: = l to 500 do begin
x1 : = random (80)+ 1;
y1 := random (25) + 1;
x2 : = x1 + random (80)+ 1;
y2 : = y1 + random (25)+ 1;
if x2>80 then x2 := 80;
if y2>25 then y2
window (x1, y1, x2, y2);
textattr : = random (256); clrscr; end;
ch : = readkey; textattr : = t; window clrscr;
end.
3.2.5. Sursa programului DELINSLN
program delinsln;
uses crt;
var t, b, c : byte;
begin
t: = textattr; randomize; repeat
b := random (2);
c := random (8);
textbackground (c);
gotoxy (1,1);
if b = 0then
d e l in e
else
insline;
delay (100);
until keypressed and (readkey = #27); textattr := t; clrscr; end.
3.2.6. Sursa programului KEYCODE
program keycode;
uses crt;
var ch ; char;
begin
repeat
ch : = readkey;
if ch = #0 then begin
ch : = readkey;
writeln ('' : 3, 00 : 4, ord (ch) : 4);
end
else
writeln (ch : 3 ,'', 4, ord (ch) : 4);
until ch = #27;
end.
|