Introduzione alla

Programmazione

in C++

Moreno Marzolla

moreno.marzolla@pd.infn.it

Copyright © 2006 Moreno Marzolla

This work is licensed under the Creative Commons Attribution-Noncommercial-Share Alike 2.5 Italy License. To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-sa/2.5/it/ or send a letter to Creative Commons, 171 Second Street, Suite 300, San Francisco, California, 94105, USA.

Il vostro primo programma in C++

1: // Primo esempio di programma in C++

2: /* Stampa “Hello World!” (senza virgolette) */

3: #include <iostream>

4: using namespace std;

5: int main( void )

6: {

7:	cout << “Hello, world!” << endl;

8:	return 0;

9: }

Analizziamo...

1: // Primo esempio di programma in C++

2: /* Stampa “Hello World!” (senza virgolette) */

3: #include <iostream>

4: using namespace std;

5: int main( void )

6: {

7:	cout << “Hello, world!” << endl;

8:	return 0;

9: }

Il carattere // rappresenta l'inizio di un commento (tutto quello che segue, fino a fine riga, viene ignorato dal compilatore)

I caratteri /* e */ denotano l'inizio e la fine di un commento (/* deve sempre essere chiuso con */

Analizziamo...

1: // Primo esempio di programma in C++

2: /* Stampa “Hello World!” (senza virgolette) */

3: #include <iostream>

4: using namespace std;

5: int main( void )

6: {

7:	cout << “Hello, world!” << endl;

8:	return 0;

9: }

Queste istruzioni indicano al compilatore di importare una serie di definizioni presenti in un file esterno, e di utilizzarle. Ricordatevi sempre di inserirle!!

Analizziamo...

1: // Primo esempio di programma in C++

2: /* Stampa “Hello World!” (senza virgolette) */

3: #include <iostream>

4: using namespace std;

5: int main( void )

6: {

7:	cout << “Hello, world!” << endl;

8:	return 0;

9: }

Dichiarazione di una funzione chiamata main(), che non accetta parametri in input (void) e restituisce come output un intero (int). L'esecuzione del programma inizia dalla prima istruzione della funzione main(). Questa deve sempre essere presente nei vostri programmi!

Analizziamo...

1: // Primo esempio di programma in C++

2: /* Stampa “Hello World!” (senza virgolette) */

3: #include <iostream>

4: using namespace std;

5: int main( void )

6: {

7:	cout << “Hello, world!” << endl;

8:	return 0;

9: }

Definizione del contenuto della funzione main(). Dentro le parentesi graffe c'è la sequenza di istruzioni da eseguire quando la funzione main() viene invocata.

Analizziamo...

1: // Primo esempio di programma in C++

2: /* Stampa “Hello World!” (senza virgolette) */

3: #include <iostream>

4: using namespace std;

5: int main( void )

6: {

7:	cout << “Hello, world!” << endl;

8:	return 0;

9: }

Stampa “Hello, world!” (senza virgolette), e va a capo.

cout è il nome del dispositivo di output (uscita) su console, cioè sullo schermo

Analizziamo...

1: // Primo esempio di programma in C++

2: /* Stampa “Hello World!” (senza virgolette) */

3: #include <iostream>

4: using namespace std;

5: int main( void )

6: {

7:	cout << “Hello, world!” << endl;

8:	return 0;

9: }

Dopo aver stampato la stringa, viene eseguita questa istruzione.

Restituisce 0 come valore della funzione main(). Normalmente main() termina restituendo 0. Dopo return 0, nessuna ulteriore istruzione viene eseguita.

E ora che facciamo?

Questo programma è solo un file di testo; il computer non sa cosa farci

Il computer è in grado solamente di eseguire sequenze di istruzioni codificate come byte (o parole), come avevamo visto

Occorre qualcosa che traduca il programma “leggibile” in sequenze di istruzioni macchina

Tale “qualcosa” è il compilatore C++

Nel nostro caso si chiama g++

Quindi?

Supponiamo che il file che contiene il codice sorgente si chiami HelloWorld.cc

Il comando sopra invoca il compilatore

Il compilatore legge il file HelloWorld.cc, e lo traduce

Il risultato (programma eseguibile) viene messo in un nuovo file HelloWorld

Ora è possibile eseguire il programma

> g++ HelloWorld.cc -o HelloWorld

> ./HelloWorld

Hello, world!

Variabili

Una variabile è una etichetta a cui è assegnato un valore di un certo tipo

Le variabili hanno un nome

Il nome è una sequenza di caratteri o numeri che inizia con un carattere alfabetico

Es: Nome, XX, XX_1, pippo1

Tipi predefiniti dal C++

int, float, double, char, bool

int XX = 0;

char l = 'a';

float pigreco = 3.14;

double e = 2.47;

int pippo1;

Attenzione: il valore iniziale di pippo1 è indefinito

Assegnamenti

In generale è possibile scrivere cose come:

Questo viene valutato come segue:

Prima si valuta l'espressione a destra dell'operatore di assegnamento (il simbolo '=')

Poi il risultato dell'espressione diventa il valore della variabile a sinistra del simbolo '='

Il codice sopra assegna il valore 100 a Area

float Base = 10.0;

float Altezza = 20.0;

float Area;

Area = (Base * Altezza) / 2.0;

Attenzione

Quanto vale:

X=X+1, vista come equazione aritmetica, non è risolvibile...

...ma questo è C++ !

Prima si valuta la parte destra (X+1 vale 10+1=11)

Poi si assegna tale valore alla parte sinistra

Dopo l'assegnamento, il nuovo valore di X è 11

int X = 10;

X = X + 1;

Attenzione

Quanto vale

Valgono le solite regole di precedenza degli operatori

Il prodotto ha precedenza maggiore della somma

X*(2+Y) – 7*X =
10*(2+12) - 7*2 =
10*14 – 7*2 = 140 - 14 = 126

int X = 10; int Y = 12;

int Z = 2; int Risultato;

Risultato = X*(2 + Y) - 7*Z;

Istruzione condizionale “if-then-else”

Condizione

Parte “then”

Parte “else”

vera

falsa

int X = 10, Y = 15;

if ( X >= Y ) {

cout << “X maggiore o uguale a Y” << endl;

} else {

cout << “X minore di Y” << endl;

}

if ( condizione ) {

// parte “then”

} else {

// parte “else”

}

In C++

Istruzione condizionale “if-then”

Il ramo “else” è opzionale e si può omettere

int num;

cin >> num; // L'utente deve digitare un numero

if ( num > 0 && num < 2 ) {

cout << “num vale 1” << endl;

}

cout << “Procediamo...” << endl;

Condizione

Parte “then”

vera

falsa

Operatori di confronto

X >= Y	Vero se X è maggiore o uguale di Y

X > Y	Vero se X è maggiore di Y

X <= Y	Vero se X è minore o uguale di Y

x < Y	Vero se X è minore di Y

X != Y	Vero se X è diverso da Y

X == Y	Vero se X è uguale a Y

Le condizioni possono essere combinate

Esempi

A && B	Vero se entrambe A e B sono vere (AND)

A || B	Vero se A oppure B sono vere (OR)

!A	Vero se A è falso (NOT)

int X = 10, Y = 15, Z=-2;

(X>0 && Y>0)	// Vero

(X>0 || Y>20)	// Vero

( (X<0 || Y<0) && (Z>3) )	// Falso

!(X>Y)	// Vero

Ciclo “while-do”

Condizione

Corpo

vera

falsa

int X = 5;

while ( X > 0 ) {

cout << “X vale “ << X << endl;

X = X-1;

}

cout << “Fine ciclo” << endl;

while ( condizione ) {

// Corpo

}

In C++

X vale 5

X vale 4

X vale 3

X vale 2

X vale 1

Fine ciclo

L'output generato

Il nostro primo secondo programma

Chiedere all'utente un intero N>0

Chiedere all'utente N numero interi

Stampare la somma dei numeri inseriti dall'utente

Implementazione

#include <iostream>

using namespace std;

int main( void )

{

int N;	// quandi numeri sommare

int somma = 0; // la somma accumulata

int num; // il numero inserito dall'utente

cout << “Digita N” << endl;

cin >> N;

while ( N > 0 ) {

cout << “Digita un intero” << endl;

cin >> num;

somma = somma + num;

N = N-1;

}

cout << “La somma vale “ << somma << endl;

}

Laboratorio guidato / 1

Aula C, piano terra dip. di Matematica

Entrate dall'ingresso in via Paolotti, prima porta a destra (dove c'è lo scivolo); siete in un piccolo atrio, l'aula C è la porta alla vostra sinistra

Ore 11:30—12:30 Chimica?

Ore 12:30—13:30 Chimica ind + Sc. geologiche?

via Paolotti

via Belzoni

via Marzolo

LAB

Noi siamo

qui

Laboratorio guidato / 2

Per poter accedere ai computer, è necessario avere un proprio nume utente (username) e password

La prima volta vi verranno assegnati automaticamente (le volte successive li riutilizzate), con la seguente procedura

Quando accendete il computer, vi compare una schermata che vi richiede nome utente e password

In entrambe le caselle, digitate “iscriz” (senza virgolette)

Vi compare una schermata in cui viene richiesto l'inserimento del vostro Nome e Cognome, Corso di studi e Numero di Matricola

Cliccando (tasto sinistro del mouse) sul pulsante, il sistema vi fa comparire il vostro nome utente e password

Ricopiate con cura username e password su un pezzo di carta (se li perdete, non potete più collegarvi!!)

Chiudete la finestra; tornerete alla schermata iniziale, in cui potete ora inserire il vostro nome utente e password

Laboratorio guidato / 3

Aprite una finestra di terminale

Vi farò vedere come si fa

Utilizzate l'editor emacs per scrivere il vostro programma che chiamerete ad es. prog1.cc

Arrivate col vostro programma già scritto su un pezzo di carta, che ricopierete

Per compilare

Per eseguirlo

emacs prog1.cc &

g++ prog1.cc -o prog1

./prog1

Ciclo “do-while”

Condizione

Corpo

vera

falsa

int X;

do {

cin >> X;

} while ( X < 0 );

cout << “Hai scritto ” << X << endl;

do {

// Corpo

} while ( condizione );

In C++

Richiede all'utente un numeroX; se viene inserito un numero negativo, ripete la richiesta.

Esercizio

Chiedere all'utente una sequenza di interi, terminata con un intero negativo qualsiasi (es. -1)

Visualizzare il minimo tra tutti gli interi inseriti dall'utente (ad esclusione del numero negativo finale)

Implementazione (bozza 1...)

#include <iostream>

using namespace std;

int main( void )

{

int minimo = ???; // il minimo fin qui trovato

int num; // il numero inserito dall'utente

do {

cout << “Digita un intero” << endl;

cin >> num;

if ( num >= 0 ) {

if ( num < minimo ) {

minimo = num;

}

}

} while ( num >= 0 );

cout << “Il minimo vale “ << minimo << endl;

}

Implementazione (bozza 2...)

#include <iostream>

using namespace std;

int main( void )

{

int minimo = ???; // il minimo fin qui trovato

int num; // il numero inserito dall'utente

do {

cout << “Digita un intero” << endl;

cin >> num;

if ( (num >= 0) && (num < minimo) ) {

minimo = num;

}

} while ( num >= 0 );

cout << “Il minimo vale “ << minimo << endl;

}

Implementazione

Cosa scriviamo al posto di ???

Che succede se poniamo minimo=0?

Che succede se poniamo minimo=-1?

Che succede se poniamo minimo=”+ infinito”?

#include <iostream>

using namespace std;

int main( void )

{

int minimo = ???; // il minimo fin qui trovato

int num; // il numero inserito dall'utente

do {

cout << “Digita un intero” << endl;

cin >> num;

if ( (num >= 0) && (num < minimo) ) {

minimo = num;

}

} while ( num >= 0 );

cout << “Il minimo vale “ << minimo << endl;

}

Implementazione (quasi) finale

#include <iostream>

using namespace std;

int main( void )

{

int minimo = 1000000; // il minimo fin qui trovato

int num; // il numero inserito dall'utente

do {

cout << “Digita un intero” << endl;

cin >> num;

if ( (num >= 0) && (num < minimo) ) {

minimo = num;

}

} while ( num >= 0 );

cout << “Il minimo vale “ << minimo << endl;

}

Pero'...

Che succede se l'utente, guarda caso, inserisce tutti numeri maggiori di 1000000?

Il programma non funziona!

Facciamo così:

Inizializziamo minimo a -1

Se minimo==-1, vuol dire che nessun elemento e' stato inserito; quindi, quando minimo==-1, il primo intero non negativo inserito dall'utente diventa il nuovo minimo

Se minimo != -1, procediamo come prima

Implementazione finale!

#include <iostream>

using namespace std;

int main( void )

{

int minimo = -1; // il minimo fin qui trovato

int num;	// il numero inserito dall'utente

do {

cout << “Digita un intero” << endl;

cin >> num;

if ( num >= 0 ) {

if ( minimo == -1 ) {

minimo = num;

} else {

if ( num < minimo ) {

minimo = num;

}

}

} // (*)

} while ( num >= 0 );

cout << “Il minimo vale “ << minimo << endl;

}

Esempio

#include <iostream>

using namespace std;

int main( void )

{

int minimo = -1; // il minimo fin qui trovato

int num;	// il numero inserito dall'utente

do {

cout << “Digita un intero” << endl;

cin >> num;

if ( num >= 0 ) {

if ( minimo == -1 ) {

minimo = num;

} else {

if ( num < minimo ) {

minimo = num;

}

}

} // (*)

} while ( num >= 0 );

cout << “Il minimo vale “ << minimo << endl;

}

num	Valore di minimo in (*)

8	8

9	8

6	6

-1	6

Esercizi per casa

Scrivere un programma che calcola il prodotto di due interi positivi x e y utilizzando la somma

Cioè, x*y deve essere calcolato come x+x+... (y volte)

Scrivere un programma che, dati in input tre interi x, y, z visualizza il massimo tra questi

Nel caso esistano più massimi, ne visualizza uno qualsiasi

Scrivere un programma che chiede in input un intero positivo N e stampa la somma dei numeri interi pari compresi tra 0 e N

Es: se N=13, stampare la somma di 2+4+6+8+10+12

Es: se N=1, deve stampare 0

Soluzione:
Calcolo del massimo di tre interi / 1

Nota 1

max( x, y, z ) = max( max(x, y), z )

Ossia: trovo prima il massimo tra x e y...

...poi il massimo tra quanto appena trovato e z

Come calcolo il max( x, y )?

x > y

Il max è x

Il max è y

#include <iostream>

using namespace std;

int main( void )

{

int x; int y;

cin >> x; // Legge x

cin >> y; // Legge y

if ( x > y ) {

cout << “Il massimo è “ << x << endl;

} else {

cout << “Il massimo è “ << y << endl;

}

return 0;

}

Vero

Falso

Soluzione:
Calcolo del massimo di tre interi / 2

x > y

Il max è x

Il max è z

Falso

Vero

y > z

x > z

Il max è y

Il max è z

Soluzione:
Calcolo del massimo di tre interi / 3

#include <iostream>

using namespace std;

int main( void )

{

int x; int y; int z;

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

if ( x > y ) {

// trovo il max tra x e z

if ( x > z ) {

cout << “Il massimo è “ << x << endl;

} else {

cout << “Il massimo è “ << z << endl;

}

} else {

// trovo il max tra y e z

if ( y > z ) {

cout << “Il massimo è “ << y << endl;

} else {

cout << “Il massimo è “ << z << endl;

}

}

return 0;

}

Moreno Mazolla

2005-09-25T15:46:34