• Non ci sono risultati.

Lettura e Stampa dei Dati

N/A
N/A
Protected

Academic year: 2021

Condividi "Lettura e Stampa dei Dati"

Copied!
21
0
0

Testo completo

(1)

G. Mecca – Università della Basilicata – mecca@unibas.it

Programmazione Procedurale in Linguaggio C++

Elementi di Base Parte 4

Lettura e Stampa dei Dati

versione 2.1

Questo lavoro è concesso in uso secondo i termini di una licenza Creative Commons (vedi ultima pagina)

Sommario

m

Introduzione

m

Concetto di Flusso (“Stream”)

m

Lettura e Stampa da Console in C++

m

Stampa su Console in C++

m

Lettura da Console in C++

ðInput Formattato

m

Lettura e Stampa da File in C++

Elementi di Base: Lettura e Stampa >> Sommario

(2)

G. Mecca - Programmazione Procedurale in Linguaggio C++ 3

Introduzione

m

Istruzioni di Stampa

ðservono a rendere visibili all’esterno del programma i valori delle variabili (“stampare”

sui dispositivi di uscita)

m

Istruzioni di Lettura

ðservono ad acquisire dall’esterno i valori delle variabili (“leggere” valori provenienti dai dispositivi di ingresso)

Elementi di Base: Lettura e Stampa >> Introduzione

ATTENZIONE alla terminologia

Introduzione

m

Lettura e stampa da “console”

ðdati acquisiti dalla tastiera e scritti sullo schermo

ðutile per l’interazione con l’utente

m

Lettura e stampa da file

ðdati acquisiti dal disco e scritti sul disco ðutile per rendere permanenti i risultati delle

elaborazioni

m

Entrambe basate sullo stesso concetto...

Elementi di Base: Lettura e Stampa >> Introduzione

(3)

G. Mecca - Programmazione Procedurale in Linguaggio C++ 5

Concetto di Flusso

m

Flusso (“Stream”)

ði dati da stampare vengono visti come una sequenza di caratteri da inviare al dispositivo di uscita (il dispositivo attinge dal flusso) ði dati da leggere vengono visti come

provenienti da un flusso che origina dal dispositivo di ingresso (il programma attinge dal flusso)

Elementi di Base: Lettura e Stampa >> Concetto di Flusso

Concetto di Flusso

Elementi di Base: Lettura e Stampa >> Concetto di Flusso

Processore (esegue le istr.

del programma)

Dispositivo di uscita (es: schermo) abcd 1234 *+-

tende a “riempire”

il flusso

tende a “svuotare”

il flusso Stampa dei Dati

Processore (esegue le istr.

del programma)

Dispositivo di ingresso (es: tastiera) 12 xyz 1.345

tende a “svuotare”

il flusso

tende a “riempire”

il flusso Lettura dei Dati

(4)

G. Mecca - Programmazione Procedurale in Linguaggio C++ 7

Flussi Standard

m

I programmi hanno due flussi predefiniti

ðflusso di uscita: “standard output”

ðflusso di ingresso: “standard input”

m

Normalmente: operazioni su console

ð“standard output” -> schermo

ð“standard input” -> tastiera

ðè possibile redirigere i flussi (es: standard output su stampante

ðè possibile definire ulteriori flussi

Elementi di Base: Lettura e Stampa >> Concetto di Flusso

Concetto di Flusso

Elementi di Base: Lettura e Stampa >> Concetto di Flusso

Schermo Flusso di uscita

File su disco

Stampante

File su disco Tastiera

Processore Esegue le istruzioni del Programma

Flusso di uscita

Flusso di uscita Flusso di ingresso

Flusso di ingresso Standard

Input

Standard Output

(5)

G. Mecca - Programmazione Procedurale in Linguaggio C++ 9

Concetto di Flusso

m

Questi concetti

ðsono comuni a tutti i linguaggi procedurali ðogni linguaggio ha una istruzione di stampa

dei dati e una istruzione di lettura dei dati ðEs: write e read in Pascal e FORTRAN ðIn C++ la sintassi è leggermente diversa,

(>> e <<)

ðin tutti i linguaggi la semantica è basata sul concetto di flusso

Elementi di Base: Lettura e Stampa >> Concetto di Flusso

Lettura e Stampa da Console in C++

m

Stampa sullo schermo

ðes: cout << “L’area vale: “ << cerchio;

m

Intuitivamente

ðcout rappresenta il flusso diretto allo schermo (“standard output”)

ði valori degli argomenti vengono stampati sullo schermo

Elementi di Base: Lettura e Stampa >> Lettura e Stampa da Console

cerchio: 22.75

RAM L’area vale: 22.75 Schermo

(6)

G. Mecca - Programmazione Procedurale in Linguaggio C++ 11

Lettura e Stampa da Console in C++

m

Lettura dalla tastiera

ðes: cin >> raggio;

m

Intuitivamente

ðcin rappresenta il flusso proveniente dalla tastiera (“standard input”)

ðil valore prelevato viene assegnato alla variabile

Elementi di Base: Lettura e Stampa >> Istruzioni di Lettura da Console

raggio:

RAM

12? 12

Schermo

Stampa su Console in C++

m

Sintassi

cout << <argomento>;

cout << <argomento1> << <argomento2> ... ; m

Dove

ðcout è un oggetto riservato del linguaggio ð<< è l’operatore di invio

ðgli argomenti sono espressioni (costanti, variabili, o espressioni complesse)

Elementi di Base: Lettura e Stampa >> Istruzioni di Stampa su Console

(7)

G. Mecca - Programmazione Procedurale in Linguaggio C++ 13

Stampa su Console

m

Semantica

ðgli argomenti sono considerati da sinistra a destra

ðviene calcolato il valore di ciascun argomento

ðil valore viene inserito nel flusso diretto allo schermo sotto forma di sequenza di caratteri ðla scheda grafica visualizza il contenuto sullo

schermo come sequenza di caratteri

Elementi di Base: Lettura e Stampa >> Istruzioni di Stampa su Console

Stampa su Console

m

Spazio visibile sullo schermo

ðorganizzato in righe

ðnumero di righe virtualmente infinito (scorrimento verticale)

ðogni riga è divisa in caratteri

m

Cursore

ðtiene traccia della posizione corrente

ðinizialmente: primo carattere della prima riga ðpoi si sposta per via delle stampe

Elementi di Base: Lettura e Stampa >> Istruzioni di Stampa su Console

(8)

G. Mecca - Programmazione Procedurale in Linguaggio C++ 15

Stampa su Console

m

Andare a capo

ðcursore sul primo carattere della riga successiva

ðequivale a stampare un carattere di fine-riga ðil carattere di fine riga è indicato con la

parola chiave endl oppure ‘\n’

m

Esempi

ðcout << “Vado a capo” << endl;

ðcout << “Vado a capo\n”;

Elementi di Base: Lettura e Stampa >> Istruzioni di Stampa su Console

Stampa su Console

m

E’ un esempio di “spazio bianco”

m

Caratteri per Spazi Bianchi

ðnon producono la stampa di simboli sullo schermo, servono a organizzare le stampe

m

In C++

ðspazio: ‘ ’

ðfine-riga: endl, ‘\n’

ðtabulatore: ‘\t’

Elementi di Base: Lettura e Stampa >> Istruzioni di Stampa su Console

(9)

G. Mecca - Programmazione Procedurale in Linguaggio C++ 17

7 ? 7 . 2 1 o i z i n I 3 ?

? e ? n i F

?

3 ? 2 1 l

a V

3 2 1 . 0 e r o l a V

Esempi

cout << “Inizio”;

cout << “ “;

cout << cerchio;

cout << endl;

cout << 2+1 << endl;

cout << “\n”;

cout << “Fine\n” << ‘\n’;

cout << “Val\t123\n”;

cout << “Valore\t0.123”;

Elementi di Base: Lettura e Stampa >> Istruzioni di Stampa su Console

posizione finale del cursore

ATTENZIONE alla differenza

Lettura da Console in C++

m

Sintassi

cin >> <variabile>;

cin >> <variabile1> >> <variabile2> ... ; m

Dove

ðcin è un oggetto riservato del linguaggio ð>> è l’operatore di prelevamento

ðgli argomenti sono variabili (devono essere state preliminarmente dichiarate)

Elementi di Base: Lettura e Stampa >> Istruzioni di Lettura da Console

(10)

G. Mecca - Programmazione Procedurale in Linguaggio C++ 19

Lettura da Console

m

Semantica

ðviene effettuato un “input formattato”

ðsu un “flusso tamponato”

m

Input formattato

ðgli “spazi bianchi” vengono trattati in modo particolare (‘ ‘, ‘\n’, ‘\t’)

m

Flusso tamponato

ðil flusso viene analizzato “per righe”

Elementi di Base: Lettura e Stampa >> Istruzioni di Lettura da Console

Input Formattato

m Flusso tamponato (“buffered”)

ði dati digitati dall’utente non sono immediatamente inseriti nel flusso

ðsono “tamponati” in un’area di memoria temporanea, detta “buffer”

ðsolo quando l’utente digita il carattere di fine riga il contenuto del buffer viene copiato nel flusso

m Inoltre

ði caratteri digitati sulla tastiera vengono mostrati sullo schermo (e spostano il cursore)

ðobiettivo: consentire correzioni

Elementi di Base: Lettura e Stampa >> Istruzioni di Lettura da Console

(11)

G. Mecca - Programmazione Procedurale in Linguaggio C++ 21

Input Formattato

m

Input formattato

ðsemantica abbastanza complessa

ðappena nel flusso è presente almeno una riga, il processore analizza il flusso per

“leggere” il valore da assegnare alla variabile ðnell’analisi del flusso ignora eventuali spazi

bianchi iniziali

ðgli spazi bianchi vengono utilizzati anche come separatori tra i valori

Elementi di Base: Lettura e Stampa >> Istruzioni di Lettura da Console

Semantica dell’Input Formattato

m Supponiamo int x; cin >> x;

ðil processore analizza il flusso di ingresso cercando un valore di tipo intero (cioè una sequenza di cifre) ðestrae e scarta tutti gli spazi bianchi iniziali che

incontra

ðquando incontra la prima cifra, comincia a leggere il numero considerando tutte le cifre successive

ðsi ferma non appena incontra uno spazio bianco ðassegna il numero letto alla variabile x

Elementi di Base: Lettura e Stampa >> Istruzioni di Lettura da Console

(12)

G. Mecca - Programmazione Procedurale in Linguaggio C++ 23

Input Formattato

Elementi di Base: Lettura e Stampa >> Istruzioni di Lettura da Console

Processore

Dispositivo di ingresso (es: tastiera)

? ? 12 \n int x; cin >> x;

x: 31456859 RAM

Processore

Dispositivo di ingresso (es: tastiera)

\n

x: 12 RAM

? : spazio

Input Formattato

Elementi di Base: Lettura e Stampa >> Istruzioni di Lettura da Console

Processore

Dispositivo di ingresso (es: tastiera)

24.3 ? 4 \n float y; cin >> y;

y: .123.E+23 RAM

Processore

Dispositivo di ingresso (es: tastiera)

? 4 \n

y: 24.3 RAM

(13)

G. Mecca - Programmazione Procedurale in Linguaggio C++ 25

Input Formattato

Elementi di Base: Lettura e Stampa >> Istruzioni di Lettura da Console

Processore

Dispositivo di ingresso (es: tastiera)

? ? A B C \n char z; cin >> z;

z: * RAM

Processore

Dispositivo di ingresso (es: tastiera)

B C \n

z: A RAM

Input Formattato

Elementi di Base: Lettura e Stampa >> Istruzioni di Lettura da Console

Processore

Dispositivo di ingresso (es: tastiera)

12 \n \n .23 \n A \n int x; float y; char z;

cin >> x; cin >> y; cin >> z;

z: + y: .2234e+1 x: 2341456 RAM

Processore

Dispositivo di ingresso (es: tastiera)

\n

z: A y: 0.23 x: 12 RAM

(14)

G. Mecca - Programmazione Procedurale in Linguaggio C++ 27

Semantica dell’Input Formattato

m

Condizioni di errore

ðsi verificano quando la lettura del valore è interrotta da un carattere inaspettato

m

Esempio

ðlettera o simbolo per gli interi

ðlettera o simbolo (meno il punto ‘.’) per i reali

m

Possono verificarsi condizioni inaspettate

Elementi di Base: Lettura e Stampa >> Istruzioni di Lettura da Console

Semantica dell’Input Formattato

m

Normalmente

ðil processore cerca di eseguire comunque la lettura producendo risultati scorretti

ðin altri casi la lettura si interrompe del tutto e i valori delle variabili restano inalterati

m

In ogni caso

ðnon viene segnalato un errore esplicito, per cui è necessario fare attenzione

Elementi di Base: Lettura e Stampa >> Istruzioni di Lettura da Console

ATTENZIONE agli errori nelle operazioni di lettura

(15)

G. Mecca - Programmazione Procedurale in Linguaggio C++ 29

Condizioni Inaspettate

Elementi di Base: Lettura e Stampa >> Istruzioni di Lettura da Console

Processore

Dispositivo di ingresso (es: tastiera)

12.4 \n \n .23 \n A \n int x; float y; char z;

cin >> x; cin >> y; cin >> z;

z: + y: .2234e+1 x: 2341456 RAM

Processore

Dispositivo di ingresso (es: tastiera)

23 \n A \n

z: . y: 0.4 x: 12 RAM

la lettura viene eseguita comunque

Situazione di Errore

Elementi di Base: Lettura e Stampa >> Istruzioni di Lettura da Console

Processore

Dispositivo di ingresso (es: tastiera)

hhh \n

int x; float y; char z;

cin >> x; cin >> y; cin >> z;

z: + y: .2234e+1 x: 2341456 RAM

Processore

Dispositivo di ingresso (es: tastiera)

hhh \n

z: + y: .2234e+1 x: 2341456 RAM

la lettura si

interrompe del tutto (il flusso “va in errore”)

(16)

G. Mecca - Programmazione Procedurale in Linguaggio C++ 31

Lettura e Stampa su File in C++

m

I dati prodotti sullo standard output

ðsono volatili

ða volte è necessario salvare

permanentemente i dati di un programma

m

Memorizzazione permanente su disco

ðè possibile scrivere dati in un file su disco ðè possibile leggere dati da un file su disco

Elementi di Base: Lettura e Stampa >> Lettura e Stampa su File

Lettura e Stampa su File

m

Il meccanismo è del tutto analogo

ðbasato su flussi (“stream”) che vengono

associati ai file

m

I linguaggi consentono di

ðcreare nuovi flussi oltre a quelli standard associandoli a file sul disco

ðutilizzare le istruzioni ordinarie di lettura e stampa per lavorare con questi flussi

Elementi di Base: Lettura e Stampa >> Lettura e Stampa su File

(17)

G. Mecca - Programmazione Procedurale in Linguaggio C++ 33

Lettura e Stampa su File

m In C++

ðofstream: flusso associato ad un file in cui si stampano dei dati

es: ofstream flussoSuFile (“fileDati.txt”);

ðifstream: flusso associato ad un file da cui si leggono dei dati

es: ifstream flussoDaFile (“fileDati.txt”);

m Per utilizzarli è necessario specificare

ð #include <fstream.h>

Elementi di Base: Lettura e Stampa >> Lettura e Stampa su File

Stampa su File

m Sintassi

ðdichiarazione di flusso di stampa su file

ofstream <nomeFlusso> (“<nomeFileSuDisco>”);

m Dove

ð<nomeFlusso> è un identificatore

ð<nomeFileSuDisco> è il nome fisico di un file sul disco

m Esempi

ofstream flussoDaFile (“fileDati.txt”);

ofstream altroFlusso (“c:\prova.txt”);

Elementi di Base: Lettura e Stampa >> Istruzioni di Stampa su File

(18)

G. Mecca - Programmazione Procedurale in Linguaggio C++ 35

Stampa su File

m Semantica

ðviene creato un nuovo flusso associato al file ðse il file non esiste viene creato

ðse esiste, il suo contenuto viene cancellato

m Da quel momento

ðil flusso creato può essere utilizzato esattamente come cout (operatore <<)

ðnel file vengono scritti caratteri (file di testo)

m ATTENZIONE

ðal termine delle operazioni il flusso deve essere chiuso

Elementi di Base: Lettura e Stampa >> Istruzioni di Stampa su File

ATTENZIONE all’apertura e alla chiusura dei flussi

su file

Stampa su File: Esempio

#include <iostream.h>

#include <fstream.h>

void main() { int x;

float y;

ofstream flussoSuDisco (“prova.txt”);

cout << "Immetti due numeri" << endl;

cin >> x;

cin >> y;

flussoSuDisco << x << " " << y << endl;

flussoSuDisco.close();

}

Elementi di Base: Lettura e Stampa >> Istruzioni di Stampa su File

>> fileUscita.cpp

(19)

G. Mecca - Programmazione Procedurale in Linguaggio C++ 37

Flusso di Lettura da File

m Sintassi

ðdichiarazione di un flusso di lettura da file

ifstream <nomeFlusso> (“<nomeFileSuDisco>”);

m Dove

ð<nomeFlusso> è un identificatore

ð<nomeFileSuDisco> è il nome fisico di un file sul disco

m Esempi

ifstream flussoDaFile (“fileDati.txt”);

ifstream altroFlusso (“c:\prova.txt”);

Elementi di Base: Lettura e Stampa >> Istruzioni di Lettura da File

Lettura da File

m Semantica

ðviene creato un nuovo flusso di lettura associato al file

m Da quel momento

ðil flusso creato può essere utilizzato esattamente come cin (operatore >>)

m Attenzione

ðil file deve esistere su disco ðaltrimenti comportamenti scorretti

ðanche in questo caso il flusso deve essere chiuso

Elementi di Base: Lettura e Stampa >> Istruzioni di Lettura da File

(20)

G. Mecca - Programmazione Procedurale in Linguaggio C++ 39

Lettura da File: Esempio

#include <iostream.h>

#include <fstream.h>

void main() { int x;

float y;

ifstream flussoDiLettura (“prova.txt”);

flussoDiLettura >> x;

flussoDiLettura >> y;

cout << "I due numeri sono" << endl;

cout << x << " " << y;

flussoDiLettura.close();

}

Elementi di Base: Lettura e Stampa >> Istruzioni di Lettura da File

>> fileIngresso.cpp

Riassumendo

m

Concetto di Flusso (“Stream”)

m

Stampa su Console

m

Lettura da Console

ðinput formattato (ATTENZIONE)

m

Lettura e Stampa da File

ð#include <fstream.h>

ðcreazione di un flusso di stampa su file ðcreazione di un flusso di lettura da file

Elementi di Base: Lettura e Stampa >> Sommario

(21)

G. Mecca - Programmazione Procedurale in Linguaggio C++ 41

Elementi di Base: Lettura e Stampa >> Un Semplice Programma

// Calcolo della superficie del cerchio

#include <iostream.h>

void main() { // Dichiarazioni

const float pigreco=3.14;

int raggio;

float cerchio, circonf;

// Operazioni

cout << “Immetti la lungh. del raggio” << endl;

cout << “(deve essere un numero intero)” << endl;

cin >> raggio;

cerchio = raggio*raggio*pigreco;

circonf = 2*pigreco*raggio;

cout << “La circonferenza misura: “ << circonf << endl;

cout << “Il cerchio ha superficie: “ << cerchio << endl;

}

Un Semplice Programma

>>

Termini della Licenza

m This work is licensed under the Creative Commons Attribution- ShareAlike License. To view a copy of this license, visit

http://creativecommons.org/licenses/by-sa/1.0/ or send a letter to Creative Commons, 559 Nathan Abbott Way, Stanford, California 94305, USA.

Termini della Licenza

m Questo lavoro viene concesso in uso secondo i termini della licenza “Attribution-ShareAlike” di Creative Commons. Per ottenere una copia della licenza, è possibile visitare

http://creativecommons.org/licenses/by-sa/1.0/ oppure inviare una lettera all’indirizzo Creative Commons, 559 Nathan Abbott Way, Stanford, California 94305, USA.

Riferimenti

Documenti correlati

o implementare una funzione virtuale nella classe base implementata nelle classi derivate (con output). o implementare una funzione virtuale nella classe base non implementata

Alcune di queste perle sono state per esempio raccolte da John Bentley in un paio di celebri libri Programming Pearls e More Programming Pearls (pubblicati da Addison Wesley).. Ci

Mecca - Programmazione Procedurale in Linguaggio C++ 5 Elementi di Base: Introduzione &gt;&gt; Panoramica. // Calcolo della superficie

ðil valore di i mi dice in ogni istante quante volte è stato già eseguito il corpo del ciclo. Strutture di Controllo: Cicli &gt;&gt;

Mecca - Programmazione Procedurale in Linguaggio C++ 11 Linguaggio C: Concetti Avanzati &gt;&gt; Elementi di Base. // Calcolo della superficie

cout &lt;&lt; (cin &gt;&gt; a); // stampa 0 se c’è errore Elementi di Base: Dettagli e Approfondimenti &gt;&gt; Espressioni.. Mecca - Programmazione Procedurale in Linguaggio

• Magazzino: è vettore di struct dichiarato nel main e passato prima alla funzione di lettura del magazzino e poi alla funzione di ricerca degli articoli mancanti

• Per stampare sul monitor (standard output) un intero i , un numero reale z oppure una stringa str, in C si usa la funzione printf (di output formattato):. printf (&#34;%d %f