• Non ci sono risultati.

Programmazione Procedurale in Linguaggio C++

N/A
N/A
Protected

Academic year: 2021

Condividi "Programmazione Procedurale in Linguaggio C++"

Copied!
23
0
0

Testo completo

(1)

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 Dato

m

Espressioni

m

Valutazione delle Condizioni

ðCondizioni a valori non booleani

Dettagli e Approfondimenti >> Sommario

(2)

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++

(3)

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 namespace

m

Nel seguito

ðNON faremo riferimento al C++ ANSI

Elementi di Base: Dettagli e Approfondimenti >> ANSI C++

(4)

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++

>>

(5)

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

(6)

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

(7)

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

(8)

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 loro

m

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

(9)

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 ampliamento

G. 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

(10)

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

(11)

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

(12)

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 prefissi

m

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

(13)

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

(14)

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

(15)

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

(16)

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

(17)

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

(18)

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

(19)

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

(20)

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

(21)

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

(22)

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

(23)

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.

Riferimenti

Documenti correlati

[r]

Size restituisce la dimensione di file e cartelle presenti nella cartella corrente Subfolder restutuisce l'elenco di tutte le sottocartelle presenti nella cartella corrente Type

[r]

õôõôõôõôõô õôõô õô õô

JLK

[r]

[r]

17 563 ./0123453.67893:2;??89@A=B3C83:DEFG.3/=@3F=@2113L/CA2=C;3MN3O3PQR STTUTTVUWXYZ[Y\UT]ZWTUY^YWZ_Y`ab cZV]dUXUY\UT]ZWTUY e fg\XhgdY\UT]ZWTUY ijY`ikb lXgmdUYnhTUgTUY