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