|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Senior Member
Iscritto dal: May 2003
Messaggi: 1113
|
[PASCAL] Alberi Binari
raga sto correggendo un esercizio che ho fatto, ma per correggerlo devo riempire due Alberi Binari, uno ordinato e l'altro non.
Per riempire l'albero binario ordinato ho usato questa funzione: Codice:
Procedure InserisciOrd(VAR A:tipoalbero;elem:integer); begin if A=NIL then begin new(A); A^.elem:=elem; A^.sx:=NIL; A^.dx:=NIL; end else if elem<A^.elem then InserisciOrd(A^.sx,elem) else InserisciOrd(A^.dx,elem); end; Il mio albero deve risultare così: Codice:
13 7 19 2 21 24 34 5 2 5 34 15
__________________
| Athlon XP Barton 3000+ | CoolerMaster HAC-V81 | ASUS A7N8X DELUXE v2.0 | 2*256 PC3200 + 1*512 PC3200 = 1GB DDR400| ATI Radeon 9250 | HD 80Gb Maxtor SATA | Ali Q-TEC 550W Dual Fan GOLD PFC |
![]() |
![]() |
![]() |
#2 |
Senior Member
Iscritto dal: May 2003
Messaggi: 1113
|
...up...
__________________
| Athlon XP Barton 3000+ | CoolerMaster HAC-V81 | ASUS A7N8X DELUXE v2.0 | 2*256 PC3200 + 1*512 PC3200 = 1GB DDR400| ATI Radeon 9250 | HD 80Gb Maxtor SATA | Ali Q-TEC 550W Dual Fan GOLD PFC |
![]() |
![]() |
![]() |
#3 |
Senior Member
Iscritto dal: May 2003
Messaggi: 1113
|
raga nessuno sa come riempire un albero binario?...
__________________
| Athlon XP Barton 3000+ | CoolerMaster HAC-V81 | ASUS A7N8X DELUXE v2.0 | 2*256 PC3200 + 1*512 PC3200 = 1GB DDR400| ATI Radeon 9250 | HD 80Gb Maxtor SATA | Ali Q-TEC 550W Dual Fan GOLD PFC |
![]() |
![]() |
![]() |
#4 |
Senior Member
Iscritto dal: Sep 2004
Città: Interamnia Urbs
Messaggi: 2125
|
edit...un secondo.
__________________
Un wormhole (buco di tarlo, in italiano), detto anche Ponte di Einstein-Rosen, è una ipotetica caratteristica topologica dello spaziotempo che è essenzialmente una "scorciatoia" da un punto dell'universo a un altro, che permetterebbe di viaggiare tra di essi più velocemente di quanto impiegherebbe la luce a percorrere la distanza attraverso lo spazio normale. Go to a Wormhole |
![]() |
![]() |
![]() |
#5 |
Senior Member
Iscritto dal: Sep 2004
Città: Interamnia Urbs
Messaggi: 2125
|
ti va bene in C++?
Codice:
void CaricaAlbero (record_albero &alb, record_albero aux, int att_liv, int pos_padre){ char c; tipo_valore val; if(att_liv == 0) { alb=new record_albero cout << "Inserire la radice"; cin >> alb->info; CaricaAlbero (alb, aux, 1, 1); } else { cout << "Esiste il figlio sinistro dell'elemento" << pos_padre << "del livello" << att_liv-1 << "?"; do c=getch(); while(!((c == 's')||(c=='S')||(c=='n')||(c=='N'))); if ((c=='s')||(c=='S')) { aux->sin=new record_albero; cout << "inserire valore"; cin >> aux->sin->info; CaricaAlbero(alb,aux->sin,att_liv+1,pos_padre*2-1); } else aux->sin=NULL; cout << "Esiste il figlio sinistro dell'elemento" << pos_padre << "del livello" << att_liv-1 << "?"; do c=getch(); while(!((c == 's')||(c=='S')||(c=='n')||(c=='N'))); if ((c=='s')||(c=='S')) { aux->des=new record_albero; cout << "inserire valore"; cin >> aux->des->info; CaricaAlbero(alb,aux->des,att_liv+1,pos_padre*2); } else aux->des=NULL; } }
__________________
Un wormhole (buco di tarlo, in italiano), detto anche Ponte di Einstein-Rosen, è una ipotetica caratteristica topologica dello spaziotempo che è essenzialmente una "scorciatoia" da un punto dell'universo a un altro, che permetterebbe di viaggiare tra di essi più velocemente di quanto impiegherebbe la luce a percorrere la distanza attraverso lo spazio normale. Go to a Wormhole |
![]() |
![]() |
![]() |
#6 |
Senior Member
Iscritto dal: May 2003
Messaggi: 1113
|
ti ringrazio...mi sarà utile, certo un po complicato dato che non conosco il C...
non è che riesci a scriverlo anche in Pascal? in ogni caso ti ringrazio molto ![]()
__________________
| Athlon XP Barton 3000+ | CoolerMaster HAC-V81 | ASUS A7N8X DELUXE v2.0 | 2*256 PC3200 + 1*512 PC3200 = 1GB DDR400| ATI Radeon 9250 | HD 80Gb Maxtor SATA | Ali Q-TEC 550W Dual Fan GOLD PFC |
![]() |
![]() |
![]() |
#7 |
Senior Member
Iscritto dal: Sep 2004
Città: Interamnia Urbs
Messaggi: 2125
|
purtroppo non lo conosco il pascal, mi spiace.
In c++ è realizzato con struct e puntatori.
__________________
Un wormhole (buco di tarlo, in italiano), detto anche Ponte di Einstein-Rosen, è una ipotetica caratteristica topologica dello spaziotempo che è essenzialmente una "scorciatoia" da un punto dell'universo a un altro, che permetterebbe di viaggiare tra di essi più velocemente di quanto impiegherebbe la luce a percorrere la distanza attraverso lo spazio normale. Go to a Wormhole |
![]() |
![]() |
![]() |
#8 |
Senior Member
Iscritto dal: Mar 2004
Città: al nord
Messaggi: 3873
|
[quote=leadergl]raga sto correggendo un esercizio che ho fatto, ma per correggerlo devo riempire due Alberi Binari, uno ordinato e l'altro non.
Per riempire l'albero binario ordinato ho usato questa funzione: Codice:
Procedure InserisciOrd(VAR A:tipoalbero;elem:integer); begin if A=NIL then begin new(A); A^.elem:=elem; A^.sx:=NIL; A^.dx:=NIL; end else if elem<A^.elem then InserisciOrd(A^.sx,elem) else InserisciOrd(A^.dx,elem); end; scusa, ma il tuo codice se A è diverso da NIL non fa niente se non che chiamarsi all'infinito... o no? |
![]() |
![]() |
![]() |
#9 |
Senior Member
Iscritto dal: May 2003
Messaggi: 1113
|
Ok...ho risolto, grazie al tuo algoritmo ne ho scritto uno in Pascal che poi ho leggermente modificato per farlo funzionare meglio in Pascal.
Ecco il codice: Codice:
Procedure Inserisci(VAR A:tipoalbero; Liv_Att,Pos_Padre:integer); var ElemTemp:integer; c:char; begin if Liv_Att=0 then begin write('Inserire elemento radice: '); readln(elemtemp); Inserisci(A,1,elemtemp); end else begin if A=NIL then begin new(A); A^.elem:=pos_padre; A^.sx:=NIL; A^.dx:=NIL; end; write('Esiste il figlio sinistro dell''elemento ',pos_padre,' del livello ',liv_att-1,'? '); readln(c); if (c='s') OR (c='S') then begin write('Inserire valore: '); readln(elemtemp); Inserisci(A^.sx,liv_att+1,elemtemp); end; write('Esiste il figlio destro dell''elemento ',pos_padre,' del livello ',liv_att-1,'? '); readln(c); if (c='s') OR (c='S') then begin write('Inserire valore: '); readln(elemtemp); Inserisci(A^.dx,liv_att+1,elemtemp); end; end; End;
__________________
| Athlon XP Barton 3000+ | CoolerMaster HAC-V81 | ASUS A7N8X DELUXE v2.0 | 2*256 PC3200 + 1*512 PC3200 = 1GB DDR400| ATI Radeon 9250 | HD 80Gb Maxtor SATA | Ali Q-TEC 550W Dual Fan GOLD PFC |
![]() |
![]() |
![]() |
#10 | |
Senior Member
Iscritto dal: May 2003
Messaggi: 1113
|
Quote:
__________________
| Athlon XP Barton 3000+ | CoolerMaster HAC-V81 | ASUS A7N8X DELUXE v2.0 | 2*256 PC3200 + 1*512 PC3200 = 1GB DDR400| ATI Radeon 9250 | HD 80Gb Maxtor SATA | Ali Q-TEC 550W Dual Fan GOLD PFC |
|
![]() |
![]() |
![]() |
#11 | |
Senior Member
Iscritto dal: Mar 2004
Città: al nord
Messaggi: 3873
|
Quote:
![]() ![]() ho programmato per anni in turbo pascal... bei tempi |
|
![]() |
![]() |
![]() |
#12 |
Senior Member
Iscritto dal: Mar 2004
Città: al nord
Messaggi: 3873
|
1 curiosità: fai l'ITC?
![]() |
![]() |
![]() |
![]() |
#13 | |
Senior Member
Iscritto dal: May 2003
Messaggi: 1113
|
no...per mia sfortuna il Turbo Pascal me lo fanno usare all'univ...
Cmq..tornarno al mio esercizio ho notato che non mi da il risultato voluto.. Allo stato attuale: 1) Creo bene i due alberi di test 2) Sembra tutto ok 3) Il risultato è completamente sbagliato ed è un numero casuale che sta in memoria... vi propongo l'esercizio così magari riuscite a vedere l'errore che io non trovo... Testo dell'esercizio: Quote:
Codice:
{Esame di Programmazione Mod. B del 20/07/2005} {Esercizio 5} Program Esercizio5; Uses CRT; Type TipoAlbero=^nodoalbero; nodoalbero=RECORD elem:integer; sx, dx:TipoAlbero; END; var Al,AlO:tipoalbero; totale,par:integer; function Trova(AO:TipoAlbero; elem:integer):integer; var trovato,temp:integer; begin trovato:=0; if (AO<>NIL) AND (trovato=0) then begin if (AO^.elem=elem) then if ((AO^.sx=NIL) OR (AO^.dx=NIL)) then trovato:=1 else begin trovato:=0; temp:=Trova(AO^.sx,elem); temp:=Trova(AO^.dx,elem); end; end; trova:=trovato; end; function Es5(A,AO:tipoalbero; VAR parziale:integer):integer; var temp:integer; begin if A<>NIL then begin if (A^.sx=NIL) AND (A^.dx=NIL) then parziale:=parziale+trova(AO,A^.elem) else begin temp:=Es5(A^.sx,AO,parziale); temp:=Es5(A^.dx,AO,parziale); end; end else Es5:=parziale; end; Procedure Stampa(A:tipoalbero); begin if A<>NIL then begin Stampa(A^.sx); writeln(A^.elem); Stampa(A^.dx); end; end; Procedure InserisciOrd(VAR A:tipoalbero;elem:integer); begin if A=NIL then begin new(A); A^.elem:=elem; A^.sx:=NIL; A^.dx:=NIL; end else if elem<A^.elem then InserisciOrd(A^.sx,elem) else InserisciOrd(A^.dx,elem); end; Procedure Inserisci(VAR A:tipoalbero; Liv_Att,Pos_Padre:integer); var ElemTemp:integer; c:char; begin if Liv_Att=0 then begin write('Inserire elemento radice: '); readln(elemtemp); Inserisci(A,1,elemtemp); end else begin if A=NIL then begin new(A); A^.elem:=pos_padre; A^.sx:=NIL; A^.dx:=NIL; end; write('Esiste il figlio sinistro dell''elemento ',pos_padre,' del livello ',liv_att-1,'? '); readln(c); if (c='s') OR (c='S') then begin write('Inserire valore: '); readln(elemtemp); Inserisci(A^.sx,liv_att+1,elemtemp); end; write('Esiste il figlio destro dell''elemento ',pos_padre,' del livello ',liv_att-1,'? '); readln(c); if (c='s') OR (c='S') then begin write('Inserire valore: '); readln(elemtemp); Inserisci(A^.dx,liv_att+1,elemtemp); end; end; End; {Main dell'esercizio} begin clrscr; writeln('Creazione e Riempimento Albero: AlO'); InserisciOrd(AlO,28); InserisciOrd(AlO,15); InserisciOrd(AlO,31); InserisciOrd(AlO,13); InserisciOrd(AlO,20); InserisciOrd(AlO,34); InserisciOrd(AlO,5); InserisciOrd(AlO,14); InserisciOrd(AlO,33); writeln('Creazione e Riempimento Albero: Al'); Inserisci(Al,0,0); writeln('Avvio Esercizio 5'); par:=0; totale:=0; totale:=Es5(Al,AlO,par); writeln; writeln('Elementi di A non presenti in Al0 che soddisfano: ',totale); writeln; writeln('Premere un tasto per continuare!'); readln; end.
__________________
| Athlon XP Barton 3000+ | CoolerMaster HAC-V81 | ASUS A7N8X DELUXE v2.0 | 2*256 PC3200 + 1*512 PC3200 = 1GB DDR400| ATI Radeon 9250 | HD 80Gb Maxtor SATA | Ali Q-TEC 550W Dual Fan GOLD PFC |
|
![]() |
![]() |
![]() |
#14 |
Senior Member
Iscritto dal: Mar 2004
Città: al nord
Messaggi: 3873
|
credo che l'errore sia qui:
Codice:
function Es5(A,AO:tipoalbero; VAR parziale:integer):integer; var temp:integer; begin if A<>NIL then begin if (A^.sx=NIL) AND (A^.dx=NIL) then parziale:=parziale+trova(AO,A^.elem) else begin temp:=Es5(A^.sx,AO,parziale); temp:=Es5(A^.dx,AO,parziale); end; end else Es5:=parziale; end; |
![]() |
![]() |
![]() |
#15 |
Senior Member
Iscritto dal: May 2003
Messaggi: 1113
|
In un Albero le Foglie sono quei nodi che non hanno figli ne sinistri ne destri...giusto?!
Per questo verifico che entrambi (AND) siano uguali a NIL Cmq facendo del Debug ho notato che qui succede qualcosa di strano: Codice:
function Trova(AO:TipoAlbero; elem:integer):integer; var trovato,temp:integer; begin trovato:=0; if (AO<>NIL) AND (trovato=0) then begin if (AO^.elem=elem) then if ((AO^.sx=NIL) OR (AO^.dx=NIL)) then trovato:=1 else begin trovato:=0; temp:=Trova(AO^.sx,elem); temp:=Trova(AO^.dx,elem); end; end; trova:=trovato; end; ma non capisco perchè fa così...
__________________
| Athlon XP Barton 3000+ | CoolerMaster HAC-V81 | ASUS A7N8X DELUXE v2.0 | 2*256 PC3200 + 1*512 PC3200 = 1GB DDR400| ATI Radeon 9250 | HD 80Gb Maxtor SATA | Ali Q-TEC 550W Dual Fan GOLD PFC |
![]() |
![]() |
![]() |
#16 |
Senior Member
Iscritto dal: May 2003
Messaggi: 1113
|
Modificando in questo modo la procedura funziona bene...bah...:
Codice:
function Trova(AO:TipoAlbero; elem:integer):integer; var trovato,temp:integer; begin if (AO<>NIL) AND (trovato=0) then begin if (AO^.elem=elem) AND ((AO^.sx=NIL) OR (AO^.dx=NIL)) then trovato:=1 else begin temp:=Trova(AO^.sx,elem); temp:=Trova(AO^.dx,elem); end; end; trova:=trovato; end;
__________________
| Athlon XP Barton 3000+ | CoolerMaster HAC-V81 | ASUS A7N8X DELUXE v2.0 | 2*256 PC3200 + 1*512 PC3200 = 1GB DDR400| ATI Radeon 9250 | HD 80Gb Maxtor SATA | Ali Q-TEC 550W Dual Fan GOLD PFC |
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 23:53.