Facoltà di Ingegneria Industriale Salvo Daniele Valente Dipartimento di Elettronica e Informazione Laurea in Ingegneria Energetica, Meccanica e dei Trasporti Corso di Informatica B - Sezione D Esercitazioni Linguaggio C Politecnico di Milano - DEI Dipartimento di Elettronica e Informazione 1 Informazioni utili Salvo Daniele Valente Dipartimento di Elettronica e Informazione Laurea in Ingegneria Energetica, Meccanica e dei Trasporti ‣ Salvo Daniele Valente: assegnista di ricerca presso Sound and Music Computing Lab, Politecnico di Milano - Polo territoriale di Como (http://suono.como.polimi.it) ‣ e-mail: ‣ Pagina web del corso: http://valente.dei.polimi.it ‣ Consultate la pagina eb periodicamente, potete seguire anche i fedd RSS ‣ Linguaggio C: http://valente.dei.polimi.it/linguaggio_c.html ‣ Matlab:http://valente.dei.polimi.it/linguaggio_matlab.html ‣ Esercitazioni: ‣ orario accademico: venerdì 12:15 –14:15 ‣ orario effettivo 12:30 –14:00, 1h30 senza pause ‣ Variazioni dell’ultima ora: sezione news pagina web ‣ Strumenti utilizzati: ‣ Linguaggio C: Code::Blocks ‣ Matlab: Matlab/Octave Politecnico di Milano - DEI Dipartimento di Elettronica e Informazione Informatica B - Esercitazione 1 del 05/10/2012 2 Facoltà di Ingegneria Industriale Salvo Daniele Valente Dipartimento di Elettronica e Informazione Laurea in Ingegneria Energetica, Meccanica e dei Trasporti Linguaggio C - Esercitazione 1 ‣ istruzioni base ‣ operazioni di input-output ‣ istruzioni condizionali Politecnico di Milano - DEI Dipartimento di Elettronica e Informazione Informatica B - Esercitazione 1 del 05/10/2012 3 Qualche consiglio... Salvo Daniele Valente Dipartimento di Elettronica e Informazione Laurea in Ingegneria Energetica, Meccanica e dei Trasporti ‣ Le diapositive mostrano i concetti con dei richiami di teoria. ‣ Vanno integrate con appunti presi durante le lezioni. ‣ Non è necessario ricopiare il codice, lo trovate sulle slides. Piuttosto segnatevi appunti utili a corredo. ‣ Quando provate l’esecuzione di un programma scrivete il codice manualmente (non copia e incolla). Riscrivere le istruzioni ripetutamente aiuta la memorizzazione. ‣ Le vostre domande sono assolutamente ben accette. ‣ Segnalatemi eventuali errori sulle slides. Politecnico di Milano - DEI Dipartimento di Elettronica e Informazione Informatica B - Esercitazione 1 del 05/10/2012 4 Richiami teorici Salvo Daniele Valente Dipartimento di Elettronica e Informazione C - Esercitazione 1 ‣ Il linguaggio C è un linguaggio compilato. Questo vuol dire che per passare dal codice al programma vero e proprio serve un passaggio intermedio che ne effettui la trasformazione, il compilatore. ‣ Un programma scritto in un linguaggio compilato ha come vantaggio di non aver più bisogno, una volta compilato, del programma specifico per essere eseguito. Inoltre, essendo la traduzione fatta una volta per tutte, sarà di più rapida esecuzione. ‣ Il linguaggio C è uno standard. Nello standard si definiscono le regole sintattiche e le linee guida per il compilatore. ‣ Per scrivere codice C basta un editor di testo (tipo Notepad, Word++, Textedit. etc.) ma, come già detto, per creare un programma funzionante dal proprio codice serve un compilatore. ‣ Il C offre anche una serie di funzionalità base (funzioni) che sono raccolte in diverse librerie (vedi dopo). Politecnico di Milano - DEI Dipartimento di Elettronica e Informazione Informatica B - Esercitazione 1 del 05/10/2012 5 Processo di building Salvo Daniele Valente Dipartimento di Elettronica e Informazione Source code C - Esercitazione 1 /* Hello World program */ #include <stdio.h> int main() { // Stampo a video la frase printf("Hello World!\n”); } build #include <stdio.h> int main() { printf("Hello World!\n”); } Assembly code Object code section! .text global _start _start: ! ! mov! mov! edx,len ecx,msg Pre-processore Compilatore Assembler Il pre-processor rimuove i commenti e valuta alcune direttive di pre-processamento tipo #include Il compilatore effettua diversi controlli (tra cui la sintassi) e traduce, file per file, il codice sorgente (alto livello) in codice macchina (basso livello) chiamato anche codice Assembly. L’Assembler crea i file oggetto (binari) ma lascia degli spazi vuoti per le funzioni richiamate esternamente rispetto al codice sorgente. Queste funzioni sono contenute nelle librerie. 011001010011001011010 ?? 010100110010110101111 001011010001000101101 ?? Linker Librerie 010010110100101001100 Codice eseguibile Politecnico di Milano - DEI Dipartimento di Elettronica e Informazione 011001010011001011010 101001100101101001010 001011010001000101101 101101011110101001101 010010110100101001100 Il Linker unisce il l’Object code con le funzioni prelevate dalle librerie e crea il file eseguibile. Informatica B - Esercitazione 1 del 05/10/2012 6 Esempio di codice Salvo Daniele Valente Dipartimento di Elettronica e Informazione C - Esercitazione 1 #include <stdio.h> #define MAXNUM 100 Dichiarazioni pre processore: parola chiave preceduta da # /*!Questo è un commento multilinea Usatelo per spiegare cose lunghe USATE I COMMENTI! */ Commenti: fondamentali. Fateli! Servono per capire cosa state facendo! int main() {! ! int i;! ! ! ! ! ! ! ! } // Dichiarazione di i! // Inizio il ciclo! for (i = 1; i <= MAXNUM; i++)! { ! printf("%3d)\n", i); } Corpo della funzione principale return 0; Politecnico di Milano - DEI Dipartimento di Elettronica e Informazione Informatica B - Esercitazione 1 del 05/10/2012 7 Fase di esecuzione Salvo Daniele Valente Dipartimento di Elettronica e Informazione C - Esercitazione 1 ‣ “Se compila, funziona”. NON E' VERO!!! ‣ Se la compilazione è andata a buon fine significa che il codice è formalmente corretto e possiamo lanciare l'eseguibile. ‣ Il lasso di tempo in cui un programma è in esecuzione è anche detto run time ‣ Ciò che succede quando parte il programma è ciò che si è chiesto al programma di fare...che non sempre coincide con quello che avremmo voluto che facesse...questo perchè: il compilatore non conosce le vostre intenzioni! ‣ Tre scenari (i più tipici): ‣ Il programma funziona e fa quello che deve. ‣ Il programma funziona, ma non fa quello che ci aspettavamo ‣ Il programma smette di funzionare ‣ Diagnosticare e risolvere problemi a run time non è semplice. Si ricorre ad uno strumento utilissimo chiamato debugger. Politecnico di Milano - DEI Dipartimento di Elettronica e Informazione Informatica B - Esercitazione 1 del 05/10/2012 8 Debugger Salvo Daniele Valente Dipartimento di Elettronica e Informazione C - Esercitazione 1 ‣ Le righe che compongono il codice di un programma vengono eseguite nell'ordine in cui sono state scritte, grazie al debugger è possibile fermare l'esecuzione in una posizione del codice. ‣ Possiamo segnalare al debugger la posizione in cui fermare l’esecuzione contrassegnando l’istruzione corrispondente con un breakpoint. ‣ Quando l'esecuzione arriva alla riga segnalata il programma va in pausa permettendoci di analizzarne lo stato. ‣ Si può ad esempio: ‣ vedere i valori delle variabili ‣ avanzare un passo alla volta nell'esecuzione ‣ Più avanti vedremo come tutto questo si fa ciò nella pratica. Politecnico di Milano - DEI Dipartimento di Elettronica e Informazione Informatica B - Esercitazione 1 del 05/10/2012 9 IDE Salvo Daniele Valente Dipartimento di Elettronica e Informazione C - Esercitazione 1 ‣ Una IDE (Integrated Developement Environmet) è un programma che contiene al suo interno: ‣ Un editor di testo (con syntax highlighting, suggeritore, etc…) ‣ Un compilatore ‣ Un debugger ‣ Ce ne sono moltissimi, per varie piattaforme (Eclipse, Visual Studio, CodeBlocks, DevC++, NetBeans, Codelite, Xcode, etc...) ‣ Noi useremo Code::Blocks ‣ Sul sito delle esercitazioni trovate: ‣ Link per le diverse architetture (Windows, Linux e Mac Intel) ‣ Una guida per l'installazione. ‣ Io sono a disposizione per dubbi e problemi ‣ Potete chiedere aiuto anche durante i laboratori Politecnico di Milano - DEI Dipartimento di Elettronica e Informazione Informatica B - Esercitazione 1 del 05/10/2012 10 Codice C: come scrivere Salvo Daniele Valente Dipartimento di Elettronica e Informazione C - Esercitazione 1 ‣ Codice C è formato da istruzioni. Ogni istruzione (e SOLO le istruzioni) deve essere terminata da punto e virgola. ‣ Utile per la leggibilità: ‣ 1 riga. 1 istruzione ‣ Indentazione: allineate le parti di codice (se non state usando un IDE che lo fa automaticamente per voi). ‣ Ricordatevi che il compilatore non ha problemi a leggere un codice estremamente disordinato… ma noi si! Il codice scritto deve essere leggibile. ‣ Essere ordinati aiuta enormemente anche a trovare/risolvere problemi. Politecnico di Milano - DEI Dipartimento di Elettronica e Informazione Informatica B - Esercitazione 1 del 05/10/2012 11 Esercizio 1 Salvo Daniele Valente Dipartimento di Elettronica e Informazione C - Esercitazione 1 Stampare a video la scritta: “Hello world! We are in 2012” Politecnico di Milano - DEI Dipartimento di Elettronica e Informazione Informatica B - Esercitazione 1 del 05/10/2012 12 Esercizio 1 - Soluzione Salvo Daniele Valente Dipartimento di Elettronica e Informazione C - Esercitazione 1 #include <stdio.h> #define YEAR 2012 Le prime istruzioni da inserire nel codice sono le istruzioni per il pre-processore (quello precedute da #). Nel nostro caso dobbiamo fare un’operazione di output, ovvero stampare un’informazione a schermo. Per farlo utilizzeremo una funzione che è contenuta in una libreria. La libreria è la standard input/output, contenuta nel file <stdio.h>, la includiamo nel codice con l’istruzione #include. La seconda istruzione è la definizione di una costante. Il pre-processore si occuperà di sostituire il valore 2012 in tutte le posizioni in cui è presente la costante YEAR. Con la #define si posso dichiarare anche brevi funzioni (macro). Per le costanti si utilizza il carattere maiuscolo per una maggiore leggibilità. Per ulteriori informazioni su #include e #define consulta: http://www.acm.uiuc.edu/webmonkeys/book/c_guide/1.7.html#define Politecnico di Milano - DEI Dipartimento di Elettronica e Informazione Informatica B - Esercitazione 1 del 05/10/2012 13 Esercizio 1 - Soluzione Salvo Daniele Valente Dipartimento di Elettronica e Informazione C - Esercitazione 1 Successivamente alle istruzioni del pre-processore inseriamo la funzione principale del codice: main(). int main() { ...corpo della funzione... } Il corpo della funzione è l’insieme di tutte le istruzioni necessarie allo svolgimento del problema. Definisco la variabile anno corrente: unsigned short currYear = 2012; Utilizzo la funzione di stampa a video contenuta nella libreria <stdio.h> per visualizzare le date contenute rispettivamente nella variabile currYear e nella costante YEAR (come vedremo, il risultato è identico): printf("Variabile - Hello World! We are in %d!\n", currYear); printf("Define - Hello World! We are in %d!\n", YEAR); Chiudo il corpo della funzione mail restituendo il valore 0. return 0; Politecnico di Milano - DEI Dipartimento di Elettronica e Informazione Informatica B - Esercitazione 1 del 05/10/2012 14 Esercizio 1 - Soluzione Salvo Daniele Valente Dipartimento di Elettronica e Informazione C - Esercitazione 1 La funzione printf("..."); stampa una stringa a video (stringa = insieme di caratteri) con formattazione. Prende in ingresso due parametri: ‣ una stringa da stampare che può contenere n placeholders (segnaposto) con indicazioni sulla formattazione (simbolo chiave: %) ‣ le n variabili da stampare, seguendo l’ordine indicato dai placeholders Esempio: char nome[10] = {'A', 'n', 'd', 'r', 'e', 'a'};! int anni = 29;! printf("Mi chiamo %s e ho %d anni.", nome, anni); %s su questo segnaposto verrà inserito il contenuto della variabile nome %d su questo segnaposto verrà inserito il valore di anni Esistono vari tipi di segnaposto, a seconda del tipo di dato che si vuole stampare. Per ulteriori informazioni su printf e placeholders consulta: http://www.acm.uiuc.edu/webmonkeys/book/c_guide/2.12.html#printf Politecnico di Milano - DEI Dipartimento di Elettronica e Informazione Informatica B - Esercitazione 1 del 05/10/2012 15 Esercizio 1 - Soluzione Salvo Daniele Valente Dipartimento di Elettronica e Informazione C - Esercitazione 1 Esempi di formattazione: stampare 1977 in tanti modi ‣ %d - signed int printf ("Signed int: %d", 1977); Signed int: 1977 ‣ %10d - Signed int preceduto da zeri. Se il numero è più corto di 10 cifre, inserisce zeri o spazi bianchi. printf ("Preceding with blanks: %10d %010d", 1977, 1977); Preceding with blanks: 1977 0000001977 ‣ %x - unsigned int stampato in esadecimale ‣ %o - unsigned int stampato in ottale ‣ forme alternative %#x, %#o printf ("Some different radixes: %d %x %o %#x %#o", 100, 100, 100, 100, 100); Some different radixes:100 64 144 0x64 0144 Politecnico di Milano - DEI Dipartimento di Elettronica e Informazione Informatica B - Esercitazione 1 del 05/10/2012 16 Esercizio 1 - Soluzione Salvo Daniele Valente Dipartimento di Elettronica e Informazione C - Esercitazione 1 ‣ %f - double precision printf ("floats: %4.2f %08.4f %+.0e %E ", 3.1416, 3.1416, 3.1416, 3.1416); (formattazione numerica) floats: 3.14 003.1416 +3e+000 3.141600E+000 ‣ %s - string printf ("%s ", "A string"); A string Politecnico di Milano - DEI Dipartimento di Elettronica e Informazione Informatica B - Esercitazione 1 del 05/10/2012 17 Esercizio 2 Salvo Daniele Valente Dipartimento di Elettronica e Informazione C - Esercitazione 1 Scrivere un programma che esegua la differenza di due numeri inseriti da tastiera Obiettivi: leggere da input utente Politecnico di Milano - DEI Dipartimento di Elettronica e Informazione Informatica B - Esercitazione 1 del 05/10/2012 18 Esercizio 2 - Soluzione Salvo Daniele Valente Dipartimento di Elettronica e Informazione C - Esercitazione 1 Questa volta vogliamo effettuare sia una operazione di input che una di output. Ancora una volta la libreria che occorre includere, quindi, è la <stdio.h> . Successivamente procediamo con la scrittura della funzione principale: main(). Definisco le variabili necessarie: int a, b, differenza; Stampo a video una frase per indicare all’utente di inserire il primo operando... printf("Inserisci il primo numero: "); ...e acquisisco il valore che inserisce. scanf("%d",&a); //fflush(stdin); La funzione scanf() legge dallo stdin (tastiera) e mette l'input negli indirizzi delle variabili specificate. Con il placeholder %d si suppone che il numero inserito dall’utente sia un intero. Nella scanf("%d",&a) è fondamentale passare alla funzione l’indirizzo della variabile e nonla variabile stessa: &a, non a. Politecnico di Milano - DEI Dipartimento di Elettronica e Informazione Informatica B - Esercitazione 1 del 05/10/2012 19 Esercizio 2 - Soluzione Salvo Daniele Valente Dipartimento di Elettronica e Informazione C - Esercitazione 1 Ripeto le operazioni per il secondo operando printf("Inserisci il secondo numero: "); scanf("%d",&b); // fflush(stdin); Eseguo la differenza... differenza = a - b; Stampo il risultato printf("Differenza: %d", differenza); getchar(); In alcuni casi, una volta visualizzato il risultato a schermo, la finestra di dialogo dell’IDE in uso si chiude automaticamente. La funzione getchar() serve a mantenere attiva la finestra finché non si preme un tasto. Per ulteriori informazioni su scanf consulta: http://www.acm.uiuc.edu/webmonkeys/book/c_guide/2.12.html#scanf Politecnico di Milano - DEI Dipartimento di Elettronica e Informazione Informatica B - Esercitazione 1 del 05/10/2012 20 Esercizio 3 Salvo Daniele Valente Dipartimento di Elettronica e Informazione C - Esercitazione 1 Scrivere un programma che, dati due numeri inseriti da tastiera esegua la differenza tra il maggiore e il minore Obiettivi: Esecuzione condizionale Differenza tra assegnamento e confronto Operatori booleani Sintassi: if ( condizione ) { ... Se la (le) condizione(i) è (sono) vera(e)... } else { ... altrimenti } Politecnico di Milano - DEI Dipartimento di Elettronica e Informazione Informatica B - Esercitazione 1 del 05/10/2012 21 Esercizio 3 Salvo Daniele Valente Dipartimento di Elettronica e Informazione C - Esercitazione 1 Operatori di confronto ‣ < minore ‣ <= minore od uguale ‣ > maggiore ‣ >= maggiore od uguale ‣ == uguale ‣ != diverso ‣x ‣x ‣y ‣ = 29 è un assegnamento. La variabile x assume il valore 29. == 29 NON assegna, ma valuta l’uguaglianza dei due termini. == 78 analogamente NON assegna, vale vero o falso (nel nostro caso falso) Esempio: Se la variabile x è maggiore od uguale a 50 fai qualcosa... if( x >= 50 ){ … } Politecnico di Milano - DEI Dipartimento di Elettronica e Informazione Informatica B - Esercitazione 1 del 05/10/2012 22 Esercizio 3 Salvo Daniele Valente Dipartimento di Elettronica e Informazione C - Esercitazione 1 Capiterà spesso di trovarsi di fronte a condizioni più complesse come: Se x è maggiore di 50 ma minore di 65 In questo caso si utilizzano gli operatori Booleani. Booleano è un tipo che può avere solo due valori: vero o falso. ‣ && AND ‣ || OR Esempio: verificare se 50 < x ≤ 65 x deve essere contemporaneamente maggiore di 50 e minore di 65 if( x > 50 && x <= 65) Esempio: verificare se una persona ha diritto a sconti sullo skipass. L’età deve essere minore di 6 o maggiore di 65 if (x < 6 || x >65 ) Attenzione perché l’operatore AND ha la precedenza sull’operatore OR. Usare le parentesi se non si è sicuri. Politecnico di Milano - DEI Dipartimento di Elettronica e Informazione Informatica B - Esercitazione 1 del 05/10/2012 23 Esercizio 3 - Soluzione Salvo Daniele Valente Dipartimento di Elettronica e Informazione C - Esercitazione 1 Da ora in poi si sottintenderà che il corpo della funzione sia incluso in nella porzione di codice che segue (salvo diverse indicazioni). #include<stdio.h> int main() { ... } Analizziamo il corpo della funzione principale. Definisco ed acquisisco le variabili necessarie: int a, b, differenza; printf("Inserisci il primo numero: "); scanf("%d",&a); fflush(stdin); printf("Inserisci il secondo numero: "); scanf("%d",&b); fflush(stdin); Politecnico di Milano - DEI Dipartimento di Elettronica e Informazione Informatica B - Esercitazione 1 del 05/10/2012 24 Esercizio 3 - Soluzione Salvo Daniele Valente Dipartimento di Elettronica e Informazione C - Esercitazione 1 Controllo chi è il maggiore if ( a > b ) { differenza = a - b; } else { differenza = b - a; } Alternativa di controllo con operatore TERNARIO: differenza = (a > b) ? a - b : b - a; ovvero: se (a > b), la differenza vale a - b, altrimenti differenza vale b - a. Sintassi: variabile=(condiz)? valore_condiz_vera : valore_condiz_falsa; Politecnico di Milano - DEI Dipartimento di Elettronica e Informazione Informatica B - Esercitazione 1 del 05/10/2012 25 Esercizio 3 - Soluzione Salvo Daniele Valente Dipartimento di Elettronica e Informazione C - Esercitazione 1 Stampo il risultato if ( b > a ) { printf("Per la differenza ho invertito i dati di input dato che b>a."); } printf("La differenza vale: %d\n", differenza); Politecnico di Milano - DEI Dipartimento di Elettronica e Informazione Informatica B - Esercitazione 1 del 05/10/2012 26 Esercizio 4 Salvo Daniele Valente Dipartimento di Elettronica e Informazione C - Esercitazione 1 Verifica se un anno è bisestile. Un anno è bisestile quando è multiplo di 4 e non di 100 oppure multiplo di 400. Obiettivi: Operazioni condizioni più complesse Politecnico di Milano - DEI Dipartimento di Elettronica e Informazione Informatica B - Esercitazione 1 del 05/10/2012 27 Esercizio 4 - Soluzione Salvo Daniele Valente Dipartimento di Elettronica e Informazione C - Esercitazione 1 Definisco ed acquisisco le variabili necessarie: int anno, bisestile; printf("il numero dell'anno: "); scanf("%d", &anno); fflush(stdin); Considero bisestile una variabile booleana, ovvero: se vale 0 --> la considero FALSE altrimenti --> la consdero TRUE bisestile = ((anno % 4 == 0) && (anno % 100 != 0)) || (anno % 400 == 0); L’operazione modulo valore1 % valore2, restituisce il resto della divisione tra i due valori. Per ulteriori informazioni su tutti gli operatori consulta: http://www.acm.uiuc.edu/webmonkeys/book/c_guide/1.5.html Politecnico di Milano - DEI Dipartimento di Elettronica e Informazione Informatica B - Esercitazione 1 del 05/10/2012 28 Esercizio 4 - Soluzione Salvo Daniele Valente Dipartimento di Elettronica e Informazione C - Esercitazione 1 Stampo il risultato: printf("L'anno %d ",anno); if (! bisestile) { printf("NON "); } printf("e’ bisestile"); Per ulteriori informazioni su tutti gli operatori consulta: http://www.acm.uiuc.edu/webmonkeys/book/c_guide/1.5.html Politecnico di Milano - DEI Dipartimento di Elettronica e Informazione Informatica B - Esercitazione 1 del 05/10/2012 29 Esercizio 5 Salvo Daniele Valente Dipartimento di Elettronica e Informazione C - Esercitazione 1 Scrivere un programma che prende in ingresso un prezzo in euro e restituisce il numero minimo di banconote utilizzando solo pezzi da 50, 20 e 5 euro. Indicare anche la moneta rimanente Obiettivi: Operatore modulo Politecnico di Milano - DEI Dipartimento di Elettronica e Informazione Informatica B - Esercitazione 1 del 05/10/2012 30 Esercizio 5 - Soluzione Salvo Daniele Valente Dipartimento di Elettronica e Informazione C - Esercitazione 1 Può essere utile nel codice ripetere delle operazioni diverse volte, magari su elementi diversi. Questo può essere fatto per un numero di volte: ‣ infinito (ATTENZIONE!) ‣ finito deciso a runtime ‣ finito deciso a compile time Per farlo esistono diversi costrutti: ‣ while ‣ for ‣ do…while Politecnico di Milano - DEI Dipartimento di Elettronica e Informazione Informatica B - Esercitazione 1 del 05/10/2012 31 Esercizio 5 - Soluzione Salvo Daniele Valente Dipartimento di Elettronica e Informazione C - Esercitazione 1 Dichiaro le variabili e prendo in input il prezzo int prezzo, rimanente, n50, n20, n5; printf("Inserisci il prezzo: "); scanf("%d",&prezzo); Un’operazione facoltativa ma sintomo di buona programmazione è quella svuotare i buffer di ingresso/uscita dopo l’acquisizione dei dati. Si fa con l’istruzione: fflush(stdin); Calcoliamo il numero di banconote per taglio. Esempio: prezzo 547€ Il valore delle divisioni è decimale, ma le variabili sono di tipo int, per cui il valore che verrà effettivamente assegnato alla variabile sarà la parte intera. n50 = prezzo / 50; numero di banconote da 50 (decimale): 10.94 rimanente = prezzo % 50; resto della divisione intera: 47 n20 = rimanente / 20; numero di banconote da 20 (decimale): 2.35 rimanente = rimanente % 20; resto: 7 n5 = rimanente / 5; numero di banconote da 5: 1.4 rimanente = rimanente % 5; resto finale: 2 Politecnico di Milano - DEI Dipartimento di Elettronica e Informazione Informatica B - Esercitazione 1 del 05/10/2012 32 Esercizio 5 - Soluzione Salvo Daniele Valente Dipartimento di Elettronica e Informazione C - Esercitazione 1 Stampo i risultati printf("Banconote da 50: %d",n50); printf("Banconote da 20: %d",n20); printf("Banconote da 5 : %d",n5); printf("Resto: %d", rimanente); getchar(); Politecnico di Milano - DEI Dipartimento di Elettronica e Informazione Informatica B - Esercitazione 1 del 05/10/2012 33