Modulo 5 – La programmazione Unità 3 – Primi programmi Prof. Antonio Scanu 1 La programmazione Per risolvere un problema abbiamo Imparato a Individuare la strategia risolutiva e a descriverla in una sequenza di passi elementari. costruendo un algoritmo. L'algoritmo, però, non è direttamente eseguibile dall'esecutore. Per renderlo eseguibile è necessario rappresentarlo in un sistema formale che consenta di comunicarlo al computer. Questo significa trasformare l'algoritmo concettuale in un insieme di Istruzioni ben definite, che vanno scritte in modo chiaro e non ambiguo. Nel caso dei computer. il sistema formale che consente di codificare cioè di tradurre nel linguaggio adottato l'algoritmo risolutivo. L'attività di codifica viene anche indicata con il termine implementazione molto usato in informatica con il preciso significato di concretizzazione di un'astrazione. 2 La documentazione del lavoro Per uno studio corretto della programmazione è importantissimo abituarsi a documentare ogni fase del lavoro con grafici. tabelle e commenti. Mentre si programma. si ha spesso la necessità di tornare indietro per rivedere alcuni punti. per correggere errori o per sviluppa re meglio un problema già risolto. Anche a distanza di tempo. un lavoro ben documentato sarà sicuramente più semplice da rileggere e da correggere. Realizzare una buona documentazione quindi, è una regola fondamentale per uno sviluppo completo ed esauriente della soluzione di un problema. Per questo motivo suggeriamo alcuni accorgimenti. Realizzare la documentazione contemporaneamente alla progettazione e mai successivamente. Riferire tutti i chiarimenti indicati nella documentazione ai punti fondamentali del problema, indicando dettagliatamente che cosa fare e, subordinatamente, come farlo. Attribuire alle variabili nomi significativi, che favoriscano la comprensione dello scopo per cui le variabili vengono utilizzate. Commentare in modo semplice le Istruzioni. evitando annotazioni superflue. Durante la lettura di un algoritmo. i commenti alle Istruzioni rappresentano la prima e più Immediata documentazione disponibile. Essi aiutano a comprendere e a giustificare la presenza di alcune istruzioni e a favorire la verifica della correttezza formale dell'algoritmo. Non tutte le Istruzioni hanno bisogno di essere commentate: in generale saranno trascurate tutte le Istruzioni il cui contenuto è facilmente deducibile dal contesto. Aggiornare la documentazione immediatamente allorquando dovessero essere necessarie modifiche all'algoritmo o al programma. Per ottenere un lavoro ben documentato, quindi. è consigliabile procedere affrontando i seguenti passaggi. Lettura del testo del problema. È Indispensabile leggere attentamente e interpretare correttamente la traccia del problema per poter passare alle fasi successive. Analisi del problema. È una delle fasi più delicate. Consiste nell'esporre l'interpretazione che segue la lettura del testo del problema e nel mettere in evidenza tutti gli aspetti fondamentali. Durante questa fase occorre individuare con grande attenzione di quali dati di input input è necessario servirsi e quali dati di output oc corre produrre; 2 Analisi dei dati. Consiste nell'analizzare i dati individuati durante l'analisi del problema e nel descriverli dettagliatamente. Utilizzeremo la tabella delle variabili con il nome. la funzione (I = Input. O= output. L =lavoro). ti tipo e la descrizione (il significato e l'utilizzo) di ogni variabile coinvolta nell'elaborazione. Le variabili che hanno funzione di Input e di output costituiranno l'area di interesse del problema, ossia le specifiche funzionali. Formalizzazione dell'algoritmo. È la fase di dettaglio. Consiste nello sviluppo dell'algoritmo con il diagramma a blocchi. Test (o trace) consiste nella rappresentazione dell'esecuzione dell'algoritmo. ossia nel compimento del test per verificare se i passi dettagliati risolvono il problema dato. Per far ciò ci serviremo di un'altra tabella. la tavola di traccia. Inserendo dati opportunamente scelti, seguiremo. Passo dopo passo i valori assunti dalle variabili e controlleremo l'esattezza delle Istruzioni e il raggiungimento dell'obiettivo. Codifica. L'algoritmo cosi testato potrà. a questo punto. essere codificato nel linguaggio di programmazione scelto. Tuttavia. se durante questa fase dovessero risultare necessarie delle modifiche queste andranno riportate prima nelle altre fasi precedentemente descritte e poi nel programma. 3 Il costrutto sequenza La sequenza è il più semplice fra I tre costrutti fondamentali. Si utilizza quando le azioni devono essere eseguite ordinatamente una dopo l'altra senza alcuna possibilità di scelta. Le Istruzioni vengono scritte una dopo l'altra separandole In modo opportuno (per esempio con un punto e virgola ";". o semplicemente scrivendo un'istruzione per riga); esse verranno poi eseguire una dopo l'altra nell'ordine con cui sono scritte. In generale tale strut tura si rappresenta, col diagramma a blocchi nel seguente modo: 3 dove B1, B2 e BN possono essere blocchi semplici o blocchi composti. Un blocco semplice è, per esempio, un'istruzione di assegnazione. un'Istruzione di I/O o uno degli altri costrutti fondamentali. Il blocco composto, Invece, è un insieme di più blocchi semplici. In base a quest'ultimo concetto. anche un Intero algoritmo strutturato è una struttura sequenziale. 4 Un primo esempio: scambio di due valori Analisi del problema A prima vista la soluzione immediata sembrerebbe: prendi il contenuto di B e mettilo in A; prendi il contenuto di A e mettilo in B. Naturalmente questa soluzione è errata. in quanto l'esecuzione della prima azione comporta la perdita Immediata del contenuto della variabile A. Per risolvere questo problema dobbiamo servirci di una terza variabile e in cui "salvare temporaneamente" il contenuto di A. È un po' come se volessimo scambiare il contenuto di due bottiglie contenenti una del vino e l'altra del latte: non possiamo versare il vino contenuto nella bottiglia all'interno dell'altra! Così facendo. Otterremmo soltanto un "cocktail poco gradevole". ma non risolveremmo il problema: per farlo. è necessario utilizzare una terza bottiglia. In dettaglio. quindi. le azioni da compiere sono le seguenti: prendi il contenuto di A e mettilo in C; prendi il contenuto di B e mettilo in A; prendi il contenuto di C e mettilo In B. Vediamole graficamente ricorrendo all'analogia con le scatole. Supponendo che il valore delle variabili è : A=2 , B=6 e C=0 inizialmente avremo: Prendi il contenuto di A e mettilo in C Prendi il contenuto di B e mettilo in A 4 5 Il testing Una volta completata la scrittura dell'algoritmo, come si può essere certi che i risultati in output siano giusti? La risposta immediata è "basta effettuare le prove". Ma come? E soprattutto, quante prove bisogna effettuare per essere sicuri di aver codificato corretta mente l'algoritmo? Teoricamente bisognerebbe provare il programma avendo in ingresso tutti i dati possibili e in tutte le possibili combinazioni: naturalmente, ciò è impossibile! Dal punto di vista operativo dovremmo quindi trovare tutti gli errori, eliminarli, e solo allora potremmo dire che non ci sono errori! Naturalmente non possiamo dimostrare la correttezza del codice sulla base di questa affermazione, ma possiamo prenderne spunto per affinare una tecnica che ci aiuti ad affermare che il nostro software, se non ne è proprio privo, contiene pochi e improbabili errori, 5 cioè quelli che non siamo riusciti a trovare; si procede cioè a una vera "caccia agli errori", che prende il nome di testing. Con testing intendiamo tutte le operazioni che vengono eseguite al termine della stesura del codice al fine dì: verificare l'adeguatezza del programma alle specifiche richieste; effettuare prove estreme di funzionamento per poterne verificare l'affidabilità anche in casi particolari, escludendo la presenza dì errori. L'affermazione "più prove vengono effettuate senza che si verifichino errori e più è possibile affermare che il programma è corretto" apparentemente è ragionevole, ma spesso è inesatta! Un programma non si testa effettuando tante prove, ma effettuando un numero adeguato di prove "ben selezionate" su un sottoinsieme di dati di ingresso significativi, che prende il nome di test data set. Per esempio, se il nostro algoritmo deve effettuare la media fra tre numeri, è inutile provare tutte le combinazioni possibili dei tre numeri, ma basta verificarlo in un caso intermedio e nei casi estremi di funzionamento, che per questo problema potrebbero essere: tutti i numeri uguali a 0; somma dei tre numeri uguale a 0; somma dei tre numeri minore di 0; tre numeri a caso, con uno maggiore di 0; tre numeri uguali. Alcune regole pratiche I criteri per la verifica e la validazione di un programma devono essere stabiliti prima della fase di progettazione e codifica: essi devono essere specificati durante la fase di analisi, insieme alla definizione delle specifiche del problema. I dati in ingresso prescelti per i test devono essere divisi in categorie omogenee, cioè con le stesse caratteristiche: prima tutti i numeri interi positivi, poi quelli negativi, poi i reali positivi e via di seguito, fino alla classe costituita dal solo numero 0. Per ogni categoria di dati di ingresso deve essere effettuato almeno un test. È necessario conoscere a priori il risultato corretto di ogni test, cioè il valore atteso in caso di correttezza dell'algoritmo. Occorre prestare particolare attenzione alle cosiddette "condizioni limite" e alle condizioni particolari cui devono sottostare, per esempio, le espressioni algebriche (testare cioè i casi in cui si possa verificare la divisione per 0, radicando < 0 ecc.). Verificare il comportamento del programma anche nel caso di dati in ingresso non validi ma che comunque possono essere inseriti dall'utente: in tali casi occorre prevedere un messaggio che indichi all'utente tale errore, in modo che non lo ripeta. Verificare il programma "strada facendo", cioè pezzo per pezzo (modulo per modulo), e solo in seguito testare il programma completo. I test dovrebbero essere effettuati da una persona diversa dal programmatore che ha realizzato la codifica. Inoltre è necessario: individuare l'istruzione (o il blocco di istruzioni) da cui l'errore viene generato; verificare se tale errore sia "singolo"; individuare la possibile rettifica, in modo da non provocare nuovi errori; 6 definire il nuovo data test in caso di interventi radicali. Trace table Spesso è opportuno verificare il corretto funzionamento del programma prima di mandarlo in esecuzione: tale verifica avviene testando il codice scritto in metalinguaggio mediante una simulazione dell'esecuzione del programma. Tale simulazione viene effettuata eseguendo una alla volta le istruzioni "sulla carta" e riportando in una tabella le variazioni che ogni istruzione provoca sui dati. La tabella prende il nome di trace table (tabella di traccia), in quanto consente al programmatore di "seguire" le tracce di come e quando viene modificata una variabile. La maggior parte degli errori è dovuta alla disattenzione e alla mancata rilettura del codice, e spesso l'individuazione e correzione dell'errore comporta più tempo che la scrittura del codice stesso: l'utilizzo di uno strumento come la trace table consente al programmatore di individuare non solo la presenza dell’ errore, ma anche la causa, e indica come po terlo eliminare. Esempio Vediamo un esempio realizzando la trace table di un semplice gioco: ti indovino il numero pensato. È semplice verificare che non esistono. trucchi: dopo dei calcoli il risultato è sempre ugua le a 4, indipendentemente dal valore che l'utente ha pensato. Verifichiamolo mediante la trace table. Trascuriamo l’analisi e la tabella delle variabili e delle costanti. Il diagramma a blocchi che rappresenta la soluzione del problema è il seguente. Costruiamo dunque la trace table: per prima cosa si disegna una tabella, in cui la prima colonna viene chiamata "istruzioni"; poi si aggiungono tante colonne quante sono le variabili da controllare e una colonna per l’output come nell'esempio seguente: 7 Istruzione numero totale nummodif output Il numero delle righe dipende invece dal numero delle istruzioni. Si procede inserendo una istruzione in ogni riga e andando a calcolare quali modifiche vengono effettuate sulle variabili. La prima istruzione è la lettura del numero pensato dall'utente (che ipotizziamo essere il numero 21): tale valore verrà collocato nella corrispondente colonna mentre le al tre colonne non saranno modificate, in quanto i valori delle variabili corrispondenti non sono stati alterati. Istruzione Leggi numero numero totale nummodif output 21 Procediamo con la seconda, la terza e la quarta istruzione, che vanno a modificare il contenuto dell'ultima colonna: Istruzione numero totale nummodif Leggi numero 21 totale numero *2 21 42 totale totale +12 21 54 totale totale /2 21 27 nummodif numero +2 21 27 23 totale totale -nummodif 21 4 23 Scrivi totale 21 4 23 output 4 6 Il linguaggio C/C++ 6.1 Struttura Base La struttura base di un programma scritto in C/C++ è il seguente: #include<iostream> using namespace std; int main() { return 0;} Esso rappresenta un programma che di fatto non esegue nessuna istruzione. L’istruzione #include <iostream> permette di inserire la libreria iostream dove al suo interno vi sono le principali istruzioni che useremo. In alcuni casi possiamo aggiungere altre librerie come math.h o string.h che permettono di usare istruzioni matematiche e per la gestione delle stringhe. Il nostro programma diventa: 8 #include<iostream> #include<math.h> #include<string.h> using namespace std; int main() { return 0;} Le librerie e l’istruzione “int main { “traduce l’istruzione di “inizio” del digramma a blocchi. La parentesi graffa finale traduce l’istruzione “fine”. I commenti possono essere scritti affianco all’istruzione se preceduti da // ad esempio: #include<iostream> using namespace std; int main() { return 0; // l’istruzione che va sempre inserita } Oppure utilizzando /* …… */ ad esempio: #include<iostream> using namespace std; int main() { return 0; /* istruzione che va sempre inserita */ } 6.2 Le variabili e costanti La tabella delle costanti viene implementata in C/C++ in due modi: #define nomecostante valore const int nomecostante=valore; Nel primo caso, metodo derivato dal C, l’istruzione va scritta subito dopo le istruzioni di “#define”. Nel secondo caso all’interno del main() ed è obbligatorio indicare il tipo di dato e la scrivere il “;” finale. Esempio per definire la variabile pigreco userò le istruzioni seguenti #include<iostream> using namespace std; #define pigreco 3.14 int main() { return 0; } oppure #include<iostream> using namespace std; int main() { const float pigreco=3.14; return 0;} 9 La tabella delle variabili viene implementata per singola variabile come segue: tipo nomevariabile; dove il tipo rappresenta il tipo di dato. Se vi sono più variabili dello stesso tipo allora possono essere scritte di seguito ad esem pio: int base,altezza; le variabili sono separate da una virgola e “;” è obbligatorio. Se alla variabile vogliamo dare un valore iniziale possiamo farlo durante la definizione della variabile stessa. Se ad esempio vogliamo azzerare un contatore scriveremo: int cont=0; 6.3 I tipi di dato I tipi di dato elementari sono i seguenti: I tipi primitivi possono essere estesi utilizzando appositi qualificatori quali short, long, signed e unsigned. I primi tre fanno riferimento al numero dl byte occupati mentre gli altri modificano il modo di valutare il contenuto di alcune variabili. Nella seguente tabella riassumiamo i tipi primitivi con le combinazioni ammissibili. I domini sono riportati nella tabella seguente: 10 Non potremo memorizzare una parola. 6.4 L’istruzione di assegnazione L’istruzione di assegnazione si implementa semplicemente con “=”. Ad esempio: C=A; A=B; Il “;” è obbligatorio. L’assegnazione di valori a una variabile segue specifiche regole in funzione del tipo di dato associato alla variabile in questione. In tal senso occorre tener presente che: le variabili Intere (int) si assegnano utilizzando un numero senza parte decimale; le variabili reali (float, double) si assegnano utilizzando per la virgola la notazione Inglese, cioè quella in cui si usa un punto (e non una virgola) per dividere la parte intera da quelle frazionaria; le variabili carattere (char) si assegnano racchiudendo il carattere tra due apici; le variabili stringa (una stringa è una concatenazione di caratteri) si assegnano racchiudendo la stringa tra virgolette. Riportiamo un esempio riassuntivo di ognuna delle precedenti assegnazioni: lnt b = 20; char carattere = 'b', lettera = 'm'; float tappo = I0.2; 6.5 Gli operatori 11 Nelle istruzioni di assegnazione possono comparire gli operatori aritmetici per eseguire dei calcoli. I cinque operatori aritmetici previsti dal linguaggio sono: Una caratteristica tipica del C++ è la possibilità di utilizzare gli operatori aritmetici nella forma ridotta. Per esempio, l'operatore ++ serve per incrementare il valore di una variabile; l'istruzione: I = I + l; può essere scritta nella forma equivalente: I++; Si possono usare in modo analogo anche gli altri operatori aritmetici, come riportato nella seguente tabella: 6.6 Istruzioni di output L’istruzione di output è : cout<<. e si implementa dal diagramma a blocchi come i seguenti esempi: cout<<”inserisci il primo numero”; permette di visualizzare sul video la scritta “inserisci il primo numero” senza ulteriori spazzi o andata a capo. Per andare a capo si utilizza endl. Esempio : cout<<”inserisci il primo numero”<<endl; cout<<A; 12 visualizza il contenuto della variabile A; Le diverse istruzioni di output si possono concatenare anche di seguito. L’istruzione : cout<<”il risultato è: ”<<A<<endl; permette di visualizzare di seguito la frase , il contenuto della variabile e l’andata a capo. Nell'istruzione cout è possibile visualizzare messaggi racchiusi tra doppi apici " " oppure valori di variabili: cout<<"il dipendente\t"<<nome<<" ha "<<età<<"anni e guadagna" <<stipendio<<"euro"<<endl; nel caso in cui la variabile NOME ha valore viene visualizzato il seguente messaggio: PAOLO, ETÀ ha valore 23 e STIPENDIO ha valore 2000, il dipendente PAOLO ha 23 anni e guadagna 2000 euro e poi va a capo. All'interno delle stringhe di output possono essere inseriti caratteri speciali per il controllo dell'output preceduti dal simbolo \ (\ t nell'esempio precedente). Nella tabella seguente sono riportati i caratteri speciali più utilizzati ammessi nelle stringhe di output, con il loro significato. 6.7 Istruzione di input L’istruzione di input e cin>> e si implementa nel modo seguente: cin>>A; Non può essere mischiata con l’istruzione cout. 13 7 Esempi Primo esempio: Stampa a video il saluto Buongiorno #include<iostream> using namespace std; int main(){ cout<<"Buongiorno"<<endl; return 0;} Secondo esempio:I/0 di variabili alfanumeriche Testo: Stampa un messaggio di saluto per una persona il cui nome è fornito in input. Analisi: Per risolvere questo problema devi richiedere in input il nome di una persona e restituirlo in output insieme a un messaggio predefinito. L’obiettivo avere il nome della persona stampato. Criterio di verifica: se scrivo Giovanni devo visualizzare “Ciao al signor Giovanni”. Tabella delle Variabili Nome variabile Tipo di dato nome Utilizzo Descrizione e vincoli stringa di caratteri input/output nome della persona da salutare #include<iostream> using namespace std; int main(){ char nome; cout<<"ins iniz. nome "; cin>>nome; cout<<"ciao al signor "<<nome<<endl; return 0; } Tabella di traccia Istruzione nome output Leggi (nome) Giorgio Scrivi (ciao al signor) Giorgio Ciao al signor Giorgio Scrivi (nome) Giorgio Giorgio 14 Terzo esempio: - I/0 di variabili numeriche Testo: Stampa il numero fornito in input. Analisi: Per risolvere questo problema devi richiedere in input un numero che sceglierò essere intero e restituirlo in output insieme a un messaggio predefinito. L’obiettivo avere il nome della persona stampato. Criterio di verifica: se scrivo 125 devo visualizzare “il numero fornito in input è 125”. Tabella delle Variabili Nome variabile Tipo di dato Utilizzo num Intero Descrizione e vincoli input/output Numero inserito #include<iostream> using namespace std; int main(){ int num; cout<<"dammi il numero "<<endl; cin>>num; cout<<"il numero fornito in input e' "<<num<<endl; return 0; } Istruzione num Output Leggi (num) 125 Scrivi (il numeorfornito da input è ) 125 Il numero fornito da input è Scrivi (num) 125 125 Quarto esercizio : uso variabili numeriche Testo. Dati due numeri, calcola il prodotto. Analisi. Obiettivo è avere il prodotto dei numeri. Per potere effettuare il prodotto di due numeri dovrai per prima cosa riceverli in input, memorizzarli in variabili opportune e, dopo avere effettuato la moltiplicazione, fornire il risultato in output. Criterio di verifica: Se digito 3 e 5 deve comparire “prodotto risultante = 15”. 15 #include<iostream> using namespace std; int main(){ int x,y,z; cout<<"inserire il primo fattore "; cin>>x; cout<<"inserire il seccondo fattore "; cin>>y; z=x*y; cout<<"il prodotto risultante e'= "<<z<<endl; return 0; } Istruzione x y Z Scrivi (inserire il primo fattore) Output Inserire il primo fattore Leggi (x) 5 Scrivi (inserire il secondo fattore) 5 Leggi (y) 5 3 Z=x*y 5 3 15 Scrivi (prodotto risultante è) 5 3 15 Prodotto risultante è Scrivi (z) 5 2 15 15 Inserire il secondo fattore Quinto esercizio :uso di variabili numeriche con operazioni complesse Testo. Date la base e l'altezza di un rettangolo, calcola l'area e il perimetro. Obbiettivo è visualizzare l’area e il perimetro Per effettuare questa operazione, dopo avere preso in input la base e l'altezza del rettangolo numeri reali, dovrò moltiplicare tra di loro tali dati per ottenere l'area. Per il perimetro basterà moltiplicare per 2 la somma 16 base+ altezza. Criterio di verifica: Se la base è 5 e altezza è 4 visualizzerò “l’area = 20” e altezza =18. #include<iostream> using namespace std; int main(){ float a,b,area,perim; cout<<"inserire l'altezza"; cin>>a; cout<<"inserire base"; cin>>b; area=a*b; perim=(a+b)*2; cout<<"area= "<<area<<endl; cout<<"perimetro= "<<perim<<endl; return 0; } 17 Istruzione a b area perim Scrivi (inserire l’altezza) output Inserire l’altezza Leggi (a) 5 Scrivi (inserire la base) 5 Leggi (b) 5 4 Area = a*b 5 4 20 Perim= 2*(a+b) 5 4 20 Inserire la base 18 Scrivi (area = ) Area = Scrivi (area) 20 Scrivi (perimetro = ) Perimetro = 8 ESERCITAZIONE N.1 (I/O) 1) Scrivere un programma che visualizza il proprio nome. 2) Scrivere un programma che visualizza la frase “tre casettine dai tetti aguzzi”. 3) Scrive un programma che visualizza la frase “tre casettine dai tetti aguzzi” utilizzando un istruzione di output a parola; 4) Scrive un programma che visualizza la frase “tre casettine dai tetti aguzzi” utilizzando una sola istruzione di output e mandando a capo le parole ogni volta. 5) Scrivere un programma che assegna ad una variabile reale un valore (poi ad un intero, poi ad un carattere) e lo visualizza. 6) Scrivere un programma che, acquisito un numero intero (poi un numero reale, poi un carattere), lo visualizza. 7) Definire una costante e visualizzarla. 8) Definire una costante intera, acquisire un numero intero in input e visualizzare la loro somma. 9) Leggere un numero intero di 4 cifre e scriverlo 3 volte sfalsando la scrittura. 10) Scrivere un programma che legge tre numeri interi e ne visualizza la somma, il prodotto e la media. 11)Scrivere un programma che legge il raggio di un cerchio e calcola e visualizza diametro, circonferenza e area. 18 9 ESERCITAZIONE N.2 (costrutto sequenza) 1) Scrivere un programma che visualizza il doppio di un numero inserito da tastiera. 2) Dati in input i prezzi di tre oggetti, calcolare il costo totale e applicare su quest’ultimo lo sconto del 17%. Comunicare in output il prezzo scontato. 3) Scrivere un programma che calcola l’ipotenusa conoscendo il valore dei cateti di un triangolo rettangolo. 4) Scrivere un programma che legge tre numeri interi e ne visualizza la somma, il prodotto e la media. 5) Scrivere un programma che calcoli l’età di una persona conoscendo l’anno di nascita. 6) Scrivere un programma che calcola la circonferenza e l’area di un cerchio. I dati iniziali sono definiti come costanti. 7) Scrivere un programma che calcola la circonferenza e l’area di un cerchio. I dati iniziali sono definiti come variabili ma non acquisite in input. 8) Di una città viene fornita la popolazione rilevata in due anni successivi. Calcolare e visualizzare in output l’incremento o il decremento della popolazione. 9) Acquisiti in input il valore di un deposito bancario e il tasso di interesse annuale calcolare e visualizzare gli interessi maturati nel corso di un anno. 10) Acquisito in input lo stipendio mensile lordo di una persona. Scrivere un programma che permetta di calcolare la retribuzione annua netta considerando 12 mensilità e una ritenuta mensile del 27%. 11) La tassa sulla casa è composta da una parte fissa di € 20, più € 0.15 per ogni mq, più 2€ per ogni posto auto. Dopo aver inserito in input i metri quadri della casa e il nume ro dei posti auto, calcolare e visualizzare il totale da pagare. 12) Il costo della bolletta del telefonino è di € 0.16 per ogni scatto e € 0.14 per ogni Sms inviato, a cui si aggiunge un canone fisso di €20. Dopo aver acquisito il numero di scatti ed il numero di Sms inviati in un bimestre, determinare e visualizzare l’importo addebitato in bolletta. 13) Sono dati in ingresso i risultati di un referendum: numero degli elettori attivi, numero dei votanti, il numero dei si e dei no. Scrivere un programma che permetta di calcolare la percentuale dei votanti sull’elettorato attivo e la percentuale dei si e dei no sul totale dei votanti. 14) La tassa per la raccolta dei rifiuti in un comune si calcola in base alle dimensioni dell’appartamento in mq. ed è paria 8€/mq. All’importo così ottenuto viene aggiunta una cifra fissa di 20€; su tale importo, inoltre, viene calcolata un’addizionale del 2%. Dopo aver introdotto in input la superficie in mq dell’appartamento, calcolare e visualizzare l’importo totale che l’utente deve pagare . 15) Un operaio guadagna 30€ l’ora. Crea un programma che calcoli il guadagno mensile conoscendo il numero di ore di lavoro effettuate al giorno (tutti i giorni l’operaio fa lo stesso numero di ore) ed il numero di giorni lavorativi effettivi. 16) Realizzare un programma che determini il numero di scatti effettuati da un utente te lefonico nell’ultimo bimestre e l’ammontare la sua bolletta conoscendo il numero di scatti conteggiati nella bolletta precedente e il numero degli scatti totali. In più si conosce il canone e il costo del singolo scatto (che rimangono costanti).42 19