|
|||||||
|
|
|
![]() |
|
|
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: 2126
|
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: 2126
|
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: 2126
|
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:
hai ragione 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: 22:03.











hai ragione







