<?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"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>alviano.com/.net/.org</title>
	<atom:link href="http://alviano.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://alviano.com</link>
	<description>Mario Alviano&#039;s web site and blog</description>
	<lastBuildDate>Fri, 18 May 2012 13:54:37 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.2</generator>
		<item>
		<title>How to resize a VDI disk</title>
		<link>http://alviano.com/2012/05/05/how-to-resize-a-vdi-disk/</link>
		<comments>http://alviano.com/2012/05/05/how-to-resize-a-vdi-disk/#comments</comments>
		<pubDate>Sat, 05 May 2012 19:52:30 +0000</pubDate>
		<dc:creator>malvi</dc:creator>
				<category><![CDATA[Linux tricks]]></category>

		<guid isPermaLink="false">http://alviano.com/?p=995</guid>
		<description><![CDATA[Today I had the necessity to enlarge the storage capacity of a VirtualBox machine running Windows XP on my laptop. Luckily, VirtualBox 4.0 and higher come with a command line tool which made this task easy. The tool is VBoxManage and I used the following command: $ VBoxManage modifyhd /path/to/your/vdi/disk.vdi --resize 30000 Executing this command [...]]]></description>
			<content:encoded><![CDATA[<p>Today I had the necessity to enlarge the storage capacity of a VirtualBox machine running Windows XP on my laptop. Luckily, VirtualBox 4.0 and higher <span id="more-995"></span> come with a command line tool which made this task easy. The tool is <code>VBoxManage</code> and I used the following command:</p>

<div class="wp_syntax"><div class="code"><pre class="txt" style="font-family:monospace;">$ VBoxManage modifyhd /path/to/your/vdi/disk.vdi --resize 30000</pre></div></div>

<p>Executing this command enlarged the capacity of my virtual disk up to 30 GB. However, the command does not affect the capacity of the partitions in the disk. For this second task I used <a href="http://gparted.sourceforge.net/">GParted</a>, a free partition editor. I simply downloaded the ISO image, which I used to boot my virtual machine and then to changed the size of the partition in the virtual disk. That&#8217;s all!</p>
<p>For a more detailed description please read this <a href="http://trivialproof.blogspot.it/2011/01/resizing-virtualbox-virtual-hard-disk.html">post</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://alviano.com/2012/05/05/how-to-resize-a-vdi-disk/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Esercizio su Fogli elettronici</title>
		<link>http://alviano.com/2012/04/29/esercizio-su-fogli-elettronici/</link>
		<comments>http://alviano.com/2012/04/29/esercizio-su-fogli-elettronici/#comments</comments>
		<pubDate>Sun, 29 Apr 2012 19:19:08 +0000</pubDate>
		<dc:creator>malvi</dc:creator>
				<category><![CDATA[Didattica]]></category>
		<category><![CDATA[Informatica - CdL Scienze dell'educazione]]></category>

		<guid isPermaLink="false">http://alviano.com/?p=934</guid>
		<description><![CDATA[Scaricate il documento iniziale (in formato ODS) tramite il seguente link: [download]. Il documento riporta i punti ottenuti dai piloti di Formula 1 nella stazione 2011. Provate ad applicare le modifiche descritte in questa pagina. Il risultato finale dovrebbe somigliare a quello riportato nel seguente documento (in formato PDF): [download]. Quasi tutti gli aspetti di [...]]]></description>
			<content:encoded><![CDATA[<p>Scaricate il documento iniziale (in formato ODS) tramite il seguente link: <a href="http://archives.alviano.com/teaching/infoedu/inf-2011-2012/E03 - Fogli elettronici - Esercizio (dati).ods">[download]</a>. Il documento riporta i punti ottenuti dai piloti di Formula 1 nella stazione 2011.</p>
<p>Provate ad applicare <span id="more-934"></span> le modifiche descritte in questa pagina. Il risultato finale dovrebbe somigliare a quello riportato nel seguente documento (in formato PDF): <a href="http://archives.alviano.com/teaching/infoedu/inf-2011-2012/E03 - Fogli elettronici - Esercizio.pdf">[download]</a>.</p>
<p>Quasi tutti gli aspetti di HTML visti a lezione sono usati in questo documento. Chi vuole, può mandarmi una mail (<strong>entro le 12:00 del 13/05/2012</strong>) allegando un archivio (.zip) contenente il foglio elettronico (.ods). Come oggetto indicate <em>Esercizio 3</em>. Mettete in CC Kristian Reale.</p>
<div class="myui-highlight" data-icon="alert">
<strong>Attenzione!</strong> L&#8217;esercizio non comporta alcuna valutazione per l&#8217;esame.
</div>
<div class="myui-highlight" data-icon="alert">
<strong>Attenzione!</strong> Mandare per email solo gli elaborati finali. Se qualcosa dell&#8217;esercizio non è chiaro, dovete indicarlo direttamente nel vostro elaborato (per favore, non chiedete chiarimenti per email).
</div>
<div class="blockarea">
<h2>Istruzioni</h2>
<ol>
<li>
Impostate la larghezza delle colonne dell&#8217;intero foglio a 0,75cm. Per la colonna dei piloti, impostate una larghezza di 3,75cm.
</li>
<li>
Impostate il bordo per tutte le celle contenenti dati (numeri o testo).
</li>
<li>
Impostate il colore di sfondo della prima riga su giallo.
</li>
<li>
Allineate al centro (sia verticalmente che orizzontalmente) l&#8217;intestazione della colonna dei piloti (la cella A1). Per le altre intestazioni usate un orientamento del testo di 45 gradi. Impostate il grassetto per la riga delle intestazioni.
</li>
<li>
Aggiungete le colonne TOTALE, MEDIA, MINIMO e MASSIMO, calcolando per ogni pilota questi valori (suggerimento: usate la copia dinamica). La formattazione di queste colonne è uguale alle precedenti, ma il carattere è formattato in grassetto.
</li>
<li>
Ordinate i dati usando come criterio il TOTALE <strong>decrescente</strong> dei punti ottenuti nella stagione.
</li>
<li>
Per i piloti, impostate il colore di sfondo delle righe pari su grigio 20% (suggerimento: usate copia e incolla speciale).
</li>
<li>
Aggiungete la colonna Posizione a sinistra del pilota e assegnate le posizioni in base al punteggio TOTALE (suggerimento: usate la copia dinamica). Usate la stessa formattazione della colonna dei piloti, ma formattate in grassetto le posizioni e impostate una larghezza della colonna di 2cm.
</li>
<li>
Aggiungete la colonna DISTANZA DAL PRIMO, con la stessa formattazione della colonna TOTALE. La DISTANZA DAL PRIMO di un pilota X si ottiene sottraendo dal TOTALE del primo il TOTALE di X. Ad esempio, se i primi tre piloti hanno 100, 80 e 75 punti, le distanze dal primo di questi piloti sono 100 &#8211; 100 = 0, 100 &#8211; 80 = 20 e 100 &#8211; 75 = 25.
</li>
<li>
Aggiungete un grafico a torta che mostri la distribuzione dei punti fra i primi 10 piloti (suggerimento: dovete fare una selezione di due aree non contigue; usate il tasto CTRL). Usate come titolo &#8220;Distribuzione punti fra i primi 10 piloti&#8221; e ridimensionate il grafico opportunamente (trascinate i quadratini verdi).
</li>
<li>
Aggiungete un grafico a barre orizzontali che mostri i punti ottenuti dai primi 5 piloti nelle prime 3 gare. Usate come titolo &#8220;Punti dei primi 5 piloti nelle prime 3 gare&#8221; e ridimensionate il grafico opportunamente.
</li>
</ol>
</div>
]]></content:encoded>
			<wfw:commentRss>http://alviano.com/2012/04/29/esercizio-su-fogli-elettronici/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Esercizio su HTML</title>
		<link>http://alviano.com/2012/04/19/esercizio-su-html/</link>
		<comments>http://alviano.com/2012/04/19/esercizio-su-html/#comments</comments>
		<pubDate>Thu, 19 Apr 2012 18:03:52 +0000</pubDate>
		<dc:creator>malvi</dc:creator>
				<category><![CDATA[Didattica]]></category>
		<category><![CDATA[Informatica - CdL Scienze dell'educazione]]></category>

		<guid isPermaLink="false">http://alviano.com/?p=779</guid>
		<description><![CDATA[Scaricate il documento (in formato PDF) tramite il seguente link: [download]. Provate a riprodurre il documento seguendo le indicazioni date dalle note di chiusura (si trovano nell&#8217;ultima pagina; il vostro documento non deve includere queste note di chiusura; i numeri romani che compaiono nel testo fanno parte delle note di chiusura). Quasi tutti gli aspetti [...]]]></description>
			<content:encoded><![CDATA[<p>Scaricate il documento (in formato PDF) tramite il seguente link: <a href="http://archives.alviano.com/teaching/infoedu/inf-2011-2012/E02 - HTML - Esercizio.pdf">[download]</a>.</p>
<p>Provate a riprodurre<span id="more-779"></span> il documento seguendo le indicazioni date dalle note di chiusura (si trovano nell&#8217;ultima pagina; il vostro documento non deve includere queste note di chiusura; i numeri romani che compaiono nel testo fanno parte delle note di chiusura). Quasi tutti gli aspetti di HTML visti a lezione sono usati in questo documento. Chi vuole, può mandarmi una mail (<strong>entro le 12:00 del 29/04/2012</strong>) allegando un archivio (.zip) contenente il documento HTML (.html). Come oggetto indicate <em>Esercizio 2</em>. Mettete in CC Kristian Reale.</p>
<div class="myui-highlight" data-icon="alert">
  <strong>Attenzione!</strong> L&#8217;esercizio non comporta alcuna valutazione per l&#8217;esame.
</div>
<div class="myui-highlight" data-icon="alert">
  <strong>Attenzione!</strong> Mandare per email solo gli elaborati finali. Se qualcosa dell&#8217;esercizio non è chiaro, dovete indicarlo direttamente nel vostro elaborato (per favore, non chiedete chiarimenti per email).
</div>
]]></content:encoded>
			<wfw:commentRss>http://alviano.com/2012/04/19/esercizio-su-html/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Lista tag, attributi e valori per HTML consultabile all&#8217;esame</title>
		<link>http://alviano.com/2012/04/14/lista-tag-attributi-e-valori-per-html-consultabile-allesame/</link>
		<comments>http://alviano.com/2012/04/14/lista-tag-attributi-e-valori-per-html-consultabile-allesame/#comments</comments>
		<pubDate>Sat, 14 Apr 2012 14:02:59 +0000</pubDate>
		<dc:creator>malvi</dc:creator>
				<category><![CDATA[Didattica]]></category>
		<category><![CDATA[Informatica - CdL Scienze dell'educazione]]></category>

		<guid isPermaLink="false">http://alviano.com/?p=767</guid>
		<description><![CDATA[TAG: a, b, body, del, em, font, h1, h2, h3, h4, h5, h6, head, html, i, li, meta, ol, p, strong, sub, sup, table, td, th, tr, u, ul ATTRIBUTI: align, border, charset, color, face, href, size VALORI: black, blue, center, gray, green, justify, left, purple, red, right, utf-8, white, yellow]]></description>
			<content:encoded><![CDATA[<div class="blockarea">
<p><strong>TAG:</strong> a, b, body, del, em, font, h1, h2, h3, h4, h5, h6, head, html, i, li, meta, ol, p, strong, sub, sup, table, td, th, tr, u, ul</p>
<p><strong>ATTRIBUTI:</strong> align, border, charset, color, face, href, size</p>
<p><strong>VALORI:</strong> black, blue, center, gray, green, justify, left, purple, red, right, utf-8, white, yellow
</div>
]]></content:encoded>
			<wfw:commentRss>http://alviano.com/2012/04/14/lista-tag-attributi-e-valori-per-html-consultabile-allesame/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Risposte a domande frequenti</title>
		<link>http://alviano.com/2012/04/10/risposte-a-domande-frequenti/</link>
		<comments>http://alviano.com/2012/04/10/risposte-a-domande-frequenti/#comments</comments>
		<pubDate>Tue, 10 Apr 2012 10:56:33 +0000</pubDate>
		<dc:creator>malvi</dc:creator>
				<category><![CDATA[Didattica]]></category>
		<category><![CDATA[Informatica - CdL Scienze dell'educazione]]></category>

		<guid isPermaLink="false">http://alviano.com/?p=739</guid>
		<description><![CDATA[Cerca la risposta alla tua domanda fra quelle riportate di seguito. D: Possiamo sapere orientativamente la data del primo appello d&#8217;esame? R: Probabilmente il 29 giugno, ma non mi hanno ancora dato la disponibilità del laboratorio. D: E` possibile effettuare una simulazione d&#8217;esame a fine corso? R: Una vera e propria simulazione d&#8217;esame non è [...]]]></description>
			<content:encoded><![CDATA[<p>Cerca la risposta alla tua domanda fra quelle riportate di seguito.<span id="more-739"></span></p>
<div class="blockarea">
<p>  <strong>D:</strong> Possiamo sapere orientativamente la data del primo appello d&#8217;esame?<br />
  <strong>R:</strong> Probabilmente il 29 giugno, ma non mi hanno ancora dato la disponibilità del laboratorio.
</div>
<div class="blockarea">
<p>  <strong>D:</strong> E` possibile effettuare una simulazione d&#8217;esame a fine corso?<br />
  <strong>R:</strong> Una vera e propria simulazione d&#8217;esame non è fattibile per diverse ragioni.</p>
<p>La prima è che siete più di 200, e quindi servirebbero 5 turni nel laboratorio 31/b, per un totale di più di 5 ore. Ha senso sacrificare le ultime 3 esercitazioni?</p>
<p>La seconda ragione è che gli esami non sono tutti uguali. In particolare, domande ed esercizi della simulazione sicuramente non uscirebbero all&#8217;esame (e vi assicuro che non è semplice trovare domande facili; vogliamo sprecarle alla simulazione?). E quindi che informazione ricavereste da una simulazione?</p>
<p>Ciò che invece ritengo utile è mostrarvi il sistema che userete per fare l&#8217;esame, così da eliminare ogni difficoltà nell&#8217;usarlo per rispondere alle domande e agli esercizi. A tempo debito (probabilmente in occasione dell&#8217;ultima esercitazione), mostreremo questo sistema e quindi qualche domanda ed esercizio da esame (che chiaramente non uscirà all&#8217;esame). Detto questo, intendo precisare che il numero di quesiti, la loro difficoltà e il tempo che avrete a disposizione per risolverli sono mutualmente dipendenti. Chi ha studiato e si è esercitato non avrà difficoltà a superare l&#8217;esame.
</p></div>
<div class="blockarea">
<p>  <strong>D:</strong> E` possibile anticipare le lezioni del giovedì? Abbiamo l&#8217;autobus.<br />
  <strong>R:</strong> Purtroppo non è possibile. Ho lezione per la Facoltà di Scienze Matematiche, Fisiche e Naturali fino alle 13:30. Per quali paesi non ci sono autobus dopo le 17:00?
</div>
<div class="blockarea">
<p><strong>D:</strong> Posso sostenere l&#8217;orale se non ho superato lo scritto?<br />
<strong>R:</strong> No.
</div>
<div class="blockarea">
<p><strong>D:</strong> Devo studiare il testo adottato? Oppure è sufficiente studiare sui lucidi?<br />
<strong>R:</strong> I lucidi sono di supporto alla lezione, che non può essere sostituita dai lucidi. Quasi tutti gli argomenti discussi a lezione sono presenti nel libro adottato, che è da studiare. Per gli argomenti discussi a lezioni che non sono presenti nel libro adottato, sarà indicato del materiale integrativo.
</div>
<div class="blockarea">
<p><strong>D:</strong> Nel piano di studi ho inserito entrambi gli esami, uno al secondo anno e l&#8217;altro al terzo. Cosa fare?<br />
<strong>R:</strong> La Presidenza ha dato la seguente direttiva: sostenere un esame con il programma di quest&#8217;anno e l&#8217;altro esame con il programma dell&#8217;anno scorso. Purtroppo dovrete studiare autonomamente, facendo riferimento al materiale in questa pagina: <a href="http://alviano.com/teaching/material/infoedu/sei-2010-2011/">[link]</a>. Al termine di alcune lezioni del corso, rispiego alcuni argomenti chiave del programma dell&#8217;anno scorso.
</div>
<div class="blockarea">
<p><strong>D:</strong> Possiamo fare le esercitazioni di laboratorio a casa e mandarle a Reale anche se siamo stati assenti?<br />
<strong>R:</strong> Potete fare le esercitazioni di laboratorio a casa, ma non potete mandarle a Reale.
</div>
<div class="blockarea">
<p><strong>D:</strong> Per l&#8217;esame devo studiare i tre libri per intero?<br />
<strong>R:</strong> No. Dovete studiare gli argomenti del programma, ovvero quelli presentati a lezione. I libri sono utili per approfondire gli argomenti trattati a lezione.<br />
<strong>Addendum:</strong> Per quanto riguarda il libro <em>Fondamenti di informatica</em>, i capitoli 4 e D non fanno parte del programma. Gli altri capitoli sono tutti di interesse per il corso.
</div>
<div class="blockarea">
<p><strong>D:</strong> Chi è l&#8217;autore del libro <em>Fondamenti di informatica</em>?<br />
<strong>R:</strong> L&#8217;autore è il gruppo <strong>Progetto A<sup><small>3</small></sup></strong>.
</div>
<div class="blockarea">
<p><strong>D:</strong> Non posso seguire il corso perché ho il tirocinio. Cosa fare?<br />
<strong>R:</strong> Il Regolamento Didattico d&#8217;Ateneo prevede la frequenza obbligatoria. Deve chiedere di cambiare i giorni di tirocinio.
</div>
<div class="blockarea">
<p><strong>D:</strong> Proprio non mi è possibile seguire il corso. Posso comunque fare l&#8217;esame?<br />
<strong>R:</strong> Il Regolamento Didattico d&#8217;Ateneo dice <em>no</em>. Tuttavia, se riesce a prepararsi autonomamente, le sarà consentito sostenere l&#8217;esame. Visto che mi chiede di fare una <em>eccezione</em> al Regolamento, mi aspetto una <em>eccezionale</em> serietà da parte sua nel presentarsi all&#8217;esame adeguatamente preparata.
</div>
<div class="blockarea">
<p><strong>D:</strong> L&#8217;esame mi è stato convalidato a seguito di passaggio da un altro corso di laurea. Devo integrare un solo credito. Cosa fare?<br />
<strong>R:</strong> In Segreteria mi dicono che per un solo credito l&#8217;esame viene convalidato per intero. Chiedere in Segreteria se è così. In caso contrario, chiedere alla Segreteria di informare il docente su quali studenti hanno l&#8217;esigenza di integrare l&#8217;esame. Pervenuta questa informazione, il docente indicherà sul sito del corso quali argomenti saranno oggetto d&#8217;esame.
</div>
<div class="blockarea">
<p><strong>D:</strong> L&#8217;esame mi è stato convalidato a seguito di passaggio da un altro corso di laurea. Devo integrare 2 o più crediti. Cosa fare?<br />
<strong>R:</strong> Chiedere alla Segreteria di informare il docente su quali studenti hanno l&#8217;esigenza di integrare l&#8217;esame. Pervenuta questa informazione, il docente indicherà sul sito del corso quali argomenti saranno oggetto d&#8217;esame.
</div>
<div class="blockarea">
<p><strong>D:</strong> Ho la ECDL. Posso non sostenere l&#8217;esame?<br />
<strong>R:</strong> Provi a chiedere in Segreteria.
</div>
<div class="blockarea">
<p><strong>D:</strong> Mi mancano pochi esami. Posso avere un trattamento di favore?<br />
<strong>R:</strong> No. Primo o ultimo esame, riceverete tutti lo stesso trattamento.
</div>
<div class="blockarea">
<p><strong>D:</strong> Ho la media alta. Mi può alzare il voto?<br />
<strong>R:</strong> No. La media dipende dal voto dei singoli esami, non il contrario.
</div>
]]></content:encoded>
			<wfw:commentRss>http://alviano.com/2012/04/10/risposte-a-domande-frequenti/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Software installato nei laboratori</title>
		<link>http://alviano.com/2012/04/10/software-installato-nei-laboratori/</link>
		<comments>http://alviano.com/2012/04/10/software-installato-nei-laboratori/#comments</comments>
		<pubDate>Tue, 10 Apr 2012 10:14:01 +0000</pubDate>
		<dc:creator>malvi</dc:creator>
				<category><![CDATA[Didattica]]></category>
		<category><![CDATA[Informatica - CdL Scienze dell'educazione]]></category>

		<guid isPermaLink="false">http://alviano.com/?p=728</guid>
		<description><![CDATA[Il software installato nei laboratori 31/b e 16/c è il seguente: Laboratorio 31/b Ubuntu 10.04 OpenOffice 3.2 GIMP 2.6 Laboratorio 16/c Ubuntu 8.04 OpenOffice 2.4 GIMP 2.4.5 Consiglio l&#8217;installazione di OpenOffice e GIMP per Windows a tutti. L&#8217;installazione di Ubuntu è invece una operazione più delicata e non necessaria ai fini del corso. Installazione di [...]]]></description>
			<content:encoded><![CDATA[<p>Il software installato nei laboratori 31/b e 16/c è<span id="more-728"></span> il seguente:</p>
<ul>
<li>Laboratorio 31/b
<ul>
<li>Ubuntu 10.04</li>
<li>OpenOffice 3.2</li>
<li>GIMP 2.6</li>
</ul>
</li>
<li>Laboratorio 16/c
<ul>
<li>Ubuntu 8.04</li>
<li>OpenOffice 2.4</li>
<li>GIMP 2.4.5</li>
</ul>
</li>
</ul>
<p>Consiglio l&#8217;installazione di OpenOffice e GIMP per Windows a tutti. L&#8217;installazione di Ubuntu è invece una operazione più delicata e non necessaria ai fini del corso.</p>
<h2>Installazione di OpenOffice, gedit e GIMP su Windows</h2>
<p>OpenOffice può essere scaricato dal seguente sito: <a href="http://www.openoffice.org/it/">[link]</a>. In particolare, l&#8217;ultima versione di OpenOffice per Windows è scaricabile da questo indirizzo: <a href="http://mirror2.mirror.garr.it/mirrors/openoffice/localized/it/3.3.0/OOo_3.3.0_Win_x86_install-wJRE_it.exe">[link]</a>. Una volta scaricato il file di installazione, seguite le istruzioni a video.</p>
<p>L&#8217;editor di testo gedit può essere scaricato dal seguente sito: <a href="http://live.gnome.org/Gedit/Windows">[link]</a>. In particolare, l&#8217;ultima versione di gedit per Windows è scaricabile da questo indirizzo: <a href="http://ftp.gnome.org/pub/gnome/binaries/win32/gedit/2.30/gedit-setup-2.30.1-1.exe">[link]</a>. Una volta scaricato il file di installazione, seguite le istruzioni a video.</p>
<p>GIMP può essere scaricato dal seguente sito: <a href="http://gimpitalia.it/download/">[link]</a>. In particolare, l&#8217;ultima versione di GIMP per Windows è scaricabile da questo indirizzo: <a href="http://downloads.sourceforge.net/gimp-win/gimp-2.6.12-i686-setup-2.exe?use_mirror=">[link]</a>. Una volta scaricato il file di installazione, seguite le istruzioni a video.</p>
<h2>Installazione di Ubuntu da Windows</h2>
<p>Tutti i software che usiamo al corso sono disponibili anche per Windows, quindi non c&#8217;è alcun bisogno di installare Ubuntu sul vostro PC. Se volete comunque installare Ubuntu, il consiglio è di installare l&#8217;ultima versione (quelle in laboratorio sono datate e presto non saranno più supportate). Fatevi aiutare da qualcuno abbastanza esperto da gestire i possibili imprevisti dell&#8217;operazione che andiamo a fare.</p>
<div class="myui-highlight">
  <strong>Attenzione!</strong> Salvate tutti i file personali su qualche disco esterno. Installare un sistema operativo è una operazione delicata. Se qualcosa dovesse andare storto, potreste rischiare di perdere tutti i dati.
</div>
<p>La procedura da seguire è la seguente:</p>
<ol>
<li>Scaricare il file per l&#8217;installazione:
<ul>
<li>Accedere a questa pagina: <a href="http://www.ubuntu.com/download/ubuntu/windows-installer" target="_blank">[link]</a></li>
<li>Cliccare su <strong>Start download</strong></li>
<li>Attendere il download del file</li>
</ul>
</li>
<li>Avviare l&#8217;installazione (doppio-click sul file)</li>
<li>Specificare lingua, username e password che si intendono utilizzare</li>
<li>Cliccare su <strong>Install</strong> e attendere la fine dell&#8217;installazione</li>
<li>Selezionare <strong>Reboot now</strong> e cliccare su <strong>Finish</strong></li>
<li>Al riavvio dovreste poter selezionare il sistema operativo da avviare (Windows oppure Ubuntu)</li>
</ol>
<p>GIMP è installato di default in Ubuntu 11.10. OpenOffice è invece stato sostituito da LibreOffice, una versione di OpenOffice modificata. Se volete installare l&#8217;OpenOffice originale, dovete prima disinstallare LibreOffice da <strong>Applicazioni | Ubuntu Software Center</strong>, quindi scaricare l&#8217;ultima versione di OpenOffice per Ubuntu dal seguente indirizzo: <a href="http://mirror2.mirror.garr.it/mirrors/openoffice/localized/it/3.3.0/OOo_3.3.0_Linux_x86_install-deb_it.tar.gz">[link]</a>. Scaricato il file, doppio-click e seguire le istruzioni.</p>
]]></content:encoded>
			<wfw:commentRss>http://alviano.com/2012/04/10/software-installato-nei-laboratori/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Esercizio su Elaborazione di testi</title>
		<link>http://alviano.com/2012/04/03/esercizio-su-elaborazione-di-test/</link>
		<comments>http://alviano.com/2012/04/03/esercizio-su-elaborazione-di-test/#comments</comments>
		<pubDate>Tue, 03 Apr 2012 10:05:11 +0000</pubDate>
		<dc:creator>malvi</dc:creator>
				<category><![CDATA[Didattica]]></category>
		<category><![CDATA[Informatica - CdL Scienze dell'educazione]]></category>

		<guid isPermaLink="false">http://alviano.com/?p=714</guid>
		<description><![CDATA[Scaricate il documento (in formato PDF) tramite il seguente link: [download]. Provate a riprodurre il documento seguendo le indicazioni date dalle note di chiusura (si trovano nell&#8217;ultima pagina; il vostro documento non deve includere queste note di chiusura). Quasi tutti gli aspetti di Open Office Writer visti a lezione sono usati in questo documento. Chi [...]]]></description>
			<content:encoded><![CDATA[<p>Scaricate il documento (in formato PDF) tramite il seguente link: <a href="http://archives.alviano.com/teaching/infoedu/inf-2011-2012/E01 - Elaborazione di testi - Esercizio.pdf">[download]</a>.</p>
<p>Provate a riprodurre<span id="more-714"></span> il documento seguendo le indicazioni date dalle note di chiusura (si trovano nell&#8217;ultima pagina; il vostro documento non deve includere queste note di chiusura). Quasi tutti gli aspetti di Open Office Writer visti a lezione sono usati in questo documento. Chi vuole, può mandarmi una mail (<strong>entro il 15/04/2012</strong>) allegando un archivio (.zip) contenente il documento OpenOffice (.odt) e la stampa PDF (.pdf). Come oggetto indicate <em>Esercizio 1</em>. Mettete in CC Kristian Reale.</p>
<div class="myui-highlight" data-icon="alert">
  <strong>Attenzione!</strong> L&#8217;esercizio non comporta alcuna valutazione per l&#8217;esame.
</div>
<div class="myui-highlight" data-icon="alert">
  <strong>Attenzione!</strong> Mandare per email solo gli elaborati finali. Se qualcosa dell&#8217;esercizio non è chiaro, dovete indicarlo direttamente nel vostro elaborato, usando una nota o un commento (per favore, non chiedete chiarimenti per email).
</div>
]]></content:encoded>
			<wfw:commentRss>http://alviano.com/2012/04/03/esercizio-su-elaborazione-di-test/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Sistemi di elaborazione delle informazioni &#8211; Esercizi tipo</title>
		<link>http://alviano.com/2012/02/02/sistemi-di-elaborazione-delle-informazioni-esercizi-tipo/</link>
		<comments>http://alviano.com/2012/02/02/sistemi-di-elaborazione-delle-informazioni-esercizi-tipo/#comments</comments>
		<pubDate>Thu, 02 Feb 2012 14:42:02 +0000</pubDate>
		<dc:creator>malvi</dc:creator>
				<category><![CDATA[Didattica]]></category>
		<category><![CDATA[Informatica - CdL Scienze dell'educazione]]></category>

		<guid isPermaLink="false">http://alviano.com/?p=582</guid>
		<description><![CDATA[Di seguito, alcuni esercizi tipo dell&#8217;esame di Sistemi di elaborazione delle informazioni.]]></description>
			<content:encoded><![CDATA[<p>Di seguito, alcuni esercizi tipo dell&#8217;esame di Sistemi di <span id="more-582"></span>elaborazione delle informazioni.</p>
<p><img src="http://archives.alviano.com/teaching/introedu/EserciziTipo/CodificaImmagini.png" /><br />
<img src="http://archives.alviano.com/teaching/introedu/EserciziTipo/CalcoloProposizionale.png" /><br />
<img src="http://archives.alviano.com/teaching/introedu/EserciziTipo/ConversioneBase.png" /><br />
<img src="http://archives.alviano.com/teaching/introedu/EserciziTipo/ConversioneByte.png" /></p>
]]></content:encoded>
			<wfw:commentRss>http://alviano.com/2012/02/02/sistemi-di-elaborazione-delle-informazioni-esercizi-tipo/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>PLY &#8211; A patch for file parsing</title>
		<link>http://alviano.com/2010/04/13/ply-a-patch-for-file-parsing/</link>
		<comments>http://alviano.com/2010/04/13/ply-a-patch-for-file-parsing/#comments</comments>
		<pubDate>Tue, 13 Apr 2010 10:44:28 +0000</pubDate>
		<dc:creator>malvi</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[Python]]></category>

		<guid isPermaLink="false">http://blog.alviano.com/?p=349</guid>
		<description><![CDATA[PLY is a Python Lex-Yacc parsing tool. Defining a parser in PLY is quite simple, and for a high-level language such as Python this is the key feature. A lack I noted in PLY is the inability of efficiently parsing a file (maybe I am wrong; in this case, I apologize in advance). Specifically, the [...]]]></description>
			<content:encoded><![CDATA[<p>PLY is a Python Lex-Yacc parsing tool. Defining a parser in PLY is quite simple, and for a high-level language such as Python this is the key feature. A lack I noted in PLY is the inability of efficiently parsing a file<span id="more-688"></span> (maybe I am wrong; in this case, I apologize in advance). Specifically, the <code>yacc.parse()</code> method requires an <code>input</code> parameter. This parameter is used by the lexer for tokens identification. Tokens identification is obtained by applying Python regular expressions, and so <code>input</code> is required to be a <code>string</code>. Thus, the only way to parse a file is to read it in a string and then to invoke <code>yacc.parse()</code> on this string. This is really inefficient. Another approach could be to constraint parsed objects to fit on a single line, but this is a good idea only for simple parsers.</p>
<h2>The patch</h2>
<p>The solution proposed here is to modify the parse methods in order to invoke the lexer one-line-per-time. When the lexer returns a <code>None</code> token, the parser reads the next line and pass it to the lexer, until the end of the file is reached. </p>
<p>Only few lines of code in the file <code>ply/yacc.py</code> need to be changed. The patch is reported below.</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
</pre></td><td class="code"><pre class="python" style="font-family:monospace;">--- ply-<span style="color: #ff4500;">3.3</span>-orig/ply/yacc.<span style="color: black;">py</span>	<span style="color: #ff4500;">2009</span>-09-02 <span style="color: #ff4500;">16</span>:<span style="color: #ff4500;">27</span>:<span style="color: #ff4500;">23.000000000</span> +0200
+++ ply-<span style="color: #ff4500;">3.3</span>-patched/ply/yacc.<span style="color: black;">py</span>	<span style="color: #ff4500;">2010</span>-04-<span style="color: #ff4500;">13</span> <span style="color: #ff4500;">11</span>:<span style="color: #ff4500;">30</span>:<span style="color: #ff4500;">28.753330468</span> +0200
@@ -<span style="color: #ff4500;">303</span>,<span style="color: #ff4500;">7</span> +<span style="color: #ff4500;">303</span>,<span style="color: #ff4500;">7</span> @@
&nbsp;
         <span style="color: #808080; font-style: italic;"># If input was supplied, pass to lexer</span>
         <span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #008000;">input</span> <span style="color: #ff7700;font-weight:bold;">is</span> <span style="color: #ff7700;font-weight:bold;">not</span> <span style="color: #008000;">None</span>:
-            lexer.<span style="color: #008000;">input</span><span style="color: black;">&#40;</span><span style="color: #008000;">input</span><span style="color: black;">&#41;</span>
+            lexer.<span style="color: #008000;">input</span><span style="color: black;">&#40;</span><span style="color: #008000;">input</span>.<span style="color: #dc143c;">readline</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
&nbsp;
         <span style="color: #ff7700;font-weight:bold;">if</span> tokenfunc <span style="color: #ff7700;font-weight:bold;">is</span> <span style="color: #008000;">None</span>:
            <span style="color: #808080; font-style: italic;"># Tokenize function</span>
@@ -<span style="color: #ff4500;">341</span>,<span style="color: #ff4500;">6</span> +<span style="color: #ff4500;">341</span>,<span style="color: #ff4500;">11</span> @@
             <span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #ff7700;font-weight:bold;">not</span> lookahead:
                 <span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #ff7700;font-weight:bold;">not</span> lookaheadstack:
                     lookahead = get_token<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>     <span style="color: #808080; font-style: italic;"># Get the next token</span>
+                    
+                    <span style="color: #808080; font-style: italic;"># If we finished with the current line, then process the next</span>
+                    <span style="color: #ff7700;font-weight:bold;">if</span> lookahead <span style="color: #ff7700;font-weight:bold;">is</span> <span style="color: #008000;">None</span> <span style="color: #ff7700;font-weight:bold;">and</span> <span style="color: #008000;">input</span> <span style="color: #ff7700;font-weight:bold;">is</span> <span style="color: #ff7700;font-weight:bold;">not</span> <span style="color: #008000;">None</span>:
+                        lexer.<span style="color: #008000;">input</span><span style="color: black;">&#40;</span><span style="color: #008000;">input</span>.<span style="color: #dc143c;">readline</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span><span style="color: #66cc66;">;</span>
+                        lookahead = get_token<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>     <span style="color: #808080; font-style: italic;"># Get the next token</span>
                 <span style="color: #ff7700;font-weight:bold;">else</span>:
                     lookahead = lookaheadstack.<span style="color: black;">pop</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
                 <span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #ff7700;font-weight:bold;">not</span> lookahead:
@@ -<span style="color: #ff4500;">614</span>,<span style="color: #ff4500;">7</span> +<span style="color: #ff4500;">619</span>,<span style="color: #ff4500;">7</span> @@
&nbsp;
         <span style="color: #808080; font-style: italic;"># If input was supplied, pass to lexer</span>
         <span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #008000;">input</span> <span style="color: #ff7700;font-weight:bold;">is</span> <span style="color: #ff7700;font-weight:bold;">not</span> <span style="color: #008000;">None</span>:
-            lexer.<span style="color: #008000;">input</span><span style="color: black;">&#40;</span><span style="color: #008000;">input</span><span style="color: black;">&#41;</span>
+            lexer.<span style="color: #008000;">input</span><span style="color: black;">&#40;</span><span style="color: #008000;">input</span>.<span style="color: #dc143c;">readline</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
&nbsp;
         <span style="color: #ff7700;font-weight:bold;">if</span> tokenfunc <span style="color: #ff7700;font-weight:bold;">is</span> <span style="color: #008000;">None</span>:
            <span style="color: #808080; font-style: italic;"># Tokenize function</span>
@@ -<span style="color: #ff4500;">647</span>,<span style="color: #ff4500;">6</span> +<span style="color: #ff4500;">652</span>,<span style="color: #ff4500;">11</span> @@
             <span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #ff7700;font-weight:bold;">not</span> lookahead:
                 <span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #ff7700;font-weight:bold;">not</span> lookaheadstack:
                     lookahead = get_token<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>     <span style="color: #808080; font-style: italic;"># Get the next token</span>
+
+                    <span style="color: #808080; font-style: italic;"># If we finished with the current line, then process the next</span>
+                    <span style="color: #ff7700;font-weight:bold;">if</span> lookahead <span style="color: #ff7700;font-weight:bold;">is</span> <span style="color: #008000;">None</span> <span style="color: #ff7700;font-weight:bold;">and</span> <span style="color: #008000;">input</span> <span style="color: #ff7700;font-weight:bold;">is</span> <span style="color: #ff7700;font-weight:bold;">not</span> <span style="color: #008000;">None</span>:
+                        lexer.<span style="color: #008000;">input</span><span style="color: black;">&#40;</span><span style="color: #008000;">input</span>.<span style="color: #dc143c;">readline</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span><span style="color: #66cc66;">;</span>
+                        lookahead = get_token<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>     <span style="color: #808080; font-style: italic;"># Get the next token </span>
                 <span style="color: #ff7700;font-weight:bold;">else</span>:
                     lookahead = lookaheadstack.<span style="color: black;">pop</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
                 <span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #ff7700;font-weight:bold;">not</span> lookahead:
@@ -<span style="color: #ff4500;">886</span>,<span style="color: #ff4500;">7</span> +<span style="color: #ff4500;">896</span>,<span style="color: #ff4500;">7</span> @@
&nbsp;
         <span style="color: #808080; font-style: italic;"># If input was supplied, pass to lexer</span>
         <span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #008000;">input</span> <span style="color: #ff7700;font-weight:bold;">is</span> <span style="color: #ff7700;font-weight:bold;">not</span> <span style="color: #008000;">None</span>:
-            lexer.<span style="color: #008000;">input</span><span style="color: black;">&#40;</span><span style="color: #008000;">input</span><span style="color: black;">&#41;</span>
+            lexer.<span style="color: #008000;">input</span><span style="color: black;">&#40;</span><span style="color: #008000;">input</span>.<span style="color: #dc143c;">readline</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
&nbsp;
         <span style="color: #ff7700;font-weight:bold;">if</span> tokenfunc <span style="color: #ff7700;font-weight:bold;">is</span> <span style="color: #008000;">None</span>:
            <span style="color: #808080; font-style: italic;"># Tokenize function</span>
@@ -<span style="color: #ff4500;">919</span>,<span style="color: #ff4500;">6</span> +<span style="color: #ff4500;">929</span>,<span style="color: #ff4500;">11</span> @@
             <span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #ff7700;font-weight:bold;">not</span> lookahead:
                 <span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #ff7700;font-weight:bold;">not</span> lookaheadstack:
                     lookahead = get_token<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>     <span style="color: #808080; font-style: italic;"># Get the next token</span>
+
+                    <span style="color: #808080; font-style: italic;"># If we finished with the current line, then process the next</span>
+                    <span style="color: #ff7700;font-weight:bold;">if</span> lookahead <span style="color: #ff7700;font-weight:bold;">is</span> <span style="color: #008000;">None</span> <span style="color: #ff7700;font-weight:bold;">and</span> <span style="color: #008000;">input</span> <span style="color: #ff7700;font-weight:bold;">is</span> <span style="color: #ff7700;font-weight:bold;">not</span> <span style="color: #008000;">None</span>:
+                        lexer.<span style="color: #008000;">input</span><span style="color: black;">&#40;</span><span style="color: #008000;">input</span>.<span style="color: #dc143c;">readline</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span><span style="color: #66cc66;">;</span>
+                        lookahead = get_token<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>     <span style="color: #808080; font-style: italic;"># Get the next token</span>
                 <span style="color: #ff7700;font-weight:bold;">else</span>:
                     lookahead = lookaheadstack.<span style="color: black;">pop</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
                 <span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #ff7700;font-weight:bold;">not</span> lookahead:</pre></td></tr></table></div>

<p>For applying the patch:</p>
<ol>
<li>Download and unpack PLY from the <a href="http://www.dabeaz.com/ply/">author site</a> (patched version <a href="http://www.dabeaz.com/ply/ply-3.3.tar.gz">3.3</a>).</li>
<li>Move on the <code>ply-3.3/ply</code> directory.</li>
<li>Save the patch above in a file <code>ply.patch</code> in this directory.</li>
<li>Execute <code>patch &lt;ply.patch</code> to apply the patch.</li>
</ol>
<h2>Usage examples</h2>
<p>Let&#8217;s try the patched version with the <code>ply-3.3/example/calc.py</code> example. Substitute the <code>while</code> loop with the following code.</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
</pre></td><td class="code"><pre class="python" style="font-family:monospace;">f = <span style="color: #008000;">open</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'data.txt'</span><span style="color: black;">&#41;</span>
yacc.<span style="color: black;">parse</span><span style="color: black;">&#40;</span>f<span style="color: black;">&#41;</span>
f.<span style="color: black;">close</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span></pre></td></tr></table></div>

<p>In the code above, <code>data.txt</code> is the file to be parsed. The file can contain any valid expression, eventually splitted on multiple lines (because in the lexer defined in <code>calc.py</code> carriage returns are ignored). For example, if the file is</p>

<div class="wp_syntax"><div class="code"><pre class="txt" style="font-family:monospace;">1 +
2 +
3 +
4 +
5</pre></div></div>

<p>the output of <code>calc.py</code> will be</p>

<div class="wp_syntax"><div class="code"><pre class="sh" style="font-family:monospace;">$ python calc.py 
15</pre></div></div>

<p>For parsing the standard input, just replace the file with the<code>sys.stdin</code> object (importing the <code>sys</code> module).</p>
<p>Parsing a string is still possible by using the <code>StringIO</code> module of Python, as shown below.</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
</pre></td><td class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">StringIO</span>
yacc.<span style="color: black;">parse</span><span style="color: black;">&#40;</span><span style="color: #dc143c;">StringIO</span>.<span style="color: #dc143c;">StringIO</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;1 + 2 + 3 + 4 + 5&quot;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span></pre></td></tr></table></div>

<p>And parsing each line independently is quite easily achievable.</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="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">StringIO</span>
<span style="color: #008000;">file</span> = <span style="color: #008000;">open</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'data2.txt'</span><span style="color: black;">&#41;</span>
line = <span style="color: #008000;">file</span>.<span style="color: #dc143c;">readline</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
<span style="color: #ff7700;font-weight:bold;">while</span> line <span style="color: #66cc66;">!</span>= <span style="color: #483d8b;">&quot;&quot;</span>:
    yacc.<span style="color: black;">parse</span><span style="color: black;">&#40;</span><span style="color: #dc143c;">StringIO</span>.<span style="color: #dc143c;">StringIO</span><span style="color: black;">&#40;</span>line<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
    line = <span style="color: #008000;">file</span>.<span style="color: #dc143c;">readline</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
f.<span style="color: black;">close</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span></pre></td></tr></table></div>

<p>If <code>data2.txt</code> contains</p>

<div class="wp_syntax"><div class="code"><pre class="txt" style="font-family:monospace;">1 + 1
2 + 2
3 + 3 
4 + 4
5</pre></div></div>

<p>the output will be</p>

<div class="wp_syntax"><div class="code"><pre class="sh" style="font-family:monospace;">$ python calc.py 
2
4
6
8
5</pre></div></div>

]]></content:encoded>
			<wfw:commentRss>http://alviano.com/2010/04/13/ply-a-patch-for-file-parsing/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Programmazione a oggetti &#8211; Appello straordinario Aprile 2010</title>
		<link>http://alviano.com/2010/04/12/programmazione-a-oggetti-appello-straordinario-aprile-2010/</link>
		<comments>http://alviano.com/2010/04/12/programmazione-a-oggetti-appello-straordinario-aprile-2010/#comments</comments>
		<pubDate>Mon, 12 Apr 2010 14:53:33 +0000</pubDate>
		<dc:creator>malvi</dc:creator>
				<category><![CDATA[Didattica]]></category>
		<category><![CDATA[Programmazione a oggetti]]></category>

		<guid isPermaLink="false">http://blog.alviano.com/?p=329</guid>
		<description><![CDATA[In questo articolo mostriamo una possibile soluzione all&#8217;appello straordinario di Aprile 2010 del corso di Programmazione a oggetti del corso di laurea in informatica dell&#8217;Università della Calabria. Iniziamo col riportare i file forniti in sede d&#8217;esame, contenti la descrizione del problema e delle funzioni da implementare. In particolare, il file Voto.h definisce una classe per [...]]]></description>
			<content:encoded><![CDATA[<p>In questo articolo mostriamo una possibile soluzione all&#8217;appello straordinario di Aprile 2010 del corso di <a href="https://www.mat.unical.it/informatica/Programmazione_ad_Oggetti">Programmazione a oggetti</a> del<span id="more-687"></span> corso di <a href="https://www.mat.unical.it/informatica">laurea in informatica</a> dell&#8217;<a href="http://www.unical.it/">Università della Calabria</a>.</p>
<p>Iniziamo col riportare i file forniti in sede d&#8217;esame, contenti la descrizione del problema e delle funzioni da implementare. In particolare, il file <code>Voto.h</code> definisce una classe per modellare l&#8217;espressione di una preferenza di un elettore in una ipotetica elezione.</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
</pre></td><td class="code"><pre class="cpp" style="font-family:monospace;"><span style="color: #666666;">// File: Voto.h</span>
&nbsp;
<span style="color: #339900;">#ifndef VOTO_H_</span>
<span style="color: #339900;">#define VOTO_H_</span>
&nbsp;
<span style="color: #339900;">#include&lt;string&gt;</span>
<span style="color: #0000ff;">using</span> <span style="color: #0000ff;">namespace</span> std<span style="color: #008080;">;</span>
&nbsp;
<span style="color: #0000ff;">enum</span> Tipo <span style="color: #008000;">&#123;</span> SENATO <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span>, CAMERA, REGIONE <span style="color: #008000;">&#125;</span><span style="color: #008080;">;</span>
&nbsp;
<span style="color: #ff0000; font-style: italic;">/*
&nbsp;
Un oggetto di tipo Voto rappresenta l'espressione di una preferenza di un elettore
su una delle tre possibili schede: SENATO, CAMERA e REGIONE.
&nbsp;
Se il flag &quot;nullo&quot; e' true, allora il voto e' nullo.
&nbsp;
Se &quot;coalizione&quot; e' la stringa vuota, allora il voto equivale ad una scheda bianca
(chiaramente cio' vale solo se il flag &quot;nullo&quot; e' false; se fosse true la scheda
sarebbe nulla indipendentemente dal campo &quot;coalizione&quot;).
&nbsp;
Questa classe e' gia' implementata e non necessita di modifiche.
Eventuali metodi accessori sono comunque ammessi.
&nbsp;
*/</span>
<span style="color: #0000ff;">class</span> Voto
<span style="color: #008000;">&#123;</span>
<span style="color: #0000ff;">private</span><span style="color: #008080;">:</span>
	string coalizione<span style="color: #008080;">;</span>
	Tipo tipo<span style="color: #008080;">;</span>
	<span style="color: #0000ff;">bool</span> nullo<span style="color: #008080;">;</span>
&nbsp;
<span style="color: #0000ff;">public</span><span style="color: #008080;">:</span>
	Voto<span style="color: #008000;">&#40;</span>string <span style="color: #000080;">=</span><span style="color: #FF0000;">&quot;&quot;</span>, Tipo <span style="color: #000080;">=</span> SENATO, <span style="color: #0000ff;">bool</span> <span style="color: #000080;">=</span> <span style="color: #0000ff;">false</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
&nbsp;
	string dammiCoalizione<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span> <span style="color: #0000ff;">const</span><span style="color: #008080;">;</span>
	Tipo dammiTipo<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span> <span style="color: #0000ff;">const</span><span style="color: #008080;">;</span>
	<span style="color: #0000ff;">bool</span> dimmiSeNullo<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span> <span style="color: #0000ff;">const</span><span style="color: #008080;">;</span>
&nbsp;
	<span style="color: #0000ff;">void</span> impostaCoalizione<span style="color: #008000;">&#40;</span>string<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	<span style="color: #0000ff;">void</span> impostaTipo<span style="color: #008000;">&#40;</span>Tipo<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	<span style="color: #0000ff;">void</span> impostaNullo<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">bool</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
&nbsp;
	<span style="color: #0000ff;">bool</span> operator<span style="color: #000080;">==</span><span style="color: #008000;">&#40;</span><span style="color: #0000ff;">const</span> Voto<span style="color: #000040;">&amp;</span><span style="color: #008000;">&#41;</span> <span style="color: #0000ff;">const</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span><span style="color: #008080;">;</span>
&nbsp;
<span style="color: #339900;">#endif</span></pre></td></tr></table></div>

<p>La classe <code>Voto</code> è già implementata e ci limitiamo a riportarla di seguito.</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
</pre></td><td class="code"><pre class="cpp" style="font-family:monospace;"><span style="color: #666666;">// File: Voto.cpp</span>
&nbsp;
<span style="color: #339900;">#include &quot;Voto.h&quot;</span>
&nbsp;
Voto<span style="color: #008080;">::</span><span style="color: #007788;">Voto</span><span style="color: #008000;">&#40;</span>string c, Tipo t, <span style="color: #0000ff;">bool</span> n<span style="color: #008000;">&#41;</span><span style="color: #008080;">:</span>coalizione<span style="color: #008000;">&#40;</span>c<span style="color: #008000;">&#41;</span>, tipo<span style="color: #008000;">&#40;</span>t<span style="color: #008000;">&#41;</span>, nullo<span style="color: #008000;">&#40;</span>n<span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span><span style="color: #008000;">&#125;</span>
&nbsp;
string Voto<span style="color: #008080;">::</span><span style="color: #007788;">dammiCoalizione</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span> <span style="color: #0000ff;">const</span>
<span style="color: #008000;">&#123;</span>
	<span style="color: #0000ff;">return</span> coalizione<span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span>
&nbsp;
Tipo Voto<span style="color: #008080;">::</span><span style="color: #007788;">dammiTipo</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span> <span style="color: #0000ff;">const</span>
<span style="color: #008000;">&#123;</span>
	<span style="color: #0000ff;">return</span> tipo<span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span>
&nbsp;
<span style="color: #0000ff;">bool</span> Voto<span style="color: #008080;">::</span><span style="color: #007788;">dimmiSeNullo</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span> <span style="color: #0000ff;">const</span>
<span style="color: #008000;">&#123;</span>
	<span style="color: #0000ff;">return</span> nullo<span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span>
&nbsp;
<span style="color: #0000ff;">void</span> Voto<span style="color: #008080;">::</span><span style="color: #007788;">impostaCoalizione</span><span style="color: #008000;">&#40;</span>string c<span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
	coalizione <span style="color: #000080;">=</span> c<span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span>
&nbsp;
<span style="color: #0000ff;">void</span> Voto<span style="color: #008080;">::</span><span style="color: #007788;">impostaTipo</span><span style="color: #008000;">&#40;</span>Tipo t<span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
	tipo <span style="color: #000080;">=</span> t<span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span>
&nbsp;
<span style="color: #0000ff;">void</span> Voto<span style="color: #008080;">::</span><span style="color: #007788;">impostaNullo</span><span style="color: #008000;">&#40;</span><span style="color: #0000ff;">bool</span> t<span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
	nullo <span style="color: #000080;">=</span> t<span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span>
&nbsp;
<span style="color: #0000ff;">bool</span> Voto<span style="color: #008080;">::</span><span style="color: #007788;">operator</span><span style="color: #000080;">==</span><span style="color: #008000;">&#40;</span><span style="color: #0000ff;">const</span> Voto<span style="color: #000040;">&amp;</span> o<span style="color: #008000;">&#41;</span> <span style="color: #0000ff;">const</span>
<span style="color: #008000;">&#123;</span>
	<span style="color: #0000ff;">return</span> coalizione <span style="color: #000080;">==</span> o.<span style="color: #007788;">coalizione</span> <span style="color: #000040;">&amp;&amp;</span> tipo <span style="color: #000080;">==</span> o.<span style="color: #007788;">tipo</span> <span style="color: #000040;">&amp;&amp;</span> nullo <span style="color: #000080;">==</span> o.<span style="color: #007788;">nullo</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span></pre></td></tr></table></div>

<p>Nel file <code>Urna.h</code> troviamo invece la definzione di una classe che modella un&#8217;urna elettorale. L&#8217;esercizio consiste nell&#8217;implementare quattro metodi di questa classe.</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
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
</pre></td><td class="code"><pre class="cpp" style="font-family:monospace;"><span style="color: #666666;">// File: Urna.h</span>
&nbsp;
<span style="color: #339900;">#ifndef URNA_H</span>
<span style="color: #339900;">#define URNA_H</span>
&nbsp;
<span style="color: #339900;">#include &quot;Voto.h&quot;</span>
<span style="color: #339900;">#include &lt;cstdlib&gt;</span>
<span style="color: #339900;">#include &lt;iostream&gt;</span>
<span style="color: #339900;">#include &lt;list&gt;</span>
<span style="color: #0000ff;">using</span> <span style="color: #0000ff;">namespace</span> std<span style="color: #008080;">;</span>
&nbsp;
<span style="color: #ff0000; font-style: italic;">/* 
&nbsp;
Questa classe modella un'URNA contente solo schede votate.
Assumiamo che un oggetto di tipo Voto rappresenti una scheda votata,
che puo' essere anche nulla o bianca (come specificato nella documentazione
della classe Voto).
Quindi, l'urna sara' rappresentata da una lista di istanze della classe Voto
(nello specifico, la lista &quot;voti&quot;).
&nbsp;
I voti sono esattamente di 3 tipi,
come specificato nella classe Voto (senato, camera e regione).
&nbsp;
Ogni elettore *deve* votare tutte e tre le schede, ma l'ordine in cui 
le tre schede votate (ovvero i tre oggetti di tipo Voto) vengono 
inserite nell'urna e' a sua discrezione.
Di conseguenza, dopo che un elettore ha votato e inserito tutte
e tre le schede nell'urna, la dimensione dell'urna sara' un multiplo di 3
(nello specifico, 3 moltiplicato il numero di elettori che hanno votato).
&nbsp;
Ad esempio, dopo quattro votanti, il tipo delle schede presenti nell'urna 
potrebbe essere il seguente:
&nbsp;
Urna = [CAMERA,     REGIONE,    SENATO, 
        SENATO,     CAMERA,     REGIONE, 
        SENATO,     REGIONE,    CAMERA,
        CAMERA,     SENATO,     REGIONE ]
&nbsp;
Si richiede di implementare nel file Urna.cpp
tutti i metodi di questa classe ad eccezione del costruttore
(la cui implementazione e' data e non puo' essere modificata).
&nbsp;
 */</span>
<span style="color: #0000ff;">class</span> Urna <span style="color: #666666;">// questa riga e' corretta NON MODIFICARE</span>
<span style="color: #008000;">&#123;</span>
&nbsp;
<span style="color: #0000ff;">private</span><span style="color: #008080;">:</span>
    <span style="color: #666666;">// Le schede dell' URNA sono memorizzate in una lista.</span>
    list<span style="color: #000080;">&lt;</span>Voto<span style="color: #000080;">&gt;</span> voti<span style="color: #008080;">;</span>
&nbsp;
<span style="color: #0000ff;">public</span><span style="color: #008080;">:</span>
&nbsp;
    <span style="color: #ff0000; font-style: italic;">/*
&nbsp;
    Questo metodo aggiunge una scheda all'urna solo se non viola la suddetta struttura dell'urna.
    In questo caso, il metodo ritorna true.
    Altrimenti, se la proprieta' non e' soddisfatta, restituisce false senza inserire la scheda.
&nbsp;
    Ad esempio, se il tipo delle schede nell'urna e' il seguente:
&nbsp;
    Urna = [SENATO,     CAMERA,     REGIONE,
            REGIONE ]
&nbsp;
    il metodo restituira' true solo se la scheda e' di tipo CAMERA o SENATO.
&nbsp;
    */</span>
    <span style="color: #0000ff;">bool</span> aggiungiVoto<span style="color: #008000;">&#40;</span>Voto v<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
&nbsp;
    <span style="color: #ff0000; font-style: italic;">/*
&nbsp;
    Dato un Tipo, il metodo restituisce true se e solo se il numero di schede nulle di quel tipo
    e` maggiore o uguale al numero di schede nulle degli altri tipi (presi singolarmente).
    Ad esempio, se l'urna contenesse i seguenti voti:
&nbsp;
    Urna = [(&quot;Coal1&quot;, CAMERA,  true),  (&quot;Coal1&quot;, REGIONE, false), (&quot;Coal2&quot;, SENATO, false), 
            (&quot;Coal1&quot;, REGIONE, true),  (&quot;Coal2&quot;, CAMERA,  false), (&quot;&quot;,      SENATO, false), 
            (&quot;Coal2&quot;, CAMERA,  true),  (&quot;Coal1&quot;, REGIONE, false), (&quot;Coal2&quot;, SENATO, false) ]
&nbsp;
    il metodo &quot;maggioranzaVotiNulli(CAMERA)&quot;  restituirebbe true  (due nulle),
    il metodo &quot;maggioranzaVotiNulli(REGIONE)&quot; restituirebbe false (una nulla),
    il metodo &quot;maggioranzaVotiNulli(SENATO)&quot;  restituirebbe false (zero nulle).
&nbsp;
    */</span>
    <span style="color: #0000ff;">bool</span> maggioranzaVotiNulli<span style="color: #008000;">&#40;</span>Tipo t<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
&nbsp;
    <span style="color: #ff0000; font-style: italic;">/*
&nbsp;
    Dato un Tipo, restituire la lista di coalizione con piu' voti per quel Tipo.
    Se piu' di una coalizione risulta vincente, la lista deve essere costruita
    dando priorita' alla coalizione che per prima ha preso un voto valido.
    Ad esempio, se l'urna contenesse i seguenti voti:
&nbsp;
    Urna = [(&quot;Coal1&quot;, CAMERA,  false), (&quot;Coal1&quot;, REGIONE, false), (&quot;Coal2&quot;, SENATO, false), 
            (&quot;Coal1&quot;, REGIONE, true),  (&quot;Coal2&quot;, CAMERA,  false), (&quot;&quot;,      SENATO, true), 
            (&quot;Coal2&quot;, CAMERA,  false), (&quot;Coal1&quot;, REGIONE, false), (&quot;Coal2&quot;, SENATO, false), 
            (&quot;&quot;,      SENATO,  false), (&quot;Coal1&quot;, REGIONE, true),  (&quot;Coal1&quot;, CAMERA, true),
            (&quot;Coal1&quot;, CAMERA,  false), (&quot;Coal1&quot;, REGIONE, false), (&quot;Coal2&quot;, SENATO, false) ]
&nbsp;
    il metodo &quot;coalizioniVincenti(CAMERA)&quot; restituirebbe [&quot;Coal1&quot;, &quot;Coal2&quot;] in quest'ordine. 
    Infatti, &quot;Coal1&quot; ha due voti validi (righe 1 e 5; la riga 4 ha un voto nullo).
    Allo stesso modo, &quot;Coal2&quot; ha due voti validi (righe 2 e 3).
    &quot;Coal1&quot; precede &quot;Coal2&quot; nella lista restituita in quanto il primo voto valido
    di &quot;Coal1&quot; e' sulla riga 1, mentre per &quot;Coal2&quot; e' sulla riga 2.
&nbsp;
     */</span>
    list<span style="color: #000080;">&lt;</span>string<span style="color: #000080;">&gt;</span> coalizioniVincenti<span style="color: #008000;">&#40;</span>Tipo t<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
&nbsp;
    <span style="color: #ff0000; font-style: italic;">/*
&nbsp;
    Dato un Tipo, restituire la lista di coalizione con piu' voti consecutivi per quel Tipo.
    Se piu' di una coalizione soddisfa la condizione, la lista deve essere costruita
    dando priorita' alla coalizione che per prima ha preso un voto valido.
    Ad esempio, se l'urna contenesse i seguenti voti:
&nbsp;
    Urna = [(&quot;Coal1&quot;, CAMERA,  false), (&quot;Coal1&quot;, REGIONE, false), (&quot;Coal2&quot;, SENATO, false), 
            (&quot;Coal1&quot;, REGIONE, true),  (&quot;Coal2&quot;, CAMERA,  false), (&quot;&quot;,      SENATO, true), 
            (&quot;Coal2&quot;, CAMERA,  false), (&quot;Coal1&quot;, REGIONE, false), (&quot;Coal2&quot;, SENATO, false), 
            (&quot;&quot;,      SENATO,  false), (&quot;Coal1&quot;, REGIONE, true),  (&quot;Coal1&quot;, CAMERA, true),
            (&quot;Coal1&quot;, CAMERA,  false), (&quot;Coal1&quot;, REGIONE, false), (&quot;Coal2&quot;, SENATO, false) ]
&nbsp;
    il metodo &quot;coalizioniConSequenzePiuLunghe(CAMERA)&quot; restituirebbe [&quot;Coal2&quot;]. 
    Infatti, &quot;Coal1&quot; compare in due sequenze di lunghezza 1: la prima in riga 1, 
    la seconda in riga 5 (da notare che il voto per &quot;Coal1&quot; in riga 4 e' nullo).
    &quot;Coal2&quot;, invece, compare in una sola lista di lunghezza 2: da riga 2 a riga 3.
    Non essendoci altre coalizzioni votate alla CAMERA, &quot;Coal2&quot; risulta essere
    la sola coalizione con la sequenza piu' lunga di voti consecutivi alla CAMERA.
&nbsp;
    */</span>
&nbsp;
    list<span style="color: #000080;">&lt;</span>string<span style="color: #000080;">&gt;</span> coalizioniConSequenzePiuLunghe<span style="color: #008000;">&#40;</span>Tipo t<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
&nbsp;
    <span style="color: #0000ff;">inline</span> list<span style="color: #000080;">&lt;</span>Voto<span style="color: #000080;">&gt;</span><span style="color: #000040;">&amp;</span> getContent<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span><span style="color: #008080;">;</span>
&nbsp;
list<span style="color: #000080;">&lt;</span>Voto<span style="color: #000080;">&gt;</span><span style="color: #000040;">&amp;</span> Urna<span style="color: #008080;">::</span><span style="color: #007788;">getContent</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
    <span style="color: #0000ff;">return</span> voti<span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span>
&nbsp;
<span style="color: #339900;">#endif</span></pre></td></tr></table></div>

<h3>Urna::aggiungiVoto(Voto)</h3>
<p>La struttura dell&#8217;urna impone che ogni tripla di voti sia composta da un voto per il Senato, uno per la Camera e uno per la Regione, in un ordine qualsiasi. Quindi, se il numero di voti nell&#8217;urna è un multiplo di 3, quello che stiamo inserendo è un voto di un nuovo elettore; in questo caso non dovremo controllare nulla. Diversamente, se il numero di voti nell&#8217;urna diviso 3 da resto 1, quella che stiamo inserendo è la seconda scheda di un elettore; in questo caso dovremo verificare che il tipo del voto inserito sia diverso da quello precedentemente inserito. L&#8217;ultimo caso possibile è che il numero di voti nell&#8217;urna diviso 3 da resto 2, ovvero l&#8217;elettore sta inserendo il suo terzo voto; dobbiamo quindi verificare che il tipo del voto inserito sia diverso dagli ultimi due voti presenti nell&#8217;urna.</p>
<p>Di seguito sono riportate due possibili implementazioni del metodo. La prima fa uso della classe list::const_iterator per attraversare la lista e trovare gli ultimi due voti presenti nell&#8217;urna. La seconda implementazione ottiene lo stesso risultato in modo più efficiente facendo uso della classe list::const_reverse_iterator (iteratore all&#8217;inverso, dalla fine all&#8217;inizio).</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" style="font-family:monospace;"><span style="color: #0000ff;">bool</span> Urna<span style="color: #008080;">::</span><span style="color: #007788;">aggiungiVoto</span><span style="color: #008000;">&#40;</span>Voto v<span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
    <span style="color: #666666;">// Se non e' un voto di un nuovo elettore, allora controlliamo il tipo degli altri voti espressi dall'elettore</span>
    <span style="color: #0000ff;">if</span><span style="color: #008000;">&#40;</span>voti.<span style="color: #007788;">size</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span> <span style="color: #000040;">%</span> <span style="color: #0000dd;">3</span> <span style="color: #000080;">&gt;=</span> <span style="color: #0000dd;">1</span><span style="color: #008000;">&#41;</span>
    <span style="color: #008000;">&#123;</span>
        <span style="color: #666666;">// Troviamo gli ultimi due voti</span>
        Voto ultima, penultima<span style="color: #008080;">;</span>
        <span style="color: #0000ff;">for</span><span style="color: #008000;">&#40;</span>list<span style="color: #000080;">&lt;</span>Voto<span style="color: #000080;">&gt;</span><span style="color: #008080;">::</span><span style="color: #007788;">const_iterator</span> it <span style="color: #000080;">=</span> voti.<span style="color: #007788;">begin</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span> it <span style="color: #000040;">!</span><span style="color: #000080;">=</span> voti.<span style="color: #007788;">end</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span> it<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span>
        <span style="color: #008000;">&#123;</span>
            penultima <span style="color: #000080;">=</span> ultima<span style="color: #008080;">;</span>
            ultima <span style="color: #000080;">=</span> <span style="color: #000040;">*</span>it<span style="color: #008080;">;</span>
        <span style="color: #008000;">&#125;</span>
&nbsp;
        <span style="color: #666666;">// Non possiamo aggiungere un voto dello stesso tipo dell'ultimo voto presente nell'urna</span>
        <span style="color: #0000ff;">if</span><span style="color: #008000;">&#40;</span>v.<span style="color: #007788;">dammiTipo</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span> <span style="color: #000080;">==</span> ultima.<span style="color: #007788;">dammiTipo</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span>
            <span style="color: #0000ff;">return</span> <span style="color: #0000ff;">false</span><span style="color: #008080;">;</span>
&nbsp;
        <span style="color: #666666;">// Se questa e' la terza scheda di un elettore eseguiamo il controllo anche per il penultimo voto</span>
        <span style="color: #0000ff;">if</span><span style="color: #008000;">&#40;</span>voti.<span style="color: #007788;">size</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span> <span style="color: #000040;">%</span> <span style="color: #0000dd;">3</span> <span style="color: #000080;">==</span> <span style="color: #0000dd;">2</span> <span style="color: #000040;">&amp;&amp;</span> v.<span style="color: #007788;">dammiTipo</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span> <span style="color: #000080;">==</span> penultima.<span style="color: #007788;">dammiTipo</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span>
            <span style="color: #0000ff;">return</span> <span style="color: #0000ff;">false</span><span style="color: #008080;">;</span>
    <span style="color: #008000;">&#125;</span>
&nbsp;
    voti.<span style="color: #007788;">push_back</span><span style="color: #008000;">&#40;</span>v<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    <span style="color: #0000ff;">return</span> <span style="color: #0000ff;">true</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span></pre></td></tr></table></div>


<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" style="font-family:monospace;"><span style="color: #0000ff;">bool</span> Urna<span style="color: #008080;">::</span><span style="color: #007788;">aggiungiVoto</span><span style="color: #008000;">&#40;</span>Voto v<span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
    <span style="color: #666666;">// Se non e' un voto di un nuovo elettore, allora controlliamo il tipo degli altri voti espressi dall'elettore</span>
    <span style="color: #0000ff;">if</span><span style="color: #008000;">&#40;</span>voti.<span style="color: #007788;">size</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span> <span style="color: #000040;">%</span> <span style="color: #0000dd;">3</span> <span style="color: #000080;">&gt;=</span> <span style="color: #0000dd;">1</span><span style="color: #008000;">&#41;</span>
    <span style="color: #008000;">&#123;</span>
        list<span style="color: #000080;">&lt;</span>Voto<span style="color: #000080;">&gt;</span><span style="color: #008080;">::</span><span style="color: #007788;">const_reverse_iterator</span> it <span style="color: #000080;">=</span> voti.<span style="color: #007788;">rbegin</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>    
        Voto ultima <span style="color: #000080;">=</span> <span style="color: #000040;">*</span>it, penultima<span style="color: #008080;">;</span>
&nbsp;
        <span style="color: #666666;">// Non possiamo aggiungere un voto dello stesso tipo dell'ultimo voto presente nell'urna</span>
        <span style="color: #0000ff;">if</span><span style="color: #008000;">&#40;</span>v.<span style="color: #007788;">dammiTipo</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span> <span style="color: #000080;">==</span> ultima.<span style="color: #007788;">dammiTipo</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span>
            <span style="color: #0000ff;">return</span> <span style="color: #0000ff;">false</span><span style="color: #008080;">;</span>
&nbsp;
        <span style="color: #666666;">// Se questa e' la terza scheda di un elettore eseguiamo il controllo anche per il penultimo voto</span>
        <span style="color: #0000ff;">if</span><span style="color: #008000;">&#40;</span>voti.<span style="color: #007788;">size</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span> <span style="color: #000040;">%</span> <span style="color: #0000dd;">3</span> <span style="color: #000080;">==</span> <span style="color: #0000dd;">2</span><span style="color: #008000;">&#41;</span>
        <span style="color: #008000;">&#123;</span>
            it<span style="color: #000040;">++</span><span style="color: #008080;">;</span>
            penultima <span style="color: #000080;">=</span> <span style="color: #000040;">*</span>it<span style="color: #008080;">;</span>
            <span style="color: #0000ff;">if</span><span style="color: #008000;">&#40;</span>v.<span style="color: #007788;">dammiTipo</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span> <span style="color: #000080;">==</span> penultima.<span style="color: #007788;">dammiTipo</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span>
                <span style="color: #0000ff;">return</span> <span style="color: #0000ff;">false</span><span style="color: #008080;">;</span>
        <span style="color: #008000;">&#125;</span>
    <span style="color: #008000;">&#125;</span>
&nbsp;
    voti.<span style="color: #007788;">push_back</span><span style="color: #008000;">&#40;</span>v<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    <span style="color: #0000ff;">return</span> <span style="color: #0000ff;">true</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span></pre></td></tr></table></div>

<h3>Urna::maggioranzaVotiNulli(Tipo)</h3>
<p>Questo metodo ritorna true se e solo se il numero di voti nulli per un dato tipo è maggiore o uguale del numero di voti nulli degli altri tipi, presi singolarmente. Una semplice implementazione consiste nel contare il numero di voti nulli di ogni tipo e quindi nel verificare la condizione. Visto che Tipo è un enumerato che associa le costanti SENATO, CAMERA e REGIONE a 0, 1 e 2, rispettivamente, possiamo usare un array di 3 elementi per contare i voti nulli di ogni tipo.</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
</pre></td><td class="code"><pre class="cpp" style="font-family:monospace;"><span style="color: #0000ff;">bool</span> Urna<span style="color: #008080;">::</span><span style="color: #007788;">maggioranzaVotiNulli</span><span style="color: #008000;">&#40;</span>Tipo t<span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
    <span style="color: #0000ff;">int</span> count<span style="color: #008000;">&#91;</span><span style="color: #008000;">&#93;</span> <span style="color: #000080;">=</span> <span style="color: #008000;">&#123;</span><span style="color: #0000dd;">0</span>,<span style="color: #0000dd;">0</span>,<span style="color: #0000dd;">0</span><span style="color: #008000;">&#125;</span><span style="color: #008080;">;</span>  <span style="color: #666666;">// equivale a: int count[3]; count[SENATO] = count[CAMERA] = count[REGIONE] = 0;</span>
&nbsp;
    <span style="color: #666666;">// Contiamo i voti nulli per ogni tipo</span>
    <span style="color: #0000ff;">for</span><span style="color: #008000;">&#40;</span>list<span style="color: #000080;">&lt;</span>Voto<span style="color: #000080;">&gt;</span><span style="color: #008080;">::</span><span style="color: #007788;">const_iterator</span> it <span style="color: #000080;">=</span> voti.<span style="color: #007788;">begin</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span> it <span style="color: #000040;">!</span><span style="color: #000080;">=</span> voti.<span style="color: #007788;">end</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span> it<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span>
        <span style="color: #0000ff;">if</span><span style="color: #008000;">&#40;</span>it<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>dimmiSeNullo<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span>
            count<span style="color: #008000;">&#91;</span>it<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>dammiTipo<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#93;</span><span style="color: #000040;">++</span><span style="color: #008080;">;</span>
&nbsp;
    <span style="color: #666666;">// Ritorniamo true se count[t] è maggiore o uguale di tutti gli altri</span>
    <span style="color: #0000ff;">return</span> count<span style="color: #008000;">&#91;</span>t<span style="color: #008000;">&#93;</span> <span style="color: #000080;">&gt;=</span> count<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">0</span><span style="color: #008000;">&#93;</span> <span style="color: #000040;">&amp;&amp;</span> count<span style="color: #008000;">&#91;</span>t<span style="color: #008000;">&#93;</span> <span style="color: #000080;">&gt;=</span> count<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">1</span><span style="color: #008000;">&#93;</span> <span style="color: #000040;">&amp;&amp;</span> count<span style="color: #008000;">&#91;</span>t<span style="color: #008000;">&#93;</span> <span style="color: #000080;">&gt;=</span> count<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">2</span><span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span></pre></td></tr></table></div>

<h3>Urna::coalizioniVincenti(Tipo)</h3>
<p>Questo metodo deve restituire la lista delle coalizioni vincenti per un dato tipo. Dobbiamo quindi contare quanti voti ha preso ogni coalizione e costruire una lista delle coalizioni con più voti. </p>
<p>Per contare i voti ottenuti da ogni coalizione possiamo eseguire un doppio ciclo sull&#8217;urna: il primo per individuare una coalizione, il secondo per contare i voti ottenuti da quella coalizione da quel momento in poi. Per costruire la lista delle coalizioni vincenti, invece, possiamo adattare facilmente un algoritmo per la ricerca di massimo. Questa soluzione è implementata di seguito.</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
</pre></td><td class="code"><pre class="cpp" style="font-family:monospace;">list<span style="color: #000080;">&lt;</span>string<span style="color: #000080;">&gt;</span> Urna<span style="color: #008080;">::</span><span style="color: #007788;">coalizioniVincenti</span><span style="color: #008000;">&#40;</span>Tipo t<span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
    list<span style="color: #000080;">&lt;</span>string<span style="color: #000080;">&gt;</span> vincenti<span style="color: #008080;">;</span>
    <span style="color: #0000ff;">int</span> max <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
&nbsp;
    <span style="color: #666666;">// Iteriamo sui voti presenti nell'urna</span>
    <span style="color: #0000ff;">for</span><span style="color: #008000;">&#40;</span>list<span style="color: #000080;">&lt;</span>Voto<span style="color: #000080;">&gt;</span><span style="color: #008080;">::</span><span style="color: #007788;">const_iterator</span> it <span style="color: #000080;">=</span> voti.<span style="color: #007788;">begin</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span> it <span style="color: #000040;">!</span><span style="color: #000080;">=</span> voti.<span style="color: #007788;">end</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span> it<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span>
    <span style="color: #008000;">&#123;</span>
        <span style="color: #666666;">// Se il voto e' valido e del tipo richiesto, allora contiamo i voti per questa coalizione</span>
        <span style="color: #0000ff;">if</span><span style="color: #008000;">&#40;</span>it<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>dammiTipo<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span> <span style="color: #000080;">==</span> t <span style="color: #000040;">&amp;&amp;</span> <span style="color: #000040;">!</span>it<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>dimmiSeNullo<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span> <span style="color: #000040;">&amp;&amp;</span> it<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>dammiCoalizione<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span> <span style="color: #000040;">!</span><span style="color: #000080;">=</span> <span style="color: #FF0000;">&quot;&quot;</span><span style="color: #008000;">&#41;</span>
        <span style="color: #008000;">&#123;</span>
            <span style="color: #0000ff;">int</span> count <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
&nbsp;
            <span style="color: #666666;">// Contiamo tutti i voti presenti nell'urna a partire da it</span>
            <span style="color: #0000ff;">for</span><span style="color: #008000;">&#40;</span>list<span style="color: #000080;">&lt;</span>Voto<span style="color: #000080;">&gt;</span><span style="color: #008080;">::</span><span style="color: #007788;">const_iterator</span> it2 <span style="color: #000080;">=</span> it<span style="color: #008080;">;</span> it2 <span style="color: #000040;">!</span><span style="color: #000080;">=</span> voti.<span style="color: #007788;">end</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span> it2<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span>
                <span style="color: #666666;">// Se il voto e' valido, dello stesso tipo e coalizione di it, allora incrementa count</span>
                <span style="color: #0000ff;">if</span><span style="color: #008000;">&#40;</span>it2<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>dammiTipo<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span> <span style="color: #000080;">==</span> t <span style="color: #000040;">&amp;&amp;</span> <span style="color: #000040;">!</span>it2<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>dimmiSeNullo<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span> <span style="color: #000040;">&amp;&amp;</span> it2<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>dammiCoalizione<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span> <span style="color: #000040;">!</span><span style="color: #000080;">=</span> it<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>dammiCoalizione<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span>
                    count<span style="color: #000040;">++</span><span style="color: #008080;">;</span>
&nbsp;
            <span style="color: #666666;">// Se questa coalizione ha preso piu' voti di tutti (finora)</span>
            <span style="color: #0000ff;">if</span><span style="color: #008000;">&#40;</span>count <span style="color: #000080;">&gt;</span> max<span style="color: #008000;">&#41;</span>
            <span style="color: #008000;">&#123;</span>
                <span style="color: #666666;">// Abbiamo un nuovo massimo</span>
                max <span style="color: #000080;">=</span> count<span style="color: #008080;">;</span>
&nbsp;
                <span style="color: #666666;">// Quindi la lista dovra' contenere solo questa coalizione</span>
                vincenti.<span style="color: #007788;">erase</span><span style="color: #008000;">&#40;</span>vincenti.<span style="color: #007788;">begin</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>, vincenti.<span style="color: #007788;">end</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>   <span style="color: #666666;">// equivale a: vincenti = list&lt;string&gt;();</span>
                vincenti.<span style="color: #007788;">push_back</span><span style="color: #008000;">&#40;</span>it<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>dammiCoalizione<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
            <span style="color: #008000;">&#125;</span>
            <span style="color: #666666;">// Se invece questa coalizione ha il massimo dei voti a parimerito di altre coalizioni</span>
            <span style="color: #0000ff;">else</span> <span style="color: #0000ff;">if</span><span style="color: #008000;">&#40;</span>count <span style="color: #000080;">==</span> max<span style="color: #008000;">&#41;</span>
                <span style="color: #666666;">// Aggiungiamo la coalizione alla lista</span>
                vincenti.<span style="color: #007788;">push_back</span><span style="color: #008000;">&#40;</span>it<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>dammiCoalizione<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
        <span style="color: #008000;">&#125;</span>
    <span style="color: #008000;">&#125;</span>
&nbsp;
    <span style="color: #0000ff;">return</span> vincenti<span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span></pre></td></tr></table></div>

<p>Un&#8217;implementazione più efficiente può essere la seguente, nella quale prima costruiamo un vettore di coalizioni con i rispettivi voti validi ottenuti, e in seguito eseguiamo la ricerca di massimo. Quest&#8217;implementazione è più efficiente di quella precedentemente esposta (lineare rispetto a quadratica). Tuttavia è più complessa. Ai fini dell&#8217;esercizio, scegliere l&#8217;una o l&#8217;altra soluzione è indifferente.</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
</pre></td><td class="code"><pre class="cpp" style="font-family:monospace;">list<span style="color: #000080;">&lt;</span>string<span style="color: #000080;">&gt;</span> Urna<span style="color: #008080;">::</span><span style="color: #007788;">coalizioniVincenti</span><span style="color: #008000;">&#40;</span>Tipo t<span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
	vector<span style="color: #000080;">&lt;</span>string<span style="color: #000080;">&gt;</span> coalizioni<span style="color: #008080;">;</span>
	vector<span style="color: #000080;">&lt;</span><span style="color: #0000ff;">int</span><span style="color: #000080;">&gt;</span> numPref<span style="color: #008080;">;</span>
&nbsp;
	<span style="color: #0000ff;">for</span><span style="color: #008000;">&#40;</span>list<span style="color: #000080;">&lt;</span>Voto<span style="color: #000080;">&gt;</span><span style="color: #008080;">::</span><span style="color: #007788;">const_iterator</span> it <span style="color: #000080;">=</span> voti.<span style="color: #007788;">begin</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span> it <span style="color: #000040;">!</span><span style="color: #000080;">=</span> voti.<span style="color: #007788;">end</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span> it<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span>
	<span style="color: #008000;">&#123;</span>
		Voto v <span style="color: #000080;">=</span> <span style="color: #000040;">*</span>it<span style="color: #008080;">;</span>
		<span style="color: #0000ff;">if</span><span style="color: #008000;">&#40;</span>v.<span style="color: #007788;">dammiTipo</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span> <span style="color: #000080;">==</span> t <span style="color: #000040;">&amp;&amp;</span> <span style="color: #000040;">!</span>v.<span style="color: #007788;">dimmiSeNullo</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span> <span style="color: #000040;">&amp;&amp;</span> v.<span style="color: #007788;">dammiCoalizione</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span> <span style="color: #000040;">!</span><span style="color: #000080;">=</span> <span style="color: #FF0000;">&quot;&quot;</span><span style="color: #008000;">&#41;</span>
		<span style="color: #008000;">&#123;</span>
			<span style="color: #0000ff;">bool</span> trovato <span style="color: #000080;">=</span> <span style="color: #0000ff;">false</span><span style="color: #008080;">;</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: #0000dd;">0</span><span style="color: #008080;">;</span> i <span style="color: #000080;">&lt;</span> coalizioni.<span style="color: #007788;">size</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span> i<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span>
				<span style="color: #0000ff;">if</span><span style="color: #008000;">&#40;</span>coalizioni<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span> <span style="color: #000080;">==</span> v.<span style="color: #007788;">dammiCoalizione</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span>
				<span style="color: #008000;">&#123;</span>
					numPref<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span><span style="color: #000040;">++</span><span style="color: #008080;">;</span>
					trovato <span style="color: #000080;">=</span> <span style="color: #0000ff;">true</span><span style="color: #008080;">;</span>
				<span style="color: #008000;">&#125;</span>
&nbsp;
			<span style="color: #0000ff;">if</span><span style="color: #008000;">&#40;</span><span style="color: #000040;">!</span>trovato<span style="color: #008000;">&#41;</span>
			<span style="color: #008000;">&#123;</span>
				coalizioni.<span style="color: #007788;">push_back</span><span style="color: #008000;">&#40;</span>v.<span style="color: #007788;">dammiCoalizione</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
				numPref.<span style="color: #007788;">push_back</span><span style="color: #008000;">&#40;</span><span style="color: #0000dd;">1</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
			<span style="color: #008000;">&#125;</span>
&nbsp;
		<span style="color: #008000;">&#125;</span>
	<span style="color: #008000;">&#125;</span>
&nbsp;
    list<span style="color: #000080;">&lt;</span>string<span style="color: #000080;">&gt;</span> vincenti<span style="color: #008080;">;</span>
	<span style="color: #0000ff;">int</span> max <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</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: #0000dd;">0</span><span style="color: #008080;">;</span> i <span style="color: #000080;">&lt;</span> coalizioni.<span style="color: #007788;">size</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span> i<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span>
		<span style="color: #0000ff;">if</span><span style="color: #008000;">&#40;</span>numPref<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span> <span style="color: #000080;">&gt;</span> max<span style="color: #008000;">&#41;</span>
		<span style="color: #008000;">&#123;</span>
			max <span style="color: #000080;">=</span> numPref<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
			vincenti.<span style="color: #007788;">erase</span><span style="color: #008000;">&#40;</span>vincenti.<span style="color: #007788;">begin</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>, vincenti.<span style="color: #007788;">end</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
			vincenti.<span style="color: #007788;">push_back</span><span style="color: #008000;">&#40;</span>coalizioni<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</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>numPref<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span> <span style="color: #000080;">==</span> max<span style="color: #008000;">&#41;</span>
			vincenti.<span style="color: #007788;">push_back</span><span style="color: #008000;">&#40;</span>coalizioni<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
&nbsp;
	<span style="color: #0000ff;">return</span> vincenti<span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span></pre></td></tr></table></div>

<h3>Urna::coalizioniConSequenzePiuLunghe(Tipo)</h3>
<p>Questo metodo è del tutto simile al precedente. L&#8217;unica differenza è che siamo interessati alle coalizioni con il maggior numero di voti consecutivi. La prima implementazione del metodo precedente richiede solo minori modifiche per eseguire questo compito (la condizione nell&#8217;if all&#8217;interno del secondo for deve essere messa in congiunzione a quella del secondo for).</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
</pre></td><td class="code"><pre class="cpp" style="font-family:monospace;">list<span style="color: #000080;">&lt;</span>string<span style="color: #000080;">&gt;</span> Urna<span style="color: #008080;">::</span><span style="color: #007788;">coalizioniVincenti</span><span style="color: #008000;">&#40;</span>Tipo t<span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
    list<span style="color: #000080;">&lt;</span>string<span style="color: #000080;">&gt;</span> vincenti<span style="color: #008080;">;</span>
    <span style="color: #0000ff;">int</span> max <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
&nbsp;
    <span style="color: #666666;">// Iteriamo sui voti presenti nell'urna</span>
    <span style="color: #0000ff;">for</span><span style="color: #008000;">&#40;</span>list<span style="color: #000080;">&lt;</span>Voto<span style="color: #000080;">&gt;</span><span style="color: #008080;">::</span><span style="color: #007788;">const_iterator</span> it <span style="color: #000080;">=</span> voti.<span style="color: #007788;">begin</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span> it <span style="color: #000040;">!</span><span style="color: #000080;">=</span> voti.<span style="color: #007788;">end</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span> it<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span>
    <span style="color: #008000;">&#123;</span>
        <span style="color: #666666;">// Se il voto e' valido e del tipo richiesto, allora contiamo i voti per questa coalizione</span>
        <span style="color: #0000ff;">if</span><span style="color: #008000;">&#40;</span>it<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>dammiTipo<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span> <span style="color: #000080;">==</span> t <span style="color: #000040;">&amp;&amp;</span> <span style="color: #000040;">!</span>it<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>dimmiSeNullo<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span> <span style="color: #000040;">&amp;&amp;</span> it<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>dammiCoalizione<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span> <span style="color: #000040;">!</span><span style="color: #000080;">=</span> <span style="color: #FF0000;">&quot;&quot;</span><span style="color: #008000;">&#41;</span>
        <span style="color: #008000;">&#123;</span>
            <span style="color: #0000ff;">int</span> count <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
&nbsp;
            <span style="color: #666666;">// Contiamo tutti i voti consecutivi presenti nell'urna a partire da it</span>
            <span style="color: #0000ff;">for</span><span style="color: #008000;">&#40;</span>list<span style="color: #000080;">&lt;</span>Voto<span style="color: #000080;">&gt;</span><span style="color: #008080;">::</span><span style="color: #007788;">const_iterator</span> it2 <span style="color: #000080;">=</span> it<span style="color: #008080;">;</span> 
                    it2 <span style="color: #000040;">!</span><span style="color: #000080;">=</span> voti.<span style="color: #007788;">end</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span> <span style="color: #000040;">&amp;&amp;</span> it2<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>dammiTipo<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span> <span style="color: #000080;">==</span> t <span style="color: #000040;">&amp;&amp;</span> 
                    <span style="color: #000040;">!</span>it2<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>dimmiSeNullo<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span> <span style="color: #000040;">&amp;&amp;</span> it2<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>dammiCoalizione<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span> <span style="color: #000040;">!</span><span style="color: #000080;">=</span> it<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>dammiCoalizione<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span> 
                    it2<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span>
                count<span style="color: #000040;">++</span><span style="color: #008080;">;</span>
&nbsp;
            <span style="color: #666666;">// Se questa coalizione ha preso piu' voti di tutti (finora)</span>
            <span style="color: #0000ff;">if</span><span style="color: #008000;">&#40;</span>count <span style="color: #000080;">&gt;</span> max<span style="color: #008000;">&#41;</span>
            <span style="color: #008000;">&#123;</span>
                <span style="color: #666666;">// Abbiamo un nuovo massimo</span>
                max <span style="color: #000080;">=</span> count<span style="color: #008080;">;</span>
&nbsp;
                <span style="color: #666666;">// Quindi la lista dovra' contenere solo questa coalizione</span>
                vincenti.<span style="color: #007788;">erase</span><span style="color: #008000;">&#40;</span>vincenti.<span style="color: #007788;">begin</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>, vincenti.<span style="color: #007788;">end</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>   <span style="color: #666666;">// equivale a: vincenti = list&lt;string&gt;();</span>
                vincenti.<span style="color: #007788;">push_back</span><span style="color: #008000;">&#40;</span>it<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>dammiCoalizione<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
            <span style="color: #008000;">&#125;</span>
            <span style="color: #666666;">// Se invece questa coalizione ha il massimo dei voti a parimerito di altre coalizioni</span>
            <span style="color: #0000ff;">else</span> <span style="color: #0000ff;">if</span><span style="color: #008000;">&#40;</span>count <span style="color: #000080;">==</span> max<span style="color: #008000;">&#41;</span>
                <span style="color: #666666;">// Aggiungiamo la coalizione alla lista</span>
                vincenti.<span style="color: #007788;">push_back</span><span style="color: #008000;">&#40;</span>it<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>dammiCoalizione<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
        <span style="color: #008000;">&#125;</span>
    <span style="color: #008000;">&#125;</span>
&nbsp;
    <span style="color: #0000ff;">return</span> vincenti<span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span></pre></td></tr></table></div>

<p>Il codice dovrebbe essere pronto per la compilazione. Eventuali errori possono essere segnalati lasciando un commento al post.</p>
]]></content:encoded>
			<wfw:commentRss>http://alviano.com/2010/04/12/programmazione-a-oggetti-appello-straordinario-aprile-2010/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>

