|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#21 |
|
Member
Iscritto dal: Aug 2008
Messaggi: 92
|
deniele nel tuo pseudocodice
algoritmo Albero-Altezza(albero T) → intero { se (T è vuoto) { restituisci 0; } altrimenti { restituisci 1 + max{ Albero-Altezza(T->sinistro), Albero-Altezza(T->destro) }; } } richiami una funzione max,ma di cosa si tratta?? |
|
|
|
|
|
#22 | |
|
Senior Member
Iscritto dal: Dec 2005
Città: Istanbul
Messaggi: 1817
|
Quote:
__________________
One of the conclusions that we reached was that the "object" need not be a primitive notion in a programming language; one can build objects and their behaviour from little more than assignable value cells and good old lambda expressions. —Guy Steele |
|
|
|
|
|
|
#23 |
|
Member
Iscritto dal: Aug 2008
Messaggi: 92
|
Codice:
/*Si consideri un Abero Binario di Ricerca caratterizzato da insieme di studenti:
Ad ogni studente corrisponde una struttura studente contenente i seguenti campi:
- Nome;
- Cognome ;
- Eta';
Si implementino:
una procedura per la creazione di un albero binario di ricerca A di studenti, ordinato per cognome;
una procedura per la stampa ordinata dei nodi dell'albero
una procedura per il calcolo del numero di Nodi dell'albero
una procedura per il calcolo del numero di Foglie dell'albero
una funzione ricorsiva booleana che verifica se l'albero ha tutte le foglie al medesimo livello
una funzione ricorsiva che, dato l'albero A e un intero n, restituisca gli n nodi più piccoli*/
#include<iostream>
using namespace std;
struct Tstudente{
char nome[20];
char cognome[20];
int eta;
Tstudente *sx,*dx;
};
typedef Tstudente *Pnodo;
void menu();
Pnodo crea_nodo(Tstudente x);
void inserimento(Pnodo &L,Tstudente x);
void stampa(Pnodo L,int i);
void conta_nodi(Pnodo L,int &);
void conta_foglie(Pnodo L,int &i);
void nodi_n(Pnodo L,int n);
bool completo(Pnodo L,int &altezzaFoglie,int altezzaCorrente);
int altezza(Pnodo L);
int main(){
int scelta,i=0,altezzaFoglie;
Tstudente temp;
Pnodo L;
L=new Tstudente;
L=NULL;
do{
menu();
cin>>scelta;
fflush(stdin);
switch(scelta){
case 1:
cout<<"INSERISCI COGNOME STUDENTE: ";
cin.getline(temp.cognome,20,'\n');
cout<<"INSERISCI NOME STUDENTE: ";
cin.getline(temp.nome,20,'\n');
cout<<"INSERISCI ETA STUDENTE: ";
cin>>temp.eta;
inserimento(L,temp);
cout<<"\n\tOPERAZIONE COMPLETATA\n\n";
break;
case 2:
stampa(L,0);
break;
case 3:
conta_nodi(L,i);
cout<<"L'ALBERO CONTIENE "<<i<<" NODI\n";
i=0;
break;
case 4:
conta_foglie(L,i);
cout<<"L'ALBERO CONTIENE "<<i<<" FOGLIE\n";
i=0;
break;
case 5:
altezzaFoglie=-1;
if(completo(L,altezzaFoglie,0))
cout<<"L'ALBERO HA TUTTE LE FOGLIE SULLO STESSO LIVELLO\n";
else
cout<<"L'ALBERO NON HA TUTTE LE FOGLIE SULLO STESSO LIVELLO\n";
break;
case 6:
cout<<"INSERIRE VALORE: ";
cin>>i;
nodi_n(L,i);
i=0;
cout<<"\n\n";
break;
case 7:
cout<<"\n\tCIAO :)\n\n";
break;
default:
cout<<"\n\tSCELTA ERRATA,RIPROVA!!\n\n";
break;
}
}while(scelta!=7);
system("pause");
return 0;
}
void menu(){
cout<<"1) INSERIMENTO NUOVO STUDENTE ORDINATO PER COGNOME\n";
cout<<"2) STAMPA ORDINATA NODI DELL'ALBERO\n";
cout<<"3) CALCOLA IL NUMERO DI NODI DELL'ALBERO\n";
cout<<"4) CALCOLA IL NUMERO DI FOGLIE DELL'ALBERO\n";
cout<<"5) VERIFICA SE L'ALBERO HA TUTTE LE FOGLIE AL MEDESIMO LIVELLO\n";
cout<<"6) RESTITUISCI I NODI DELL ALBERO MINORI DI UN VALORE DATO IN INPUT\n";
cout<<"7) ESCI\n";
cout<<"\t SCELTA: ";
}
Pnodo crea_nodo(Tstudente x){
Pnodo temp;
temp=new Tstudente;
strcpy(temp->cognome,x.cognome);
strcpy(temp->nome,x.nome);
temp->eta=x.eta;
temp->sx=NULL;
temp->dx=NULL;
}
void inserimento(Pnodo &L,Tstudente x){
if(L==NULL){
L=crea_nodo(x);
return;
}
else if(strcmp(x.cognome,L->cognome)>0)
inserimento(L->dx,x);
else if(strcmp(x.cognome,L->cognome)<0)
inserimento(L->sx,x);
else
cout<<"\n\tELEMENTO GIA INSERITO\n\n";
}
void stampa(Pnodo L,int i){
if(L!=NULL){
stampa(L->dx,i+1);
for(int j=1;j<=i;j++){
cout<<"\t";
}
cout<<L->cognome<<endl;
stampa(L->sx,i+1);
}
}
void conta_nodi(Pnodo L,int &i){
if(L!=NULL){
i++;
conta_nodi(L->sx,i);
conta_nodi(L->dx,i);
}
else
return;
}
void conta_foglie(Pnodo L,int &i){
if(L!=NULL){
if(L->sx==NULL && L->dx==NULL)
i++;
else{
conta_foglie(L->sx,i);
conta_foglie(L->dx,i);
}
}
}
void nodi_n(Pnodo L,int n){
if(L!=NULL){
nodi_n(L->sx,n);
nodi_n(L->dx,n);
if(L->eta < n)
cout<<L->cognome<<" --> ";
}
}
bool completo(Pnodo L,int &altezzaFoglie,int altezzaCorrente){
if(L==NULL){
if(altezzaFoglie==-1){
altezzaFoglie=altezzaCorrente;
return true;
}
else
return (altezzaCorrente == altezzaFoglie);
}
else
return completo(L->sx,altezzaFoglie,altezzaCorrente+1) && completo(L->dx,altezzaFoglie,altezzaCorrente+1);
}
nel caso in cui inserisco un albero così: P K G C B l'algoritmo mi restituisce false quando poi dovrebbe restituirmi true!! non so se il disegno viene bene ma la radice è g che ha come sottoalberi K e C K ha sottoalbero P C ha sottoalbero B Ultima modifica di Doraemond : 20-06-2010 alle 12:46. |
|
|
|
|
|
#24 |
|
Senior Member
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
|
Di una funzione che, dati n numeri in input, scelga il numero che ha il valore più grande.
__________________
C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai! |
|
|
|
|
|
#25 | |
|
Senior Member
Iscritto dal: Oct 2006
Città: Roma
Messaggi: 1383
|
Quote:
![]() perché ti ostini a chiamare C++ quello che di fatto é codice C? no perché scusa se te lo dico ma tuo "codice C++" fa schifo, non mi stupisce che tu non riesca a concludere dovendo avere a che fare con quella monnezza. PS: non stai scrivendo SMS, scrivi in italiano corretto per cortesia. |
|
|
|
|
|
|
#26 |
|
Senior Member
Iscritto dal: Oct 2006
Città: Roma
Messaggi: 1383
|
andiamo bene
|
|
|
|
|
|
#27 | |
|
Senior Member
Iscritto dal: Oct 2006
Città: Roma
Messaggi: 1383
|
Quote:
edit - e invece ho detto una parziale sciocchezza dato che fino a un certo punto, cioé fino a che la parte di albero esaminata é completa, Complete() chiama Height()
__________________
3D Volley Demo (Facebook) | Reversi (Facebook) | Blockout (Facebook) | Puzzle15 (Facebook) Ultima modifica di fero86 : 20-06-2010 alle 14:06. |
|
|
|
|
|
|
#28 |
|
Senior Member
Iscritto dal: Oct 2006
Città: Roma
Messaggi: 1383
|
riformulo!
Codice:
#include <iostream>
using namespace std;
class CNode {
public:
virtual unsigned int Height() const = 0;
bool Complete() const try {
Height();
return true;
} catch (bool) {
return false;
}
};
class CEmpty :
public CNode {
public:
virtual unsigned int Height() const {
return 0;
}
};
class CTree :
public CNode {
private:
CNode &m_rLeft;
CNode &m_rRight;
public:
CTree(CNode &a_rLeft, CNode &a_rRight)
:
m_rLeft(a_rLeft),
m_rRight(a_rRight) {
}
virtual unsigned int Height() const {
unsigned int nHeight = m_rLeft.Height();
if (nHeight != m_rRight.Height()) {
throw false;
}
return nHeight + 1;
}
};
int main() {
cout << CTree(CEmpty(), CEmpty()).Complete() << endl;
cout << CTree(CTree(CEmpty(), CEmpty()), CEmpty()).Complete() << endl;
cout << CTree(CEmpty(), CTree(CEmpty(), CEmpty())).Complete() << endl;
cout << CTree(CTree(CEmpty(), CEmpty()), CTree(CEmpty(), CEmpty())).Complete() << endl;
return 0;
}
mi sono reso conto che due funzioni erano inutili riflettendo sul funzionamento della mia vecchia Height(): essa nel caso induttivo restituiva il massimo tra le due altezze dei sottoalberi, quindi "sprecava" un'informazione: quando trovava due sottoalberi di altezza diversa buttava via l'informazione del fatto che i due alberi sono di altezza diversa. la nuova Height() in quel caso lancia un'eccezione, che viene catturata dalla Complete() che in quel caso restituisce false. la Complete non é piu ne' virtuale ne' ricorsiva, serve solo come wrapper per la chiamata iniziale di Height().
__________________
3D Volley Demo (Facebook) | Reversi (Facebook) | Blockout (Facebook) | Puzzle15 (Facebook) Ultima modifica di fero86 : 20-06-2010 alle 14:28. |
|
|
|
|
|
#29 |
|
Member
Iscritto dal: Aug 2008
Messaggi: 92
|
fero guarda che questo è il primo anno che studio informatica e cn il prof siamo arrivati a questo,le classi le studierò l'anno prox ,x ora abbiamo fatto solo un accenno delle classi x qst nn sn pronto a programmare cn le classi...so k c++ usa gli oggetti ma x ora di programmaz ad oggetti nn ne ho fatta....e poi se l'esercizio mi è stato assegnato 2 mesi fa senza aver ancora introdotto le classi,ci sn solo 2 risposte,o dv farlo senza classi o il mio prof è pazzo!!
|
|
|
|
|
|
#30 |
|
Senior Member
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
|
Mi viene in mente che se si strutturasse l'albero in modo che ogni nodo conservi il numero di nodi contenuti nel sottoalbero in esso radicato e l'altezza del sottoalbero in questione, allora la soluzione sarebbe O(1).
Chiamato n il numero di nodi nell'albero ed h l'altezza dell'albero (quindi i campi di cui dicevo prima, letti dalla radice), allora basterà controllare che sia n = 2^h - 1. È il solito compromesso spazio/tempo. ciao
__________________
C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai! |
|
|
|
|
|
#31 |
|
Member
Iscritto dal: Aug 2008
Messaggi: 92
|
Codice:
bool compara_foglie(Pnodo rad){
if(rad==NULL)
return true;
else if(compara_foglie(rad->sx)&& compara_foglie(rad->dx)&& altezza(rad->sx,rad->dx))
return true;
else
return false;
}
bool altezza(Pnodo radsx,Pnodo raddx){
if(radsx && raddx){
int min=10000;
int max=0;
high(radsx,0,max,min);
high(raddx,0,max,min);
if(max-min==0)
return true;
else
return false;
}
else
return true;
}
void high(Pnodo rad,int livello,int& max,int& min){
if(rad!=NULL){
if(rad->sx==NULL && rad->dx==NULL){
if(livello>max)
max=livello;
if(livello<min)
min=livello;
}
high(rad->sx,livello+1,max,min);
high(rad->dx,livello+1,max,min);
}
}
questo è il codice che mi ha passato un mio amico e funziona!! |
|
|
|
|
|
#32 |
|
Senior Member
Iscritto dal: Oct 2006
Città: Roma
Messaggi: 1383
|
buon per te; ora puoi andare a studiarti le classi e tutto il resto del C++, cosi capisci anche come mai quel codice fa schifo.
|
|
|
|
|
|
#33 |
|
Senior Member
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
|
Non serve studiare il C++ per capirlo, lo si vede già così.
__________________
C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai! |
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 05:32.





















