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 1
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); 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 2
Principali specificatori di formato per numeri: %d int %u unsigned int %ld long %lu unsigned long %f, %e, %g float %lf double 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) : 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 caratteri 4 e 2, li converte nell intero 42, e lo assegna a y 3
Eventuali caratteri rimanenti rimangono a disposizione per letture successive : 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 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) 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) 4
scanf restituisce il numero di variabili a cui è riuscita ad assegnare un valore oppure la costante simbolica EOF (end of file) 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) 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 scanf("%d/%d/%d", &giorno, &mese, &anno); permette di leggere date come 19/01/2015[Invio] 5
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 scanf("%d %d", &x, &y); permette di leggere input come 19 23[Invio] 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) 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); 6
Principali specificatori di formato per numeri: %d int %u unsigned int %ld long %f double o float in formato decimale con 6 cifre dopo il punto decimale %e double o float in formato esponenziale %g double o float in formato decimale o esponenziale (viene scelto il più adatto a seconda del valore) 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: %% 7
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) 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) printf("%7.2f",256.7865) à 256.79 %.3f stampa tre decimali e non pone nessuna richiesta sul numero di cifre prima del punto 8
Anche se spesso non è utile, è bene sapere che la funzione 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 Quindi l istruzione printf("ciao Mondo!") restituisce il numero 11 (conta anche lo spazio) 9