Documente online.
Zona de administrare documente. Fisierele tale
Am uitat parola x Creaza cont nou
 HomeExploreaza
upload
Upload




UNIT-UL CRT

Informatica


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;

Sugestie

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.




Document Info


Accesari: 2154
Apreciat: hand-up

Comenteaza documentul:

Nu esti inregistrat
Trebuie sa fii utilizator inregistrat pentru a putea comenta


Creaza cont nou

A fost util?

Daca documentul a fost util si crezi ca merita
sa adaugi un link catre el la tine in site


in pagina web a site-ului tau.




eCoduri.com - coduri postale, contabile, CAEN sau bancare

Politica de confidentialitate | Termenii si conditii de utilizare




Copyright © Contact (SCRIGROUP Int. 2025 )