Programmazione Procedurale in
Linguaggio C++
Elementi di Base
Parte 7
Dettagli e Approfondimenti
versione 2.6
Questo lavoro è concesso in uso secondo i termini di una licenza Creative Commons
(vedi ultima pagina)
G. Mecca – M. Samela – Università della Basilicata
Elementi di Base: Dettagli e Approfondimenti >> Sommario
Sommario
 Ricapitolazione
 ANSI
C++
Compilatori in Ambiente Linux
 Approfondimenti
sui Tipi di Dato
Altri Tipi di Dato
 Operatore
di Cast
 Espressioni
 Differenze con il C
G. Mecca - Programmazione Procedurale in Linguaggio C++
2
Elementi di Base: Dettagli e Approfondimenti >> Ricapitolazione
Ricapitolazione
 Elementi
di Base
nozioni sintattiche di base
nozioni sulla dichiarazione dei dati
nozioni sulle operazioni di base sui dati di
un programma
 In
sintesi
quello che serve per scrivere programmi che
si comportano come una calcolatrice
G. Mecca - Programmazione Procedurale in Linguaggio C++
3
Elementi di Base: Dettagli e Approfondimenti >> Ricapitolazione
Nozioni Sintattiche di Base
 Direttive
per librerie di sistema e librerie dell’utente
#include <iostream.h> (librerie di sistema)
#include <fstream.h> (librerie di sistema)
#include “equazioniLib.h” (librerie utente)
 Commenti
linea singola // questo è un commento
multilinea /* commento */
G. Mecca - Programmazione Procedurale in Linguaggio C++
4
Elementi di Base: Dettagli e Approfondimenti >> Ricapitolazione
Nozioni Sintattiche di Base
 Identificatori
nomi degli oggetti di un programma
(variabili, costanti, parametri, moduli)
 Regole
sintattiche
sequenza di lettere/cifre/_
primo carattere: lettera o _
codice ASCII a 7 bit
sensibile alle maiuscole
escluse le parole chiave riservate (es: main)
G. Mecca - Programmazione Procedurale in Linguaggio C++
5
Elementi di Base: Dettagli e Approfondimenti >> Ricapitolazione
Dichiarazione dei Dati
 Tipi
di dato di base
int: 32 bit in complemento a 2, da -2 miliardi
a +2 miliardi circa
float: 32 bit in v.m., da -1038 a +1038 circa
double: 64 bit in v.m., da -10308 a +10308 ca.
char: 8 bit, codice ASCII a 7 bit
bool: 1 bit
 Tipo
string: classe di oggetti del C++
G. Mecca - Programmazione Procedurale in Linguaggio C++
6
Elementi di Base: Dettagli e Approfondimenti >> Ricapitolazione
Dichiarazione dei Dati
 Dichiarazioni
di costante simbolica
const <tipo> <identificatore> = <valore>;
es: const float PIGRECO = 3.1415;
 Semantica
spazio nella memoria del tipo specificato,
non modificabile, contenente il valore
 Vantaggi
poter cambiare il valore intervenendo solo
sulla dichiarazione
G. Mecca - Programmazione Procedurale in Linguaggio C++
7
Elementi di Base: Dettagli e Approfondimenti >> Ricapitolazione
Dichiarazione dei Dati
 Dichiarazioni
di variabili
<tipo> <identificatore>;
<tipo> <identif1>, <identif2>, ... <identifn>;
es: int raggio;
es: float cerchio, circonf;
 Semantica
spazio nella memoria del tipo specificato
modificabile liberamente nel corso del
programma (lettura o assegnazione)
G. Mecca - Programmazione Procedurale in Linguaggio C++
8
Elementi di Base: Dettagli e Approfondimenti >> Ricapitolazione
Dichiarazione dei Dati
 Attenzione
subito dopo la dichiarazione il valore della
variabile è casuale (indefinibile)
è necessario inizializzare la variabile
leggendone il valore da un flusso
o con un’istruzione di assegnazione
 Esempio
int raggio; cin >> raggio;
int raggio; raggio = 3;
G. Mecca - Programmazione Procedurale in Linguaggio C++
9
Elementi di Base: Dettagli e Approfondimenti >> Ricapitolazione
Dichiarazione dei Dati
 In
alternativa
inizializzazione contestuale alla
dichiarazione
es: int raggio = 0;
 Equivalente
a due istruzioni
int raggio;
raggio = 0;
G. Mecca - Programmazione Procedurale in Linguaggio C++
10
Elementi di Base: Dettagli e Approfondimenti >> Ricapitolazione
Dichiarazione dei Dati
 Attenzione
(2)
possibili errori di rappresentazione
 Varie
cause
limitatezza dello spazio in memoria
(trabocco)
natura della rappresentazione in virgola
mobile (arrotondamenti)
G. Mecca - Programmazione Procedurale in Linguaggio C++
11
Elementi di Base: Dettagli e Approfondimenti >> Ricapitolazione
Istruzioni di Base sui Dati
 Istruzioni
di base
istruzioni di assegnazione
istruzioni di lettura e stampa
 Istruzioni
di assegnazione
servono ad assegnare il risultato di un
calcolo ad una variabile
 Istruzioni
di lettura e stampa
servono ad acquisire e stampare i valori
delle variabili
G. Mecca - Programmazione Procedurale in Linguaggio C++
12
Elementi di Base: Dettagli e Approfondimenti >> Ricapitolazione
Istruzioni di Assegnazione
 Sintassi
<nomeVariabile> = <espressione>;
 Semantica
viene calcolato il valore dell’espressione
se il valore risultante è compatibile con il
tipo della variabile, viene assegnato alla
variabile (ovvero: il valore viene scritto nello
spazio di memoria associato alla variabile)
altrimenti si genera un errore
G. Mecca - Programmazione Procedurale in Linguaggio C++
13
Elementi di Base: Dettagli e Approfondimenti >> Ricapitolazione
Espressioni
 Formule
per il calcolo di un valore
composte di operandi e operatori
 Operandi
costanti
variabili
 Operatori
operatori predefiniti
funzioni predefinite
G. Mecca - Programmazione Procedurale in Linguaggio C++
14
Elementi di Base: Dettagli e Approfondimenti >> Ricapitolazione
Istruzioni di Lettura e Stampa
 Basate
sul concetto di “flusso”
canale di comunicazione tra il processore ed
un dispositivo di ingresso o di uscita
 Standard
input
flusso standard di ingresso, proveniente
dalla tastiera
 Standard
output
flusso standard di uscita, diretto verso lo
schermo
G. Mecca - Programmazione Procedurale in Linguaggio C++
15
Elementi di Base: Dettagli e Approfondimenti >> Ricapitolazione
Standard
Input
Tastiera
Flusso di ingresso
File su disco
Flusso di ingresso
Processore
Esegue le istruzioni del Programma
Concetto di Flusso
Standard
Output
Schermo
Flusso di uscita
Stampante
Flusso di uscita
File su disco
Flusso di uscita
G. Mecca - Programmazione Procedurale in Linguaggio C++
16
Elementi di Base: Dettagli e Approfondimenti >> Ricapitolazione
Istruzioni di Stampa
 Sintassi
cout << <espressione>;
cout << <espressione1> << <espressione2> ... ;
espressione: costante, variabile, espr.
complessa
 Semantica
viene calcolato il valore di ciascuna
espressione
il valore viene inserito nel flusso diretto allo
schermo sotto forma di sequenza di caratteri
G. Mecca - Programmazione Procedurale in Linguaggio C++
17
Elementi di Base: Dettagli e Approfondimenti >> Ricapitolazione
Istruzioni di Lettura
 Sintassi
cin >> <variabile>;
 Semantica:
input formattato
appena nel flusso è presente almeno una
riga, il processore analizza il flusso
nell’analisi del flusso ignora eventuali spazi
bianchi iniziali
gli spazi bianchi vengono utilizzati anche
come separatori tra i valori
G. Mecca - Programmazione Procedurale in Linguaggio C++
18
Elementi di Base: Dettagli e Approfondimenti >> Ricapitolazione
Lettura e Stampa da e verso File

ofstream
flusso associato ad un file in cui si stampano dati
es: ofstream flussoSuFile (“fileDati.txt”);

ifstream
flusso associato ad un file da cui si leggono dei dati
es: ifstream flussoDaFile (“fileDati.txt”);

Per utilizzarli è necessario specificare
 #include <fstream.h>
G. Mecca - Programmazione Procedurale in Linguaggio C++
19
Elementi di Base: Dettagli e Approfondimenti >> Ricapitolazione
Domande ed Esercizi
di Riepilogo
G. Mecca - Programmazione Procedurale in Linguaggio C++
20
Elementi di Base: Dettagli e Approfondimenti >> ANSI C++
ANSI C++
 Versione
standard del C++
successiva alla prima introduzione
 Prevede
alcune varianti nella sintassi
 Alcuni esempi
cambiamenti nelle direttive di inclusione
introduzione dei “namespace”
cambiamenti nella struttura del programma
principale
G. Mecca - Programmazione Procedurale in Linguaggio C++
21
Elementi di Base: Dettagli e Approfondimenti >> ANSI C++
Un Semplice Programma in ANSI C++
// Calcolo della superficie del cerchio
#include <iostream>
using namespace std;
int main() {
const float pigreco=3.14;
int raggio;
float cerchio, circonf;
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;
return 0;
}
G. Mecca - Programmazione Procedurale in Linguaggio C++
22
Elementi di Base: Dettagli e Approfondimenti >> ANSI C++
ANSI C++
 Le
modifiche sono orientate
prevalentemente alla programmazione a
oggetti
 Complicano la descrizione del linguaggio
es: concetto di namespace
 Nel
seguito NON faremo riferimento al
C++ ANSI
G. Mecca - Programmazione Procedurale in Linguaggio C++
23
Elementi di Base: Dettagli e Approfondimenti >> ANSI C++
Compilatori in Ambiente Linux
 Attenzione
alcuni compilatori, però, richiedono
necessariamente codice ANSI C++
 Esempio
GCC (GNU C Compiler) compilatore storico
per Linux – digerisce solo ANSI C++
 Utilizzo
compilazione: g++ <sorgente>.cpp
esecuzione: ./a.out
G. Mecca - Programmazione Procedurale in Linguaggio C++
>>
24
Elementi di Base: Dettagli e Approfondimenti >> ANSI C++
Compilatori in Ambiente Linux
 La
particolarità di gcc
è una collezione di compilatori
 Compilatore
FORTRAN
g77
stesse modalità di funzionamento di gcc
 Utilizzo
compilazione: g77 <sorgente>.for
esecuzione: ./a.out
G. Mecca - Programmazione Procedurale in Linguaggio C++
>>
25
Elementi di Base: Dettagli e Approfondimenti >> Approfondimenti sui Tipi
Approfondimenti sui Tipi di Dato
 Finora
ci siamo concentrati solo sui tipi di dato
fondamentali del C++
 Ma
esistono altri tipi di dato
le regole di compatibilità sono più
complesse di quelle che abbiamo descritto
G. Mecca - Programmazione Procedurale in Linguaggio C++
26
Elementi di Base: Dettagli e Approfondimenti >> Approfondimenti sui Tipi
Altri Tipi di Dato
 Esistono
altri tipi
 Intero corto: short int
esempio: short int raggio;
16 bit di memoria, valori (-32768, +32767)
 Intero
lungo: long int
esempio: long int risultato;
tipicamente: bit int ≤ bit long int
G. Mecca - Programmazione Procedurale in Linguaggio C++
27
Elementi di Base: Dettagli e Approfondimenti >> Approfondimenti sui Tipi
Altri Tipi di Dato
 Intero
con segno/senza segno
signed int risultato;
signed short int risultato;
unsigned int risultato;
unsigned long int risultato;
 Reali
lunghi: long double
esempio: long double circonferenza;
tipicamente: #bit double ≤ #bit long double
G. Mecca - Programmazione Procedurale in Linguaggio C++
28
Elementi di Base: Dettagli e Approfondimenti >> Approfondimenti sui Tipi
Altri Tipi di Dato
 Caratteri
con segno/senza segno
char car1;
unsigned char car2;
 Inoltre
esiste un tipo per rappresentare caratteri al
di fuori del set di caratteri ASCII standard
tipo wchar_t (“wide char type”)
normalmente 16 bit per la rappresentazione
dipende dal compilatore
G. Mecca - Programmazione Procedurale in Linguaggio C++
29
Elementi di Base: Dettagli e Approfondimenti >> Approfondimenti sui Tipi
Altri Tipi di Dato
 Attenzione
a differenza di quanto affermato per
semplicità in precedenza, lo spazio
assegnato a ciascun tipo di dato non è fisso
dipende dal compilatore e dal processore
 Esempio
in alcune macchine int può essere di 32 bit
in altre macchine di 16 bit
G. Mecca - Programmazione Procedurale in Linguaggio C++
30
Elementi di Base: Dettagli e Approfondimenti >> Approfondimenti sui Tipi
Altri Tipi di Dato
 Operatore
sizeof
operatore fornito dal linguaggio per scoprire
la dimensione esatta attribuita dal
processore ad una variabile o un tipo di dato
 Sintassi
sizeof(<tipo>)
sizeof(<variabile>)
G. Mecca - Programmazione Procedurale in Linguaggio C++
31
Elementi di Base: Dettagli e Approfondimenti >> Approfondimenti sui Tipi
Altri Tipi di Dato

Esempi
int i;
cout <<
cout <<
cout <<
cout <<
cout <<
cout <<
cout <<
cout <<
"i : "
<< sizeof(i);
//4
"short int: " << sizeof(short int); //2
"int : "
<< sizeof(int);
//4
"long int: "
<< sizeof(long int); //4
"char : "
<< sizeof(char);
//1
"float: "
<< sizeof(float);
//4
"double: "
<< sizeof(double);
//8
"long double:“<< sizeof(long double);//10
G. Mecca - Programmazione Procedurale in Linguaggio C++
32
Elementi di Base: Dettagli e Approfondimenti >> Approfondimenti sui Tipi
Una Classificazione Complessiva
Tipi di base del C++
tipi “enumerabili”
tipo booleano
tipi carattere
tipi interi
bool
char
unsigned
wchar_t
short
int
long
unsigned
unsigned
unsigned
char
short
int
long
tipi in virgola mobile
float
double
long double
G. Mecca - Programmazione Procedurale in Linguaggio C++
33
Elementi di Base: Dettagli e Approfondimenti >> Approfondimenti sui Tipi
Compatibilità tra Tipi
 Le
regole di compatibilità tra tipi sono più
complesse di quanto visto finora
tutti i tipi di base sono compatibili tra loro
 In
particolare
il tipo char è considerato un tipo numerico
(valore di un carattere pari al codice ASCII)
il tipo bool è considerato un tipo numerico
(valore pari a 0 oppure 1); qualsiasi valore
diverso da 0 è considerato true
G. Mecca - Programmazione Procedurale in Linguaggio C++
34
Elementi di Base: Dettagli e Approfondimenti >> Approfondimenti sui Tipi
Compatibilità tra Tipi
 Esempio:
int i;
bool b;
char c;
c = ‘a’;
i = c;
// assegno un char ad un int
b = i;
// assegno un int ad un bool
cout << c << “ “ << i << “ “ b;
a 97 1
G. Mecca - Programmazione Procedurale in Linguaggio C++
35
Elementi di Base: Dettagli e Approfondimenti >> Approfondimenti sui Tipi
Compatibilità tra Tipi
 Gerarchia
di Tipi Numerici
tipo booleano: bool (tipo meno generale)
tipi carattere: char, unsigned char
tipi interi: short int, int, long int (tutti signed e
unsigned)
tipi reali: float, double, long double
(tipi più generali)
 Nelle
espressioni sono compatibili
troncamento e ampliamento
G. Mecca - Programmazione Procedurale in Linguaggio C++
36
Elementi di Base: Dettagli e Approfondimenti >> Approfondimenti sui Tipi
Compatibilità tra Tipi
 Attenzione
queste sono da considerarsi idiosincrasie
del C/C++ (non presenti in FORTRAN)
è opportuno evitare di utilizzare queste
funzionalità (i caratteri sono diversi dagli
interi)
è importante conoscerle perché a volte
nascondono errori (es: assegnazioni errate)
G. Mecca - Programmazione Procedurale in Linguaggio C++
37
Elementi di Base: Dettagli e Approfondimenti >> Operatore di Cast
Operatore di Cast
Importante
 Riassumendo
ogni dato trattato dal processore ha un tipo
alcuni valori possono essere considerati di
tipi diversi
 Esempio:
il numero 1
valore di tipo bool
valore di tipo int
valore di tipo float
valore di tipo double
G. Mecca - Programmazione Procedurale in Linguaggio C++
38
Elementi di Base: Dettagli e Approfondimenti >> Operatore di Cast
Operatore di Cast
 In
questi casi
il valore può essere soggetto a conversioni
di tipo
 Conversioni
di tipo
consistono nella trasformare la
rappresentazione in memoria del valore
che da quel momento è considerato di tipo
diverso rispetto al suo tipo originale
G. Mecca - Programmazione Procedurale in Linguaggio C++
39
Elementi di Base: Dettagli e Approfondimenti >> Operatore di Cast
Operatore di Cast
 Normalmente
le conversioni di tipo vengono effettuate
automaticamente dal processore
ma possono essere richieste esplicitamente
dal programmatore
 Operazioni
di “Cast”
operazione attraverso cui il programmatore
chiede esplicitamente di trasformare la
rappresentazione e il tipo di un valore
G. Mecca - Programmazione Procedurale in Linguaggio C++
40
Elementi di Base: Dettagli e Approfondimenti >> Operatore di Cast
Operatore di Cast
 Operatori
di Cast
l’operazione viene realizzata attraverso
opportuni operatori unari
un operatore per ciascun tipo
 Esempio
es: float x; bool b;
x = (float) 3;
b = (bool) x;
dato di tipo int, valore 3
dato di tipo float, valore 3.0
dato di tipo bool, valore 1
G. Mecca - Programmazione Procedurale in Linguaggio C++
41
Elementi di Base: Dettagli e Approfondimenti >> Operatore di Cast
Operatore di Cast
 Sintassi
(<tipo>)<valore>
 Semantica
supponiamo che <valore> sia di tipo <tipo’>
il processore trasforma la rappresentazione
in memoria del <valore> nella corrispond.
rappresentazione del <tipo> specificato
da quel momento <valore> è considerato di
tipo <tipo>
G. Mecca - Programmazione Procedurale in Linguaggio C++
42
Elementi di Base: Dettagli e Approfondimenti >> Operatore di Cast
Operatore di Cast
 Utilizzo
consentono di controllare le trasformazioni
di tipo nelle espressioni
 Esempio: float media; int sommaVoti, numEsami;
sommaVoti = 64;
numEsami = 3;
media =
cout <<
media =
cout <<
sommaVoti/numEsami;
21
media;
(float)sommaVoti/numEsami;
21.3334
media;
G. Mecca - Programmazione Procedurale in Linguaggio C++
43
Elementi di Base: Dettagli e Approfondimenti >> Operatore di Cast
Operatore di Cast
 Attenzione
l’operatore ha priorità molto alta
attenzione all’ordine di applicazione
media = (float)sommaVoti/numEsami;
cout << media;
21.3334
media = ((float)sommaVoti)/numEsami;
21.3334
cout << media;
media = (float)(sommaVoti/numEsami);
21
cout << media;
G. Mecca - Programmazione Procedurale in Linguaggio C++
44
Elementi di Base: Dettagli e Approfondimenti >> Espressioni
Espressioni
 Un
altro esempio di stranezza del C/C++
in C++ tutte le istruzioni sono in effetti
considerate espressioni
ovvero regole per calcolare un valore
 In
particolare
le istruzioni di assegnazione sono
complessivamente anche espressioni
le istruzioni di lettura e stampa sono
complessivamente anche espressioni
G. Mecca - Programmazione Procedurale in Linguaggio C++
45
Elementi di Base: Dettagli e Approfondimenti >> Espressioni
Assegnazioni

Operatore di assegnazione (=)
ha una duplice funzione
assegna il valore a destra alla variabile a sinistra
restituisce il valore assegnato

Esempio
int a;
a = 1; // assegna 1 ad a e restituisce 1

E’ possibile includere le assegnazioni in
espressioni più complesse
G. Mecca - Programmazione Procedurale in Linguaggio C++
46
Elementi di Base: Dettagli e Approfondimenti >> Espressioni
Assegnazioni
 Esempio
n.1
int a, b, c;
a = (a = 5) + (b = 7);
equivalente a;
a = 5;
 Esempio
b = 7;
c = a + b;
n.2
int a, b, c;
a = (b = (c = 0)); // equivalente a a=b=c=0;
equivalente a;
c = 0;
b = 0;
a = 0;
G. Mecca - Programmazione Procedurale in Linguaggio C++
47
Elementi di Base: Dettagli e Approfondimenti >> Espressioni
Istruzioni di Lettura e Stampa

Operatore di Lettura (>>)
ha una duplice funzione
acquisisce il valore da assegnare alla var
restituisce 1 se la lettura si è svolta correttamente, 0
se c’è stato un errore

Anche in questo caso
è possibile combinare le istruzioni di lettura e
stampa in espressioni più complesse

Esempio
int a, b, c;
cout << (cin >> a); // stampa 0 se c’è errore
G. Mecca - Programmazione Procedurale in Linguaggio C++
48
Elementi di Base: Dettagli e Approfondimenti >> Espressioni
Espressioni
 Possono
essere complesse
Il C++ fornisce numerosi altri operatori
le regole di precedenza sono intricate
 Esempi
operatori “bit a bit”: &, |, ~
operatori di scorrimento: >>, <<
operatore condizionale: ?
operatore “virgola”: ,
G. Mecca - Programmazione Procedurale in Linguaggio C++
49
Elementi di Base: Dettagli e Approfondimenti >> Espressioni
Espressioni
 Operatori
unari con effetti collaterali
possono essere postfissi o prefissi
 Operatore
postfisso
effetto collaterale dopo la valutazione
es: a++ (valuta a e poi la incrementa)
 Operatore
prefisso
effetto collaterale prima della valutazione
es: ++a (incrementa a e poi valuta)
G. Mecca - Programmazione Procedurale in Linguaggio C++
50
Elementi di Base: Dettagli e Approfondimenti >> Espressioni
Espressioni
 Esempio
1
prima viene valutata
la sottoespressione a
(valore 10) e poi la
variabile viene
incrementata
int i, j, k;
i = 10; j = 20;
k = i++ + j; // k vale 30
 Esempio
1
prima viene incrementata la
variabile a (valore 11)
e poi viene valutata
la sottoespressione
int i, j, k;
i = 10; j = 20;
k = ++i + j; // k vale 31
G. Mecca - Programmazione Procedurale in Linguaggio C++
51
Elementi di Base: Dettagli e Approfondimenti >> Espressioni
Una Annotazione Importante
 Attenzione
è possibile programmare benissimo anche
ignorando le stranezze descritte in questa
lezione
anzi, per molti versi si programma meglio se
queste cose non vengono usate
servono a rendere più compatto ma anche
più incomprensibile il codice
G. Mecca - Programmazione Procedurale in Linguaggio C++
52
Elementi di Base: Dettagli e Approfondimenti >> Differenze con il C
Differenze con il C
 In
generale
il C è molto simile al “clean C” che abbiamo
approfondito
per alcuni aspetti è più spartano
e questo lo rende in molti casi più complesso
come linguaggio di programmazione
 Nel
seguito
l’elenco delle principali differenze
G. Mecca - Programmazione Procedurale in Linguaggio C++
53
Elementi di Base: Dettagli e Approfondimenti >> Differenze con il C
Differenze con il C
 Attenzione
imparare a scrivere programmi complessi in
C NON è tra gli obiettivi del corso
si tratta di un livello secondario
le differenze vengono illustrate a scopo di
completezza, e per preparare gli studenti che
dovessero successivamente programmare in
C ad ulteriori approfondimenti
G. Mecca - Programmazione Procedurale in Linguaggio C++
54
Elementi di Base: Dettagli e Approfondimenti >> Differenze con il C
Differenze con il C
 Tipo
di ritorno del main
normalmente int (non void, come ANSI C++)
 Libreria
di input/output
#include <stdio.h>
 Definizione
di costanti
esiste la parola chiave “const”, ma ha una
semantica leggermente diversa
normalmente si utilizza la direttiva #define
es: #define PIGRECO 3.14
G. Mecca - Programmazione Procedurale in Linguaggio C++
55
Elementi di Base: Dettagli e Approfondimenti >> Differenze con il C
Differenze con il C
 Istruzioni
di lettura e di stampa
sono basate sui flussi standard di ingresso e
uscita come in tutti i linguaggi
ma ci sono differenze sintattiche
 Differenza
principale
non esistono cout e cin (che sono oggetti)
istruzione printf per scrivere dati
istruzione scanf per leggere dati
G. Mecca - Programmazione Procedurale in Linguaggio C++
56
Elementi di Base: Dettagli e Approfondimenti >> Differenze con il C
Istruzione printf
 Sintassi
printf(<stringa>);
printf(<stringaFormato>, argomenti);
 Stringa
formato
stringa che descrive la natura degli
argomenti successivi
 Esempi
printf(“Immetti il valore \n”);
printf(“Il cerchio vale: %d”, cerchio);
G. Mecca - Programmazione Procedurale in Linguaggio C++
57
Elementi di Base: Dettagli e Approfondimenti >> Differenze con il C
Istruzione printf
 Descrittori
di formato
%d: numero intero
%f: numero reale
%c: carattere singolo
%s: sequenza di caratteri (stringa)
 Attenzione
in C non esiste il tipo stringa
le stringhe si rappresentano come array di
caratteri
G. Mecca - Programmazione Procedurale in Linguaggio C++
58
Elementi di Base: Dettagli e Approfondimenti >> Differenze con il C
Istruzione scanf
 Sintassi
scanf(<stringaFormato>, &variabile);
 Stringa
formato
analoga a quella della printf
 Esempi
scanf(“%d”, &raggio);
 Nota
ATTENZIONE:
la mancanza della &
è una fonte di errore
molto frequente
è indispensabile la & prima della variabile
G. Mecca - Programmazione Procedurale in Linguaggio C++
59
Elementi di Base: Dettagli e Approfondimenti >> Differenze con il C
Istruzione scanf
 Infatti
scanf è una procedura
il secondo argomento deve essere
modificato attraverso il corrispond. param.
 Ma
in C esistono solo parametri standard
per simulare la semantica dei parametri per
riferimento si utilizzano i puntatori
G. Mecca - Programmazione Procedurale in Linguaggio C++
60
Elementi di Base: Dettagli e Approfondimenti >> Differenze con il C
Un Semplice Programma in C
// Calcolo della superficie del cerchio
#include <stdio.h>
#define PIGRECO 3.14
int main() {
// Dichiarazioni
int raggio;
float cerchio, circonf;
// Operazioni
printf("Immetti la lungh. del raggio\n");
printf("(deve essere un numero intero)\n");
scanf("%d", &raggio);
cerchio = raggio * raggio * PIGRECO;
circonf = 2 * PIGRECO * raggio;
printf("La circonferenza misura: %f \n", circonf);
printf("Il cerchio ha superficie: %f \n", cerchio);
return 0;
}
G. Mecca - Programmazione Procedurale in Linguaggio C++
>>
61
Elementi di Base: Dettagli e Approfondimenti >> Differenze con il C
Istruzione scanf
 Attenzione
la scanf esegue un input formattato
esistono ulteriori procedure per effettuare
l’input non formattato nel caso di stringhe
 Le
stringhe in C
non esiste il tipo string
una stringa è un array di caratteri terminato
in maniera particolare (con un carattere ‘\0’)
G. Mecca - Programmazione Procedurale in Linguaggio C++
62
Elementi di Base: Dettagli e Approfondimenti >> Differenze con il C
Esempio
#include <stdio.h>
NOTA: scanf e gets
aggiungono automaticamente
il carattere ‘\0’ al termine
della stringa letta
int main() {
char targa[8];
char modello[20];
printf("Immetti la targa
: ");
scanf("%s", &targa); // input formattato
getchar(); // equivalente della ignore
printf("Immetti il modello : ");
gets(modello); // input non formattato
printf("Dati dell'automobile : \n");
printf("Targa
: %s\n", targa);
printf("Modello : %s\n", modello);
return 0;
}
G. Mecca - Programmazione Procedurale in Linguaggio C++
63
Elementi di Base: Dettagli e Approfondimenti >> Differenze con il C
Istruzione scanf
 Inoltre
non è possibile effettuare il confronto tra
stringhe utilizzando ==
è necessario utilizzare la funzione strcmp
strcmp(s1, s2) ritorna 0 se le due stringhe
sono uguali, altrimenti un valore diverso da 0
fa parte (come tutte le principali funzioni sulle
stringhe) della libreria string.h
G. Mecca - Programmazione Procedurale in Linguaggio C++
64
Elementi di Base: Dettagli e Approfondimenti >> Differenze con il C
Esempio
#include <stdio.h>
#include <string.h>
int main() {
char targa[8];
printf("Immetti la targa
: ");
scanf("%s", &targa); // input formattato
if (strcmp(targa, "ab762de") == 0) {
printf("Auto corretta\n");
}
return 0;
}
G. Mecca - Programmazione Procedurale in Linguaggio C++
65
Elementi di Base: Dettagli e Approfondimenti >> Sommario
Riassumendo
 Ricapitolazione
 ANSI
C++
Compilatori in Ambiente Linux
 Approfondimenti
sui Tipi di Dato
Altri Tipi di Dato
 Operatore
di Cast
 Espressioni
 Differenze con il C
G. Mecca - Programmazione Procedurale in Linguaggio C++
66
Termini della Licenza
Termini della Licenza

This work is licensed under the Creative Commons AttributionShareAlike 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.

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.
G. Mecca - Programmazione Procedurale in Linguaggio C++
67
Scarica

Elementi di Base: Dettagli e Approfondimenti >> Ricapitolazione