Input/Output di numeri
I/O di numeri
¨
Per utilizzare le funzioni di I/O occorre include il file di intestazione (o file header) stdio.h utilizzando all’inizio del sorgente la direttiva
#include <stdio.h>
¨
stdio.h contiene i prototipi delle funzioni (descritti
in seguito nel corso) e costanti simboliche. I prototipi
servono al compilatore per controllare che le funzioni
siano utilizzate con la sintassi corretta
¨
Per l’input la funzione più utilizzata e più completa è la scanf (scan formatted, scansione con formato)
¨
La sintassi è
scanf(stringa di formato, lista di variabili)
¨
Legge dallo standard input (di solito la tastiera) le variabili indicate nella lista di variabili
¨
Per ogni variabile bisogna indicare nella stringa di formato lo specificatore di formato adatto
¨
Ad es.
scanf("%d%d", &x, &y);
Input formattato
¨
La lista di variabili comprende le variabili, separate da virgole, che verranno assegnate nell’ordine in cui sono elencate
¨
Ogni variabile è preceduta dal simbolo di & (che serve per ricavarne l’indirizzo, come vedremo dopo)
¨
La stringa di formato contiene, tra doppi apici, degli
specificatori di formato che specificano qual è il tipo
di dato atteso per le variabili in lista di variabili
%d int
%u unsigned int
%ld long
%lu unsigned long
%f, %e, %g float
%lf double
Input formattato
¨
La scanf legge dalla tastiera un carattere per volta e,
seguendo le indicazioni degli specificatori di formato, ricava una sequenza di caratteri che si chiama token
¨
scanf interrompe la lettura di un token quando incontra un carattere white space (cioè lo spazio, il tab o l’“a capo”) (eventuali white space iniziali vengono scartati)
¨
Es.:
Se si scrive da tastiera “ 23 42[Invio] ”, l’istruzione
scanf("%d%d", &x, &y); legge i caratteri 2 e 3, li
converte nel numero 23 e assegna a x tale valore; lo spazio
segnala alla scanf la fine del primo token. Poi scanf legge i
¨
Eventuali caratteri rimanenti rimangono a disposizione per letture successive
¨
Es.:
Se si scrive da tastiera “23 42[Invio]”, l’istruzione
scanf("%d", &x); legge i caratteri 2 e 3 e lascia
“ 42[Invio]” nel buffer a disposizione di eventuali letture successive
Input formattato
¨
Se la scanf incontra un carattere non compatibile con lo specificatore di formato, termina la lettura senza
modificare il valore della variabile corrispondente (e lascia il carattere nel buffer)
¨
Es.
Se si scrive da tastiera “ 42 pippo 55[Invio] ”,
scanf("%d%d%d", &x, &y, &z); legge 42 , che assegna a x . Poi incontra “ pippo ”, che non è un valore numerico, e termina la lettura senza assegnare valori a y
e a z (e lasciando “ pippo 55[Invio] ” nel buffer)
assegnare un valore oppure la costante simbolica EOF (end of file)
¨
Es.
int n = scanf("%d%d", &x, &y);
¤
Se n==2, la scanf ha letto entrambi i valori
¤
Se n==1, la scanf ha letto solo x e non ha modificato y
¤
Se n==0, la scanf non ha assegnato nessun valore né a x né a y ma ci sono ancora caratteri nel buffer che possono essere letti
¤
Se n==EOF, la scanf non ha letto nessun valore e non ci sono caratteri nel buffer. Per introdurre EOF da tastiera si premono Ctrl+D su Unix (o Ctrl+Z su Windows)
Input formattato
¨
La stringa di formato può contenere anche caratteri diversi dagli specificatori di formato. In questo caso la scanf si aspetta di ritrovare nell’input esattamente quei caratteri nell’ordine indicato. I caratteri vengono letti e scartati. Se la scanf trova una discrepanza tra i caratteri nella stringa di formato e i caratteri di input, termina la lettura
¨
Es.
scanf("%d/%d/%d", &giorno, &mese, &anno);
permette di leggere date come “ 19/01/2015[Invio] ”
¨
Se la stringa di formato contiene un white space, la scanf legge zero o più white space, che verranno scartati, fino al primo carattere non white space
¨
Es.
scanf("%d %d", &x, &y);
permette di leggere input come “ 19 23[Invio] ”
¨
Es.
scanf("%d\n", &x);
legge input come “ 19[Invio]23[Invio] ” lasciando nel buffer “ 23[Invio] ” (il primo [Invio] viene atteso e scartato per via del “\n”; dopo scanf attende fino al secondo Invio prima di restituire il controllo al chiamante)
Output formattato
¨
Per l’output la funzione più utilizzata e più completa è la printf (print formatted, stampa con formato)
¨
La sintassi è
printf(stringa di formato, lista di espressioni)
¨
Stampa nello standard output (di solito la finestra del terminale) le espressioni indicate nella lista di espressioni
¨
Per ogni espressione bisogna indicare nella stringa di formato lo specificatore di formato adatto, che verrà sostituito dall’espressione
¨
Ad es.
printf("La somma di %d e %d è \n", x,
y, x+y);
%d int
%u unsigned int
%ld long
%f double
o
floatin formato decimale con 6 cifre dopo il punto decimale
%e double
o
floatin formato esponenziale
%g double
o
floatin formato decimale o esponenziale (viene scelto il più adatto a seconda del valore)
Output formattato
¨
La stringa di formato può contenere sequenze di escape:
¤
\n (newline)
¤
\t (tab)
¤
\b (backspace)
¤
\\ (carattere di escape per \),
¤
\" (carattere di escape per ", doppi apici),
¤
Per la stampa del carattere % si usa: %%
Indentazione:
¨
Tipi interi:
¤
Tra specificatore di formato e % si può indicare un valore n
¤
n specifica il numero (minimo) di caratteri con cui stampare il numero
¤
Ad es. se voglio scrivere il contenuto della variabile x su 6 caratteri e x vale 234, nella stringa di controllo scriverò "%6d"
¤
Il risultato a video sarà “ 234”, dove 234 è preceduto da tre spazi vuoti (blank)
Output formattato
Indentazione:
¨
Tipi in virgola mobile:
¨
Tra specificatore di formato e % si indicano due valori n.m
¨
n specifica il numero (minimo) di caratteri con cui stampare il numero compreso il punto decimale
¨
m specifica la sua precisione (cioè quante cifre dopo il punto decimale)
¨
Es. printf("%7.2f",256.7865) à “ 256.79”
¨
Es. %.3f stampa tre decimali e non pone nessuna richiesta sul numero
di cifre prima del punto
printf, come molte funzioni del C, restituisce un valore
¨
In particolare, printf restituisce il numero di caratteri stampati o un numero negativo in caso di errore
¨