Newsgroup: it.comp.java
Titolo: Principiante!

Ciao ragazzi!
Mi presento, sono una matricola di Ing. Informatica all'università di
PD...
Qualche tempo fa mi sembrava di aver visto un newsgroup italiano
riservato ai principianti di java, ma ora non lo trovo più, così rompo
le scatole a voi che invece mi sembrate già almeno avviati!:D
Beh, passiamo al sodo...
Non mi reffo bene con java... eheheh
Il prof di fondamenti ci ha dato da svolgere un esercizio sugli alberi
binari di ricerca...
Devo fare un metodo che conti i nodi dei livelli dispari di un
albero... però non riesco a farlo funzionare... mi da "Errore, return
not in statment (O na roba simile!:DDD)"
Certo è che ho vagliato tutte le possibilità di esecuzione del metodo,
ed in nessun caso, una volta applicato ad un oggetto potrebbe non
arrivare ad un return!
Ok, mi spiego come un cane ma vi passo il codice, così magari qualcuno
mi aiuta!:D
public class ARB
{
	private int value;
	private ARB left, right;
 
	public ARB()
	{
		this.value=0;
		this.left= null;
		this.right= null;
	}
 
	public ARB(int valore)
	{
		this.value=valore;
		this.left= null;
		this.right= null;
	}
 
	public ARB(int valore, ARB asinistra, ARB adestra)
	{
		this.value=valore;
		this.left=asinistra;
		this.right=adestra;
	} 
 
	public boolean presenza(int valore)
	{
		/* Qui creo una variabile "cursore" temp che mi serve
per muovermi nell'albero con
		tutta tranquillità (è una copia dell'albero originale)
perchè altrimenti non potrei
		riassegnare nuovi valore (come faccio dentro il ciclo
while nei primi due if)
		utilizzando l'oggetto su cui si sta applicando il
metodo.
		In sostanza non posso scrivere una cosa del tipo
this=this.left perchè java non lo
		consente */
 
		if (this == null)
		return false;
		ARB temp = new ARB();
		temp = this;
		boolean b;
		b = false;
		while (!b)
 
		{
			if (valore<temp.value && temp.left != null)
			temp = temp.left;
 
			if (valore > temp.value && temp.right != null)
			temp= temp.right;
 
			if (valore > temp.value && temp.right == null)
			return false;
 
			if (valore < temp.value && temp.left == null)
			return false;
 
			if (valore == temp.value)
			b= true;
		}
 
		return true;
	}
 
	public void inserisci(int valore)
	{
		boolean b;
		ARB cursore = new ARB();
		cursore = this;
 
		// Se l'albero è vuoto inserisco il valore...
 
		if (cursore == null)
		{
			ARB nuovo = new ARB(valore, null, null);
		}
 
		// Se il numero è già presente esco dal metodo
		if (this.presenza(valore))
		{
			System.out.println("Il valore da inserire è
già presente nell'albero");
			return;
		}
 
		// Analizzo uno ad uno i casi che mi possono capitare
 
		if (valore > this.value && this.right != null)
		this.right.inserisci(valore);
 
		if (valore < this.value && this.left != null)
		this.left.inserisci(valore);
 
		if (valore > this.value && this.right == null)
		{
			ARB nuovo = new ARB(valore, null, null);
			this.right = nuovo;
			return;
		}
 
		if (valore < this.value && this.left == null)
		{
			ARB nuovo = new ARB(valore, null, null);
			this.left = nuovo;
			return;
		}
	}
 
	public void stampa()
	{
		if (this.left != null)
		this.left.stampa();
 
		System.out.println(value);
 
		if (this.right != null)
		this.right.stampa();
	}
 
	public void stampapost()
	{
		if (this.right != null)
		this.right.stampapost();
 
		System.out.println(value);
 
		if (this.left != null)
		this.left.stampapost();
	}
 
	public int findmin()
	{
		boolean b;
		b= false;
		ARB cursore = new ARB();
		cursore = this;
		while (!b)
		{
			if (cursore.left != null)
			cursore = cursore.left;
 
			if (cursore.left == null)
			b=true;
 
		}
 
		return cursore.value;
	}
 
	public void printleaves()
	{
		if (this == null)
		{
			System.out.println("L'albero è vuoto");
			return;
		}
 
		ARB cursore = new ARB();
		cursore = this;
 
		if (cursore.right != null)
		cursore.right.printleaves();
 
		if (cursore.left != null)
		cursore.left.printleaves();
 
		if (cursore.right == null && cursore.left == null)
		System.out.println(value);
	}
 
 
	/*public int count(int livello)
	{
 
		if (this == null)
		return 0;
 
		if (livello % 2 == 1)
		{		
			if (this.left != null && this.right == null)
			return (1+this.left.count(livello +1));
 
			if (this.left == null && this.right != null)
			return (1+this.right.count(livello+1));
 
			if (this.left != null && this.right != null)
			return (1+this.right.count(livello+1) +
this.left.count(livello+1));
		}
 
		else
		{
			if (this.left != null && this.right == null)
			return (this.left.count(livello +1));
 
			if (this.left == null && this.right != null)
			return (this.right.count(livello+1));
 
			if (this.left != null && this.right != null)
			return (this.right.count(livello+1) +
this.left.count(livello+1));
		}
 
	}	*/
}
Quest'ultimo metodo (count) mi da l'errore che ho specificato sopra...
come è possibile?!
Se ritentete che questa domanda non sia adatta a questo gruppo
potreste segnalarmi un newsgroup per principianti?!:D
Ciao ciao e grazie in anticipo!:D

 come č possibile?!
Perchč il compilatore fa una analisi semantica e sintattica del codice che
scrivi ma mentre tu *sai* che livello % 2 o č uno o e 0, lui non lo sa e
non si sogna nemmeno di controllarr una cosa del genere. Quindi metti un
bel return 0, -1, quel che vuoi dove ti ho indicato e vedrai che,
nonostante il tuo programma non arriverą mai a fare *quel* return, il
compilatore sarą contento e soddisfatto.
Ciao,
 Stefano
----------
"X WindowSSS, teSSSoro mio... lo odieremo per SSSempre"
Bill Gollum
----------

 come č possibile?!
In primo luogo, in compilatore in genere non e' tenuto a calcolare a 
*compiletime* tutti i possibili valori di un'espressione che controlla un 
branching, tipo la tua if. Molti compilatori per altri linguaggi non 
eseguono proprio nessun calcolo; quello di Sun per java e' ragionevolmente 
furbo, ma non ci si puo' aspettare calcoli tutto. 
Secondo, nel tuo branching manca a prima vista il caso this.left=null && 
this.right=null, in entrambi i rami. 
-- 
Life's something u don't get out alive..
ObjectZone - 
http://space.tin.it/computer/csadun


Prima di tutto grazie mille per l'aiuto!:D
Praticamente io e il compilatore non ci capiamo... ehehehe (č un buon
punto di inizio mi sembra!:D)
In sostanza se metto un return 0 dove dici tu le cose non cambiano
(visto che il programma non arriva mai a quella riga) e tutto quindi
dovrebbe funzionare liscio giusto?!
Ora provo...
Ecco fatto... ora il programma funziona e mi stampa un risultato se
richiamo quel metodo... purtroppo non č corretto...
ora provo a smanettare un po' per vedere che cosa puņ essere!
Grazie mille ancora per l'aiuto... ritorno a debuggare!:D

this.right=null, in entrambi i rami. 
Grazie per aver risposto... cosa significa esattamente il termine
"Branching"?
Grazie!

 "Branching"?
Se non ricordo male dal mio TAMC :), "selezione". Una delle tre strutture 
di controllo procedurali: assegnamento, iterazione e selezione - un "if" 
realizza un branching, cioe' una selezione, del flusso di controllo.
