Scrieti programul C care permite crearea si vizualizarea unui arbore binar ordonat sub forma naturala.
Descrierea algoritmului
Pentru a putea realiza vizualizarea naturala a unui arbore binar ordonat este necesar sa avem cunostinte despre lucrul in mod grafic in limbajul C.
1.Gestiunea ecranului in mod grafic
Modul grafic presupune c 424c26e 9; ecranul este format din “puncte luminoase”(pixeli). Numarul acestora depinde de adaptorul grafic si se numeste rezolutie. O rezolutie este cu atat mai buna cu cat este mai mare.
Adaptorul CGA are o rezolutie de 200 de randuri a 640 de coloane, iar adaptorul EGA ofera o rezolutie de tot atatea coloane, dar de 350 de randuri.
Adaptorul VGA ofera o rezolutie de 480 de randuri a 640 de coloane sau chiar mai mare, de pana la 768 de randuri, a 1024 de coloane.
Pentru gestiunea ecranului in mod grafic se pot utiliza peste 60 de functii din biblioteca sistemului. Aceste functii au prototipul in fisierul graphics.h.
Etapele ce trebuie parcurse pentru realizarea unei aplicatii grafice:
initilizarea(setarea) modului grafic;
stabilirea culorii de fundal;
stabilirea culorii de scris;
desenarea efectiva;
inchiderea modului grafic.
2.Setarea modului graphic
Modul grafic se seteaza cu ajutorul functiei initgraph. Aceasta functie poate fi folosita singura sau cu o alta functie numita detectgraph care determina parametrii adaptorului grafic. Prototipul ei este:
void far detectgraph(int far *gd, int far *gm);
Exemplu:
Pentru setarea in mod implicit a modului grafic, putem utiliza secventa de mai jos:
int driver, mod_grafic;
detectgraph(&driver, &mod_grafic);
initgraph(&driver, &mod_grafic, “c:BORLANDCBGI”);
Dupa apelul functiei initgraph se pot utiliza celelalte functii standard de gestiune a ecranului.
Din modul grafic se poate iesi apeland functia closegraph de prototip:
void far closegraph(void);
In programele noastre pentru a initializa modul grafic vom folosi o functie pe care o vom numi initializare_mod_grafic(void).
Definitia functiei initializare_mod_grafic(void) este:
void initializare_mod_grafic(void)
}/*initializare mod grafic*/
3.Gestiunea culorilor
Adaptoarele grafice sunt prevazute cu o zona de memorie in care se pastreaza date specifice gestiunii ecranului. Aceasta zona de memorie poarta denumirea de memorie video.
In mod grafic, ecranul se considera format din puncte luminoase numite pixeli. Pozitia pe ecran a unui pixel se defineste printr-un sistem binar:
(x, y) unde:
x – defineste coloana in care este afisat pixelul;
y – defineste linia in care este afisat pixelul.
In cazul adaptoarelor color unui pixel ii corespunde o culoare.
Culoarea pixelilor se pastreaza pe biti in memoria video. Adaptoarele pot contine mai multe pagini video.
Gestiunea culorilor este dependenta de tipul de adaptor grafic existent la microprocesor.
Multimea culorilor care pot fi afisate simultan pe ecran se numeste paleta. Culorile din componenta unei palete pot fi modificate de utilizator prin intermediul functiilor standard. La initializarea modului grafic se seteaza o paleta implicita.
Functiile de gestiune a culorilor pot avea ca parametri nu numai codurile culorilor, ci si indecsi in tabloul care defineste culorile unei palete. De aceea indecsi din intervalul [0, 15] pot fi referiti prin constante simbolice definite in fisierul graphics.h. Aceste denumiri sugereaza culoarea din compunerea paletei.
Exemplu:
denumire simbolica |
valoare |
BLACK | |
BLUE | |
WHITE |
Culoarea fondului(background) este totdeauna cea corespunzatoare indicelui zero.
Culoarea pentru desenare(foreground) este cea corespunzatoare indicelui 15.
Culoarea de fond poate fii modificata cu ajutorul functiei setbkcolor. Aceasta are prototipul:
void far setbkcolor(int culoare);
unde:
culoare – Este index in tabloul care defineste paleta.
De exemplu, daca se utilizeaza apelul:
setbkcolor(BLUE) atunci culoarea de fond devine albastra.
Culoarea pentru desenare poate fii modificata folosind functia getbkcolor de prototip:
int far setcolor(int culoare);
unde:
culoare – Este index in tabloul care defineste paleta.
De exemplu, daca se utilizeaza apelul:
setcolor(YELLOW); atunci culoarea pentru desenare este galbena.
4.Starea ecranului
In mod grafic, ecranul se compune din n*m puncte luminoase(pixeli). Aceasta inseamna ca pe ecran se pot afisa m linii a n pixeli fiecare.
Pozitia unui pixel se defineste printr-un sistem binar de intregi:
(x, y) numite coordonatele pixelului. Coordonata x defineste coloana pixeluli, iar y defineste linia acestuia.
Pixelul aflat in coltul din stanga sus are coordonatele (0, 0).
Coloanele se numeroteaza de la stanga spre dreapta, iar liniile de sus in jos.
Biblioteca grafica a sistemului contine 4 functii care permit utilizatorului sa obtina urmatoarele informatii relativ la ecran:
coordonata maxima pe orizontala;
coordonata maxima pe verticala;
pozitia curenta(pixel curent).
Prototipurile acestor functii sunt:
int far getmaxx(void);
functia returneaza coordonata maxima pe orizontala (abscisa maxima);
int far getmaxy(void);
functia care returneaza coordonata maxima pe verticala(ordonata maxima);
int far getx(void);
functia returneaza pozitia pe orizontala(abscisa) a pixelului curent;
int far gety(void);
functia returneaza pozitia pe verticala(ordonata) a pixelului curent.
Functia care realizeaza tiparirea in mod grafic in programul nostru este:
void tip(ref anod, int nivel, int x1, int x2, int c1, int c2, char *s)
/*tiparire grafica*/
Aceasta functie va fii apelata din cadrul functiilor de tiparire in inordine, preordine, postordine.
Observații:
Presupunem ca toate cheile sunt diferite de zero. Cheile se vor citi de la tastatura. Sfarsitul introducerii cheilor este marcat de citirea unei chei fictive, egala cu zero.
Programul C:
#include <graphics.h>
#include <stdlib.h>
#include <stdio.h>
#include <conio.h>
#include <ctype.h>
#include <dos.h>
const int raza=20;
const int timp=100;
typedef struct nod
Tnod;
typedef Tnod *ref;
ref radacina,q;
int n,s,x;
char c;
void Inarbore(ref *t, int x)
else if(x<(*t)->cheie)
Inarbore(&((*t)->st),x);
else Inarbore(&((*t)->dr),x);
}/*Inarbore*/
void creare(void)
}/*creare*/
void Init_Mod_Grafic(void)
}/*Init_Mod_Grafic*/
void Tip(ref a,int nivel,int x1,int x2,int c1,int c2,char *s)
/*Tip*/
void Inordine(ref rad,int nivel,int x1,int x2,int c1,int c2)
}/*Inordine*/
void InordineS(ref rad,int nivel,int x1,int x2,int c1, int c2)
}/*Inordine*/
void Preordine(ref rad,int nivel,int x1,int x2,int c1,int c2)
}/*Preordine*/
void Postordine(ref rad, int nivel,int x1, int x2, int c1, int c2)
}/*Postordine*/
ref Loc(int x, ref t)
/*Loc*/
void main(void)
else outtextxy(0,0,'Arborele nu exista');
closegraph();
break;
case 'E':Init_Mod_Grafic();
delay(1000);
cleardevice();
settextstyle(2,0,5);
if(radacina!=NULL)
else outtextxy(0,0,'Arborele nu exista');
closegraph();
break;
case 'O':Init_Mod_Grafic();
delay(1000);
cleardevice();
settextstyle(2,0,5);
if(radacina!=NULL)
else outtextxy(0,0,'Arborele nu exista');
closegraph();
break;
case 'S':Init_Mod_Grafic();
delay(1000);
cleardevice();
settextstyle(2,0,5);
if(radacina!=NULL)
else outtextxy(0,0,'Arborele nu exista');
closegraph();
break;
case 'X':break;
}/*switch*/
printf('Tastati Enter!n');
getch();
}while(op!='X');
}/*functia principala*/
|