<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	>

<channel>
	<title>4ndr3@'s Codes</title>
	<atom:link href="http://www.andrea-asta.com/techworld/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.andrea-asta.com/techworld</link>
	<description>Solo un altro blog targato WordPress</description>
	<pubDate>Mon, 27 Oct 2008 14:49:31 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.6.2</generator>
	<language>en</language>
			<item>
		<title>Funzione di risposta armonica</title>
		<link>http://www.andrea-asta.com/techworld/2008/10/funzione-di-risposta-armonica-e-teorema-del-regime-permanente/</link>
		<comments>http://www.andrea-asta.com/techworld/2008/10/funzione-di-risposta-armonica-e-teorema-del-regime-permanente/#comments</comments>
		<pubDate>Mon, 27 Oct 2008 13:23:26 +0000</pubDate>
		<dc:creator>Andrea Asta</dc:creator>
		
		<category><![CDATA[Articoli]]></category>

		<category><![CDATA[Sistemi]]></category>

		<guid isPermaLink="false">http://www.andrea-asta.com/techworld/?p=81</guid>
		<description><![CDATA[Sia dato un sistema dinamico lineare stazionario e asintoticamente stabile, con la sua funzione di trasferimento amath G(s) endamath.
Supponiamo di forzare l&#8217;ingresso con un segnale sinusoidale a pulsazione specificata, del tipo
amath u(t) = X sin(omega t + phi) =&#62; U(s) = {s cos phi - omega sin phi}/{s^2 + omega^2} endamath
Dalla relazione tra funzione di [...]]]></description>
			<content:encoded><![CDATA[<p>Sia dato un sistema dinamico lineare stazionario e asintoticamente stabile, con la sua funzione di trasferimento amath G(s) endamath.</p>
<p>Supponiamo di forzare l&#8217;ingresso con un segnale sinusoidale a pulsazione specificata, del tipo</p>
<p style="text-align: center;">amath u(t) = X sin(omega t + phi) =&gt; U(s) = {s cos phi - omega sin phi}/{s^2 + omega^2} endamath</p>
<p style="text-align: left;">Dalla relazione tra funzione di trasferimento e ingresso, applicando lo <strong>sviluppo in fratti semplici</strong>, abbiamo che:</p>
<p style="text-align: center;">amath Y(s) = G(s) U(s) = (sum_{i=1}^n {k_i}/{s+p_i}) + {Q}/{s-j omega} + {bar(Q)}/{s + j omega} endamath</p>
<p style="text-align: left;">Possiamo dire, in parole semplici, che l&#8217;uscita è formata da due componenti:</p>
<ul>
<li>Componente amath Y_1(s) endamath, corrispondente ai modi del sistema, destinati a generare una risposta nulla a regime per ipotesi (sistema asintoticamente stabile).</li>
<li>Componente amath Y_2(s) endamath, corrispondente ai modi forzanti applicati al sistema.</li>
</ul>
<p>Determiniamo ora, sfruttando i <strong>teoremi sui residui</strong>, il valore di Q e del suo complesso coniugato.</p>
<p>amath Q = [(s - j omega) G(s) {s cos phi - omega sin phi}/{s^2 + omega^2} ]_{s = j omega} =</p>
<p>= X G(j omega) {j omega cos phi - omega sin phi}/{j omega + j omega}=</p>
<p>= X G(j omega) (1/2 cos phi - 1 / {2j} sin phi) = endamath</p>
<p>Applicando ora le <strong>relazioni di Eulero</strong> si ha</p>
<p>amath Q = X G(j omega) (1/2 {e^{j phi} + e^{-j phi}}/2 - 1 / {2j} {e^{j phi} - e^{-j phi}}/{2j}) =</p>
<p>= 1/4 X G(j omega) 2 e^{j phi} =</p>
<p>=1/2 X G(j omega) e^{j phi} endamath</p>
<p>La funzione amath G(j omega) è complessa di variabile complessa, pertanto rappresentabile nella sua <strong>forma esponenziale</strong>:</p>
<p style="text-align: center;">amath = G(j omega) = |G(j omega)| e^{j /_G(j omega)} endamath</p>
<p style="text-align: left;">Utilizzando questa notazione, riscriviamo il valore di Q.</p>
<p style="text-align: left;">amath Q = 1/2 X |G(j omega)| e^{j /_(G(j omega))}  e^{j phi} =</p>
<p style="text-align: left;">= 1/2 X |G(j omega)| e^{j (phi + /_G(j omega))} endamath</p>
<p style="text-align: left;">Il numero Q è quindi complesso, caratterizzato da:</p>
<ul>
<li>Modulo: amath 1/2 X |G(j omega)| endamath</li>
<li>Fase: amath phi + /_G(j omega) endamath</li>
</ul>
<p style="text-align: left;">A questo punto è immediato, antitrasformando l&#8217;espressione dell&#8217;uscita, ricavare</p>
<p style="text-align: left;">amath y_2(t) = 2 |Q| cos (omega t + /_Q) =</p>
<p style="text-align: left;">= 2 1/2 X |G(j omega)| cos (omega t + phi + /_G(j omega)) =</p>
<p style="text-align: left;">= Y(omega) cos (omega t + phi(omega)) endamath</p>
<p style="text-align: left;">Come si nota, quindi, sull&#8217;uscita si presenta un segnale temporale di tipo periodico, che non si estingue nel tempo come le componenti asintoticamente stabili già descritte in precedenza. Il sistema continuerà quindi a presentare, sull&#8217;uscita, un segnale periodico di frequenza amath 1/omega endamath. Essendo tutti gli altri contribuiti destinati ad esaurirsi nel tempo (per l&#8217;ipotesi di asintotica stabilità), possiamo affermare che, terminato il transitorio, l&#8217;andamento a regime del sistema sarà proprio di tipo sinusoidale.</p>
<p style="text-align: left;">Questo importante risultato permette di formulare immediatamente il <strong>teorema del regime permanente</strong>:</p>
<p style="text-align: left; padding-left: 30px;">Un sistema dinamico lineare, tempo invariante ed asintoticamente stabile, soggetto ad un&#8217;eccitazione sinusoidale, presenta, a regime, un&#8217;uscita sinusoidale di frequenza uguale a quella del segnale d&#8217;ingresso.</p>
<p style="text-align: left;">Vogliamo ora definire una funzione complessa, di variabile reale, che contenga al suo interno informazioni relative a quanto il segnale di ingresso viene amplificato/attenuato e di quanto sfasato. Risulta quindi intuitiva la definizione della seguente funzione di risposta armonica:</p>
<p style="text-align: center;">amath F(omega) = {Y(omega)}/X e^{j (phi(omega) - phi} endamath</p>
<p style="text-align: left;">In cui:</p>
<ul>
<li>amath X endamath rappresenta il modulo del segnale in ingresso</li>
<li>amath phi endamath rappresenta la fase del segnale di ingresso</li>
<li>amath Y(omega) endamath e amath phi(omega) endamath rappresentano le funzioni sovra definite e dipendono, in generale, sia dalle caratteristiche del sistema che da quelle della forzante</li>
</ul>
<p>Sviluppando i calcoli, si ottiene l&#8217;importante relazione tra funzione di trasferimento e funzione di risposta armonica.</p>
<p>amath F(omega) = {Y(omega)}/X e^{j (phi(omega) - phi} =</p>
<p>= {X |G(j omega)|}/X e^ {j (phi + /_G(j omega) - phi} =</p>
<p>= |G(j omega)| e^{j /_G(j omega)} =</p>
<p>= G(j omega) endamath</p>
<p>L&#8217;importante conclusione è dunque la seguente:</p>
<p style="padding-left: 30px;">Sussiste una relazione di equivalenza tra funzione di trasferimento e funzione di risposta armonica. In particolare, si ha che amath F (omega) = G(j omega) endamath.</p>
<p>La seguente relazione è molto importante, poiché permette di analizzare le prestazioni di un sistema partendo da un&#8217;analisi sperimentale. Infatti la funzione di risposta armonica, per come è stata definita, si presta molto bene ad una determinazione sperimentale, come descritto di seguito.</p>
<p>Si supponga di avere un sistema (dinamico, lineare, stazionario, asintoticamente stabile) e di forzarlo con un segnale sinusoidale ad ampiezza e fase fissati e frequenza variabile. Terminato il transitorio, come detto, l&#8217;uscita avrà andamento sinusoidale con la stessa frequenza del segnale di ingresso. Misurando quindi ampiezza e fase dell&#8217;uscita, e registrandone i valori opportunamente modificati (l&#8217;ampiezza deve essere divisa per quella del segnale di ingresso ed alla fase deve essere sottratta quella del segnale d&#8217;ingresso), sarà possibile tracciare un diagramma approssimato sia del modulo che della fase della funzione di risposta armonica. Mediante tecniche di interpolazione, poi, sarà possibile determinarne l&#8217;espressione analitica e, attraverso diverse tecniche, anche l&#8217;espressione della corrispondente funzione di trasferimento.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.andrea-asta.com/techworld/2008/10/funzione-di-risposta-armonica-e-teorema-del-regime-permanente/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Proprietà bloccante degli zeri</title>
		<link>http://www.andrea-asta.com/techworld/2008/10/proprieta-bloccante-degli-zeri/</link>
		<comments>http://www.andrea-asta.com/techworld/2008/10/proprieta-bloccante-degli-zeri/#comments</comments>
		<pubDate>Mon, 27 Oct 2008 12:30:26 +0000</pubDate>
		<dc:creator>Andrea Asta</dc:creator>
		
		<category><![CDATA[Articoli]]></category>

		<category><![CDATA[Sistemi]]></category>

		<guid isPermaLink="false">http://www.andrea-asta.com/techworld/?p=70</guid>
		<description><![CDATA[Sia dato un sistema dinamico lineare tempo invariante, dotato di funzione di trasferimento G(s). Trascuriamo per ipotesi il caso di presenza di stato iniziale diverso da zero, riferendoci quindi sempre a situazioni del tipo
amath Y(s) = G(s) * U(s) endamath
Dove

Y(s) rappresenta l&#8217;uscita
G(s) rappresenza la funzione di trasferimento
U(s) rappresenza l&#8217;ingresso

La trattazione farà inoltre riferimento a sistemi [...]]]></description>
			<content:encoded><![CDATA[<p>Sia dato un <strong>sistema dinamico lineare tempo invariante</strong>, dotato di funzione di trasferimento <em>G(s)</em>. Trascuriamo per ipotesi il caso di presenza di stato iniziale diverso da zero, riferendoci quindi sempre a situazioni del tipo</p>
<p style="text-align: center;">amath Y(s) = G(s) * U(s) endamath</p>
<p>Dove</p>
<ul>
<li>Y(s) rappresenta l&#8217;uscita</li>
<li>G(s) rappresenza la funzione di trasferimento</li>
<li>U(s) rappresenza l&#8217;ingresso</li>
</ul>
<p>La trattazione farà inoltre riferimento a sistemi di tipo <em>SISO </em>(Single - Input, Single - Output), ma è naturale ed immediato estenderla a sistemi <em>MIMO</em>.</p>
<p>Altro requisito importante per lo studio di questa proprietà è l&#8217;<strong>asintotica stabilità</strong> esterna del sistema, che viene tradotta, normalmente, nella condizione che i poli della funzione di trasferimento siano tutti a parte reale negativa.</p>
<p style="padding-left: 30px;">La proprietà bloccante degli zeri afferma che modi forzanti coincidenti con zeri della funzione di trasferimento non hanno effetti sull&#8217;andamento asintotico del sistema.</p>
<p>Per chiarire meglio, si supponga di avere un sistema caratterizzato da:</p>
<p style="text-align: center;">amath G(s) = {s^2+omega_i^2}/{s+2} endamath</p>
<p>e che si ponga al suo ingresso un segnale sinusoidale elementare, del tipo</p>
<p style="text-align: center;">amath u(t) = sin(omega_u t) =&gt; U(s) = {omega_u^2}/{s^2 + omega_u^2} endamath</p>
<p>Distinguiamo allora due casi:</p>
<ul>
<li>amath w_i != w_u endamath</li>
<li>amath w_i = w_u endamath</li>
</ul>
<p>Il secondo caso è di particolare interesse, poiché avviene una semplificazione tra il denominatore della forzante e il numeratore della funzione di trasferimento:</p>
<p style="text-align: center;">amath Y(s) = G(s)*U(s) = {s^2+omega^2}/{s+2} * {omega^2}/{s^2 + omega^2} = {omega^2}/{s+2} endamath</p>
<p>E&#8217; facile calcolare quindi l&#8217;uscita nel dominio temporale:</p>
<p style="text-align: center;">amath y(t) = L^{-1}[Y(s)] = L^{-1}[{omega^2}/{s+2}] = omega^2 e^(-2t) endamath</p>
<p>L&#8217;uscita, a regime, sarà quindi nulla. Come si vede, quindi, la presenza di una forzante su un sistema di per sé asintoticamente stabile non porta ad alcuna modifica dello stesso. La forzante non ha effetti a regime.</p>
<p>Ancora più interessante è il caso di analisi della proprietà bloccante degli zeri nel <strong>dominio delle frequenze</strong>. In questo caso, la coppia di zeri complessi coniugati genera una risposta in ampiezza con un picco di amath -oo d B endamath in corrispondenza della pulsazione amath omega endamath.</p>
<div id="attachment_73" class="wp-caption aligncenter" style="width: 510px"><a href="http://www.andrea-asta.com/techworld/wp-content/uploads/2008/10/bode.jpg"><img class="size-full wp-image-73" title="bode" src="http://www.andrea-asta.com/techworld/wp-content/uploads/2008/10/bode.jpg" alt="Bode" width="500" height="375" /></a><p class="wp-caption-text">Bode</p></div>
<p>Questa proprietà ha un&#8217;interessante conseguenza: l&#8217;utilizzo, come forzante, di un&#8217;armonica a pulsazione amath omega endamath genera un&#8217;uscita a pulsazione nulla (<strong>attenuazione totale</strong>). Infatti, si ha che</p>
<p style="text-align: center;">amath|G(j omega)| = -oo d B =&gt; 20 log |G(j omega)| = -oo =&gt; |G(j omega)| = 0 endamath</p>
<p style="text-align: left;">Pertanto, rappresentando il modulo della funzione di trasferimento il fattore di amplificazione o attenuazione dell&#8217;uscita, abbiamo un&#8217;armonica nulla in corrispondenza di tale pulsazione.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.andrea-asta.com/techworld/2008/10/proprieta-bloccante-degli-zeri/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Orologio digitale in ASM x86</title>
		<link>http://www.andrea-asta.com/techworld/2008/10/orologio-digitale-in-asm-x86/</link>
		<comments>http://www.andrea-asta.com/techworld/2008/10/orologio-digitale-in-asm-x86/#comments</comments>
		<pubDate>Sun, 26 Oct 2008 18:16:12 +0000</pubDate>
		<dc:creator>Andrea Asta</dc:creator>
		
		<category><![CDATA[ASM x86]]></category>

		<category><![CDATA[Progetti]]></category>

		<guid isPermaLink="false">http://www.andrea-asta.com/techworld/?p=56</guid>
		<description><![CDATA[Il nostro intento è creare un programma ed implementarlo in linguaggio Assembly 8086, che stampi a schermo un orologio digitale. Inizialmente il valore sarà sincronizzato con l&#8217;orologio di sistema, in seguito la modifica avverrà attraverso la gestione del TIC.

Analisi Hardware
Il TIC
Il TIC, il temporizzatore di sistema, è un dispositivo diviso in 4 canali. Ogni canale [...]]]></description>
			<content:encoded><![CDATA[<p>Il nostro intento è creare un programma ed implementarlo in linguaggio Assembly 8086, che stampi a schermo un orologio digitale. Inizialmente il valore sarà sincronizzato con l&#8217;orologio di sistema, in seguito la modifica avverrà attraverso la gestione del TIC.</p>
<p><span id="more-56"></span></p>
<h2>Analisi Hardware</h2>
<h3>Il TIC</h3>
<p>Il TIC, il temporizzatore di sistema, è un dispositivo diviso in 4 canali. Ogni canale è composto da un contatore a 16 bit che si decrementa con una frequenza</p>
<p>f = 1.19318 MHz</p>
<p>Ogni volta che il contatore raggiunge il valore zero, viene generato un interrupt hardware sul piedino INTR del microprocessore (interrupt mascherabile), dopodichè il conteggio riparte.<br />
Il costruttore assicura che il TIC genera un interrupt di priorità massima rispetto a tutti gli altri.<br />
Utilizzando il valore della frequenza fornita dal costruttore, si ricava che, se il contatore parte dal valore massimo (FFFFh), esso si azzera ogni</p>
<p>amath N = 18.2 {v o l t e}/{s e c o n d o} endamath</p>
<p>Il TIC ha compiti molto importanti all&#8217;interno del sistema microprocessore: tra le attività che svolge, c&#8217;è quella fondamentale di eseguire il refresh della RAM dinamica.<br />
Uno dei canali del TIC è reso disponibile per il programmatore: ogni volta che il rispettivo contatore si azzera, si genera un interrupt hardware al vettore 8.<br />
Tuttavia, la funzione corrispondente è importante per il sistema operativo, quindi non possiamo semplicemente sovrascriverla cambiando il valore del vettore 8. Per nostra fortuna questa situazione era stata prevista dai costruttori, che hanno fatto in modo che, alla fine della routine puntata dal vettore 8, sia generato un secondo interrupt al vettore 1Ch. E questo interrupt è generato apposta per il programmatore, quindi possiamo tranquillamente far eseguire una nostra routine.</p>
<h2>Analisi Software</h2>
<h3>Programmazione della tabella dei vettori</h3>
<p>La tabella dei vettori non è scrivibile direttamente dal programmatore, ma solo attraverso l&#8217;utilizzo di apposite routine fornite dal sistema operativo sotto forma di servizi interrupt software.<br />
In particolare, il DOS (int 21h) fornisce il servizio 25h:</p>
<ul>
<li>Servizio 25H, set interrupt vector (in AL=interrupt number, DS:DX=new vector)</li>
</ul>
<p>In pratica, le azioni da eseguire per settare una nuova routine nella tabella dei vettori sono</p>
<pre>Blocco Interrupt
AL &lt;- Numero del vettore
DS &lt;- Code Segment
DX &lt;- Indirizzo della routine
Riattivazione interrupt
!!! Ripristino del DS !!!</pre>
<p>Va notato che, per ricavare l&#8217;indirizzo della routine, è sufficiente riferirsi ad essa con la sua label, il nome che le abbiamo assegnato: infatti la label non è altro che un modo per definire un&#8217;etichetta mnemonica al posto di un indirizzo: le label nell&#8217;area codice definiscono un indirizzo della zona codice (quindi con segmento CS), pertanto il nome di una routine corrisponde al punto di entrata della stessa.<br />
Va precisato che la manipolazione della tabella degli interrupt deve avvenire sotto protezione dalla rilevazione di interrupt, per evitare problemi causati dalla modifica parziale dei registri o dall&#8217;aggiornamento della tabella stessa.</p>
<h3>Gestione del tempo con il TIC</h3>
<p>Abbiamo detto che il TIC genera un interrupt hardware al vettore 8 (e, conseguentemente, all&#8217;1Ch) 18.2 volte al secondo. Quindi la nostra routine viene eseguita appunto questo numero di volte ogni secondo. Se vogliamo rilevare il passaggio di un secondo, dobbiamo eseguire ciò che vogliamo solo ogni 18 chiamate alla routine.<br />
Ma manca una questione: ogni 5 secondi è necessario aspettare un&#8217;esecuzione in più (19 in tutto) in modo da &#8220;pareggiare&#8221; gli scompensi che si sono creati eseguendo il codice ogni 18 volte (invece che ogni 18.2).<br />
Infatti abbiamo che</p>
<p>amath 18.2 * 5 = 91 = 4*18 + 19 endamath</p>
<p>Va precisato subito che, all&#8217;entrata della routine di servizio, il data segment è sporco (viene sporcato dalla routine puntata dal vettore 8), quindi deve essere ripristinato con un&#8217;opportuna istruzione. In realtà sarà sufficiente spostare nel registro DS il valore @data, che contiene automaticamente il valore iniziale del DS impostato all&#8217;avvio del programma.</p>
<pre>DS &lt;- @data</pre>
<h3>Stampa dell&#8217;orologio</h3>
<p>Possiamo immaginare l&#8217;orologio come tre contatori (secondi, minuti, ore) che si incrementano automaticamente ogni secondo (il passaggio del tempo si può rilevare con il TIC). Se la nostra routine lavora con dei dati già presenti in memoria (e quindi i contatori sono visti come delle label che puntano a dei byte), sarà quindi sufficiente inizializzare quest&#8217;area al valore dell&#8217;orario attuale per ottenere l&#8217;orologio.</p>
<p>Notare che la stampa deve avvenire comunque attraverso simboli ASCII, quindi abbiamo due strade da percorrere:</p>
<ol>
<li>Lavoriamo direttamente con contatori in formato ASCII</li>
<li>Lavoriamo con contatori numerici ma prima della stampa convertiamo il tutto in ASCII</li>
</ol>
<p>La via che ho scelto, perché mi sembrava la più comoda, è quella di gestire i contatori in formato ASCII. In pratica, necessitiamo di 6 byte:</p>
<ol>
<li>Decine delle ore (&#8217;0&#8242;…&#8217;2&#8242;)</li>
<li>Unità delle ore (&#8217;0&#8242;…&#8217;9&#8242;)</li>
<li>Decine dei minuti (&#8217;0&#8242;…&#8217;5&#8242;)</li>
<li>Unità dei minuti (&#8217;0&#8242;…&#8217;9&#8242;)</li>
<li>Decide dei secondi (&#8217;0&#8242;…&#8217;5&#8242;)</li>
<li>Unità dei secondi (&#8217;0&#8242;…&#8217;9&#8242;)</li>
</ol>
<p>La nostra routine di servizio dovrà quindi aggiornare le unità dei secondi e, se necessario, aggiornare in cascata tutti gli altri contatori coinvolti (sarà sufficiente controllare il superamento del valore massimo).</p>
<pre>Rilevo se è passato un secondo
		Aggiorno il contatore unità secondi
			Se è arrivato a '9' + 1
				Aggiorno le decine dei secondi
					Se... e così via fino alle unità delle ore
		Eseguo la stampa</pre>
<p>Discorso a parte meritano le ore, perché, oltre a gestire il riporto unità – decine, è necessario prevedere un controllo quando l&#8217;orario arriva a 24: in questo caso, infatti, tutto il dispositivo deve essere azzerato.</p>
<pre>Se l'orario è 24
			ore &lt;- '0'
			ore+1 &lt;- '0'</pre>
<p>In realtà è sufficiente azzerare la parte delle ore, perché le altre parti, per come è strutturato il nostro algoritmo, sono già state azzerate in cascata prima di poter arrivare alla modifica dei contatori dell&#8217;ora.</p>
<p>Va notato che le routine di gestione degli interrupt non sono mai generiche: anche nel nostro caso esse si basano su dati presenti in memoria a particolari label, quindi non saranno adattabili ad altri casi.</p>
<p>L&#8217;ultima cosa da fare è sistemare le locazioni di memoria utilizzate per la routine di servizio: per farlo è necessario rilevare l&#8217;orario di sistema. Ho scelto di utilizzare l&#8217;interrupt software 1Ah che permette di avere l&#8217;orario in formato BCD compattato, facilmente scomponibile in ASCII con una routine di mascheratura.</p>
<ul>
<li>Servizio 2, Read real time clock (returns in BCD : CH=hours, CL=minutes, DH= seconds)</li>
</ul>
<p>Una volta sistemata l&#8217;ora di partenza, andrà solamente sistemata la tabella degli interrupt e il nostro problema è risolto.<br />
Una precisazione: se non si esegue una prima stampa nel main, l&#8217;orario verrà stampato per la prima volta quando la routine di gestione viene effettivamente eseguita completamente, ossia dopo il primo secondo di esecuzione. Per ovviare il problema, come detto, è sufficiente stampare l&#8217;orario anche all&#8217;inizio del programma.</p>
<pre>Rileva l'ora di sistema
	Stampa l'ora di sistema
	Imposta la routine di gestione degli Interrupt
	Rimani in esecuzione indeterminatamente</pre>
<p>Il programma rimane in loop infinito, in modo che l&#8217;ora sia stampata continuamente finché l&#8217;utente non interrompe l&#8217;esecuzione manualmente.</p>
<h3>Jump lontani</h3>
<p>Per come sono interpretate le istruzioni di jump condizionale, esse non permettono un salto di oltre 256 byte. Se ciò dovesse essere necessario, come nel mio caso, si ricorre ad un piccolo trucchetto, che consiste nel far saltare il programma ad un punto &#8220;morto&#8221;, ossia dove l&#8217;esecuzione normalmente non arriverebbe, e porre in quel punto un JMP secco alla label che ci interessava.</p>
<p>Va notato che i punti morti del nostro programma sono essenzialmente dopo tutte le istruzioni JMP non condizionali: infatti, arrivati a quel punto, l&#8217;esecuzione si sposterà in un&#8217;altra zona, impedendo l&#8217;esecuzione della successiva istruzione.</p>
<h3>Struttura del programma</h3>
<p><strong>Programma principale</strong></p>
<ol>
<li>Inizializza le variabili necessarie per il programma</li>
<li>Rileva l&#8217;ora di sistema</li>
<li>Effettua la prima stampa</li>
<li>Imposta la tabella degli interrupt</li>
</ol>
<p><strong>Routine &#8220;orol&#8221;</strong></p>
<ol>
<li>Ripristina il data segment</li>
<li>Routine associata all&#8217;interrupt generato dal TIC</li>
<li>Rileva il passaggio di un secondo</li>
<li>Aggiorna tutti i rispettivi contatori</li>
<li>Stampa l&#8217;orario</li>
<li>Richiede le locazioni di memoria
<ul>
<li>conta: inizializzato a 18, indica il numero di chiamate a vuoto prima che sia passato un secondo</li>
<li>pareggio: inizializzato a 5, indica ogni quanti secondi deve essere eseguita una chiamata a vuoto per pareggiare il tempo</li>
<li>Locazioni di memoria per ore, minuti e secondi (2 byte ognuna); N.B. Il byte a indirizzo basso di ogni coppia indica le decine. Inoltre la struttura che devono avere questi byte è quella della stampa, quindi ORE, separatore, MINUTI, separatore, SECONDI, carattre $ come terminatore della sequenza</li>
</ul>
</li>
<li>Sistema i contatori per la rilevazione successiva</li>
</ol>
<p><strong>Routine &#8220;stampaora&#8221;</strong></p>
<ol>
<li>La routine riceve in ingresso una coppia di byte che indica la posizione in cui stampare e la stringa dell&#8217;orario (formato ore, separatore, minuti, separatore, secondi, separatore, carattere $ come terminatore della convenzione DOS). La stringa termina con $ perché per la stampa si utilizza l&#8217;interrupt 21h del DOS.</li>
<li>La routine si posiziona sullo schermo e stampa la stringa</li>
</ol>
<p><strong>Routine &#8220;scompatta&#8221;</strong></p>
<ol>
<li>La routine riceve in ingresso un dato BCD compattato a 8 bit e lo scompatta nelle sue due componenti (decine e unità), depositando i risultati in due byte puntati dal registro SI ([SI] e [SI+1])</li>
</ol>
<h3>Costanti di servizio</h3>
<p><strong>Costante &#8220;separa&#8221;</strong><br />
E&#8217; un byte ASCII che indica il carattere da stampare per separare ore, minuti e secondi: generalmente è &#8216;:&#8217;<br />
<strong><br />
Costanti &#8220;maschera_alta&#8221; e &#8220;maschera_bassa&#8221;</strong><br />
Sono le due maschere utilizzate dalla routine scompatta per prelevare la parte alta e la parte bassa del numero BCD compattato.<br />
<strong><br />
Costante &#8220;posizione_stampa&#8221;</strong><br />
Indica la posizione utilizzata dall&#8217;interrupt 10h del video in cui posizionare il cursore per la stampa. E&#8217; formata da due byte: il primo indica la riga, il secondo la colonna</p>
<p><strong>Costanti &#8220;num_pareggio&#8221; e &#8220;tic_secondo&#8221;</strong><br />
Costanti utilizzate per la gestione del TIC. La prima indica ogni quanti secondi deve essere eseguita una chiamata &#8220;a vuoto&#8221; della routine di gestione dell&#8217;interrupt per pareggiare il tempo. La seconda indica quante chiamate della routine devono essere effettuate prima che sia passato un secondo effettivo.</p>
<h3>Codice</h3>

<div class="wp_syntax"><div class="code"><pre class="asm asm" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">;------------------------------------------------------------------------------</span>
<span style="color: #666666; font-style: italic;">; STUDENTE:		Andrea Asta</span>
<span style="color: #666666; font-style: italic;">; PROGRAMMA:		orologio.asm</span>
<span style="color: #666666; font-style: italic;">; DESCRIZIONE:	Stampa un orologio digitale sfruttando gli interrupt del TIC</span>
<span style="color: #666666; font-style: italic;">;------------------------------------------------------------------------------</span>
&nbsp;
<span style="color: #666666; font-style: italic;">; Segmentazione del DOS</span>
	<span style="color: #000000; font-weight: bold;">DOSSEG</span>
<span style="color: #666666; font-style: italic;">; Modello di memoria</span>
	<span style="color: #000000; font-weight: bold;">.MODEL</span>	small
<span style="color: #666666; font-style: italic;">; Memoria per lo stack</span>
	<span style="color: #000000; font-weight: bold;">.STACK</span>	<span style="color: #0000ff;">100h</span>
&nbsp;
<span style="color: #666666; font-style: italic;">;------------------------------------------------------------------------------</span>
<span style="color: #666666; font-style: italic;">; Data segment</span>
<span style="color: #666666; font-style: italic;">;------------------------------------------------------------------------------</span>
	<span style="color: #000000; font-weight: bold;">.DATA</span>
&nbsp;
<span style="color: #666666; font-style: italic;">; Cose di servizio</span>
separa	         	EQU	<span style="color: #7f007f;">':'</span>
maschera_alta	   	EQU	<span style="color: #0000ff;">11110000b</span>
maschera_bassa	   	EQU	<span style="color: #0000ff;">00001111b</span>
posizione_stampa	EQU	<span style="color: #0000ff;">0520h</span>
&nbsp;
<span style="color: #666666; font-style: italic;">; Propri dati</span>
ore	  	<span style="color: #000000; font-weight: bold;">db</span>	? <span style="color: #339933;">,</span> ?
	     	<span style="color: #000000; font-weight: bold;">db</span> 	separa
minuti  	<span style="color: #000000; font-weight: bold;">db</span>    ? <span style="color: #339933;">,</span> ?
	     	<span style="color: #000000; font-weight: bold;">db</span> 	separa
secondi 	<span style="color: #000000; font-weight: bold;">db</span>    ? <span style="color: #339933;">,</span> ?
	     	<span style="color: #000000; font-weight: bold;">db</span>    <span style="color: #7f007f;">'$'</span>
&nbsp;
<span style="color: #666666; font-style: italic;">; Richieste per il funzionamento del tic</span>
num_pareggio EQU    <span style="color: #0000ff;">5</span>
tic_secondo <span style="color: #000000; font-weight: bold;"> EQU</span>    <span style="color: #0000ff;">18</span>
conta        <span style="color: #000000; font-weight: bold;">db</span>     ?
pareggio     <span style="color: #000000; font-weight: bold;">db</span>     ?
&nbsp;
<span style="color: #666666; font-style: italic;">;------------------------------------------------------------------------------</span>
<span style="color: #666666; font-style: italic;">; Code Segment</span>
<span style="color: #666666; font-style: italic;">;------------------------------------------------------------------------------</span>
	<span style="color: #000000; font-weight: bold;">.CODE</span>
&nbsp;
stampaora	<span style="color: #000000; font-weight: bold;">PROC</span>
      	<span style="color: #666666; font-style: italic;">; Stampa la stringa HH-MM-SS</span>
	<span style="color: #666666; font-style: italic;">; DX -&amp;gt; Posizione di stampa</span>
	<span style="color: #666666; font-style: italic;">; DS:SI -&amp;gt; Stringa completa HH-MM-SS</span>
&nbsp;
	<span style="color: #00007f; font-weight: bold;">PUSHF</span>
	<span style="color: #00007f; font-weight: bold;">PUSH</span>	<span style="color: #00007f;">AX</span> <span style="color: #00007f;">BX</span> <span style="color: #00007f;">DX</span>
&nbsp;
	<span style="color: #666666; font-style: italic;">; Riposiziono il cursore</span>
     	<span style="color: #00007f; font-weight: bold;">MOV</span>     <span style="color: #00007f;">BH</span> <span style="color: #339933;">,</span> <span style="color: #0000ff;">0</span>
     	<span style="color: #00007f; font-weight: bold;">MOV</span>     <span style="color: #00007f;">AH</span> <span style="color: #339933;">,</span> <span style="color: #0000ff;">2</span>
     	<span style="color: #00007f; font-weight: bold;">INT</span>     <span style="color: #0000ff;">10h</span>
&nbsp;
      	<span style="color: #666666; font-style: italic;">; Stampo la stringa</span>
	<span style="color: #00007f; font-weight: bold;">MOV</span>	<span style="color: #00007f;">DX</span> <span style="color: #339933;">,</span> <span style="color: #00007f;">SI</span>
	<span style="color: #00007f; font-weight: bold;">MOV</span>	<span style="color: #00007f;">AH</span> <span style="color: #339933;">,</span> <span style="color: #0000ff;">9</span>
	<span style="color: #00007f; font-weight: bold;">INT</span>	<span style="color: #0000ff;">21h</span>
&nbsp;
	<span style="color: #00007f; font-weight: bold;">POP</span>     <span style="color: #00007f;">DX</span> <span style="color: #00007f;">BX</span> <span style="color: #00007f;">AX</span>
	<span style="color: #00007f; font-weight: bold;">POPF</span>
	<span style="color: #00007f; font-weight: bold;">RET</span>
	<span style="color: #000000; font-weight: bold;">ENDP</span>
&nbsp;
scompatta	<span style="color: #000000; font-weight: bold;">PROC</span>
&nbsp;
	<span style="color: #00007f; font-weight: bold;">PUSHF</span>
	<span style="color: #00007f; font-weight: bold;">PUSH</span>	<span style="color: #00007f;">AX</span>
&nbsp;
<span style="color: #666666; font-style: italic;">; Riceve in ingresso un dato 8 bit (AL) BCD compattato</span>
<span style="color: #666666; font-style: italic;">; e un puntatore ad una zona di memoria di 2 byte (SI)</span>
<span style="color: #666666; font-style: italic;">; Mette in SI &amp;lt;- decine e in SI + 1 &amp;lt;- Unità</span>
&nbsp;
      	<span style="color: #666666; font-style: italic;">; Prelievo le decine</span>
	<span style="color: #00007f; font-weight: bold;">MOV</span>	<span style="color: #00007f;">AH</span> <span style="color: #339933;">,</span> <span style="color: #00007f;">AL</span>
	<span style="color: #00007f; font-weight: bold;">AND</span>	<span style="color: #00007f;">AH</span> <span style="color: #339933;">,</span> maschera_alta
	<span style="color: #00007f; font-weight: bold;">SHR</span>	<span style="color: #00007f;">AH</span> <span style="color: #339933;">,</span> <span style="color: #0000ff;">4</span>
	<span style="color: #00007f; font-weight: bold;">ADD</span>	<span style="color: #00007f;">AH</span> <span style="color: #339933;">,</span> <span style="color: #7f007f;">'0'</span>
	<span style="color: #00007f; font-weight: bold;">MOV</span>	<span style="color: #000000; font-weight: bold;">BYTE</span> <span style="color: #000000; font-weight: bold;">PTR</span> <span style="color: #009900; font-weight: bold;">&#91;</span><span style="color: #00007f;">SI</span><span style="color: #009900; font-weight: bold;">&#93;</span> <span style="color: #339933;">,</span> <span style="color: #00007f;">AH</span>
&nbsp;
 	<span style="color: #666666; font-style: italic;">; Prelievo le unità</span>
	<span style="color: #00007f; font-weight: bold;">MOV</span>	<span style="color: #00007f;">AH</span> <span style="color: #339933;">,</span> <span style="color: #00007f;">AL</span>
	<span style="color: #00007f; font-weight: bold;">AND</span>	<span style="color: #00007f;">AH</span> <span style="color: #339933;">,</span> maschera_bassa
	<span style="color: #00007f; font-weight: bold;">ADD</span>	<span style="color: #00007f;">AH</span> <span style="color: #339933;">,</span> <span style="color: #7f007f;">'0'</span>
	<span style="color: #00007f; font-weight: bold;">MOV</span>	<span style="color: #000000; font-weight: bold;">BYTE</span> <span style="color: #000000; font-weight: bold;">PTR</span> <span style="color: #009900; font-weight: bold;">&#91;</span><span style="color: #00007f;">SI</span><span style="color: #339933;">+</span><span style="color: #0000ff;">1</span><span style="color: #009900; font-weight: bold;">&#93;</span> <span style="color: #339933;">,</span> <span style="color: #00007f;">AH</span>
&nbsp;
	<span style="color: #00007f; font-weight: bold;">POP</span>	<span style="color: #00007f;">AX</span>
	<span style="color: #00007f; font-weight: bold;">POPF</span>
	<span style="color: #00007f; font-weight: bold;">RET</span>
	<span style="color: #000000; font-weight: bold;">ENDP</span>
&nbsp;
orol   	<span style="color: #000000; font-weight: bold;">PROC</span>
       	<span style="color: #00007f; font-weight: bold;">PUSH</span>    <span style="color: #00007f;">AX</span> <span style="color: #00007f;">DX</span> <span style="color: #00007f;">DS</span> <span style="color: #00007f;">ES</span> <span style="color: #00007f;">SI</span> <span style="color: #00007f;">BX</span>
&nbsp;
        <span style="color: #666666; font-style: italic;">; Ripristino DS</span>
        <span style="color: #00007f; font-weight: bold;">MOV</span>     <span style="color: #00007f;">AX</span> <span style="color: #339933;">,</span> @<span style="color: #000000; font-weight: bold;">data</span>
        <span style="color: #00007f; font-weight: bold;">MOV</span>     <span style="color: #00007f;">DS</span> <span style="color: #339933;">,</span> <span style="color: #00007f;">AX</span>
&nbsp;
        <span style="color: #666666; font-style: italic;">; E' passato un secondo?</span>
        <span style="color: #00007f; font-weight: bold;">CMP</span>     <span style="color: #009900; font-weight: bold;">&#91;</span>conta<span style="color: #009900; font-weight: bold;">&#93;</span> <span style="color: #339933;">,</span> <span style="color: #0000ff;">0</span>
        <span style="color: #00007f; font-weight: bold;">JNZ</span>     lamp_supp
&nbsp;
        <span style="color: #666666; font-style: italic;">; E' stato anche effettuato l'eventuale &quot;pareggio&quot;?</span>
        <span style="color: #00007f; font-weight: bold;">CMP</span>     <span style="color: #009900; font-weight: bold;">&#91;</span>pareggio<span style="color: #009900; font-weight: bold;">&#93;</span>   <span style="color: #339933;">,</span>  <span style="color: #0000ff;">0</span>
        <span style="color: #00007f; font-weight: bold;">JZ</span>      lamp_supp2
&nbsp;
             <span style="color: #666666; font-style: italic;">; E' passato il mio secondo effettivo</span>
             <span style="color: #666666; font-style: italic;">;--------------------------------------------</span>
             <span style="color: #666666; font-style: italic;">; Scrivi ciò che vuoi fare nella routine</span>
&nbsp;
             <span style="color: #666666; font-style: italic;">; Incremento i secondi (le unità)</span>
             <span style="color: #00007f; font-weight: bold;">INC</span>      <span style="color: #000000; font-weight: bold;">BYTE</span> <span style="color: #000000; font-weight: bold;">PTR</span> <span style="color: #009900; font-weight: bold;">&#91;</span>secondi<span style="color: #339933;">+</span><span style="color: #0000ff;">1</span><span style="color: #009900; font-weight: bold;">&#93;</span>
             <span style="color: #00007f; font-weight: bold;">CMP</span>      <span style="color: #000000; font-weight: bold;">BYTE</span> <span style="color: #000000; font-weight: bold;">PTR</span> <span style="color: #009900; font-weight: bold;">&#91;</span>secondi<span style="color: #339933;">+</span><span style="color: #0000ff;">1</span><span style="color: #009900; font-weight: bold;">&#93;</span> <span style="color: #339933;">,</span> <span style="color: #7f007f;">'9'</span> <span style="color: #339933;">+</span> <span style="color: #0000ff;">1</span>
             <span style="color: #00007f; font-weight: bold;">JNZ</span>      lamp_x5
             <span style="color: #00007f; font-weight: bold;">MOV</span>      <span style="color: #000000; font-weight: bold;">BYTE</span> <span style="color: #000000; font-weight: bold;">PTR</span> <span style="color: #009900; font-weight: bold;">&#91;</span>secondi<span style="color: #339933;">+</span><span style="color: #0000ff;">1</span><span style="color: #009900; font-weight: bold;">&#93;</span> <span style="color: #339933;">,</span> <span style="color: #7f007f;">'0'</span>
&nbsp;
             <span style="color: #666666; font-style: italic;">; E in cascata eventualmente tutto il resto!</span>
             <span style="color: #00007f; font-weight: bold;">INC</span>      <span style="color: #000000; font-weight: bold;">BYTE</span> <span style="color: #000000; font-weight: bold;">PTR</span> <span style="color: #009900; font-weight: bold;">&#91;</span>secondi<span style="color: #009900; font-weight: bold;">&#93;</span>
             <span style="color: #00007f; font-weight: bold;">CMP</span>      <span style="color: #000000; font-weight: bold;">BYTE</span> <span style="color: #000000; font-weight: bold;">PTR</span> <span style="color: #009900; font-weight: bold;">&#91;</span>secondi<span style="color: #009900; font-weight: bold;">&#93;</span> <span style="color: #339933;">,</span> <span style="color: #7f007f;">'5'</span> <span style="color: #339933;">+</span> <span style="color: #0000ff;">1</span>
             <span style="color: #00007f; font-weight: bold;">JNZ</span>      lamp_x5
             <span style="color: #00007f; font-weight: bold;">MOV</span>      <span style="color: #000000; font-weight: bold;">BYTE</span> <span style="color: #000000; font-weight: bold;">PTR</span> <span style="color: #009900; font-weight: bold;">&#91;</span>secondi<span style="color: #009900; font-weight: bold;">&#93;</span> <span style="color: #339933;">,</span> <span style="color: #7f007f;">'0'</span>
&nbsp;
             <span style="color: #00007f; font-weight: bold;">INC</span>      <span style="color: #000000; font-weight: bold;">BYTE</span> <span style="color: #000000; font-weight: bold;">PTR</span> <span style="color: #009900; font-weight: bold;">&#91;</span>minuti<span style="color: #339933;">+</span><span style="color: #0000ff;">1</span><span style="color: #009900; font-weight: bold;">&#93;</span>
             <span style="color: #00007f; font-weight: bold;">CMP</span>      <span style="color: #000000; font-weight: bold;">BYTE</span> <span style="color: #000000; font-weight: bold;">PTR</span> <span style="color: #009900; font-weight: bold;">&#91;</span>minuti<span style="color: #339933;">+</span><span style="color: #0000ff;">1</span><span style="color: #009900; font-weight: bold;">&#93;</span> <span style="color: #339933;">,</span> <span style="color: #7f007f;">'9'</span> <span style="color: #339933;">+</span> <span style="color: #0000ff;">1</span>
             <span style="color: #00007f; font-weight: bold;">JNZ</span>      lamp_x5
             <span style="color: #00007f; font-weight: bold;">MOV</span>      <span style="color: #000000; font-weight: bold;">BYTE</span> <span style="color: #000000; font-weight: bold;">PTR</span> <span style="color: #009900; font-weight: bold;">&#91;</span>minuti<span style="color: #339933;">+</span><span style="color: #0000ff;">1</span><span style="color: #009900; font-weight: bold;">&#93;</span> <span style="color: #339933;">,</span> <span style="color: #7f007f;">'0'</span>
&nbsp;
             <span style="color: #00007f; font-weight: bold;">INC</span>      <span style="color: #000000; font-weight: bold;">BYTE</span> <span style="color: #000000; font-weight: bold;">PTR</span> <span style="color: #009900; font-weight: bold;">&#91;</span>minuti<span style="color: #009900; font-weight: bold;">&#93;</span>
             <span style="color: #00007f; font-weight: bold;">CMP</span>      <span style="color: #000000; font-weight: bold;">BYTE</span> <span style="color: #000000; font-weight: bold;">PTR</span> <span style="color: #009900; font-weight: bold;">&#91;</span>minuti<span style="color: #009900; font-weight: bold;">&#93;</span> <span style="color: #339933;">,</span> <span style="color: #7f007f;">'5'</span> <span style="color: #339933;">+</span> <span style="color: #0000ff;">1</span>
             <span style="color: #00007f; font-weight: bold;">JNZ</span>      lamp_x5
             <span style="color: #00007f; font-weight: bold;">MOV</span>      <span style="color: #000000; font-weight: bold;">BYTE</span> <span style="color: #000000; font-weight: bold;">PTR</span> <span style="color: #009900; font-weight: bold;">&#91;</span>minuti<span style="color: #009900; font-weight: bold;">&#93;</span> <span style="color: #339933;">,</span> <span style="color: #7f007f;">'0'</span>
&nbsp;
             <span style="color: #00007f; font-weight: bold;">INC</span>      <span style="color: #000000; font-weight: bold;">BYTE</span> <span style="color: #000000; font-weight: bold;">PTR</span> <span style="color: #009900; font-weight: bold;">&#91;</span>ore<span style="color: #339933;">+</span><span style="color: #0000ff;">1</span><span style="color: #009900; font-weight: bold;">&#93;</span>
             <span style="color: #00007f; font-weight: bold;">CMP</span>      <span style="color: #000000; font-weight: bold;">BYTE</span> <span style="color: #000000; font-weight: bold;">PTR</span> <span style="color: #009900; font-weight: bold;">&#91;</span>ore<span style="color: #339933;">+</span><span style="color: #0000ff;">1</span><span style="color: #009900; font-weight: bold;">&#93;</span> <span style="color: #339933;">,</span> <span style="color: #7f007f;">'9'</span> <span style="color: #339933;">+</span> <span style="color: #0000ff;">1</span>
             <span style="color: #00007f; font-weight: bold;">JNZ</span>      lamp_x5check
             <span style="color: #00007f; font-weight: bold;">MOV</span>      <span style="color: #000000; font-weight: bold;">BYTE</span> <span style="color: #000000; font-weight: bold;">PTR</span> <span style="color: #009900; font-weight: bold;">&#91;</span>ore<span style="color: #339933;">+</span><span style="color: #0000ff;">1</span><span style="color: #009900; font-weight: bold;">&#93;</span> <span style="color: #339933;">,</span> <span style="color: #7f007f;">'0'</span>
&nbsp;
             <span style="color: #00007f; font-weight: bold;">INC</span>      <span style="color: #000000; font-weight: bold;">BYTE</span> <span style="color: #000000; font-weight: bold;">PTR</span> <span style="color: #009900; font-weight: bold;">&#91;</span>ore<span style="color: #009900; font-weight: bold;">&#93;</span>
             <span style="color: #00007f; font-weight: bold;">JMP</span>      lamp_x5
&nbsp;
             <span style="color: #666666; font-style: italic;">; Label di supporto per i far JMP</span>
lamp_supp<span style="color: #339933;">:</span>   <span style="color: #00007f; font-weight: bold;">JMP</span>      lamp_x6
lamp_supp2<span style="color: #339933;">:</span>  <span style="color: #00007f; font-weight: bold;">JMP</span>      lamp_x3
&nbsp;
lamp_x5check<span style="color: #339933;">:</span><span style="color: #666666; font-style: italic;">; Devo controllare che non siano le 24!</span>
             <span style="color: #00007f; font-weight: bold;">CMP</span>      <span style="color: #000000; font-weight: bold;">BYTE</span> <span style="color: #000000; font-weight: bold;">PTR</span> <span style="color: #009900; font-weight: bold;">&#91;</span>ore<span style="color: #339933;">+</span><span style="color: #0000ff;">1</span><span style="color: #009900; font-weight: bold;">&#93;</span><span style="color: #339933;">,</span> <span style="color: #7f007f;">'4'</span>
             <span style="color: #00007f; font-weight: bold;">JNZ</span>      lamp_x5
             <span style="color: #00007f; font-weight: bold;">CMP</span>      <span style="color: #000000; font-weight: bold;">BYTE</span> <span style="color: #000000; font-weight: bold;">PTR</span> <span style="color: #009900; font-weight: bold;">&#91;</span>ore<span style="color: #009900; font-weight: bold;">&#93;</span><span style="color: #339933;">,</span> <span style="color: #7f007f;">'2'</span>
             <span style="color: #00007f; font-weight: bold;">JNZ</span>      lamp_x5
             <span style="color: #00007f; font-weight: bold;">MOV</span>      <span style="color: #009900; font-weight: bold;">&#91;</span>ore<span style="color: #009900; font-weight: bold;">&#93;</span> <span style="color: #339933;">,</span> <span style="color: #7f007f;">'0'</span>
             <span style="color: #00007f; font-weight: bold;">MOV</span>      <span style="color: #009900; font-weight: bold;">&#91;</span>ore<span style="color: #339933;">+</span><span style="color: #0000ff;">1</span><span style="color: #009900; font-weight: bold;">&#93;</span> <span style="color: #339933;">,</span> <span style="color: #7f007f;">'0'</span>
&nbsp;
lamp_x5<span style="color: #339933;">:</span>     	<span style="color: #666666; font-style: italic;">; Stampa</span>
		<span style="color: #00007f; font-weight: bold;">MOV</span>	    <span style="color: #00007f;">DX</span> <span style="color: #339933;">,</span> posizione_stampa
		<span style="color: #00007f; font-weight: bold;">LEA</span>	    <span style="color: #00007f;">SI</span> <span style="color: #339933;">,</span> ore
 	       	<span style="color: #00007f; font-weight: bold;">CALL</span>	    stampaora
&nbsp;
	<span style="color: #666666; font-style: italic;">;--------------------------------------------</span>
&nbsp;
             <span style="color: #666666; font-style: italic;">; Aggiorno i vari contatori del tempo</span>
             <span style="color: #00007f; font-weight: bold;">MOV</span>     <span style="color: #009900; font-weight: bold;">&#91;</span>conta<span style="color: #009900; font-weight: bold;">&#93;</span> <span style="color: #339933;">,</span> tic_secondo
             <span style="color: #00007f; font-weight: bold;">DEC</span>     <span style="color: #009900; font-weight: bold;">&#91;</span>pareggio<span style="color: #009900; font-weight: bold;">&#93;</span>
             <span style="color: #00007f; font-weight: bold;">JMP</span>     lamp_x2
&nbsp;
lamp_x6<span style="color: #339933;">:</span>     <span style="color: #00007f; font-weight: bold;">JMP</span>     lamp_x2
&nbsp;
lamp_x3<span style="color: #339933;">:</span>     <span style="color: #00007f; font-weight: bold;">MOV</span>     <span style="color: #009900; font-weight: bold;">&#91;</span>pareggio<span style="color: #009900; font-weight: bold;">&#93;</span>   <span style="color: #339933;">,</span>  num_pareggio
             <span style="color: #00007f; font-weight: bold;">JMP</span>     lamp_x4
&nbsp;
lamp_x2<span style="color: #339933;">:</span>     <span style="color: #00007f; font-weight: bold;">DEC</span>     <span style="color: #009900; font-weight: bold;">&#91;</span>conta<span style="color: #009900; font-weight: bold;">&#93;</span>
&nbsp;
lamp_x4<span style="color: #339933;">:</span>     <span style="color: #00007f; font-weight: bold;">POP</span>     <span style="color: #00007f;">BX</span> <span style="color: #00007f;">SI</span> <span style="color: #00007f;">ES</span> <span style="color: #00007f;">DS</span> <span style="color: #00007f;">DX</span> <span style="color: #00007f;">AX</span>
             <span style="color: #00007f; font-weight: bold;">IRET</span>
             <span style="color: #000000; font-weight: bold;">ENDP</span>
&nbsp;
<span style="color: #666666; font-style: italic;">; Inizio del programma</span>
Begin<span style="color: #339933;">:</span>       StartupCode
&nbsp;
      		<span style="color: #00007f; font-weight: bold;">MOV</span>     <span style="color: #009900; font-weight: bold;">&#91;</span>conta<span style="color: #009900; font-weight: bold;">&#93;</span> <span style="color: #339933;">,</span> tic_secondo
      		<span style="color: #00007f; font-weight: bold;">MOV</span>     <span style="color: #009900; font-weight: bold;">&#91;</span>pareggio<span style="color: #009900; font-weight: bold;">&#93;</span> <span style="color: #339933;">,</span> num_pareggio
&nbsp;
		<span style="color: #666666; font-style: italic;">; Prelevo l'orario</span>
		<span style="color: #00007f; font-weight: bold;">MOV</span>	<span style="color: #00007f;">AH</span> <span style="color: #339933;">,</span> <span style="color: #0000ff;">2</span>
		<span style="color: #00007f; font-weight: bold;">INT</span>	<span style="color: #0000ff;">1Ah</span>
&nbsp;
		<span style="color: #666666; font-style: italic;">; Scompatto i dati</span>
		<span style="color: #00007f; font-weight: bold;">MOV</span>	<span style="color: #00007f;">AL</span> <span style="color: #339933;">,</span> <span style="color: #00007f;">CH</span>
		<span style="color: #00007f; font-weight: bold;">LEA</span>	<span style="color: #00007f;">SI</span> <span style="color: #339933;">,</span> ore
		<span style="color: #00007f; font-weight: bold;">CALL</span>	scompatta
&nbsp;
		<span style="color: #00007f; font-weight: bold;">MOV</span>	<span style="color: #00007f;">AL</span> <span style="color: #339933;">,</span> <span style="color: #00007f;">CL</span>
		<span style="color: #00007f; font-weight: bold;">LEA</span>	<span style="color: #00007f;">SI</span> <span style="color: #339933;">,</span> minuti
		<span style="color: #00007f; font-weight: bold;">CALL</span>	scompatta
&nbsp;
		<span style="color: #00007f; font-weight: bold;">MOV</span>	<span style="color: #00007f;">AL</span> <span style="color: #339933;">,</span> <span style="color: #00007f;">DH</span>
		<span style="color: #00007f; font-weight: bold;">LEA</span>	<span style="color: #00007f;">SI</span> <span style="color: #339933;">,</span> secondi
		<span style="color: #00007f; font-weight: bold;">CALL</span>	scompatta
&nbsp;
		<span style="color: #666666; font-style: italic;">; Prima stampa</span>
		<span style="color: #00007f; font-weight: bold;">MOV</span>	<span style="color: #00007f;">DX</span> <span style="color: #339933;">,</span> posizione_stampa
		<span style="color: #00007f; font-weight: bold;">LEA</span>	<span style="color: #00007f;">SI</span> <span style="color: #339933;">,</span> ore
		<span style="color: #00007f; font-weight: bold;">CALL</span>	stampaora
&nbsp;
       <span style="color: #666666; font-style: italic;">; Aggiorno la tabella degli interrupt, ma prima mi proteggo da altri INT</span>
       <span style="color: #00007f; font-weight: bold;">CLI</span>
&nbsp;
       <span style="color: #666666; font-style: italic;">; Salvo DS</span>
       <span style="color: #00007f; font-weight: bold;">PUSH</span>    <span style="color: #00007f;">DS</span>
&nbsp;
       <span style="color: #666666; font-style: italic;">; Sistemo i valori da impostare nella tabella</span>
       <span style="color: #00007f; font-weight: bold;">MOV</span>     <span style="color: #00007f;">AX</span> <span style="color: #339933;">,</span> <span style="color: #00007f;">CS</span>
       <span style="color: #00007f; font-weight: bold;">MOV</span>     <span style="color: #00007f;">DS</span> <span style="color: #339933;">,</span> <span style="color: #00007f;">AX</span>
       <span style="color: #00007f; font-weight: bold;">LEA</span>     <span style="color: #00007f;">DX</span> <span style="color: #339933;">,</span> orol
&nbsp;
       <span style="color: #666666; font-style: italic;">; Imposto la tabella con la mia routine (orol)</span>
       <span style="color: #00007f; font-weight: bold;">MOV</span>     <span style="color: #00007f;">AH</span> <span style="color: #339933;">,</span> <span style="color: #0000ff;">25h</span>
       <span style="color: #00007f; font-weight: bold;">MOV</span>     <span style="color: #00007f;">AL</span> <span style="color: #339933;">,</span> <span style="color: #0000ff;">1Ch</span>
       <span style="color: #00007f; font-weight: bold;">INT</span>     <span style="color: #0000ff;">21h</span>
&nbsp;
       <span style="color: #666666; font-style: italic;">; E ora ripristino tutto e tolgo la protezione</span>
       <span style="color: #00007f; font-weight: bold;">POP</span>     <span style="color: #00007f;">DS</span>
       <span style="color: #00007f; font-weight: bold;">STI</span>
&nbsp;
       <span style="color: #666666; font-style: italic;">; Rimango in attesa</span>
       <span style="color: #00007f; font-weight: bold;">JMP</span>     $
&nbsp;
       <span style="color: #000000; font-weight: bold;">END</span>		Begin</pre></div></div>

]]></content:encoded>
			<wfw:commentRss>http://www.andrea-asta.com/techworld/2008/10/orologio-digitale-in-asm-x86/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Progetto #01: Somma di 2 byte</title>
		<link>http://www.andrea-asta.com/techworld/2008/10/progetto-01-somma-di-2-byte/</link>
		<comments>http://www.andrea-asta.com/techworld/2008/10/progetto-01-somma-di-2-byte/#comments</comments>
		<pubDate>Sun, 26 Oct 2008 12:59:54 +0000</pubDate>
		<dc:creator>Andrea Asta</dc:creator>
		
		<category><![CDATA[ASM x86 per progetti]]></category>

		<category><![CDATA[Manuali]]></category>

		<guid isPermaLink="false">http://www.andrea-asta.com/techworld/?p=48</guid>
		<description><![CDATA[Testo del problema
Dati due byte residenti in memoria, depositare in una terza locazione la loro somma.
Analisi del problema
Per sommare due byte non abbiamo alcun tipo di problema dal punto di vista hardware: essendo il processore 8086 dotato di un circuito interno per la somma aritmetica, possiamo tranquillamente utilizzare le rispettive istruzioni per eseguire la somma.
L’unico [...]]]></description>
			<content:encoded><![CDATA[<h2>Testo del problema</h2>
<p>Dati due byte residenti in memoria, depositare in una terza locazione la loro somma.</p>
<h2>Analisi del problema</h2>
<p>Per sommare due byte non abbiamo alcun tipo di problema dal punto di vista hardware: essendo il processore 8086 dotato di un circuito interno per la somma aritmetica, possiamo tranquillamente utilizzare le rispettive istruzioni per eseguire la somma.<br />
L’unico problema a cui dobbiamo prestare sufficiente attenzione è quello relativo all’eventuale overflow: eseguendo la somma tra due byte, infatti, è possibile che questo risultato non sia contenibile in un byte, ma sia invece necessaria una word. In realtà, trattandosi di due soli byte, basterebbero 1 byte più un eventuale bit per il riporto finale, ma ragionando dal punto di vista software, l’elemento di definizione dato minimo dopo il byte è la word (2 byte).</p>
<p><span id="more-48"></span></p>
<h2>Registri utilizzati</h2>
<h3>Registri a 8 bit</h3>
<ul>
<li>AH: Parte alta della somma</li>
<li>AL: Primo addendo, Parte bassa della somma</li>
</ul>
<h2>Codice del programma</h2>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
</pre></td><td class="code"><pre class="asm asm" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">;--------------------------------------</span>
<span style="color: #666666; font-style: italic;">; Direttive all'assemblatore</span>
<span style="color: #666666; font-style: italic;">;--------------------------------------</span>
   <span style="color: #000000; font-weight: bold;">DOSSEG</span>               <span style="color: #666666; font-style: italic;">; Segmentazione DOS</span>
   <span style="color: #000000; font-weight: bold;">.MODEL</span> small         <span style="color: #666666; font-style: italic;">; Modello di memoria</span>
   <span style="color: #000000; font-weight: bold;">.STACK</span> <span style="color: #0000ff;">100h</span>          <span style="color: #666666; font-style: italic;">; Dimensione dello stack</span>
&nbsp;
<span style="color: #666666; font-style: italic;">;--------------------------------------</span>
<span style="color: #666666; font-style: italic;">; Data Segment</span>
<span style="color: #666666; font-style: italic;">;--------------------------------------</span>
 	<span style="color: #000000; font-weight: bold;">.DATA</span>
X   <span style="color: #000000; font-weight: bold;">db</span>    <span style="color: #0000ff;">30</span>            <span style="color: #666666; font-style: italic;">; Primo addendo</span>
Y   <span style="color: #000000; font-weight: bold;">db</span>    <span style="color: #0000ff;">50</span>            <span style="color: #666666; font-style: italic;">; Secondo addendo</span>
S   <span style="color: #000000; font-weight: bold;">dw</span>    ?             <span style="color: #666666; font-style: italic;">; Somma</span>
&nbsp;
<span style="color: #666666; font-style: italic;">;--------------------------------------</span>
<span style="color: #666666; font-style: italic;">; Code segment</span>
<span style="color: #666666; font-style: italic;">;--------------------------------------</span>
	<span style="color: #000000; font-weight: bold;">.CODE</span>
&nbsp;
<span style="color: #666666; font-style: italic;">;;;;;;;;;;;;;;;;;;;;;;;;;;;;;</span>
<span style="color: #666666; font-style: italic;">; Programma principale</span>
<span style="color: #666666; font-style: italic;">;;;;;;;;;;;;;;;;;;;;;;;;;;;;;</span>
Begin<span style="color: #339933;">:</span> StartupCode      <span style="color: #666666; font-style: italic;">; Inizio del programma</span>
&nbsp;
<span style="color: #666666; font-style: italic;">; Inizializzazione variabili</span>
  <span style="color: #00007f; font-weight: bold;">MOV</span>   <span style="color: #00007f;">AL</span> <span style="color: #339933;">,</span> <span style="color: #009900; font-weight: bold;">&#91;</span>X<span style="color: #009900; font-weight: bold;">&#93;</span>        <span style="color: #666666; font-style: italic;">; Prelevo il primo addendo</span>
  <span style="color: #00007f; font-weight: bold;">MOV</span>   <span style="color: #00007f;">AH</span> <span style="color: #339933;">,</span> <span style="color: #0000ff;">0</span>          <span style="color: #666666; font-style: italic;">; Azzero il registro per il Carry</span>
&nbsp;
<span style="color: #666666; font-style: italic;">; Algoritmo</span>
  <span style="color: #00007f; font-weight: bold;">ADD</span>   <span style="color: #00007f;">AL</span> <span style="color: #339933;">,</span> <span style="color: #009900; font-weight: bold;">&#91;</span>Y<span style="color: #009900; font-weight: bold;">&#93;</span>        <span style="color: #666666; font-style: italic;">; Aggiungo il secondo...</span>
  <span style="color: #00007f; font-weight: bold;">ADC</span>   <span style="color: #00007f;">AH</span> <span style="color: #339933;">,</span> <span style="color: #0000ff;">0</span>          <span style="color: #666666; font-style: italic;">; ...e l'eventuale Carry</span>
&nbsp;
<span style="color: #666666; font-style: italic;">; Salvataggio risultati</span>
  <span style="color: #00007f; font-weight: bold;">MOV</span>   <span style="color: #009900; font-weight: bold;">&#91;</span>S<span style="color: #009900; font-weight: bold;">&#93;</span> <span style="color: #339933;">,</span> <span style="color: #00007f;">AX</span>        <span style="color: #666666; font-style: italic;">; Salvo la somma</span>
&nbsp;
<span style="color: #666666; font-style: italic;">; Operazioni finali</span>
	ExitCode <span style="color: #0000ff;">0</span>             <span style="color: #666666; font-style: italic;">; Esecuzione corretta del programma</span>
	<span style="color: #000000; font-weight: bold;">END</span> Begin              <span style="color: #666666; font-style: italic;">; Fine del programma</span></pre></td></tr></table></div>

<h2>Prove effettuate</h2>
<h3>Prova #01</h3>
<p>Prova con dati generici pseudo - casuali.</p>
<p><b>Valori in input</b></p>
<ul>
<li>X -> 30</li>
<li>Y -> 50</li>
</ul>
<p><b>Valori attesi in output</b></p>
<ul>
<li>S -> 50h (80)</li>
</ul>
<p><b>Valori in input</b></p>
<ul>
<li>S -> 50h (80)</li>
</ul>
<h3>Prova #02</h3>
<p>Prova al limite inferiore.</p>
<p><b>Valori in input</b></p>
<ul>
<li>X -> 0</li>
<li>Y -> 0</li>
</ul>
<p><b>Valori attesi in output</b></p>
<ul>
<li>S -> 0</li>
</ul>
<p><b>Valori in input</b></p>
<ul>
<li>S -> 0</li>
</ul>
<h3>Prova #03</h3>
<p>Prova con dati generici pseudo - casuali.</p>
<p><b>Valori in input</b></p>
<ul>
<li>X -> FFh</li>
<li>Y -> FFh</li>
</ul>
<p><b>Valori attesi in output</b></p>
<ul>
<li>S -> 01FEh</li>
</ul>
<p><b>Valori in input</b></p>
<ul>
<li>S -> 01FEh</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.andrea-asta.com/techworld/2008/10/progetto-01-somma-di-2-byte/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Alberi binari - parte 1</title>
		<link>http://www.andrea-asta.com/techworld/2008/10/alberi-binari-parte-1/</link>
		<comments>http://www.andrea-asta.com/techworld/2008/10/alberi-binari-parte-1/#comments</comments>
		<pubDate>Sat, 25 Oct 2008 12:54:25 +0000</pubDate>
		<dc:creator>Andrea Asta</dc:creator>
		
		<category><![CDATA[Articoli]]></category>

		<category><![CDATA[Strutture dati]]></category>

		<guid isPermaLink="false">http://www.andrea-asta.com/techworld/?p=19</guid>
		<description><![CDATA[Una delle strutture fondamentali di tutta la programmazione è l&#8217;albero. Esiste un particolare tipo di albero, detto binario, che per le sue particolari proprietà si presta molto bene ad alcuni tipi di operazioni, quali l&#8217;analisi di espressioni matematiche o la ricerca dicotomica.
Particolari tipi di alberi binari sono utilizzati come nuovi tipi di strutture dati, particolarmente [...]]]></description>
			<content:encoded><![CDATA[<p>Una delle strutture fondamentali di tutta la programmazione è l&#8217;albero. Esiste un particolare tipo di albero, detto binario, che per le sue particolari proprietà si presta molto bene ad alcuni tipi di operazioni, quali l&#8217;analisi di espressioni matematiche o la ricerca dicotomica.<br />
Particolari tipi di alberi binari sono utilizzati come nuovi tipi di strutture dati, particolarmente ottimizzati per operazioni di ricerca o ordinamento: è il caso degli heap, degli alberi di ricerca e così via.<br />
In questo fascicolo analizzeremo tutti gli algoritmi basilari per la gestione di un albero binario, partendo dalle definizioni e ragionando su ogni algoritmo.<br />
Il linguaggio scelto per la stesura dei programmi è il C++, anche se in realtà saranno utilizzati concetti del tutto compatibili con il C. E&#8217; da sottolineare, tuttavia, che il codice è compilabile in ANSI C++, per la compilazione in C saranno necessarie alcune modifiche. Quindi quando vedete scritto [C/C++] non significa che il codice è compilabile in C, ma solo che la sintassi utilizzata non prevede elementi proprietari del C++, quali classi, template, reference e così via.<br />
Naturalmente questo fascicolo è dedicato esclusivamente alla parte relativa all&#8217;albero binario come struttura dati, quindi tutti i discorsi relativi alla sintassi del linguaggio adottato sono dati per scontati. In particolare, è bene avere buona padronanza delle strutture, dei puntatori e delle funzioni ricorsive, anche se quest&#8217;ultimo punto è presente una piccola digressione.<br />
Non c&#8217;è altro da dire: buona lettura e buona programmazione.</p>
<p><span id="more-19"></span></p>
<h2>Teoria degli alberi binari</h2>
<h3>Definizioni</h3>
<p>Si definisce albero binario un insieme, eventualmente vuoto, di <strong>nodi </strong>connessi da archi detti <strong>rami</strong>. Un particolare nodo è detto <strong>radice </strong>e ogni nodo è tale da essere collegato a due sottoinsiemi distinti e disgiunti, anch&#8217;essi alberi binari (<strong>sottoalbero </strong>sinistro e destro).</p>
<div id="attachment_20" class="wp-caption aligncenter" style="width: 303px"><a href="http://www.andrea-asta.com/techworld/wp-content/uploads/2008/10/ab1.png"><img class="size-full wp-image-20" title="ab1" src="http://www.andrea-asta.com/techworld/wp-content/uploads/2008/10/ab1.png" alt="Albero binario" width="293" height="253" /></a><p class="wp-caption-text">Albero binario</p></div>
<p>Nell&#8217;albero mostrato in Figura 1, la radice è il nodo A, da cui si diramano altri due sottoalberi binari.</p>
<h3>Terminologia</h3>
<p>Un nodo si dice <strong>foglia </strong>se non ha figli. I nodi che non sono foglie sono detti <strong>nodi interni</strong>. Nell&#8217;esempio precedente, sono foglie i nodi F, I, M e N.</p>
<p>Dati due nodi i e j, si definisce <strong>cammino </strong>o percorso da i a j la sequenza di rami da percorrere per passare da i a j.</p>
<p style="padding-left: 30px;"><span style="text-decoration: underline;"><strong>PROPRIETA&#8217;</strong></span><br />
In un albero, esiste sempre un cammino che collega una arbitraria coppia di nodi.</p>
<p>Si definisce <strong>profondità </strong>o livello di un nodo <em>i</em>, la sua distanza dalla radice, ossia il numero di archi da percorrere (ovviamente, nel caso migliore) per raggiungere i partendo dalla radice. Per convenzione la radice ha profondità 0.</p>
<p>Si definisce <strong>altezza </strong>o profondità di un albero binario l&#8217;altezza massima delle sue foglie. Nell&#8217;esempio precedente, l&#8217;albero ha altezza 5.</p>
<p>E&#8217; possibile stabilire dei legami di <strong>parentela </strong>tra i nodi, del tutto simili a quelli della vita reale: la radice è il padre o genitore dei due nodi a lui connessi, che quindi saranno suoi figli. I figli di uno stesso genitore sono fratelli. Allo stesso modo si possono stabilire i legami di parentela nonno, zio ecc…</p>
<p style="padding-left: 30px;"><span style="text-decoration: underline;"><strong>PROPRIETA&#8217;</strong></span><br />
Ogni nodo di un albero ha un solo genitore e, nel caso degli alberi binari, al massimo due figli.</p>
<p>Un albero binario si dice <strong>pieno </strong>se sono soddisfatte contemporaneamente queste condizioni:</p>
<ol>
<li>Tutte le foglie hanno lo stesso livello</li>
<li>Tutti i nodi interni hanno esattamente 2 figli</li>
</ol>
<p>Un albero binario pieno, formato da n nodi, ha profondità uguale a</p>
<p style="text-align: center;">amath L = |__ log_{2} n __| endamath</p>
<p style="text-align: left;">Notare che con le parentesi quadrate inferiormente si intende l&#8217;approssimazione per difetto (le parentesi quadrate superiormente intendono invece l&#8217;approssimazione per eccesso).</p>
<p style="text-align: left;">Un albero binario pieno, di altezza h, ha un numero di nodi pari esattamente a</p>
<p style="text-align: center;">amath n = 2 ^ {h+1} - 1 endamath</p>
<p style="text-align: left;">Un albero binario è <strong>bilanciato </strong>quando tutte le foglie hanno lo stesso livello, con un margine di errore di 1. Quindi, se l&#8217;altezza dell&#8217;albero è h, tutte le foglie dovranno avere livello h o al più h-1.<br />
Un albero binario bilanciato in cui tutte le foglie hanno livello h si dice <strong>perfettamente bilanciato</strong>.</p>
<p style="text-align: left;">L&#8217;<strong>attraversamento </strong>di un albero consiste nell&#8217;elencarne tutti i nodi una e una sola volta.</p>
<h3 style="text-align: left;">Attraversamenti</h3>
<p>Per gli alberi binari sono definiti tre metodi di attraversamento, che illustreremo uno ad uno:</p>
<ol>
<li>Ordine anticipato (<strong>preorder</strong>)</li>
<li>Ordine posticipato (<strong>postorder</strong>)</li>
<li>Ordine simmetrico (<strong>inorder</strong>)</li>
</ol>
<p><span style="text-decoration: underline;">Ordine anticipato</span><br />
Se l&#8217;albero binario non è vuoto:</p>
<ol>
<li>Visito la radice</li>
<li>Attraverso il sottoalbero sinistro in ordine anticipato</li>
<li>Attraverso il sottoalbero destro in ordine anticipato</li>
</ol>
<p><span style="text-decoration: underline;">Ordine posticipato</span><br />
Se l&#8217;albero binario non è vuoto:</p>
<ol>
<li>Attraverso il sottoalbero sinistro in ordine posticipato</li>
<li>Attraverso il sottoalbero destro in ordine posticipato</li>
<li>Visito la radice</li>
</ol>
<p><span style="text-decoration: underline;">Ordine simmetrico</span></p>
<ol>
<li>Attraverso il sottoalbero sinistro in ordine simmetrico</li>
<li>Visito la radice</li>
<li>Attraverso il sottoalbero destro in ordine posticipato</li>
</ol>
<p>Va notato che le tre visite differiscono solo nel fatto che viene alterato l&#8217;ordine di visita dei sottoalberi e della radice.<br />
Riferendosi all&#8217;albero di <em>Figura 1</em>, ecco come risultano le visite.</p>
<ul>
<li>ANTICIPATA:  ABDFCEGIHLMN</li>
<li>POSTICIPATA: FDBIGMNLHECA</li>
<li>SIMMETRICA:  DFBACIGEMLNH</li>
</ul>
<h3>Alberi binari di ricerca</h3>
<p>Un albero binario di ricerca (ABR, oppure BST dall&#8217;inglese <strong>Binary Search Tree</strong>) è un albero binario in cui tutti gli elementi del sottoalbero sinistro sono minori della radice, tutti gli elementi del sottoalbero destro sono maggiori della radice e  con l&#8217;ulteriore vincolo per cui anche i due sottoalberi sono alberi binari di ricerca a loro volta. Non sono ammessi elementi duplicati.</p>
<div id="attachment_26" class="wp-caption aligncenter" style="width: 316px"><a href="http://www.andrea-asta.com/techworld/wp-content/uploads/2008/10/abr.png"><img class="size-full wp-image-26" title="abr" src="http://www.andrea-asta.com/techworld/wp-content/uploads/2008/10/abr.png" alt="Albero binario di ricerca" width="306" height="208" /></a><p class="wp-caption-text">Albero binario di ricerca</p></div>
<p>In modo intuitivo si può capire come una struttura dati del genere sia particolarmente indicata per inserimenti ordinati e per la ricerca di tipo dicotomico (che viene anche detta binaria).<br />
Una particolare proprietà dei BST è che la visita simmetrica fornisce gli elementi esattamente in ordine crescente.</p>
<ul>
<li>SIMMETRICA:  5 6 7 8 9 10 11 15 18 20</li>
</ul>
<h2>Implementazione di un albero binario</h2>
<h3>Struttura di un albero binario</h3>
<p>La prima cosa che dobbiamo affrontare è la scrittura del codice che ci permetterà di definire ogni nodo di un albero binario. E&#8217; chiaro che ogni struttura avrà almeno un campo di tipo informativo, più due puntatori ad altri nodi, che sono il figlio sinistro ed il figlio destro. Come convenzione stabiliamo che, se un nodo non ha uno o alcuno dei figli, i puntatori avranno come valore NULL.</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
</pre></td><td class="code"><pre class="cpp cpp" style="font-family:monospace;"><span style="color: #0000ff;">struct</span> nodo <span style="color: #008000;">&#123;</span>
  <span style="color: #666666;">// Campi informativi</span>
  <span style="color: #0000ff;">int</span> dato;
  <span style="color: #666666;">// Puntatori ai prossimi nodi</span>
  nodo<span style="color: #000040;">*</span>  <span style="color: #0000dd;">sin</span>;
  nodo<span style="color: #000040;">*</span>  des;
<span style="color: #008000;">&#125;</span>;
<span style="color: #0000ff;">typedef</span> nodo<span style="color: #000040;">*</span> albin;</pre></td></tr></table></div>

<p>L&#8217;istruzione <em>typedef </em>ci permetterà di trattare il puntatore ad un nodo come un nuovo tipo di dato, evitando confusione quando dobbiamo passare alle funzioni parametri di questo tipo.</p>
<h3>Funzioni di gestione basilare</h3>
<p>Le prime funzioni che ci accingiamo a creare sono decisamente banali e spesso possono anche essere omesse: si tratta delle funzioni che restituiscono il figlio sinistro e destro di un nodo, il campo informativo, oppure un albero vuoto. L&#8217;utilizzo di queste funzioni faciliterà, in futuro, l&#8217;eventuale revisione e riadattamento del codice, anche nel prospetto di una conversione ad un altro linguaggio di programmazione.<br />
Saranno definite quindi le seguenti funzioni:</p>

<div class="wp_syntax"><div class="code"><pre class="cpp cpp" style="font-family:monospace;"><span style="color: #0000ff;">bool</span> test_vuoto<span style="color: #008000;">&#40;</span>albin root<span style="color: #008000;">&#41;</span>;
albin f_sinistro<span style="color: #008000;">&#40;</span>albin<span style="color: #008000;">&#41;</span>;
albin f_destro<span style="color: #008000;">&#40;</span>albin<span style="color: #008000;">&#41;</span>;
<span style="color: #0000ff;">int</span> dato<span style="color: #008000;">&#40;</span>albin<span style="color: #008000;">&#41;</span>;
albin albero_vuoto<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>;</pre></div></div>

<p>La versione basilare che presentiamo è compilabile sia in linguaggio C sia in linguaggio C++.</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
</pre></td><td class="code"><pre class="cpp cpp" style="font-family:monospace;"><span style="color: #0000ff;">bool</span> test_vuoto<span style="color: #008000;">&#40;</span>albin root<span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
  <span style="color: #666666;">// Verifica se root è un albero vuoto</span>
  <span style="color: #0000ff;">return</span> root <span style="color: #000080;">==</span> <span style="color: #0000ff;">NULL</span>;
<span style="color: #008000;">&#125;</span>
&nbsp;
albin f_sinistro<span style="color: #008000;">&#40;</span>albin root<span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
  <span style="color: #666666;">// Restituisce il figlio sinistro di root</span>
  <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span><span style="color: #000040;">!</span>test_vuoto<span style="color: #008000;">&#40;</span>root<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span>
    <span style="color: #0000ff;">return</span> root<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span><span style="color: #0000dd;">sin</span>;
<span style="color: #008000;">&#125;</span>
&nbsp;
albin f_destro<span style="color: #008000;">&#40;</span>albin root<span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
  <span style="color: #666666;">// Restituisce il figlio destro di root</span>
  <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span><span style="color: #000040;">!</span>test_vuoto<span style="color: #008000;">&#40;</span>root<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span>
    <span style="color: #0000ff;">return</span> root<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>des;
<span style="color: #008000;">&#125;</span>
&nbsp;
<span style="color: #0000ff;">int</span> dato<span style="color: #008000;">&#40;</span>albin root<span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
  <span style="color: #666666;">// Restituisce il campo informativo di root</span>
  <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span><span style="color: #000040;">!</span>test_vuoto<span style="color: #008000;">&#40;</span>root<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span>
    <span style="color: #0000ff;">return</span> root<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>dato;
<span style="color: #008000;">&#125;</span>
&nbsp;
albin albero_vuoto<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
  <span style="color: #666666;">// Restituisce un albero vuoto</span>
  <span style="color: #0000ff;">return</span> <span style="color: #0000ff;">NULL</span>;
<span style="color: #008000;">&#125;</span></pre></td></tr></table></div>

<p>Utilizzando il C++ è possibile migliorare leggermente le funzioni restituendo il valore di f_sinistro() e f_destro() come reference: in questo modo saranno possibili assegnazioni del tipo</p>

<div class="wp_syntax"><div class="code"><pre class="cpp cpp" style="font-family:monospace;">f_sinistro<span style="color: #008000;">&#40;</span>mioalbero<span style="color: #008000;">&#41;</span> <span style="color: #000080;">=</span> <span style="color: #0000dd;">new</span> nodo;</pre></div></div>

<p>Del resto, restando nell&#8217;ambito del C, è possibile scrivere due semplici funzioni imposta_sinistro() e imposta_destro() che svolgono lo stesso compito.</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
</pre></td><td class="code"><pre class="cpp cpp" style="font-family:monospace;">albin<span style="color: #000040;">&amp;</span> f_sinistro<span style="color: #008000;">&#40;</span>albin root<span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
  <span style="color: #666666;">// Restituisce il figlio sinistro di root</span>
  <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span><span style="color: #000040;">!</span>test_vuoto<span style="color: #008000;">&#40;</span>root<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span>
    <span style="color: #0000ff;">return</span> root<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span><span style="color: #0000dd;">sin</span>;
<span style="color: #008000;">&#125;</span>
&nbsp;
albin<span style="color: #000040;">&amp;</span> f_destro<span style="color: #008000;">&#40;</span>albin root<span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
  <span style="color: #666666;">// Restituisce il figlio destro di root</span>
  <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span><span style="color: #000040;">!</span>test_vuoto<span style="color: #008000;">&#40;</span>root<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span>
    <span style="color: #0000ff;">return</span> root<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>des;
<span style="color: #008000;">&#125;</span>
&nbsp;
<span style="color: #0000ff;">int</span><span style="color: #000040;">&amp;</span> dato<span style="color: #008000;">&#40;</span>albin root<span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
  <span style="color: #666666;">// Restituisce il campo informativo di root</span>
  <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span><span style="color: #000040;">!</span>test_vuoto<span style="color: #008000;">&#40;</span>root<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span>
    <span style="color: #0000ff;">return</span> root<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>dato;
<span style="color: #008000;">&#125;</span></pre></td></tr></table></div>

<p>Ecco ora il codice in C.</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
</pre></td><td class="code"><pre class="cpp cpp" style="font-family:monospace;"><span style="color: #0000ff;">bool</span> imposta_sinistro<span style="color: #008000;">&#40;</span>albin root, albin what<span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
  <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span><span style="color: #000040;">!</span>test_vuoto<span style="color: #008000;">&#40;</span>root<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span>
  <span style="color: #008000;">&#123;</span>
    root<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span><span style="color: #0000dd;">sin</span> <span style="color: #000080;">=</span> what;
    <span style="color: #0000ff;">return</span> <span style="color: #0000ff;">true</span>;
  <span style="color: #008000;">&#125;</span>
  <span style="color: #0000ff;">return</span> <span style="color: #0000ff;">false</span>;
<span style="color: #008000;">&#125;</span>
&nbsp;
<span style="color: #0000ff;">bool</span> imposta_destro<span style="color: #008000;">&#40;</span>albin root, albin what<span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
  <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span><span style="color: #000040;">!</span>test_vuoto<span style="color: #008000;">&#40;</span>root<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span>
  <span style="color: #008000;">&#123;</span>
    root<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>des <span style="color: #000080;">=</span> what;
    <span style="color: #0000ff;">return</span> <span style="color: #0000ff;">true</span>;
  <span style="color: #008000;">&#125;</span>
  <span style="color: #0000ff;">return</span> <span style="color: #0000ff;">false</span>;
<span style="color: #008000;">&#125;</span>
&nbsp;
<span style="color: #0000ff;">void</span> imposta_radice<span style="color: #008000;">&#40;</span>albin<span style="color: #000040;">*</span> root, albin what<span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
  <span style="color: #000040;">*</span>root <span style="color: #000080;">=</span> what;
<span style="color: #008000;">&#125;</span>
&nbsp;
<span style="color: #0000ff;">bool</span> imposta_dato<span style="color: #008000;">&#40;</span>albin root, <span style="color: #0000ff;">int</span> x<span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
  <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span><span style="color: #000040;">!</span>test_vuoto<span style="color: #008000;">&#40;</span>root<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span>
  <span style="color: #008000;">&#123;</span>
    root<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>dato <span style="color: #000080;">=</span> x;
  <span style="color: #008000;">&#125;</span>
<span style="color: #008000;">&#125;</span></pre></td></tr></table></div>

<p>Le funzioni di inserimento nel figlio sinistro e destro restituiscono true se l&#8217;inserimento è stato possibile, false altrimenti. D&#8217;ora in avanti faremo riferimento alle funzioni C per compatibilità maggiore, chi utilizza il C++ sappia che può risparmiare queste tre funzioni semplicemente modificando le tre precedenti come mostrato sopra.</p>
<h2>Teoria elementare della ricorsione</h2>
<h3>Perché la ricorsione</h3>
<p>Come avrete notato, le definizioni di albero binario e albero binario di ricerca si prestano bene ad essere implementate con una procedura ricorsiva.<br />
In realtà vedremo che quasi tutti gli algoritmi relativi agli alberi binari si prestano bene ad essere implementati ricorsivamente. Ecco qualche esempio.<strong><br />
</strong></p>
<ul>
<li><strong>Conteggio del numero di foglie</strong><br />
Se l&#8217;attuale nodo è una foglia, restituisci 1, altrimenti restituisci la somma del numero di foglie del sottoalbero sinistro e del sottoalbero destro.</li>
<li><strong>Calcolo della profondità</strong><br />
La profondità di un albero è uguale a 1 sommato alla profondità massima tra il sottoalbero sinistro e quello destro.</li>
</ul>
<p>Vedremo che, per risolvere un qualsiasi problema relativo agli alberi, sarà quasi più importante pensare all&#8217;algoritmo e alla definizione in modo ricorsivo, piuttosto che scrivere il codice.<br />
Tuttavia la ricorsione non è una tecnica del tutto immediata e, se non si presta sufficiente attenzione al codice che si scrive, è facile cadere in cicli infiniti, ossia in ricorsioni che non terminano mai.</p>
<h3>Un esempio pratico</h3>
<p>Va innanzitutto chiarito che tutti gli algoritmi iterativi possono essere trasformati nella controparte ricorsiva e viceversa. Tuttavia è bene valutare un problema di efficienza: la ricorsione, da una parte rende il codice più compatto e facile da comprendere, dall&#8217;altra allunga il tempo di esecuzione, in quanto ogni chiamata a funzione richiede l&#8217;utilizzo della memoria per salvare il punto di ritorno e richiede la ricostruzione di tutte le variabili locali.</p>
<p>Un esempio classico di ricorsione è dato dal calcolo del fattoriale di un numero. Dato un numero naturale n</p>
<p style="text-align: center;">amath n in NN endamath</p>
<p>si definisce fattoriale si n e si indica con amath n! endamath il prodotto di tutti i numeri naturali e positivi minori o uguali a n.</p>
<p style="text-align: center;">amath n! = n (n-1) (n-2) &#8230; 3 * 2 * 1 = prod_{i=1}^n i endamath</p>
<p>Data questa definizione, è facile scrivere un programma iterativo per il calcolo del fattoriale: lo stesso simbolo di produttoria sottintende l&#8217;utilizzo di un semplice ciclo per la codifica.<br />
Un&#8217;ultima nota sulla definizione è che si assume</p>
<p style="text-align: center;">amath 0! = 1 endamath</p>
<p>La motivazione va cercata nel calcolo combinatorio, ma non è questo il nostro interesse, quindi possiamo prendere l&#8217;identità mostrata come un assioma.</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
</pre></td><td class="code"><pre class="cpp cpp" style="font-family:monospace;"><span style="color: #0000ff;">long</span> fattoriale_iterativo <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">short</span> <span style="color: #0000ff;">int</span> n<span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
  <span style="color: #0000ff;">long</span> f <span style="color: #000080;">=</span> <span style="color: #0000dd;">1</span>;
  <span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">short</span> <span style="color: #0000ff;">int</span> i <span style="color: #000080;">=</span> <span style="color: #0000dd;">1</span>; i <span style="color: #000080;">&lt;</span> n; i<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span>
    f <span style="color: #000040;">*</span><span style="color: #000080;">=</span> i;
  <span style="color: #0000ff;">return</span> f;
<span style="color: #008000;">&#125;</span></pre></td></tr></table></div>

<p>Il programma calcola il fattoriale anche nel caso di n = 0, visto che la variabile f è inizializzata a 1 e l&#8217;esecuzione non entrerà mai nel ciclo con n = 0.<br />
La funzione viene eseguita anche se è passato un parametro errato, come un numero negativo. In questo caso, però, il valore restituito sarà comunque 1. Per ovviare il problema è possibile definire meglio il parametro di ingresso, ad esempio di tipo unsigned short int, oppure inserire un ulteriore controllo all&#8217;interno della funzione per la gestione degli errori. Ad esempio, è chiaro che il fattoriale non restituirà mai un valore uguale a 0, quindi si può utilizzare questo valore di ritorno come sentinella di errore.</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
</pre></td><td class="code"><pre class="cpp cpp" style="font-family:monospace;"><span style="color: #0000ff;">long</span> fattoriale_iterativo <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">short</span> <span style="color: #0000ff;">int</span> n<span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
  <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>n <span style="color: #000080;">&lt;</span> <span style="color:#800080;">0</span><span style="color: #008000;">&#41;</span>
    <span style="color: #0000ff;">return</span> <span style="color:#800080;">0</span>;
  <span style="color: #0000ff;">long</span> f <span style="color: #000080;">=</span> <span style="color: #0000dd;">1</span>;
  <span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">short</span> <span style="color: #0000ff;">int</span> i <span style="color: #000080;">=</span> <span style="color: #0000dd;">1</span>; i <span style="color: #000080;">&lt;</span> n; i<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span>
    f <span style="color: #000040;">*</span><span style="color: #000080;">=</span> i;
  <span style="color: #0000ff;">return</span> f;
<span style="color: #008000;">&#125;</span></pre></td></tr></table></div>

<p>Abbiamo visto come la versione iterativa del fattoriale sia abbastanza semplice da implementare. Tuttavia, è anche possibile definire un algoritmo ricorsivo per il calcolo del fattoriale.<br />
Basta infatti capire che il fattoriale di un numero n è interpretabile anche come </p>
<p style="text-align: center;">amath n! = n * (n-1)! endamath</p>
<p>ossia il fattoriale di n è uguale al prodotto di n per il fattoriale di n-1. Del resto è facile capirne la dimostrazione. Il fattoriale di 6, ad esempio, si trova prendendo il fattoriale di 5 (amath 5*4*3*2*1 endamath) e moltiplicandogli appunto 6.<br />
Con una definizione del genere è facile scrivere la procedura ricorsivo corrispondente.</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
</pre></td><td class="code"><pre class="cpp cpp" style="font-family:monospace;"><span style="color: #0000ff;">long</span> fattoriale_ricorsivo <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">unsigned</span> <span style="color: #0000ff;">short</span> <span style="color: #0000ff;">int</span> n<span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
  <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>n <span style="color: #000080;">==</span> <span style="color:#800080;">0</span><span style="color: #008000;">&#41;</span>
    <span style="color: #0000ff;">return</span> <span style="color: #0000dd;">1</span>;
  <span style="color: #0000ff;">return</span> n <span style="color: #000040;">*</span> fattoriale_ricorsivo <span style="color: #008000;">&#40;</span>n – <span style="color: #0000dd;">1</span><span style="color: #008000;">&#41;</span>; 
<span style="color: #008000;">&#125;</span></pre></td></tr></table></div>

<p>Se la funzione è richiamata, ad esempio con n = 5, avremo</p>
<pre style="font-size: 10pt">fattoriale_ricorsivo (5)
5 * fattoriale_ricorsivo (4);
		4 * fattoriale_ricorsivo (3);
			3 * fattoriale_ricorsivo (2);
				2 * fattoriale_ricorsivo (1);
					1 * fattoriale_ricorsivo (0);
						1
					1 * 1 = 1
				2 * 1 = 2
			3 * 2 = 6
		4 * 6 = 24
	5 * 24 = 120
120</pre>
<p>Come si è visto nell&#8217;esempio, la ricorsione termina in modo corretto e il risultato ottenuto è quello previsto.<br />
Tuttavia, per una funzione del genere, l&#8217;utilizzo della ricorsione pare decisamente inutile e, anzi, decisamente dannoso per le prestazioni. Osserviamo infatti che:</p>
<ol>
<li>La funzione ha una variabile globale di tipo long (generalmente 4 byte), che viene ricreata ad ogni chiamata ricorsiva</li>
<li> La funzione è chiamata un numero di volte pari a n più la chiamata di partenza (n+1 volte totali). Ogni volta il sistema dovrà memorizzare il punto di ritorno, andando così ad utilizzare lo stack. </li>
<li>La chiarezza dell&#8217;algoritmo non è tanto maggiore rispetto alla versione iterativa<br />
E&#8217; chiaro che, quando si verifica una situazione del genere, è bene restare nel campo dell&#8217;iterazione. </li>
</ol>
<h3>Tecniche di ricorsione</h3>
<p>Abbiamo visto un esempio di procedura ricorsiva, dimostrando &#8220;brutalmente&#8221; il suo funzionamento. Adesso, tuttavia, è bene riorganizzare il tutto e descrivere i punti fondamentali della ricorsione, da seguire sempre quando si scrive una procedura ricorsiva:</p>
<ol>
<li>La procedura deve risolvere manualmente almeno un caso base.</li>
<li>La procedura deve essere chiamata ricorsivamente con parametri che convergono sempre di più verso il caso base. In generale, la procedura deve essere sempre richiamata con parametri sempre più piccoli. </li>
<li>Deve essere possibile la convergenza insiemistica.</ol>
</li>
<p>Se si verificano queste tre condizioni, siamo sicuri che la nostra procedura ricorsiva terminerà.<br />
Nel caso del fattoriale, il caso base era 0! e la procedura era richiamata sempre con parametri più vicini al caso base, in particolare sempre più piccoli. </p>
<p>Il terzo punto merita un esempio apposito. Supponiamo di avere una funzione f(x) definita come segue:</p>
<p style="text-align: center;">amath f(x) = {(2 + f(x/2)),(f(1)=1),(x in NN - {0}):} endamath</p>
<p>La funzione gestisce un caso base e la ricorsione è chiamata con parametri sempre più convergenti verso il caso base. Tuttavia, se x è dispari, la divisione per due non porterà mai al caso base 1.<br />
Infatti, dividendo un numero dispari per 2 avremo sempre un numero dispari. Il più piccolo numero dispari naturale è 1, che, se diviso ancora per 2, porta al risultato 0. Se la funzione è richiamata con parametro 0, allora si entra in un loop infinito. I problemi di questa funzione sono quindi che il caso base gestito non è l&#8217;unico possibile e che gli insiemi non convergono.<br />
Come verificato, quindi, una procedura che non soddisfi esattamente tutti e tre i punti sopra elencati, di sicuro non terminerà. E&#8217; bene prestare attenzione particolare alla fase di progetto di un algoritmo ricorsivo, analizzando tutti i possibili casi di ingresso.</p>
<h2>Algoritmi di base</h2>
<h3>Stampa dell&#8217;albero binario</h3>
<p>La visita di un albero binario è l&#8217;algoritmo più semplice da implementare, si tratta infatti di applicare le definizioni ricorsive prima fornite alla lettera e di trascriverle in linguaggio di programmazione.<br />
Per prima cosa ci soffermeremo su un algoritmo di base, che si occupa di stampare a video tutti i nodi di un albero, utilizzando uno dei tre metodi di attraversamento.</p>

<div class="wp_syntax"><div class="code"><pre class="cpp cpp" style="font-family:monospace;"><span style="color: #0000ff;">void</span> stampa_preorder<span style="color: #008000;">&#40;</span>albin<span style="color: #008000;">&#41;</span>;
<span style="color: #0000ff;">void</span> stampa_inorder<span style="color: #008000;">&#40;</span>albin<span style="color: #008000;">&#41;</span>;
<span style="color: #0000ff;">void</span> stampa_postorder<span style="color: #008000;">&#40;</span>albin<span style="color: #008000;">&#41;</span>;</pre></div></div>

<p>Per la stampa utilizzeremo la funzione printf(), ma è chiaro che in C++ è sufficiente utilizzare l&#8217;oggetto di output a schermo, cout.</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
</pre></td><td class="code"><pre class="cpp cpp" style="font-family:monospace;"><span style="color: #0000ff;">void</span> stampa_preorder<span style="color: #008000;">&#40;</span>albin root<span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
  <span style="color: #666666;">// Stampa in preorder</span>
  <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span><span style="color: #000040;">!</span>test_vuoto<span style="color: #008000;">&#40;</span>root<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span>
  <span style="color: #008000;">&#123;</span>
    <span style="color: #0000dd;">printf</span> <span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;%i &quot;</span>,dato<span style="color: #008000;">&#40;</span>root<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span>;
    stampa_preorder<span style="color: #008000;">&#40;</span>f_sinistro<span style="color: #008000;">&#40;</span>root<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span>;
    stampa_preorder<span style="color: #008000;">&#40;</span>f_destro<span style="color: #008000;">&#40;</span>root<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span>;
  <span style="color: #008000;">&#125;</span>
<span style="color: #008000;">&#125;</span>
&nbsp;
<span style="color: #0000ff;">void</span> stampa_inorder<span style="color: #008000;">&#40;</span>albin root<span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
  <span style="color: #666666;">// Stampa in inorder</span>
  <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span><span style="color: #000040;">!</span>test_vuoto<span style="color: #008000;">&#40;</span>root<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span>
  <span style="color: #008000;">&#123;</span>
    stampa_inorder<span style="color: #008000;">&#40;</span>f_sinistro<span style="color: #008000;">&#40;</span>root<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span>;
    <span style="color: #0000dd;">printf</span> <span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;%i &quot;</span>,dato<span style="color: #008000;">&#40;</span>root<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span>;
    stampa_inorder<span style="color: #008000;">&#40;</span>f_destro<span style="color: #008000;">&#40;</span>root<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span>;
  <span style="color: #008000;">&#125;</span>
<span style="color: #008000;">&#125;</span>
&nbsp;
<span style="color: #0000ff;">void</span> stampa_postorder<span style="color: #008000;">&#40;</span>albin root<span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
  <span style="color: #666666;">// Stampa in postorder</span>
  <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span><span style="color: #000040;">!</span>test_vuoto<span style="color: #008000;">&#40;</span>root<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span>
  <span style="color: #008000;">&#123;</span>
    stampa_postorder<span style="color: #008000;">&#40;</span>f_sinistro<span style="color: #008000;">&#40;</span>root<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span>;
    stampa_postorder<span style="color: #008000;">&#40;</span>f_destro<span style="color: #008000;">&#40;</span>root<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span>;
    <span style="color: #0000dd;">printf</span> <span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;%i &quot;</span>,dato<span style="color: #008000;">&#40;</span>root<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span>;
  <span style="color: #008000;">&#125;</span>
<span style="color: #008000;">&#125;</span></pre></td></tr></table></div>

<p>Come si nota, per ottenere le tre diverse visite, è sufficiente scambiare l&#8217;ordine delle tre istruzioni visita-attraversa-attraversa.</p>
<h2>Visita generica dell&#8217;albero binario</h2>
<p>Quello che vogliamo ottenere adesso è visitare l&#8217;albero binario, quindi come abbiamo fatto nel paragrafo precedente, ma non per stampare semplicemente i campi informativi. Vogliamo adesso che anche l&#8217;azione da eseguire sul nodo visitato possa essere specificata come parametro della funzione. Si tratta soltanto di passare un puntatore a funzione che definisca cosa fare con il dato del nodo.<br />
Possiamo per prima cosa definire un puntatore generico ad una funzione, come segue:</p>

<div class="wp_syntax"><div class="code"><pre class="cpp cpp" style="font-family:monospace;"><span style="color: #0000ff;">typedef</span> <span style="color: #0000ff;">int</span> <span style="color: #008000;">&#40;</span><span style="color: #000040;">*</span>funz<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span><span style="color: #008000;">&#41;</span>;</pre></div></div>

<p>Abbiamo definito il tipo di puntatore con il nome <i>funz</i>. La funzione accetterà un parametro intero e restituirà un intero.<br />
Ecco adesso come possono essere trasformate le visite utilizzando i puntatori a funzione.</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
</pre></td><td class="code"><pre class="cpp cpp" style="font-family:monospace;"><span style="color: #0000ff;">void</span> visita_preorder<span style="color: #008000;">&#40;</span>albin root, funz f<span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
  <span style="color: #666666;">// Visita in preorder</span>
  <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span><span style="color: #000040;">!</span>test_vuoto<span style="color: #008000;">&#40;</span>root<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span>
  <span style="color: #008000;">&#123;</span>
    imposta_dato<span style="color: #008000;">&#40;</span>root,f<span style="color: #008000;">&#40;</span>dato<span style="color: #008000;">&#40;</span>root<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span>;
    visita_preorder<span style="color: #008000;">&#40;</span>f_sinistro<span style="color: #008000;">&#40;</span>root<span style="color: #008000;">&#41;</span>,f<span style="color: #008000;">&#41;</span>;
    visita_preorder<span style="color: #008000;">&#40;</span>f_destro<span style="color: #008000;">&#40;</span>root<span style="color: #008000;">&#41;</span>,f<span style="color: #008000;">&#41;</span>;
  <span style="color: #008000;">&#125;</span>
<span style="color: #008000;">&#125;</span>
&nbsp;
<span style="color: #0000ff;">void</span> visita_inorder<span style="color: #008000;">&#40;</span>albin root, funz f<span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
  <span style="color: #666666;">// Visita in inorder</span>
  <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span><span style="color: #000040;">!</span>test_vuoto<span style="color: #008000;">&#40;</span>root<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span>
  <span style="color: #008000;">&#123;</span>
    visita_inorder<span style="color: #008000;">&#40;</span>f_sinistro<span style="color: #008000;">&#40;</span>root<span style="color: #008000;">&#41;</span>,f<span style="color: #008000;">&#41;</span>;
    imposta_dato<span style="color: #008000;">&#40;</span>root,f<span style="color: #008000;">&#40;</span>dato<span style="color: #008000;">&#40;</span>root<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span>;
    visita_inorder<span style="color: #008000;">&#40;</span>f_destro<span style="color: #008000;">&#40;</span>root<span style="color: #008000;">&#41;</span>,f<span style="color: #008000;">&#41;</span>;
  <span style="color: #008000;">&#125;</span>
<span style="color: #008000;">&#125;</span>
&nbsp;
<span style="color: #0000ff;">void</span> visita_postorder<span style="color: #008000;">&#40;</span>albin root, funz f<span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
  <span style="color: #666666;">// Visita in postorder</span>
  <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span><span style="color: #000040;">!</span>test_vuoto<span style="color: #008000;">&#40;</span>root<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span>
  <span style="color: #008000;">&#123;</span>
    visita_postorder<span style="color: #008000;">&#40;</span>f_sinistro<span style="color: #008000;">&#40;</span>root<span style="color: #008000;">&#41;</span>,f<span style="color: #008000;">&#41;</span>;
    visita_postorder<span style="color: #008000;">&#40;</span>f_destro<span style="color: #008000;">&#40;</span>root<span style="color: #008000;">&#41;</span>,f<span style="color: #008000;">&#41;</span>;
    imposta_dato<span style="color: #008000;">&#40;</span>root,f<span style="color: #008000;">&#40;</span>dato<span style="color: #008000;">&#40;</span>root<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span>;
  <span style="color: #008000;">&#125;</span>
<span style="color: #008000;">&#125;</span></pre></td></tr></table></div>

<p>Il codice risultante è decisamente meno comprensibile, ma sicuramente è adattabile a situazioni differenti. Con il puntatore a funzione, possiamo infatti fare qualsiasi cosa, dal cambiare il valore del nodo, a scriverlo su file e così via. Da notare che il risultato di <i>f(x)</i> viene salvato come nuovo valore del nodo, quindi la funzione dovrà provvedere a restituire un valore sensato al termine della propria esecuzione.<br />
Supponiamo di voler decrementare di una unità tutti i nodi di un albero: sarà sufficiente utilizzare un qualsiasi attraversamento, passando come puntatore una funzione che, ricevuto un intero <i>x</i>, lo restituisce decrementato.<br />
Molti altri algoritmi potrebbero essere riadattati utilizzando questo puntatore a funzione, ma visto che i puntatori a funzione non sono un concetto noto a tutti continueremo a presentare tutti gli algoritmi in maniera classica, senza ricorrere alle versioni con puntatore a funzione. </p>
<h3>Creazione dell&#8217;albero binario</h3>
<p>Esistono diversi modi per creare un albero binario: il primo è quello di creare un albero binario di ricerca, in cui gli inserimenti sono semplici e immediati da fare, l&#8217;altra prevede invece la lettura di tutti i nodi dall&#8217;utente, supponendo di avere un carattere particolare per indicare un nodo vuoto.<br />
Partiamo con la creazione del BST. Per creare un BST sarà sufficiente scorrere l&#8217;albero, procedendo a destra o a sinistra a seconda che l&#8217;elemento da inserire sia maggiore o minore di quello attualmente in esame.<br />
Il codice dell&#8217;inserimento è il seguente.</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
</pre></td><td class="code"><pre class="cpp cpp" style="font-family:monospace;">albin creaBST <span style="color: #008000;">&#40;</span>albin root, <span style="color: #0000ff;">int</span> x<span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
  <span style="color: #666666;">// Crea l'albero binario di ricerca</span>
  <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>test_vuoto<span style="color: #008000;">&#40;</span>root<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span>
  <span style="color: #008000;">&#123;</span>
    <span style="color: #666666;">// Creo il nodo</span>
    root <span style="color: #000080;">=</span> <span style="color: #0000dd;">new</span> nodo;
    imposta_dato<span style="color: #008000;">&#40;</span>root,x<span style="color: #008000;">&#41;</span>;
    imposta_sinistro<span style="color: #008000;">&#40;</span>root,albero_vuoto<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span>;
    imposta_destro<span style="color: #008000;">&#40;</span>root,albero_vuoto<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span>;
  <span style="color: #008000;">&#125;</span>
  <span style="color: #0000ff;">else</span>
    <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>x <span style="color: #000080;">&lt;</span> dato<span style="color: #008000;">&#40;</span>root<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span>
      <span style="color: #666666;">// Inserisco a sinistra</span>
      imposta_sinistro <span style="color: #008000;">&#40;</span>root,creaBST<span style="color: #008000;">&#40;</span>f_sinistro<span style="color: #008000;">&#40;</span>root<span style="color: #008000;">&#41;</span>,x<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span>;
    <span style="color: #0000ff;">else</span>
      <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>x <span style="color: #000080;">&gt;</span> root<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>dato<span style="color: #008000;">&#41;</span>
        <span style="color: #666666;">// Inserisco a destra</span>
        imposta_destro<span style="color: #008000;">&#40;</span>root,creaBST<span style="color: #008000;">&#40;</span>f_destro<span style="color: #008000;">&#40;</span>root<span style="color: #008000;">&#41;</span>,x<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span>;
      <span style="color: #0000ff;">else</span>
        <span style="color: #666666;">// Errore, elemento duplicato</span>
        <span style="color: #0000ff;">return</span> <span style="color: #0000ff;">NULL</span>;
  <span style="color: #666666;">// Restituisco il nodo</span>
  <span style="color: #0000ff;">return</span> root;
<span style="color: #008000;">&#125;</span></pre></td></tr></table></div>

<p>La funzione riceve in ingresso la radice del BST e un numero da inserirvi, quindi provvede al giusto posizionamento.<br />
A questo punto, per creare un BST sarà sufficiente leggere i valori da inserire e utilizzare questa funzione per inserirli in un albero inizialmente vuoto. E&#8217; chiaro che la forma del BST sarà alterata dall&#8217;ordine in cui sono inseriti i numeri. L&#8217;unica cosa di cui siamo sicuri è che, leggendo il BST in ordine simmetrico, avremo sempre i dati ordinati in modo crescente.</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
</pre></td><td class="code"><pre class="cpp cpp" style="font-family:monospace;"><span style="color: #339900;">#include &lt;iostream&gt;</span>
<span style="color: #339900;">#include &lt;cstdlib&gt;</span>
&nbsp;
<span style="color: #339900;">#ifndef EXIT_SUCCESS</span>
<span style="color: #339900;">#define EXIT_SUCCESS 0</span>
<span style="color: #339900;">#endif</span>
&nbsp;
<span style="color: #339900;">#ifndef EXIT_FAILURE</span>
<span style="color: #339900;">#define EXIT_FAILURE 1</span>
<span style="color: #339900;">#endif</span>
&nbsp;
<span style="color: #0000ff;">struct</span> nodo <span style="color: #008000;">&#123;</span>
  <span style="color: #666666;">// Campi informativi</span>
  <span style="color: #0000ff;">int</span> dato;
  <span style="color: #666666;">// Puntatori ai prossimi nodi</span>
  nodo<span style="color: #000040;">*</span>  <span style="color: #0000dd;">sin</span>;
  nodo<span style="color: #000040;">*</span>  des;
<span style="color: #008000;">&#125;</span>;
&nbsp;
<span style="color: #666666;">// Definizione del tipo puntatore</span>
<span style="color: #0000ff;">typedef</span> nodo<span style="color: #000040;">*</span> albin;
&nbsp;
<span style="color: #666666;">// Definizione di puntatore a funzione che riceve un parametro intero</span>
<span style="color: #0000ff;">typedef</span> <span style="color: #0000ff;">int</span> <span style="color: #008000;">&#40;</span><span style="color: #000040;">*</span>funz<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span><span style="color: #008000;">&#41;</span>;
&nbsp;
<span style="color: #666666;">// Funzioni di base</span>
<span style="color: #0000ff;">bool</span> test_vuoto<span style="color: #008000;">&#40;</span>albin<span style="color: #008000;">&#41;</span>;
albin f_sinistro<span style="color: #008000;">&#40;</span>albin<span style="color: #008000;">&#41;</span>;
albin f_destro<span style="color: #008000;">&#40;</span>albin<span style="color: #008000;">&#41;</span>;
<span style="color: #0000ff;">int</span> dato<span style="color: #008000;">&#40;</span>albin<span style="color: #008000;">&#41;</span>;
albin albero_vuoto<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>;
&nbsp;
<span style="color: #666666;">// Modifica dei figli sinistro e destro</span>
<span style="color: #0000ff;">bool</span> imposta_sinistro<span style="color: #008000;">&#40;</span>albin,albin<span style="color: #008000;">&#41;</span>;
<span style="color: #0000ff;">bool</span> imposta_destro<span style="color: #008000;">&#40;</span>albin,albin<span style="color: #008000;">&#41;</span>;
<span style="color: #0000ff;">void</span> imposta_radice<span style="color: #008000;">&#40;</span>albin<span style="color: #000040;">*</span>,albin<span style="color: #008000;">&#41;</span>;
&nbsp;
<span style="color: #666666;">// Imposta il dato</span>
<span style="color: #0000ff;">bool</span> imposta_dato<span style="color: #008000;">&#40;</span>albin,<span style="color: #0000ff;">int</span><span style="color: #008000;">&#41;</span>;
&nbsp;
<span style="color: #666666;">// Attraversanenti</span>
<span style="color: #0000ff;">void</span> stampa_preorder<span style="color: #008000;">&#40;</span>albin<span style="color: #008000;">&#41;</span>;
<span style="color: #0000ff;">void</span> stampa_inorder<span style="color: #008000;">&#40;</span>albin<span style="color: #008000;">&#41;</span>;
<span style="color: #0000ff;">void</span> stampa_postorder<span style="color: #008000;">&#40;</span>albin<span style="color: #008000;">&#41;</span>;
&nbsp;
<span style="color: #666666;">// Creazione dell'albero</span>
albin creaBST<span style="color: #008000;">&#40;</span>albin,<span style="color: #0000ff;">int</span><span style="color: #008000;">&#41;</span>;
&nbsp;
<span style="color: #0000ff;">int</span> main<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
  <span style="color: #666666;">// Creo l'albero vuoto</span>
  albin roo;
  imposta_radice <span style="color: #008000;">&#40;</span><span style="color: #000040;">&amp;</span>root, albero_vuoto<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span>;
&nbsp;
  <span style="color: #666666;">// Dato da leggere</span>
  <span style="color: #0000ff;">int</span> n;
&nbsp;
  <span style="color: #666666;">// Leggo il BST</span>
  <span style="color: #0000ff;">do</span> <span style="color: #008000;">&#123;</span>
    <span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #FF0000;">&quot;Valore da inserire (0 per terminare): &quot;</span>;
    <span style="color: #0000dd;">scanf</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;%i&quot;</span>,<span style="color: #000040;">&amp;</span>n<span style="color: #008000;">&#41;</span>;
    <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>n <span style="color: #000040;">!</span><span style="color: #000080;">=</span> <span style="color:#800080;">0</span><span style="color: #008000;">&#41;</span>
      imposta_radice <span style="color: #008000;">&#40;</span><span style="color: #000040;">&amp;</span>root, creaBST<span style="color: #008000;">&#40;</span>root,n<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span>;
  <span style="color: #008000;">&#125;</span> <span style="color: #0000ff;">while</span> <span style="color: #008000;">&#40;</span>n <span style="color: #000040;">!</span><span style="color: #000080;">=</span> <span style="color:#800080;">0</span><span style="color: #008000;">&#41;</span>;
&nbsp;
  <span style="color: #666666;">// Stampa anticipata</span>
  <span style="color: #0000dd;">printf</span> <span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;Preorder:    &quot;</span><span style="color: #008000;">&#41;</span>;
  stampa_preorder<span style="color: #008000;">&#40;</span>root<span style="color: #008000;">&#41;</span>;
  <span style="color: #0000dd;">printf</span> <span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;<span style="color: #666666; font-weight: bold;">\r</span><span style="color: #666666; font-weight: bold;">\n</span>&quot;</span><span style="color: #008000;">&#41;</span>;
&nbsp;
  <span style="color: #666666;">// Stampa simmetrica</span>
  <span style="color: #0000dd;">printf</span> <span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;Inorder:     &quot;</span><span style="color: #008000;">&#41;</span>;
  stampa_inorder<span style="color: #008000;">&#40;</span>root<span style="color: #008000;">&#41;</span>;
  <span style="color: #0000dd;">printf</span> <span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;<span style="color: #666666; font-weight: bold;">\r</span><span style="color: #666666; font-weight: bold;">\n</span>&quot;</span><span style="color: #008000;">&#41;</span>;
&nbsp;
  <span style="color: #666666;">// Stampa posticipata</span>
  <span style="color: #0000dd;">printf</span> <span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;Postoridine: &quot;</span><span style="color: #008000;">&#41;</span>;
  stampa_postorder<span style="color: #008000;">&#40;</span>root<span style="color: #008000;">&#41;</span>;
  <span style="color: #0000dd;">printf</span> <span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;<span style="color: #666666; font-weight: bold;">\r</span><span style="color: #666666; font-weight: bold;">\n</span>&quot;</span><span style="color: #008000;">&#41;</span>;
&nbsp;
  <span style="color: #666666;">// Fine del programma</span>
  <span style="color: #0000dd;">system</span> <span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;pause&quot;</span><span style="color: #008000;">&#41;</span>;
  <span style="color: #0000ff;">return</span> <span style="color: #0000ff;">EXIT_SUCCESS</span>;  
<span style="color: #008000;">&#125;</span></pre></td></tr></table></div>

<p>Il metodo utilizzato per uscire dal ciclo è un valore sentinella, ma sarebbe stato possibile utilizzare anche un altro metodo: chiedere il numero di nodi da inserire, oppure chiedere se si desidera inserire un nuovo nodo alla fine di ogni iterazione. </p>
<p>Questo metodo di lettura è comodo e veloce, però non permette di &#8220;disegnare&#8221; l&#8217;albero come uno vorrebbe, stabilendo per ogni nodo i propri figli. A questo punto sorge la necessità di leggere l&#8217;albero nel secondo modo presentato. Pensando all&#8217;algoritmo in modo ricorsivo sarà tutto più facile</p>
<ol>
<li>Leggo una stringa</li>
<li>
<ol>
<li>Se la stringa è un &#8220;.&#8221; allora inserisco nel nodo corrente NULL</li>
<li>Altrimenti inserisco l&#8217;informazione nel nodo corrente e analizzo il sottoalbero sinistro e destro. </li>
</ol>
</li>
</ol>
<p>A questo punto la funzione non dovrebbe risultare troppo complessa da scrivere. E&#8217; chiaro che questo tipo di algoritmo simula una lettura in preorder. Del resto, come abbiamo già visto, per realizzare altri tipi di lettura, non sarà necessario altro che l&#8217;inversione dell&#8217;ordine delle istruzioni.</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
</pre></td><td class="code"><pre class="cpp cpp" style="font-family:monospace;">albin creaAB <span style="color: #008000;">&#40;</span>albin root<span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
  <span style="color: #666666;">// Crea l'albero leggendo i dati in ordine anticipato</span>
  <span style="color: #666666;">// (. = NULL)</span>
  <span style="color: #0000ff;">char</span> str<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">11</span><span style="color: #008000;">&#93;</span>;
  <span style="color: #0000dd;">scanf</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;%s&quot;</span>,str<span style="color: #008000;">&#41;</span>;
  <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>str<span style="color: #008000;">&#91;</span><span style="color:#800080;">0</span><span style="color: #008000;">&#93;</span> <span style="color: #000080;">==</span> <span style="color: #FF0000;">'.'</span><span style="color: #008000;">&#41;</span>
  <span style="color: #008000;">&#123;</span>
    imposta_radice <span style="color: #008000;">&#40;</span><span style="color: #000040;">&amp;</span>root, albero_vuoto<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span>;
  <span style="color: #008000;">&#125;</span>
  <span style="color: #0000ff;">else</span>
  <span style="color: #008000;">&#123;</span>
    <span style="color: #0000ff;">int</span> num <span style="color: #000080;">=</span> <span style="color: #0000dd;">atoi</span><span style="color: #008000;">&#40;</span>str<span style="color: #008000;">&#41;</span>;
    imposta_radice <span style="color: #008000;">&#40;</span><span style="color: #000040;">&amp;</span>root, <span style="color: #0000dd;">new</span> nodo<span style="color: #008000;">&#41;</span>;
    imposta_dato <span style="color: #008000;">&#40;</span>root,num<span style="color: #008000;">&#41;</span>;
    imposta_sinistro<span style="color: #008000;">&#40;</span>root,creaAB<span style="color: #008000;">&#40;</span>f_sinistro<span style="color: #008000;">&#40;</span>root<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span>;
    imposta_destro<span style="color: #008000;">&#40;</span>root,creaAB<span style="color: #008000;">&#40;</span>f_destro<span style="color: #008000;">&#40;</span>root<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span>;
  <span style="color: #008000;">&#125;</span>
  <span style="color: #0000ff;">return</span> root;
<span style="color: #008000;">&#125;</span></pre></td></tr></table></div>

<p>Notare che questa funzione non necessita del supporto di alcun ciclo: per la corretta lettura dell&#8217;albero, saranno sufficienti le istruzioni.</p>
<pre lang="cpp"  // Creo l'albero vuoto
  albin root;
  imposta_radice (&#038;root, albero_vuoto());

  // Lettura albero binario
  imposta_radice (&#038;root, creaAB(root));</pre>
<p>Questo metodo richiede più tempo e attenzione, visto che per ogni foglia è necessario inserire due volte il carattere '.', scelto come sentinella, ma almeno permette un controllo totale sul design dell'albero.<br />
Se, nel complesso, inseriamo la sequenza</p>
<pre style = "font-size: 10pt">5 4 3 . . 5 . . 6 . 9 7 . . 2 . .</pre>
<p>avremo l&#8217;equivalente dell&#8217;albero</p>
<div id="attachment_42" class="wp-caption aligncenter" style="width: 361px"><a href="http://www.andrea-asta.com/techworld/wp-content/uploads/2008/10/ab2.jpg"><img src="http://www.andrea-asta.com/techworld/wp-content/uploads/2008/10/ab2.jpg" alt="Albero binario generato da una stringa" title="ab2" width="351" height="165" class="size-full wp-image-42" /></a><p class="wp-caption-text">Albero binario generato da una stringa</p></div>
<h3>Calcolo dei parametri dell&#8217;albero</h3>
<p>Abbiamo visto come creare e attraversare un albero, adesso vedremo come calcolarne i parametri, quali altezza, numero di nodi, numero di foglie ecc.<br />
Il primo problema che ci poniamo è calcolare il numero totale dei nodi presenti nell&#8217;albero: ragionando ricorsivamente, possiamo dire che il numero di nodi è uguale a 1 (radice) sommato al numero di nodi del sottoalbero sinistro e a quello del sottoalbero destro, a patto ovviamente che la radice non sia un insieme vuoto.</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
</pre></td><td class="code"><pre class="cpp cpp" style="font-family:monospace;"><span style="color: #0000ff;">int</span> contaNodi <span style="color: #008000;">&#40;</span>albin root<span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
  <span style="color: #666666;">// Conta i nodi</span>
  <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span><span style="color: #000040;">!</span>test_vuoto<span style="color: #008000;">&#40;</span>root<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span>
    <span style="color: #0000ff;">return</span> <span style="color: #0000dd;">1</span> <span style="color: #000040;">+</span> contaNodi<span style="color: #008000;">&#40;</span>f_sinistro<span style="color: #008000;">&#40;</span>root<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span> <span style="color: #000040;">+</span> contaNodi<span style="color: #008000;">&#40;</span>f_destro<span style="color: #008000;">&#40;</span>root<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span>;
  <span style="color: #0000ff;">return</span> <span style="color:#800080;">0</span>;
<span style="color: #008000;">&#125;</span></pre></td></tr></table></div>

<p>Il secondo problema è quello di contare le foglie, ossia i nodi che non hanno figli: se il nodo in esame è una foglia, restituiamo 1, altrimenti sommiamo il numero di foglie del sottoalbero sinistro e quelle del sottoalbero destro.</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
</pre></td><td class="code"><pre class="cpp cpp" style="font-family:monospace;"><span style="color: #0000ff;">int</span> contaFoglie <span style="color: #008000;">&#40;</span>albin root<span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
  <span style="color: #666666;">// Conta le foglie</span>
  <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>test_vuoto<span style="color: #008000;">&#40;</span>root<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span>
  <span style="color: #008000;">&#123;</span>
    <span style="color: #666666;">// Albero vuoto</span>
    <span style="color: #0000ff;">return</span> <span style="color:#800080;">0</span>;
  <span style="color: #008000;">&#125;</span>
&nbsp;
  <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>test_vuoto<span style="color: #008000;">&#40;</span>f_sinistro<span style="color: #008000;">&#40;</span>root<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span> <span style="color: #000040;">&amp;&amp;</span> test_vuoto<span style="color: #008000;">&#40;</span>f_destro<span style="color: #008000;">&#40;</span>root<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span>
    <span style="color: #666666;">// Il nodo attuale è una foglia</span>
    <span style="color: #0000ff;">return</span> <span style="color: #0000dd;">1</span>;
&nbsp;
  <span style="color: #0000ff;">return</span> contaFoglie<span style="color: #008000;">&#40;</span>f_sinistro<span style="color: #008000;">&#40;</span>root<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span> <span style="color: #000040;">+</span> contaFoglie<span style="color: #008000;">&#40;</span>f_destro<span style="color: #008000;">&#40;</span>root<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span>;
<span style="color: #008000;">&#125;</span></pre></td></tr></table></div>

<p>E&#8217; chiaro che, se volessimo calcolare il numero di nodi interni, avremo almeno due strade:</p>
<ol>
<li>Fare la differenza tra il numero totale di nodi e il numero di foglie</li>
<li>Calcolare il numero di nodi interni utilizzando lo stesso metodo utilizzato per le foglie ma restituendo 1 non quando viene trovata una foglia, ma quando non viene trovata. </li>
</ol>
<p>Il prossimo problema che vogliamo risolvere è quello di calcolare la profondità di un albero binario: come già detto, il processo ricorsivo è abbastanza intuitivo. Se l&#8217;albero non è vuoto, l&#8217;altezza è data dal massimo livello dei due sottoalberi incrementato di 1. Se l&#8217;albero è vuoto, l&#8217;altezza è -1. Se la radice è una foglia, l&#8217;altezza è 0.</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
</pre></td><td class="code"><pre class="cpp cpp" style="font-family:monospace;"><span style="color: #0000ff;">int</span> altezza <span style="color: #008000;">&#40;</span>albin root<span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
  <span style="color: #666666;">// Altezza dell'albero (RADICE =&gt; 0)</span>
  <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>test_vuoto<span style="color: #008000;">&#40;</span>root<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span>
    <span style="color: #0000ff;">return</span> <span style="color: #000040;">-</span><span style="color: #0000dd;">1</span>;
  <span style="color: #0000ff;">int</span> ls <span style="color: #000080;">=</span> altezza<span style="color: #008000;">&#40;</span>f_sinistro<span style="color: #008000;">&#40;</span>root<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span>;
  <span style="color: #0000ff;">int</span> ld <span style="color: #000080;">=</span> altezza<span style="color: #008000;">&#40;</span>f_destro<span style="color: #008000;">&#40;</span>root<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span>;
  <span style="color: #0000ff;">return</span> ls <span style="color: #000080;">&gt;</span> ld <span style="color: #008080;">?</span> <span style="color: #0000dd;">1</span> <span style="color: #000040;">+</span> ls <span style="color: #008080;">:</span> <span style="color: #0000dd;">1</span> <span style="color: #000040;">+</span> ld;
<span style="color: #008000;">&#125;</span></pre></td></tr></table></div>

<h3>Stampe dei livelli</h3>
<p>bbiamo visto come stampare gli alberi utilizzando uno qualsiasi dei metodi di attraversamento. Adesso ci poniamo un obiettivo leggermente superiore: per ogni nodo, oltre al campo informativo, vogliamo stampare anche il livello.<br />
Il metodo più semplice è modificare leggermente le funzioni di stampa aggiungendo una variabile static che viene modificata in modo da contenere sempre il livello esatto. Se non si vuole usare una variabile static, sarà sufficiente aggiungere alla funzione un nuovo parametro, di tipo intero, passato sempre per indirizzo.<br />
E&#8217; chiaro che, utilizzando il valore del livello, possiamo realizzare anche l&#8217;effetto di &#8220;stampa indentata&#8221; dell&#8217;albero.<br />
L&#8217;esempio più semplice è quello di stampa anticipata.</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
</pre></td><td class="code"><pre class="cpp cpp" style="font-family:monospace;"><span style="color: #0000ff;">void</span> stampa_liv_preorder <span style="color: #008000;">&#40;</span>albin root<span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
  <span style="color: #0000ff;">static</span> <span style="color: #0000ff;">int</span> l <span style="color: #000080;">=</span> <span style="color:#800080;">0</span>;
  <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span><span style="color: #000040;">!</span>test_vuoto<span style="color: #008000;">&#40;</span>root<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span>
  <span style="color: #008000;">&#123;</span>
    <span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> i <span style="color: #000080;">=</span> <span style="color:#800080;">0</span>; i <span style="color: #000080;">&lt;</span> l; i<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span>
      <span style="color: #0000dd;">printf</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;  &quot;</span><span style="color: #008000;">&#41;</span>;
    <span style="color: #0000dd;">printf</span> <span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;[L%i] %i<span style="color: #666666; font-weight: bold;">\r</span><span style="color: #666666; font-weight: bold;">\n</span>&quot;</span>,l,dato<span style="color: #008000;">&#40;</span>root<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span>;
    l++;
    stampa_liv_preorder<span style="color: #008000;">&#40;</span>f_sinistro<span style="color: #008000;">&#40;</span>root<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span>;
    stampa_liv_preorder<span style="color: #008000;">&#40;</span>f_destro<span style="color: #008000;">&#40;</span>root<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span>;
    l--;
  <span style="color: #008000;">&#125;</span>
<span style="color: #008000;">&#125;</span></pre></td></tr></table></div>

]]></content:encoded>
			<wfw:commentRss>http://www.andrea-asta.com/techworld/2008/10/alberi-binari-parte-1/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Partono i lavori per il nuovo portfolio</title>
		<link>http://www.andrea-asta.com/techworld/2008/10/partono-i-lavori-per-il-nuovo-portfolio/</link>
		<comments>http://www.andrea-asta.com/techworld/2008/10/partono-i-lavori-per-il-nuovo-portfolio/#comments</comments>
		<pubDate>Sat, 25 Oct 2008 11:25:29 +0000</pubDate>
		<dc:creator>Andrea Asta</dc:creator>
		
		<category><![CDATA[Generale]]></category>

		<guid isPermaLink="false">http://www.andrea-asta.com/techworld/?p=31</guid>
		<description><![CDATA[Dopo tanto tempo lontano dall&#8217;informatica e dalle scienze, ho pensato fosse il caso di dare una spolveratina ai miei vecchi lavori e mettere su il nuovo portfolio. Dopo diverse meditazioni, ho deciso di buttarmi su WordPress, lo stesso sistema che già uso per Volley World. Le motivazioni sono molteplici, ma partono tutte dal presupposto che [...]]]></description>
			<content:encoded><![CDATA[<p>Dopo tanto tempo lontano dall&#8217;informatica e dalle scienze, ho pensato fosse il caso di dare una spolveratina ai miei vecchi lavori e mettere su il nuovo portfolio. Dopo diverse meditazioni, ho deciso di buttarmi su <strong>WordPress</strong>, lo stesso sistema che già uso per <a href="http://www.andrea-asta.com/volleyworld" target="_blank">Volley World</a>. Le motivazioni sono molteplici, ma partono tutte dal presupposto che ormai, con tutti gli standard esistenti e tutte le buone regole di programmazione ed accessibilità, ritengo non sia più conveniente creare un sito standard da zero.</p>
<p>Mi spiego: se non ho esigenze particolari (come può essere, per l&#8217;appunto, il caso di un portfolio), creare un sito da zero richiede oggi molto più tempo di quanto ne richiedeva una decina di anni fa. Allora bastava aprire il proprio editor preferito, inserire due o tre tabelle, qualche gif animata e tutto era pronto. Adesso bisogna rispettare gli standard, è consigliabile utilizzare fogli di stile, bisogna validare il codice, provarlo con diversi browser e diverse versioni. In più, per dare un senso a ciò che si sta facendo, è bene non trascurare le regole per la reperibilità dei motori di ricerca, sfruttare sistemi XML (quali possono essere i feed RSS e le SiteMap) e, insomma, avere la voglia e il tempo di creare un progetto solido e robusto. Non dimentichiamo, infine, l&#8217;importanza basilare dell&#8217;utilizzo &#8220;sensato&#8221; di linguaggi lato server e database, che fanno crescere esponenzialmente la complessità dei propri problemi (si pensi, banalmente, ad un sito web gestito da 2-3 persone, che richiede quindi la creazione di un pannello amministrativo con, magari, tre livelli di accesso). Orbene, ce n&#8217;è davvero l&#8217;esigenza? <strong>L&#8217;utente moderno cerca il contenuto o il sito fatto in casa? </strong>Sinceramente, credo che ormai non sia più così divertente e fruttifero creare un sito web standard da zero. I CMS esistono e hanno successo proprio per questo motivo.</p>
<p>Si pongono poi problemi etici e egocentristi, del tipo: &#8220;<em>I CMS li usa chi non sa fare i siti, io che sono capace me lo faccio da solo</em>&#8220;. Ma il punto di riflessione è sempre lo stesso: ce n&#8217;è veramente il bisogno? All&#8217;utente interessa veramente? E&#8217; lo stesso spirito con cui, ad oggi, non conviene più riscriversi le proprie funzioni, all&#8217;interno di un programma, da soli. Se esistono e sono disponibili, utilizziamole! Non è forse questa la filosofia dei recenti linguaggi di progrmamazione, quali <em>Java </em>o <em>C#</em>?</p>
<p>Siamo quindi al punto cruciale: <strong>esistono ancora siti che vale la pena programmare?</strong> La risposta è sì. Ma con cautela. Nel senso, io mi metto a scrivere codice da zero solo quando sono sicuro che ciò che sto facendo è veramente <span style="text-decoration: underline;">innovativo</span>. E&#8217; questo il succo di tutto. Io studio, raccolgo materiale, riutilizzo codice degli altri al puro scopo di innovare. L&#8217;innovazione è, a mio avviso, il vero step che serve all&#8217;informatica. Lavorare su progetti nuovi ed interessanti. Ad esempio, lavoro da più di un anno ad un sito web (che andrebbe definito come <em>Web-Application</em>) per allenatori di pallavolo, il <a href="http://www.andrea-asta.com/VCS" target="_blank">Volley Coaching System</a>. Valeva la pena programmarlo da zero? Certamente! Perché, banalmente, tutto ciò che è quel progetto non esiste altrove.</p>
<p>Fatte queste premesse, ripartiamo: nei prossimi giorni, settimane, mesi, tenterò di ripristinare il vecchio materiale e di inserirne di nuovo. Nel frattempo, buona navigazione.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.andrea-asta.com/techworld/2008/10/partono-i-lavori-per-il-nuovo-portfolio/feed/</wfw:commentRss>
		</item>
	</channel>
</rss>
