Le istruzioni di ingresso e uscita


L’istruzione per acquisire dati dalla tastiera (input) si indica in C con scanf. La lettera f finale indica che l’acquisizione dei dati è fatta secondo un formato (input formattato).
Per esempio:

scanf("%d", &raggio);

fa entrare da tastiera un numero intero e lo assegna alla variabile di nome raggio. L’istruzione ha due argomenti, scritti tra le parentesi tonde e separati dalla virgola: il primo, tra virgolette, indica il formato; il secondo contiene la variabile il cui valore viene acquisito dalla tastiera.
Come già visto nel primo esempio, per il calcolo della somma di due numeri, il nome della variabile è preceduto dal carattere &, perché l’istruzione scanf richiede come argomento l’indirizzo della variabile e non il nome della variabile. Questo vale per i dati di tipo numerico, intero e reale, e per i caratteri; invece per le stringhe formate da più di un carattere non si deve indicare il carattere &.
I formati sono rappresentati con sequenze di caratteri, dette specificatori di formato: essi iniziano con il carattere %, seguito da uno o più caratteri.

Gli specificatori di uso più comune sono i seguenti:

%d dati numerici interi
%f dati numerici in virgola mobile (float e double)
%c dati formati da un solo carattere
%s dati stringa


L’istruzione scanf indica quindi un’operazione sullo standard input, cioè l’unità standard del computer per acquisire dati dall’esterno (tastiera).
L’operazione di lettura con scanf, permette di leggere con un’unica operazione tutti i caratteri digitati fino alla pressione del tasto Invio. Se si vogliono leggere più dati, si devono indicare, nelle parentesi di scanf, tanti specificatori di formato e tante variabili quanti sono i dati da inserire:

scanf("%d %d", &base, &altezza);

L’utente del programma può inserire i dati richiesti sulla stessa riga separandoli con la barra spaziatrice o con il ritorno a capo.
L’istruzione per visualizzare dati e messaggi sul video (output) si indica in C con printf. La lettera f finale indica che la visualizzazione è ottenuta specificando un formato (output formattato).
Per esempio:

printf("%f", area);

scrive sul video il valore numerico in virgola mobile contenuto nella variabile area. L’istruzione printf utilizza gli stessi specificatori di formato visti per scanf.
L’istruzione printf indica quindi un’operazione sullo standard output, cioè l’unità standard del computer per comunicare i risultati (video).
Eventuali messaggi, utili per illustrare i risultati, devono essere inseriti tra le virgolette, insieme agli specificatori di formato, nella posizione dove devono comparire. Per esempio, se la variabile area possiede il valore 10, l’istruzione:

printf("Risultato del calcolo = %f", area);

produce in output la seguente riga:

Risultato del calcolo = 10.0

È possibile impostare il numero delle posizioni utilizzate per rappresentare il risultato e il numero delle cifre dopo il punto decimale. I valori delle impostazioni sono indicati prima dei caratteri dello specificatore di formato. Per esempio:

printf("Risultato del calcolo = %15.2f", area);

visualizza il valore di area allineato a destra all’interno di 15 posizioni e con 2 cifre decimali.
L’output è il seguente:

Risultato del calcolo = 10.00

L’istruzione printf visualizza il messaggio e il valore di area lasciando il cursore sulla stessa riga del video; l’output di una successiva istruzione printf verrà visualizzato subito dopo. Per portare il cursore all’inizio della riga successiva del video (cioè per andare a capo nella visualizzazione), occorre aggiungere all’interno delle virgolette, alla fine della specificazione del formato, i due caratteri \n; l’output successivo comparirà all’inizio di una nuova riga.
Per esempio:

printf("%f \n", area);

Per facilitare l’inserimento dei dati da parte dell’utente del programma, è buona norma far precedere all’istruzione scanf un’istruzione printf, che fa comparire un messaggio, per ricordare quali dati occorre inserire, di quale tipo (numeri o stringhe) ed eventualmente in quale formato.

printf("Introduci il lato: ");
scanf("%d", &lato);

Se si vuole stampare sulla carta della stampante anziché sul video, occorre utilizzare, anziché l’istruzione printf, l’analoga fprintf (stampa formattata su file), che funziona con le stesse modalità di printf. Occorre solo specificare il nome della stampante, stdprn (stampante standard o predefinita), per indicare la ridirezione dell’output dal video alla stampante (da stdout, standard output o video, a stampante).
Per esempio:


fprintf(stdprn,"Totale importi = %f \n ", Tot);


Nella fase di testing di un programma che richiede l’output su stampante oppure nel caso in cui la stampante non fosse disponibile, si può sostituire stdprn con stdout, per ottenere i risultati sul video, anziché sulla carta della stampante.
Per l’input e output standard di singoli caratteri, il linguaggio C possiede anche le funzioni getchar per l’acquisizione e putchar per la visualizzazione.
Per le stringhe le funzioni sono gets e puts. Queste funzioni sono di uso meno frequente rispetto a scanf e printf per l’input e l’output formattati.
Occorre ricordare, infine, che tutte queste funzioni appartengono alla libreria delle funzioni standard per l’input e output dei programma: pertanto i programmi che utilizzano queste funzioni devono 
contenere all’inizio, come già visto negli esempi precedenti, la direttiva:

#include <stdio.h>

che indica appunto l’inclusione del file di intestazione stdio.h per le operazioni di I/O standard.

Input e output formattati
La tabella seguente riassume il significato degli specificatori di formato più importanti:

Specificatore di formato Tipo di dato
%d Intero decimale
%i Intero decimale
%c Carattere singolo
%s Stringa di caratteri
%o Numero ottale
%x Numero esadecimale
%u  Intero senza segno
%f Numero reale (float)
%lf  Numero reale (double)
%e Formato scientifico
%% Per visualizzare il carattere % stesso

Nella specificazione del formato, dopo il carattere % e prima della lettera che identifica il formato, si possono aggiungere altre opzioni di formato; nell’ordine:

  • il segno – per indicare l’allineamento a sinistra del dato; oppure
  • uno zero (0) per indicare che le posizioni a sinistra, occupate dal numero da stampare, devono essere riempite con zeri;
  • un numero intero per impostare il numero di posizioni all’interno delle quali il valore deve essere visualizzato; oppure
  • due numeri, separati dal punto, per indicare il numero di posizioni e il numero di cifre decimali della rappresentazione.

Per esempio, se il valore della variabile area è 10, la seguente istruzione:

printf("Risultato del calcolo = %–15.2f", area);

produce sul video il seguente output con il numero allineato a sinistra, all’interno di 15 posizioni, con 2 cifre decimali:

Risultato del calcolo = 10.00

I seguenti esempi servono a chiarire meglio le modalità di utilizzo delle specificazioni di formato e gli output che si ottengono. La colonna di destra si riferisce alla visualizzazione delle variabili a, b, nazione, in corrispondenza delle istruzioni indicate nella colonna di sinistra:

int a = 5;
float b = 3.4567;
char nazione[7] = "Italia";

 

 Istruzioni  Output 
printf("% \n", a); 5
printf("%15d \n", a); 5
printf("%015d \n", a); 000000000000005
printf("%f \n", b); 3.456700
printf("%15.2f \n", b); 3.46
printf("%10d %15.2f \n", a, b); 5        3.46
printf("%-10d %-15.2f \n", a, b); 5        3.46
printf("%s \n", nazione); Italia
printf("%20s \n", nazione); Italia
printf("%-20s \n", nazione); Italia
printf("%-20s %15.2f \n", nazione, b); Italia              3.46

 

Si noti l’uso dei caratteri \n per specificare il ritorno a capo, come già visto in precedenza.
Questi due caratteri si chiamano sequenza di escape.

La tabella seguente presenta l’elenco completo delle sequenze di escape utilizzate dal linguaggio C:

Sequenza di escape  Descrizione   Terminologia inglese
\n A capo riga new line
\t Tabulazione tab
\r Ritorno a capo della stessa riga carriage return
\" Doppi apici double quote
\\ Barra contraria backslash
\b Una battuta indietro backspace
\' Apice singolo single quote
 \? Punto di domanda question mark
\a Segnalazione acustica bell
\0 Fine stringa end of string
\f Salto pagina form feed

ESEMPIO: Calcolo del valore in dollari corrispondente al cambio di una cifra in euro.
Si deve costruire un programma che richieda all’utente l’importo in euro da cambiare e il cambio dollaro/euro, e che comunichi il corrispondente valore in dollari.

Programma C


/* Cambio.c : cambio di denaro da euro a dollari */
#include <stdio.h>
main()
{

/* input */
float euro, cambio;
/* output */
float dollari;
printf("Importo in euro? ");
scanf("%f", &euro);
printf("Cambio dollari/euro? ");
scanf("%f", &cambio);
dollari = cambio * euro;
printf("%-10s %-10s %-10s \n", "Euro", "Cambio", "Dollari");
printf("%-10.2f %-10.4f %-10.2f \n", euro, cambio, dollari);
}

Il programma mostra esempi di utilizzo degli output formattati per visualizzare in modo più ordinato i risultati dell’elaborazione. Le variabili utilizzate sono state dichiarate di tipo float, in quanto sia i dollari sia gli euro sono numeri con i decimali e perché il valore del cambio può avere una parte decimale.

ESERCIZI 

  1. Calcolare il doppio di un numero fornito da tastiera.
  2. Dato il lato, trovare il perimetro e l’area di un quadrato.
  3. Dato il raggio, calcolare la circonferenza e l’area del cerchio.
  4. Scrivere il programma per scambiare il contenuto di due variabili (occorre usare una terza variabile temporanea).
  5. Calcolare la misura dell’ipotenusa di un triangolo rettangolo, noti i cateti.
  6. Date le età di tre persone, calcolare l’età media delle persone (somma delle età diviso 3).
  7. In quali casi il seguente programma determina un errore di esecuzione nel calcolo della radice quadrata?

    main()
    {
    int x;
    float y;
    scanf("%d", &x);
    y = sqrt(x);
    printf("%f", y);
    }

  8. Individuare nel seguente programma le istruzioni che non sono corrette.

    #includere <stdio.h>
    main()
    {
    /* input
    int i;
    printf(Introduci un numero);
    scanf("%d", i);
    i*=2;
    scrivi("%d \n",i)
    }

  9. Scrivere un programma che richieda in input le coordinate di due punti e scriva le coordinate del punto medio del segmento che unisce i due punti.
  10. Scrivere un programma che richieda in input le coordinate di due punti e che scriva l’equazione della retta passante per essi (va escluso, a priori, che la retta risulti verticale).
  11. Dato il prezzo di un prodotto e la percentuale di sconto, calcolare il prezzo scontato.
  12. Dato in input il valore di un deposito bancario e il tasso di interesse annuo, calcolare gli interessi maturati dopo 25 giorni.
  13. Scrivere un programma che legga due numeri interi e che comunichi il risultato della divisione tra i due numeri presentando 3 cifre intere e 5 decimali.
  14. Dato il raggio, calcolare la circonferenza e l’area del cerchio. Presentare i risultati con 3 cifre decimali.
  15. Dati in input la descrizione, la quantità, il prezzo unitario di un articolo venduto e l’aliquota IVA, comunicare in output la descrizione e il prezzo totale aumentato dell’IVA, visualizzando i dati in modo formattato.
  16. Scrivere un programma che richieda in input il nome dell’utente e scriva sul video il messaggio «Buongiorno,» seguito dal nome fornito.