Vai alla Home Page About me Courseware Federica Living Library Federica Federica Podstudio Virtual Campus 3D Le Miniguide all'orientamento Gli eBook di Federica La Corte in Rete
 
I corsi di Scienze Matematiche Fisiche e Naturali
 
Il Corso Le lezioni del Corso La Cattedra
 
Materiali di approfondimento Risorse Web Il Podcast di questa lezione

Silvia Rossi » 3.Le istruzioni di I/O standard


Rappresentazione dei numeri

Rappresentazione di interi

  • Supponiamo 2 byte (16 bit)
  • 216 = 65536
  • [-32767, 32768] con m bit 2m-1 numeri
  • Se prendiamo come segno il primo bit abbiamo ad esempio (01111111)2 = 127 e (11111111)2 = -127

Rappresentazione dei numeri (segue)

  • Con questa rappresentazione si hanno 2 modi di rappresentare 0!!!!!!!
  • Inoltre non valgono più le regole per la somma binaria.
  • Consideriamo ad esempio i due numeri (01010000)2 = 96 e (11010000)2 = -96 ed il numero (00001000)2 = 8 ed eseguiamo le somme in binario, come mostrato in figura a lato.

Complemento a 2

  • -x10 = (2n – x)2
  • Si calcola invertendo 1 con 0 e viceversa e aggiungendo + 1 alla fine.
  • Valgono ancora le regole per la somma.

Rappresentazione dei numeri (segue)

Rappresentazione di reali

  • Vogliamo rappresentare numeri reali distribuiti sulla retta con la distanza relativa il più piccola possibile.
  • 0.0004285741428571 rappresentazione non normalizzata.
  • 0.4285741428571 x 10-3 rappresentazione normalizzata.

Rappresentazione dei numeri (segue)

Rappresentazione di reali

  • Se ho a disposizione 7 cifre:
    • 0.000428 e 0.4285741
  • Ci sarà uno spazio per la mantissa e uno per l’esponente.
  • float 4 byte:
    • Un bit per il segno, 23 per la mantissa e 8 per l’esponente.

Rappresentazione dei numeri (segue)

Rappresentazione di reali

  • Potendo l’esponente essere sia positivo che negativo, con 8 bit è possibile utilizzare i numeri compresi nell’intervallo
    [ -127, 128 ];
  • per cui l’esponente varia tra  [ 2-127, 2128 ];
  • che, in base 10, corrisponde ad un esponente incluso nell’intervallo  [ 10-37, 1038 ].

C++ dispositivi standard di I/O

In C++ (come in C) sono definiti i seguenti dispositivi standard di I/O:

  • stdout standard output (di default associato al video);
  • stderr standard output per i messaggi (associato al video);
  • stdin standard input (di default associato alla tastiera).

C++ oggetti globali di I/O

In C++ i dispositivi standard di I/O sono “collegati” rispettivamente agli oggetti globali di I/O:

cout cerr cin

  • Oggetto (definizione temporanea): variabile appartenente a un tipo astratto, non nativo del linguaggio.
  • Globale: visibile sempre e dappertutto.
    • Un oggetto globale é creato appena si lancia il programma, prima che venga eseguita la prima istruzione del main.

Per definire gli oggetti globali di I/O bisogna includere l’header-file <iostream>.

C++ operativi di flusso I/O

In C++ sono definiti gli operatori di flusso di I/O:

cout << (inserimento) (oppure cerr)

cin >> (estrazione)

C++ input con operatore estrazione

In C++ un’operazione di input si identifica con una operazione di estrazione dall’oggetto cin:

cin >> dato;

  • il valore immesso da stdin (autom. trasferito in cin) viene “estratto” dall’oggetto cin e memorizzato nella variabile dato;
  • dato è un l-value di qualsiasi tipo nativo (oppure una variabile stringa).

Le operazioni di estrazione possono essere “impilate” una di seguito all’altra in un’unica istruzione.

  • Esempio: cin >> dato1 >> dato2 >> dato3;
    • (i dati devono essere forniti nello stesso ordine).

C++ input con operatore estrazione (segue)

Il programma interpreta la lettura di un dato come terminata se incontra uno spazio vuoto (blank), un carattere di tabulazione (tab) o un ritorno a capo (CR).

  • Se l’input è una stringa, non deve contenere blank (né tab) e non può essere spezzata in due righe: l’esistenza dei terminatori (blank, tab o CR) consente di immettere più dati nella stessa riga.

Casi particolari:

  • i terminatori inseriti ripetutamente o prima del dato sono ignorati;
  • se il dato da leggere é di tipo numerico, la lettura termina quando incontra un carattere non valido:
    • incluso il punto decimale se il numero é intero; (non esegue conversioni di tipo);
  • se il dato da leggere é di tipo char, legge un solo carattere.

C++ input con operatore estrazione (segue)

Esempio:

  • Supponiamo che base e altezza siano due variabili di tipo float. Eseguendo l’istruzione:
    • cin >> base >> altezza;
  • il computer estrae un valore corretto dai caratteri digitati da tastiera finché non incontra il primo carattere spazio: tale valore verrà associato alla variabile base.
  • Ad esempio, se si digita:
    • 15.2 12.2[INVIO]
  • il computer immagazzinerà 15.2 nell’indirizzo di memoria relativa alla variabile base e 12.2 in quello relativo alla variabile altezza.

Suggerimento

  • Far precedere sempre ogni istruzione di lettura da un opportuno messaggio che fornisca informazioni sull’input che ci si aspetta.

C++ input errore

Le operazioni di estrazione non restituiscono mai espliciti messaggi di errore, tuttavia:

  • se il primo carattere letto non é valido (es. lettera se si deve leggere un numero), il programma non memorizza il dato e imposta una condizione di errore interna:
    • inibisce anche le successive operazioni di lettura (nel senso che tutte le istruzioni di lettura, dal punto dell’errore in poi, vengono “saltate”);
  • se invece il carattere non valido non è il primo, il programma accetta il dato letto fino a quel momento, ma il carattere invalido resta nel buffer, disponibile per le operazioni di lettura successive.

Per accorgersi di un errore (e per porvi rimedio) bisogna utilizzare alcune proprietà dell’oggetto cin (… più avanti).

C++ output con operatore inserimento

In C++ un’operazione di output si identifica con una operazione di inserimento nell’oggetto cout:

cout << dato;

  • il dato viene “inserito” nell’oggetto cout (e da questo automaticamente trasferito su stdout);
  • dato è una qualsiasi variabile o espressione di tipo nativo (oppure una stringa).

Le operazioni di inserimento possono essere “impilate” una di seguito all’altra in un’unica istruzione.

Esempio:

cout << dato1 << dato2 << dato3;

(equivale a:

cout << dato1;

cout << dato2;

cout << dato3;).

C++ output con operatore inserimento (segue)

Il tipo delle variabili è riconosciuto automaticamente.
Esempio:

cout<<”Base triangolo: “<<base<<endl;
cout<<”Altezza triangolo: “<<altezza<< endl;

  • Si noti che le variabili base e altezza rappresentano in queste istruzioni il loro valore (r-value) mentre nell’istruzione:

cin >> base >> altezza

  • rappresentano il loro indirizzo (l-value).

Esempio:

cout << “Salve! \n”; cout << “Come va? \n”; → Salve! Come va?

\n è un carattere speciale di fine riga.

Sequenza di escape

Il carattere \ (backslash) non è trasferito sullo schermo, ma usato in combinazione con i caratteri successivi:

  • un solo carattere se si tratta di una lettera,
  • oppure una sequenza di cifre numeriche;

l’insieme di caratteri viene detto sequenza di escape, e viene interpretato come un unico carattere.

Le sequenze di escape sono usate tipicamente per specificare caratteri speciali che non hanno il loro equivalente stampabile:

  • come newline, carriage return, tabulazioni, suoni ecc…,
  • oppure caratteri, che da soli, hanno una funzione speciale, come le virgolette o lo stesso backslash.

Regola

E’ opportuno che al termine di una istruzione di stampa il cursore sia situato all’inizio della linea successiva.

C++ sequenza di escape

Le sequenze di escape sono utili anche per scrivere sul monitor dei caratteri particolari quali la stessa barra inversa (\) o le doppie virgolette (“).

Per esempio, per far scrivere sul monitor la frase seguente,

Stampiamo questi due simboli \ e

contenente la barra inversa e le doppie virgolette dobbiamo assegnare la seguente istruzione:

cout<<"Stampiamo questi due simboli \\ e \"

Ricordiamo che le costanti stringa devono essere racchiuse tra doppi apici mentre le costanti carattere tra apici semplici.

C++ sequenza di escape (segue)


C++ output con formattazione

Per l’output formattato abbiamo due metodi fondamentali di cout:

cout.width(ampiezza);

cout.precision(cifre);

dove ampiezza e cifre sono due interi che rappresentano,

  • l’ampiezza totale messa a disposizione della variabile;
  • il numero massimo di cifre che possono essere visualizzate.

Queste istruzioni di formattazione devono precedere ogni ordine di stampa.
Vedere l’esempio in figura a lato.


  • Solo il valore di A sarà stampato con un’ampiezza totale di 10 caratteri e con una precisione di 8 cifre complessive (a partire da destra); il valore di B sarà stampato con la formattazione standard.

Esercizio 3.1


C++ printf

  • La funzione printf formatta e scrive una serie di caratteri e valori sul dispositivo standard di output (stdout);
  • restituisce al programma il numero di caratteri scritti (o un numero negativo in caso di errore).
  • Quando si usa la funzione printf bisogna prima includere il file header <stdio.h>.

C++ printf: stringa di controllo

La funzione printf riceve dal programma chiamante uno o più argomenti.

Solo il primo è obbligatorio e deve essere una stringa, che si chiama control string (stringa di controllo).

La stringa di controllo viene trasferita sullo schermo, carattere per carattere (compresi gli spazi bianchi), salvo quando sono incontrati i seguenti caratteri particolari:

  • ” (termina la stringa di controllo);
  • % (introduce uno specificatore di formato);
  • \ (introduce una sequenza di escape).

C++ printf: specificatore di formato

Altri argomenti successivi alla stringa di controllo, nella chiamata a printf, rappresentano i dati da formattare e scrivere, e possono essere costituiti da:

  • costanti,
  • variabili,
  • espressioni,
  • o altre funzioni.

Ad ogni argomento successivo alla stringa di controllo, deve corrispondere, all’interno di essa e nello stesso ordine, uno specificatore di formato, costituito da un gruppo di caratteri introdotto dal carattere %.

C++ printf: specificatore di formato (segue)

In uno specificatore di formato il campo tipo può assumere uno di questi valori

In uno specificatore di formato il campo tipo può assumere uno di questi valori


C++ printf: specificatore di formato (segue)

In generale uno specificatore di formato ha la seguente sintassi:

%[flags][ampiezza][.precisione]tipo

Si veda l’esempio nella figura a lato.

Esercizio3.2


C++ output con formattazione

Osserviamo che cout.width(ampiezza) cout.precision(cifre) possono utilizzare anche delle variabili mentre printf può servirsi soltanto di numeri per formattare un dato;

printf("%.5f", dato)

se il numero di cifre è inferiore al numero di cifre significative, allora il dato viene espresso in notazione esponenziale;

Esempio

cout.precision

(3);

cout<<123456;

→ 1.23 e05

cout possiede molte altre istruzioni che consentono una gestione completa della formattazione a scapito della semplicità.

C++ output con formattazione

Esercizio3.3



C++ output con formattazione (segue)

In C++ non esiste il concetto di tastiera, disco, monitor, stampante; questi dispositivi sono raggruppati secondo due tipologie:

  • dispositivi di input;
  • dispositivi di output.

In generale avremo

dispositivo di input >>x1>>...>>xn;

che va inteso come:
i valori estratti dal dispositivo di input sono immessi come valore nelle variabili che seguono l’operatore >>

mentre

dispositivo di output << espr1<<...<

va letto come: i valori delle singole espressioni sono inseriti successivamente nel dispositivo di output.

C++ output con formattazione (segue)

Ad esempio se si intende inviare dei dati sulla stampante occorre scrivere la seguente dichiarazione di tipo:

ofstream stampante(“prn”);

ed adoperare stampante al posto di cout. Ad esempio:

stampante<<”Area= “<

Occorre però includere il file <fstream> in cui il tipo ofstream è definito.

Esercizi

Scrivere un algoritmo che calcoli la somma dei primi N naturali.

Esercizi (segue)

Scrivere un programma che chiede all’utente di digitare tre interi sulla stessa riga, e ne visualizza la somma, il prodotto e la media.

Esercizi (segue)

Scrivere un programma che calcola il quadrato e il cubo dei numeri da 0 a 10 e li visualizzi come indicato in figura.


I materiali di supporto della lezione

esercizio3.1

esercizio3.2

esercizio3.3

  • Contenuti protetti da Creative Commons
  • Feed RSS
  • Condividi su FriendFeed
  • Condividi su Facebook
  • Segnala su Twitter
  • Condividi su LinkedIn
Progetto "Campus Virtuale" dell'Università degli Studi di Napoli Federico II, realizzato con il cofinanziamento dell'Unione europea. Asse V - Società dell'informazione - Obiettivo Operativo 5.1 e-Government ed e-Inclusion