Sei sulla pagina 1di 7

2

Funzioni di I/O per numeri


 Per utilizzare le funzioni di Input/Output
Input e output bisogna includere l’header file <stdio.h>
di valori numerici che ne contiene la descrizione (ossia la
sintassi) in modo che il compilatore possa
controllare che l’utilizzo della funzione sia
corretto
Ver. 2.4  <stdio.h> contiene anche la definizione di
alcune costanti simboliche, come quella usata
da alcune funzioni per segnalare la fine
dell’input o del file: EOF (End Of File)

© 2010 - Claudio Fornaro - Corso di programmazione in C

3 4

Stream preesistenti Input formattato – scanf


 Quando un programma viene mandato in  La scanf è la più completa tra le funzioni di
esecuzione, il sistema operativo gli fornisce 3 input da tastiera (scan formatted =
stream (flussi di dati) già aperti (pronti per scansione con formato)
essere utilizzati):  Sintassi:
 stdin [standard input] collegato alla tastiera scanf(stringa di formato, lista di variabili)
 stdout [standard output] collegato al video per
l’output normale, ossia per mostrare i  Legge valori dalla tastiera e li assegna alle
dati prodotti dall’elaborazione variabili indicate nella lista di variabili
 stderr [standard error] collegato al video per  Per ciascuna variabile c’è il corrispondente
l’output di diagnostica, ossia per tipo nella stringa di formato
riportare informazioni relative al
scanf("%d%d", &a, &b);
funzionamento del programma, ad
esempio segnalazioni errori (che non
sono i dati prodotti dall’elaborazione)
5 6

Input formattato – scanf Input formattato – scanf


 Più in dettaglio:  Esempi
scanf(stringa di formato, lista di variabili)  scanf("%d", &a);
 La lista di variabili è un elenco di variabili a cui legge 1 valore di tipo int (come richiesto dalla
assegnare i dati letti dalla tastiera, queste: specifica %d) e lo assegna alla var a (che deve
essere stata definita di tipo int)
 sono separate da virgole
 scanf("%d%d", &a, &b);
 sono assegnate nell’ordine in cui sono elencate
legge 2 valori di tipo int (come richiesto dalle 2
 precedute (ciascuna) dal carattere ‘&’ (per
specifiche %d) e li assegna ad a e b (di tipo int)
ricavarne il puntatore)
 Quest’ultima equivale a:
 La stringa di formato contiene un elenco di scanf("%d", &a);
specifiche di conversione, queste: scanf("%d", &b);
 sono composte da una lettera preceduta dal
 Negli ultimi 2 esempi l’utente può inserire i 2 valori
carattere ‘%’ in input tutti insieme (separati da spazi) con un
 specificano il tipo di dato atteso per ciascuna unico Invio finale o uno per volta con un Invio
delle variabili della lista di variabili dopo ciascun valore

7 8

Input formattato – scanf Input formattato – scanf


 Principali specifiche di conversione per valori  Tipicamente la stringa di formato contiene solo
numerici: specifiche di conversione, senza altri caratteri
%d  int in mezzo (neppure spazi): "%d%d%d"
%u  unsigned int  La stringa di formato può contenere anche
%x  unsigned int in esadecimale caratteri ordinari, in questo caso la scanf si
%hd  short int aspetta l’introduzione di proprio quei caratteri
%ld  long int
%f, %e, %g  float (equivalenti)
in quella esatta sequenza. Questi caratteri sono
%lf  double
scartati, ma se non ci sono la scanf si blocca
%Lf  long double  Esempio: lettura di una data:
scanf("%d/%d/%d", &giorno, &mese, &anno);
 Le lettere h, l e L sono i cosiddetti
legge date tipo ‘25/2/1997’
modificatori di tipo
ma un input quale ‘25 febbraio 1997’ fa
leggere solo il 25 e al primo spazio si ferma
9 10

Input formattato – scanf Input formattato – scanf


 Per indicare un carattere ‘%’ (non specifica di  La scanf legge da tastiera dei caratteri e in
conversione) nella stringa di formato è base alla specifica di conversione ‘%x’
necessario indicarlo doppio: %% indicata nella stringa di formato li trasforma in
un valore del tipo corrispondente
 Se la stringa di formato contiene un white  Ad esempio, con la specifica %d la scanf legge i
space (ossia spazio, Tab e ‘\n’), la scanf si caratteri 1 e 2 e li trasforma nel numero 12 (int)
aspetta di trovare uno o più white space (di  Il gruppo di caratteri letti di volta in volta dalla
qualunque tipo) consecutivi in quel punto scanf per essere trasformati in un unico
dell’input e li salta tutti. Quindi indicare il valore viene detto campo (field ) o token
carattere ‘\n’ non richiede alla scanf di  La scanf salta i white space iniziali del campo
aspettarsi in quel momento l’introduzione di che legge (è per questo che i valori possono
un semplice ritorno a capo e di scartarlo essere immessi su più righe)

11 12

Input formattato – scanf Input formattato – scanf


 La quantità di caratteri utilizzati per costituire  Se non ci sono caratteri compatibili con il tipo
un campo dipende dalla specifica di richiesto dalla specifica, il campo è nullo, la
conversione utilizzata: variabile corrispondente non viene modificata,
 viene prelevato il massimo numero di caratteri la scanf termina immediatamente e tutti i
compatibili con il tipo richiesto dalla specifica caratteri restano nel buffer di tastiera
 non appena si incontra un carattere non compatibile  Se si inserisce dalla tastiera la sequenza di caratteri
con la specifica si ferma “12 abc 34”, una scanf("%d%d", &a, &b) legge
 i caratteri rimanenti rimangono a disposizione per le solo il 12 perché si aspetta un valore numerico per
successive letture (“restano nel buffer della b e invece trova “ abc 34” che non lo è, il contenuto
tastiera”, ossia in memoria) di b non viene modificato
Se si inserisce dalla tastiera la sequenza di caratteri  Si noti che se in questo caso la scanf termina
“12 23 34”, una scanf("%d", &a); legge il 12 e anche se ha altre variabili da assegnare, in
lo mette in a, mentre “ 23 34” resta in memoria e questi casi è diverso avere una scanf con più
verrà utilizzato (ad es.) dalla successiva scanf variabili o più scanf con una sola variabile
13 14

Input formattato – scanf Input formattato – scanf


 La funzione scanf restituisce:  Esempio
 un valore ≥ 0 di tipo int che indica a quante n = scanf("%d%d", &a, &b);
variabili della lista sono stati assegnati valori  se n vale 2: la scanf ha letto 2 valori e li ha
prelevati dalla tastiera assegnati ad a e b
 oppure il valore int costante EOF che indica che si  se n vale 1: la scanf ha letto un solo valore
è verificato un errore o che non c’è nulla da leggere (assegnato ad a), mentre b non è stata modificata
(ha il vecchio valore)
 La scanf produce il valore EOF quando  se n vale 0: nessun valore è stato letto, né a né b
l’utente inserisce il carattere di Fine File da sono stati modificati, ma ci sono altri caratteri
tastiera premendo i tasti: pronti per essere letti dalla prossima istruzione di
 Control-Z su sistemi DOS/Windows (+tasto Invio) input
 se n vale EOF: nessun valore è stato letto, né a né
 Control-D su sistemi Unix/Linux
b sono stati modificati e non ci sono altri caratteri
 Si noti che il codice ASCII del carattere di Fine pronti per essere letti dalla prossima istruzione di
File non è il valore della costante EOF input

15 16

Input formattato – scanf Input formattato – scanf


 Esempi  Una specifica contenente un ‘*’ tra il ‘%’ e la
Se in input (da tastiera) la funzione lettera indica che il corrispondente campo
n=scanf("%d", &a) legge i caratteri: deve essere letto, ma il valore non deve
 “12”  questi producono per a = 12, n = 1 essere assegnato ad alcuna variabile
 “12 23”  a = 12, n = 1, i caratteri “ 23” restano (soppressione dell’input )
a disposizione della successiva operazione di input
 Il valore restituito dalla scanf considera solo
 “12abc”  a = 12, n = 1, i caratteri “abc” restano
a disposizione della successiva operazione di input i valori letti e assegnati
 “abc”  non producono nulla per a (che mantiene  Esempio
il vecchio valore), n = 0, i caratteri “abc” restano a n = scanf("%d%*d%d", &a, &b);
disposizione della successiva operazione di input
Se si dà in input: “12 23 34” si ottiene:
 “abc12”  non producono nulla per a (mantiene il
vecchio valore), n = 0, i caratteri “abc12” restano a a=12, b=34, n=2
disposizione della successiva operazione di input mentre il valore 23 viene letto e scartato
17 18

Input formattato – scanf Input formattato – scanf


 Si noti che se la scanf legge almeno un  Una specifica contenente un numero intero
valore (anche se c’è soppressione dell’input) specifica la quantità massima di caratteri da
NON dà EOF leggere per costituire il campo corrispondente
 Esempio (e per poi convertirlo in numero)
n = scanf("%*d");  Esempio
 Se si dà in input: “12” si ottiene: La specifica %4d indica che il campo da
n =0 leggere per essere convertito in un valore di
mentre il valore 12 viene letto e scartato tipo int può essere costituito da al massimo
 Se si dà in input: Control-Z (+ tasto Invio) si 4 caratteri
ottiene:
n = –1
(supponendo che –1 sia il valore della costante EOF
nel compilatore in uso)

19 20

Input formattato – scanf Input formattato – scanf


 Se il numero di caratteri in input che possono  Se il numero di caratteri in input che possono
fare parte del campo è inferiore alla quantità fare parte del campo è superiore alla quantità
massima specificata, vengono letti solo quei massima specificata, vengono letti solo tanti
caratteri: caratteri quanti sono quelli indicati nella
 scanf("%4d%d",&a,&b); specifica (gli altri restano per le letture
se si dà in input: “12 23” successive) :
si ottiene: a=12, b=23  scanf("%4d%d",&a,&b);
in quanto lo spazio delimita il primo campo prima se si dà in input: “123456”
del 4o carattere) si ottiene: a=1234, b=56
21 22

Output formattato – printf Output formattato – printf


 La printf è la più completa tra le funzioni di  Più in dettaglio:
output su tastiera (print formatted = stampa printf(stringa di formato, lista di espressioni)
con formato)  La stringa di formato contiene:
 caratteri ordinari, vengono visualizzati tali e
 Sintassi: quali (per visualizzare il carattere %, lo si deve
printf(stringa di formato, lista di espressioni) indicare raddoppiato: %%)
 Visualizza il testo indicato nella stringa di  specifiche di conversione (es. %d) che indicano

formato e valori elencati nella lista di come visualizzare l’espressione corrispondente


della lista di espressioni
espressioni
 La lista di espressioni è l’elenco delle espressioni di
 Ciascun valore della lista di espressioni viene cui visualizzare il risultato:
visualizzato sostituendolo alla corrispondente  ciascun risultato viene visualizzato al posto della
direttiva di conversione nella stringa di formato corrispondente specifica di conversione (devono
corrispondere per numero e tipo)
printf("Lat: %d, Lon: %d\n", a, b);
 le espressioni sono separate da virgole

23 24

Output formattato – printf Output formattato – printf


 Specifiche di conversione per valori numerici  Restituisce un valore int che può essere:
%d  int  se  0: è il numero di caratteri scritti a video
%u  unsigned int  se < 0: è una segnalazione di un errore
%x  unsigned int in esadecimale n = printf("Somma = %d", a);
%hd  short int Con a pari a 5, n vale 9
%ld  long int  Le sequenze di escape permettono di
%f  double in formato decimale con 6 inserire singoli caratteri speciali nella stringa di
cifre dopo la virgola formato:
%e  double in formato esponenziale \n inserisce un ritorno a capo (si mette in fondo
%g  double in formato decimale o alla stringa di formato, di solito)
esponenziale a seconda del valore, \t inserisce un carattere Tab
rimuove zeri in coda \" inserisce un carattere doppie virgolette ‘"’
%Lf  long double in formato decimale
\’ inserisce un carattere apice ‘’’
 Per i float si usano le specifiche dei double \\ inserisce un carattere backslash ‘\’
25 26

Output formattato – printf Output formattato – printf


 Tra il carattere ‘%’ e la specifica di conversione  Esempi
possono esserci, nell’ordine da sinistra:  %8d  int su almeno 8 caratteri
 Opzioni di allineamento (es. un ‘–’ allinea a sinistra) n=printf("X%8dX", 12);
visualizza “X12X”, n vale 10
 Un numero intero che specifica l’ampiezza minima
del campo (in caratteri)  %12f  float/double su almeno 12 char
n=printf("X%12fX", 12.4);
 Un punto se si vuole specificare la precisione visualizza “X12.400000X”, n vale 14
 Un numero intero che specifica la precisione:  %.2f  float/double con 2 caratteri decimali
 per i floating-point: è il numero di cifre da n=printf("X%.2fX", 12.4);
visualizzare dopo il punto decimale (default: 6), i visualizza “X12.40X”, n vale 7
valori hanno internamente il n. di cifre proprio  %8.2f  float/double su almeno 8 caratteri e
del tipo a cui appartengono, es. i float 7 con 2 caratteri dopo la virgola
 per gli interi: è il numero minimo di caratteri n=printf("X%8.2fX", 12.4);
da visualizzare visualizza “X12.40X”, n vale 10
 Un modificatore di tipo (h,l,L) per short, ecc. n=printf("X%8.2fX", 121212.4);
visualizza “X121212.40X”, n vale 11

27

Esercizi
1. Scrivere un programma che chieda 4 numeri
double e ne calcoli la media (double) con 2
decimali.
2. Scrivere un programma che chieda un valore
double e lo visualizzi con le 3 specifiche di
conversione %f, %e e %g.

Potrebbero piacerti anche