Sunteți pe pagina 1din 5

LABORATOR 1

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.

Setarea modului grafic


Modul grafic se setează cu ajutorul funcţiei initgraph. Această funcţie poate fi folosită singură
sau cu o altă funcţie numită detectgraph care determină parametrii adaptorului grafic. Prototipul ei
este:
void far detectgraph(int far *gd, int far *gm);

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

typedef struct nod


{
int cheie;
struct nod *st, *dr;
}Tnod;
typedef Tnod *ref;

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 inarbore(int x, ref *t)


{
if((*t)==NULL)
{
*t = (Tnod*)malloc(sizeof(Tnod));
(*t)->st = NULL;
(*t)->dr = NULL;
(*t)->cheie = x;
}
else
{
if(x < (*t)->cheie)
inarbore(x, &(*t)->st);
else
inarbore(x, &(*t)->dr);
}
}/*inarbore*/

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);
}
}/*initializare mod grafic*/

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*/

S-ar putea să vă placă și