Enunţ:
Scrieţi programul C care permite crearea şi vizualizarea unui arbore binar ordonat cu
vizualizare naturală.
1. Descrierea algoritmului.
Pentru a putea realiza vizualizarea naturală a unui arbore binar ordonat este necesar să avem
cunoştinţe despre lucrul în mod grafic în limbajul C.
Exemplu:
Pentru setarea în mod implicit a modului grafic, putem utiliza secvenţa de mai jos:
int driver, mod_grafic;
detectgraph(&driver, &mod_grafic);
initgraph(&driver, &mod_grafic, “c:\\BORLANDC\\BGI”);
După apelul funcţiei initgraph se pot utiliza celelalte funcţii standard de gestiune a ecranului.
Din modul grafic se poate ieşi apelând funcţia closegraph de prototip:
void far closegraph(void);
În programele noastre pentru a iniţializa modul grafic vom folosi o funcţie pe care o vom numi
iniţializare_mod_grafic(void).
Definiţia funcţiei iniţializare_mod_grafic(void) este:
void initializare_mod_grafic(void)
{
int gdriver=DETECT, gmode, err;
initgraph(&gdriver, &gmode, CALE);
err=graphresult();
if(err!=grOk)
{
printf("Eroare la initializarea modului grafic: %s\n",
grapherrormsg(err));
printf("Apasati o tasta pentru a termina ...\n");
getch();
exit(1); /*se iese din program*/
}
}/*initializare mod grafic*/
Rezolvare:
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <conio.h>
#include <graphics.h>
#include <dos.h>
#define CALE "E:\\BC\\BGI"
#define raza 10
#define timp 500
#define spatiu 40
ref radacina;
void creare(void);
void inarbore(int, ref *);
void initializare_mod_grafic(void);
void tip(ref, int, int, int, int, int, char *);
void inordine(ref, int, int, int, int, int);
void preordine(ref, int, int, int, int, int);
void postordine(ref, int, int, int, int, int);
void tipt(ref anod, int nivel);
void inordinest(ref rad, int nivel);
void main(void)
{
char op;
do
{
clrscr();
printf("Sa se creeze un arbore binar ordonat si sa se afiseze
grafic\n");
printf(" C. Creare\n");
printf(" I. Afisare in mod grafic in inordine\n");
printf(" P. Afisare in mod grafic in preordine\n");
printf(" O. Afisare in mod grafic in postordine\n");
printf(" E. Iesire\n");
printf("Introduceti optiunea: ");
fflush(stdin); op=toupper(getc(stdin));
switch (op)
{
case 'C':
creare();
break;
case 'I':
if(radacina==NULL)
printf("Arborele este vid\n");
else
{
initializare_mod_grafic();
delay(2000);
settextjustify(1,1);
outtextxy(getmaxx()/2, 10, "Parcurgere in INORDINE" );
setviewport(0,30,getmaxx(), getmaxy(), 1);
inordine(radacina, 0, 0, getmaxx(), getmaxx()/2, raza);
setcolor(BLUE);
outtextxy(getmaxx()/2, getmaxy()-40, "Apasati o tasta pt. a
termina");
fflush(stdin);while(!getch());
closegraph();
}
break;
case 'P':
if(radacina==NULL)
printf("Arborele este vid\n");
else
{
initializare_mod_grafic();
delay(2000);
settextjustify(1,1);
outtextxy(getmaxx()/2, 10, "Parcurgere in PREORDINE" );
setviewport(0,30,getmaxx(), getmaxy(), 1);
preordine(radacina, 0, 0, getmaxx(), getmaxx()/2, raza);
setcolor(BLUE);
outtextxy(getmaxx()/2, getmaxy()-40, "Apasati o tasta pt. a
termina.");
fflush(stdin);while(!getch());
closegraph();
}
break;
case 'O':
if(radacina==NULL)
printf("Arborele este vid\n");
else
{
initializare_mod_grafic();
delay(2000);
settextjustify(1,1);
outtextxy(getmaxx()/2, 10, "Parcurgere in POSTORDINE" );
setviewport(0,30,getmaxx(), getmaxy(), 1);
postordine(radacina, 0, 0, getmaxx(), getmaxx()/2, raza);
setcolor(BLUE);
outtextxy(getmaxx()/2, getmaxy()-40, "Apasati o tasta pt. a
termina.");
fflush(stdin);while(!getch());
closegraph();
}
break;
case 'E':
break;
default:
printf("\nOptiune invalida !\n");
break;
}
}
while(op!='E');
void creare(void)
{
int x;
radacina=NULL;
printf("Introduceti noul nod (0-pt a termina): ");
while(scanf("%d", &x)!=1)
{
printf("Introduceti un numar!\n");
fflush(stdin);
}
while(x!=0)
{
inarbore(x, &radacina);
printf("Introduceti noul nod (0-pt a termina): ");
while(scanf("%d", &x)!=1)
{
printf("Introduceti un numar!\n");
fflush(stdin);
}
}
}/*creare*/
void initializare_mod_grafic(void)
{
int gdriver=DETECT, gmode, err;
void inordine(ref rad, int nivel, int x1, int x2, int c1, int c2)
{
static char s[10];
if(rad!=NULL)
{
inordine(rad->st, nivel+1, x1, (x1+x2)/2, (x1+x2)/2,
nivel*spatiu+raza);
tip(rad, nivel, x1, x2, c1, c2, s);
inordine(rad->dr, nivel+1, (x1+x2)/2, x2, (x1+x2)/2,
nivel*spatiu+raza);
}
}/*inordine*/
void preordine(ref rad, int nivel, int x1, int x2, int c1, int c2)
{
static char s[10];
if(rad!=NULL)
{
tip(rad, nivel, x1, x2, c1, c2, s);
preordine(rad->st, nivel+1, (x1+x2)/2, x2, (x1+x2)/2,
nivel*spatiu+raza);
preordine(rad->dr, nivel+1, x1, (x1+x2)/2, (x1+x2)/2,
nivel*spatiu+raza);
}
}/*preordine*/
void postordine(ref rad, int nivel, int x1, int x2, int c1, int c2)
{
static char s[10];
if(rad!=NULL)
{
postordine(rad->dr, nivel+1, x1, (x1+x2)/2, (x1+x2)/2,
nivel*spatiu+raza);
postordine(rad->st, nivel+1, (x1+x2)/2, x2, (x1+x2)/2,
nivel*spatiu+raza);
tip(rad, nivel, x1, x2, c1, c2, s);
}
}/*postordine*/
void tip(ref anod, int nivel, int x1, int x2, int c1, int c2, char *s)
{
setcolor(15);
line((x1+x2)/2, nivel*spatiu+raza, c1,c2+textheight("1")/2);
fillellipse((x1+x2)/2, nivel*spatiu+raza, raza, raza);
setcolor(1);/*albastru*/
sprintf(s, "%d", anod->cheie);
outtextxy((x1+x2)/2, nivel*spatiu+raza, s);
delay(timp);
}/*tiparire grafica*/