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
Scarica

Slides - Informatica B - Politecnico di Milano