• Non ci sono risultati.

Input/Output di numeri I/O di numeri

N/A
N/A
Protected

Academic year: 2021

Condividi "Input/Output di numeri I/O di numeri"

Copied!
9
0
0

Testo completo

(1)

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

(2)

¨ 

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

(3)

%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

(4)

¨ 

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)

(5)

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]

(6)

¨ 

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);

(7)

%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)

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: %%

(8)

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

(9)

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)

Riferimenti

Documenti correlati

In relazione alla compilazione della parte relativa all’ iscrizione nell'elenco dei fornitori di servizi ed esecutori di lavori non soggetti a tentativo di infiltrazione

In sintesi, secondo la ricorrente, l’aggiudicazione in favore de La Ginestra sarebbe viziata (e, di conseguenza, sarebbe viziata quella effettuata per scorrimento in favore della

L'impiego di lubrificanti o di soluzioni intelligenti per il rivestimento superficiale, come Bossard ecosyn ® -lubric, il know-how nella realizzazione delle filettature, la

Semiotics of Space / Space of Semiotics Sémiotique de l’espace / Espace de la Sémiotique Semiótica del espacio / Espacio de la semiótica Semiótica do espaço / Espaços da

Per chi scrive il compito attualmente più impegna- tivo per un progettista è quello di determinare la durata di un prodotto in termini di gestione della corrosione. In altre

271 BELLATO GIANLUCA M SM55 25 RUN ATHLETIC TEAM A.S.D.. atleta

Gara 21Km WRA Half Marathon

Internal composition of WDs and the physics core He-burning stars The majority of the white dwarfs have a core made of the ashes of the He burning:3. carbon, which is produced by the