G. Mecca – M. Samela – Università della Basilicata
Programmazione Procedurale in Linguaggio C++
Dettagli e Approfondimenti
versione 3.0
Questo lavoro è concesso in uso secondo i termini di una licenza Creative Commons (vedi ultima pagina)
G. Mecca - Programmazione Procedurale in Linguaggio C++ 2
Sommario
m
ANSI C++
ðCompilatori in Ambiente Linux
m
Approfondimenti sui Tipi di Dato
ðAltri Tipi di Datom
Espressioni
m
Valutazione delle Condizioni
ðCondizioni a valori non booleaniDettagli e Approfondimenti >> Sommario
G. Mecca - Programmazione Procedurale in Linguaggio C++ 3
Sommario
m
Utilizzo delle Espressioni
m
Altre Istruzioni
ðIstruzione DO-WHILE ðIstruzione SWITCH
ðIstruzione BREAK e CONTINUE
m
Sottoprogrammi Sovraccarichi
Dettagli e Approfondimenti >> Sommario
ANSI C++
m
Versione standard del C++
ðsuccessiva alla prima introduzione
m
Prevede alcune varianti nella sintassi
m
Alcuni esempi
ðcambiamenti nelle direttive di inclusione ðintroduzione dei “namespace”
ðcambiamenti nella struttura del programma principale
Elementi di Base: Dettagli e Approfondimenti >> ANSI C++
G. Mecca - Programmazione Procedurale in Linguaggio C++ 5
// 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;
}
Un Semplice Programma in ANSI C++
G. Mecca - Programmazione Procedurale in Linguaggio C++ 6
ANSI C++
m
Le modifiche
ðsono orientate prevalentemente alla programmazione a oggetti
m
Complicano la descrizione del linguaggio
ðes: concetto di namespacem
Nel seguito
ðNON faremo riferimento al C++ ANSI
Elementi di Base: Dettagli e Approfondimenti >> ANSI C++
G. Mecca - Programmazione Procedurale in Linguaggio C++ 7
Compilatori in Ambiente Linux
m
Attenzione
ðalcuni compilatori, però, richiedono necessariamente codice ANSI C++
m
Esempio
ðGCC (GNU C Compiler) compilatore storico per Linux – digerisce solo ANSI C++
m
Utilizzo
ðcompilazione: g++ <sorgente>.cpp ðesecuzione: ./a.out
Elementi di Base: Dettagli e Approfondimenti >> ANSI C++
>>
Compilatori in Ambiente Linux
m
La particolarità di gcc
ðè una collezione di compilatori
m
Compilatore FORTRAN
ðg77ðstesse modalità di funzionamento di gcc
m
Utilizzo
ðcompilazione: g77 <sorgente>.for ðesecuzione: ./a.out
Elementi di Base: Dettagli e Approfondimenti >> ANSI C++
>>
G. Mecca - Programmazione Procedurale in Linguaggio C++ 9
Approfondimenti sui Tipi di Dato
m
Finora
ðci siamo concentrati solo sui tipi di dato fondamentali del C++
m
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++ 10
Altri Tipi di Dato
m
Esistono altri tipi
m
Intero corto: short int
ðesempio: short int raggio;
ð16 bit di memoria, valori (-32768, +32767)
m
Intero lungo: long int
ðesempio: long int risultato;
ðtipicamente: bit int = bit long int
Elementi di Base: Dettagli e Approfondimenti >> Approfondimenti sui Tipi
G. Mecca - Programmazione Procedurale in Linguaggio C++ 11
Altri Tipi di Dato
m
Intero con segno/senza segno
ðsigned int risultato;
ðsigned short int risultato;
ðunsigned int risultato;
ðunsigned long int risultato;
m
Reali lunghi: long double
ðesempio: long double circonferenza;
ðtipicamente: #bit double < #bit long double
Elementi di Base: Dettagli e Approfondimenti >> Approfondimenti sui Tipi
Altri Tipi di Dato
m
Caratteri con segno/senza segno
ðchar car1;
ðunsigned char car2;
m
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
Elementi di Base: Dettagli e Approfondimenti >> Approfondimenti sui Tipi
G. Mecca - Programmazione Procedurale in Linguaggio C++ 13
Altri Tipi di Dato
m
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
m
Esempio
ðin alcune macchine int può essere di 32 bit ðin altre macchine di 16 bit
G. Mecca - Programmazione Procedurale in Linguaggio C++ 14
Una Classificazione Complessiva
Elementi di Base: Dettagli e Approfondimenti >> Approfondimenti sui Tipi
Tipi di base del C++
tipi “enumerabili”
tipo booleano bool tipi carattere char
unsigned char tipi interi short
int long
unsigned short unsigned int unsigned long tipi in virgola mobile
float double long double wchar_t
G. Mecca - Programmazione Procedurale in Linguaggio C++ 15
Compatibilità tra Tipi
m
Le regole complete di compatibilità tra tipi
ðsono più complesse di quanto visto finora ðtutti i tipi di base sono compatibili tra lorom
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
Elementi di Base: Dettagli e Approfondimenti >> Approfondimenti sui Tipi
Compatibilità tra Tipi
m
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;
Elementi di Base: Dettagli e Approfondimenti >> Approfondimenti sui Tipi
a 97 1
G. Mecca - Programmazione Procedurale in Linguaggio C++ 17
Compatibilità tra Tipi
m
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)
m
Nelle espressioni sono compatibili
ðtroncamento e ampliamentoG. Mecca - Programmazione Procedurale in Linguaggio C++ 18
Compatibilità tra Tipi
m
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)
Elementi di Base: Dettagli e Approfondimenti >> Approfondimenti sui Tipi
G. Mecca - Programmazione Procedurale in Linguaggio C++ 19
Espressioni
m
Un altro esempio di stranezza del C/C++
ðin C++ tutte le istruzioni sono in effetti considerate espressioni
ðovvero regole per calcolare un valore
m
In particolare
ðle istruzioni di assegnazione sono complessivamente anche espressioni ðle istruzioni di lettura e stampa sono
complessivamente anche espressioni
Elementi di Base: Dettagli e Approfondimenti >> Espressioni
Assegnazioni
m Operatore di assegnazione (=)
ðha una duplice funzione
ðassegna il valore a destra alla variabile a sinistra ðrestituisce il valore assegnato
m Esempio
int a;
a = 1; // assegna 1 ad a e restituisce 1
m E’ possibile includere le assegnazioni in espressioni più complesse
Elementi di Base: Dettagli e Approfondimenti >> Espressioni
G. Mecca - Programmazione Procedurale in Linguaggio C++ 21
Assegnazioni
m
Esempio n.1
int a, b, c;
a = (a = 5) + (b = 7);
equivalente a;
a = 5; b = 7; c = a + b;
m
Esempio 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++ 22
Istruzioni di Lettura e Stampa
m 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
m Anche in questo caso
ðè possibile combinare le istruzioni di lettura e stampa in espressioni più complesse
m Esempio
int a, b, c;
cout << (cin >> a); // stampa 0 se c’è errore Elementi di Base: Dettagli e Approfondimenti >> Espressioni
G. Mecca - Programmazione Procedurale in Linguaggio C++ 23
Espressioni
m
Possono essere complesse
ðIl C++ fornisce numerosi altri operatori ðle regole di precedenza sono intricate
m
Esempi
ðoperatori “bit a bit”: &, |, ~
ðoperatori di scorrimento: >>, <<
ðoperatore condizionale: ? ðoperatore “virgola”: ,
Elementi di Base: Dettagli e Approfondimenti >> Espressioni
Espressioni
m
Operatori unari con effetti collaterali
ðpossono essere postfissi o prefissim
Operatore postfisso
ðeffetto collaterale dopo la valutazione ðes: a++ (valuta a e poi la incrementa)
m
Operatore prefisso
ðeffetto collaterale prima della valutazione ðes: ++a (incrementa a e poi valuta)
Elementi di Base: Dettagli e Approfondimenti >> Espressioni
G. Mecca - Programmazione Procedurale in Linguaggio C++ 25
Espressioni
m
Esempio 1
int i, j, k;
i = 10; j = 20;
k = i++ + j; // k vale 30
m
Esempio 1
int i, j, k;
i = 10; j = 20;
k = ++i + j; // k vale 31
prima viene valutata la sottoespressione a (valore 10) e poi la variabile viene incrementata
prima viene incrementata la variabile a (valore 11) e poi viene valutata la sottoespressione
G. Mecca - Programmazione Procedurale in Linguaggio C++ 26
Una Annotazione Importante
m
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
Elementi di Base: Dettagli e Approfondimenti >> Espressioni
G. Mecca - Programmazione Procedurale in Linguaggio C++ 27
Valutazione delle Condizioni
m
Le strutture di controllo sono basate sulla valutazione di condizioni
m
Condizione
ðespressione a valori booleani
m
Due particolarità del C++
ðcondizioni a valori non booleani ðtecnica del “corto circuito”
Strutture di Controllo: Dettagli e Approfondimenti >> Condizioni
Condizioni a Valori Non Booleani
m
In generale
ðun’espressione deve restituire vero o falso
m
In C/C++
ðqualsiasi tipo di base è compatibile con il tipo bool (per troncamento)
ðqualsiasi espressione che ritorni un valore del tipo di base è accettabile come
condizione per un’espressione di controllo ðvalore 0->false, qualsiasi altro valore->true
Strutture di Controllo: Dettagli e Approfondimenti >> Condizioni
G. Mecca - Programmazione Procedurale in Linguaggio C++ 29
Condizioni a Valori Non Booleani
m
Esempio
numeroEsami = 0;
sommaVoti = 0.0;
cout << “Voto (0 per fermarti)”;
cin >> voto;
while (voto) { numeroEsami++;
sommaVoti += voto;
cout << “Voto (0 per fermarti)" << endl;
cin >> voto;
}
G. Mecca - Programmazione Procedurale in Linguaggio C++ 30
Altre Istruzioni
m
Strutture di controllo fondamentali
ðistruzione ifðciclo while ðciclo for
m
Esistono altre strutture di controllo
ðnon sono fondamentali (sono sostituibili da quelle fondamentali)
ðle elenchiamo per completezza
Strutture di Controllo: Dettagli e Approfondimenti >> Altre Istruzioni
G. Mecca - Programmazione Procedurale in Linguaggio C++ 31
Altre Istruzioni
m
Altre istruzioni
ðistruzione do while (istruzione iterativa a condizione finale)
ðistruzione case/switch (istruzione condizionale a molte vie)
ðistruzione break ðistruzione continue
Strutture di Controllo: Dettagli e Approfondimenti >> Altre Istruzioni
Istruzione DO WHILE
m
Ciclo while a condizione finale
ðla condizione è alla fine e non all’inizio
m
Sintassi
do <istruzioni> while (<condizione>);
m
Semantica
ðidentica a quella del while
ðil corpo viene eseguito almeno una volta prima di valutare la condizione
Strutture di Controllo: Dettagli e Approfondimenti >> Altre Istruzioni
G. Mecca - Programmazione Procedurale in Linguaggio C++ 33
Altre Istruzioni
m
Esempio: calcolo della media
numeroEsami = 0;
sommaVoti = 0.0;
do {
cout << “Voto (0 per fermarti)" << endl;
cin >> voto;
if (voto) {
numeroEsami++;
sommaVoti += voto;
}
} while (voto);
G. Mecca - Programmazione Procedurale in Linguaggio C++ 34
Istruzione CASE
m
A volte
ðè necessario verificare caso per caso una condizione
ðes: riconoscimento dei mesi dell’anno
m
In questi casi
ðmolte istruzioni if-then-else una dopo l’altra ðlunghe e poco leggibili
ðin questi casi è possibile utilizzare il case
Strutture di Controllo: Dettagli e Approfondimenti >> Altre Istruzioni
G. Mecca - Programmazione Procedurale in Linguaggio C++ 35
Istruzione CASE
m
Esempio: riconoscimento del mese
#include <iostream.h>
void main() { int numero;
string mese;
cout << "Inserisci il mese (da 1 a 12): ";
cin >> numero;
if (numero == 1) mese=“gennaio”;
else if (numero == 2) mese=“febbraio”;
else if (numero == 3) mese=“marzo”;
...
}
Strutture di Controllo: Dettagli e Approfondimenti >> Altre Istruzioni
Istruzione CASE
#include <iostream.h>
void main() {
int numero; string mese;
cout << "Inserisci il mese (da 1 a 12): ";
cin >> numero;
switch (numero) {
case 1: mese = "gennaio"; break;
case 2: mese = "febbraio"; break;
case 3: mese = "marzo"; break;
case 4: mese = “aprile"; break;
...
case 12: mese = “dicembre";
} }
Strutture di Controllo: Dettagli e Approfondimenti >> Altre Istruzioni
G. Mecca - Programmazione Procedurale in Linguaggio C++ 37
Istruzione CASE
m Sintassi
switch (<espr>) {
case <val1>: <istruzioni1>;
case <val2>: <istruzioni2>;
...
default: <istruzioniN>; // opzionale }
m Dove
ð<espr> è un’espressione a valori di tipo enumerabile ð<val1>, <val2>,... sono possibili valori
dell’espressione
G. Mecca - Programmazione Procedurale in Linguaggio C++ 38
Istruzione CASE
m
Semantica
ðviene valutata l’espressione
ðviene cercato il ramo case con il valore corrispondente; se viene trovato, vengono eseguite le istruzioni relative e quelle di tutti i rami successivi
ðaltrimenti, se è specificato il ramo default, vengono eseguite le istruzioni relative ðsi prosegue con l’istruzione successiva
Strutture di Controllo: Dettagli e Approfondimenti >> Altre Istruzioni
G. Mecca - Programmazione Procedurale in Linguaggio C++ 39
Istruzione CASE
m
Nota sulla semantica
ðvengono eseguite le istruzioni del ramo case selezionato e tutte le istruzioni dei rami
successivi
ðin molti casi, è necessario eseguire le istruzioni di un solo ramo
ðper interrompere l’esecuzione subito dopo il ramo selezionato: istruzione break
Strutture di Controllo: Dettagli e Approfondimenti >> Altre Istruzioni
Istruzione BREAK
m
Si usa nelle strutture di controllo
m
Sintassi
break;
m
Semantica
ðinterrompe l’esecuzione della strutture di controllo (qualsiasi sia lo stato) per
proseguire con l’istruzione successiva
m
Esempio
ðpuò essere usata per interrompere for/while
Strutture di Controllo: Dettagli e Approfondimenti >> Altre Istruzioni
G. Mecca - Programmazione Procedurale in Linguaggio C++ 41
Istruzione CONTINUE
m
Simile a break, ma si usa solo nei cicli
m
Sintassi
continue;
m
Semantica
ðinterrompe l’esecuzione del corpo del ciclo (qualsiasi sia lo stato) per ritornare in cima e valutare di nuovo la condizione di uscita
m
Differenza con break
ðnon necessariamente termina il ciclo
G. Mecca - Programmazione Procedurale in Linguaggio C++ 42
Sottoprogrammi Sovraccarichi
m
Normalmente
ði sottoprogrammi di un’applicazione devono avere nomi diversi
ðin modo che il processore possa distinguere in caso di chiamata
m
In realtà
ðè possibile distinguere due sottoprogrammi anche solo dai parametri
Sottoprogrammi: Dettagli e Approfondimenti >> Sottoprog. Sovraccarichi
G. Mecca - Programmazione Procedurale in Linguaggio C++ 43
Sottoprogrammi Sovraccarichi
m
In C++
ðè possibile definire più sottoprogrammi con lo stesso nome e parametri diversi
ðsi dice che il nome utilizzato è “sovraccarico”
m
Fenomeno analogo
ðsovraccarico degli operatori
ðesempio: somma (+) tra numeri e concatenazione (+) tra stringhe
Sottoprogrammi: Dettagli e Approfondimenti >> Sottoprog. Sovraccarichi
Esempio: minimo
int minimo (int a, int b) { int min;
if (a<=b) min=a;
else min=b;
return min;
}
int minimo (int a, int b, int c) { int min;
if (a<=b && a<=c) min=a;
else if (b<=a && b<=c) min=b;
else min=c;
return min;
}
Sottoprogrammi: Dettagli e Approfondimenti >> Sottoprogr. Sovraccarichi
i due sottoprogrammi hanno lo stesso nome ma sono distinguibili sulla base del prototipo
G. Mecca - Programmazione Procedurale in Linguaggio C++ 45
Sottoprogrammi Sovraccarichi
m Un ulteriore esempio
ðoperazioni sulle liste
m Inserimenti
ðin coda e in posizione fissata
void aggiungi (lista &l, float elem, bool& esito);
void aggiungi (lista &l, float elem, int pos, bool& esito);
m Cancellazioni
ðin coda ed in posizione fissata void elimina (lista &l, bool& esito);
void elimina (lista &l, int pos, bool& esito);
>> listaDiReali2.cpp
>> listaDiReali2.h
G. Mecca - Programmazione Procedurale in Linguaggio C++ 46
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.