Vai alla Home Page About me Courseware Federica Living Library Federica Federica Podstudio Virtual Campus 3D Le Miniguide all'orientamento Gli eBook di Federica La Corte in Rete
 
 
Il Corso Le lezioni del Corso La Cattedra
 
Materiali di approfondimento Risorse Web Il Podcast di questa lezione

Silvia Rossi » 13.Le strutture di controllo - parte terza


C++ funzioni, scope di variabili

Lo scope (visibilità) di elementi del linguaggio (funzioni, variabili, costanti, …) è la regione del programma in cui la variabile può essere usata.

Finora abbiamo incontrato elementi con visibilità:

  • Limitata a funzioni: dichiarate nel corpo delle funzioni
  • Limitate a costrutti for

in C++ è possibile dichiarare elementi del linguaggio in qualsiasi punto del programma.

Lo scope di elementi del linguaggio (funzioni, variabili, costanti, …) è dato dalla più piccola istruzione composta (gruppo di istruzioni racchiuso tra due parentesi graffe) che include la sua dichiarazione.

C++ funzioni, scope di variabili

Per questo motivo la variabile i definita in un for ha come scope solo il blocco o la singola istruzione che segue il for ed è sconosciuta all’esterno.

Sempre per questo motivo il parametro di una function può avere lo stesso nome del parametro effettivo del processo chiamante.

Possiamo definire anche delle variabili globali e delle costanti globali: esse vanno dichiarate all’esterno di qualsiasi function, compreso il main.

Il loro scope comprende tutto il programma sorgente in cui è presente.

Se una variabile v viene definita come globale e poi dichiarata nuovamente locale in una funzione, si dice che la variabile locale v nasconde la variabile globale v.

C++ funzioni, scope di variabili

Le dichiarazioni fatte in uno scope nascondono quelle fatte in scope più esterni
Una variabile locale a uno scope ha associata un’area di memoria allocata prima dell’esecuzione dello scope e distrutta al suo termine

Mostra codice

Esercizio13.1.cpp
Esercizio13.2.cpp


C++ funzioni, scope di variabili

Un side-effect è la modifica nel corpo di una funzione di una variabile globale.

Una funzione non dovrebbe avere side-effect:

  • Una funzione dovrebbe avere la caratteristica che, al suo ritorno al programma chiamante, i soli valori modificati sono i parametri passati per riferimento
  • I side effect sono spesso origine di errori difficili da individuare

In un programma è buona norma dichiarare una costante come globale: ogni tentativo di modificarne il valore causa un errore di compilazione.
Esempio: definire le dimensioni di array come costanti globali all’inizio del programma rende più facile ritrovarle per la modifica in un secondo momento

C++ funzioni, namespace

I namespace sono molto utili quando si creano librerie di funzioni:

  • raggruppano (modularità) sotto un nome comune un insieme di elementi correlati: funzioni, classi, variabili, costanti, etc.
  • distinguono (scope) elementi appartenenti a namespace diversi

Possiamo definire un namespace dichiarando e inizializzando nel suo corpo tutti gli elementi che vi appartengono:

Mostra codice
Fig. a.

Fig. a.

Fig. b.

Fig. b.


C++ funzioni, namespace

Possiamo usare in ogni programma gli elementi di un namespace con l’operatore di scope :: (risolutore di visibilità)

Mostra codice

Esercizio13.3.cpp

C++ funzioni, namespace

Se occorre usare spesso gli elementi di un namespace
using namespace nome-namespace;

Mostra codice

Esercizio13.4.cpp


Semplici regole per la scrittura di buoni programmi

Tutte le variabili globali possono essere richiamate da ogni funzione o procedura ma non è consigliabile utilizzare le variabili globali così che ogni procedura è autosufficiente
Non ha bisogno di altre variabili oltre le locali e quelle di input/output assegnate nella lista dei parametri formali.

Se tutte le procedure di un programma sono autosufficienti, il programma si dice modulare.

Un programma modulare non ha effetti collaterali (side-effects).

Scrivere del codice senza effetti collaterali è molto semplice: basta fare in modo di servirsi soltanto di variabili che fanno riferimento a termini che o sono dichiarati localmente o sono definiti nella lista dei parametri formali

non deve essere richiamata nessuna variabile globale.

C++ espressioni condizionali

Esiste un particolare operatore, detto operatore condizionale, che rappresenta un’istruzione if... else... estremamente compattata.

Supponiamo di voler inserire nella variabile intera x il più grande dei valori interi tra a e b:

if (a > b)
x=a;
else
x=b;

Invece adoperando l’operatore condizionale ? scriveremo:
(a > b) ? x=a : x=b;


C++ espressioni condizionali

L’operatore condizionale è l’unico operatore ternario:

condizione ? espressione A : espressione B

dove condizione è un’espressione logica. L’operazione restituisce il valore dell’espressione A se la condizione è true o il valore dell’espressione B se la condizione è false

Esempio: minimo = a < b ? a : b;

(n % 2==0) ? cout << "pari" : cout << "dispari";

L’operatore condizionale può* restituire un l-value

Esempio:
(m < n ? a : b) = c ;

memorizza il valore di c in a se m è minore di n, altrimenti memorizza il valore di c in b) in questo caso però a e b non possono essere né espressioni né costanti, ma soltanto l-values.
* non in tutti i compilatori, però!

C++ istruzione switch

L’istruzione switch offre un altro modo per implementare strutture di selezione con diverse alternative.

Occorre riprendere il concetto di tipo ordinale
Tipo per il quale è possibile definire il precedente (tranne il primo) ed il successivo (tranne l’ultimo) di ogni valore.

Alcuni tipi standard sono ordinali:

  • I tipi int, long int, char, bool sono ordinali
  • I tipi float, double non sono ordinali

C++ istruzione switch

L’istruzione switch offre un altro modo per implementare strutture di selezione con diverse alternative.


C++ istruzione switch

L’istruzione switch è equivalente ad una sequenza di istruzioni if ... else annidati
Non introduciamo nello pseudocodice una istruzione corrispondente allo switch, ma lo esprimeremo sempre con istruzioni se … altrimenti annidate


C++ istruzione switch

Attenzione alla istruzione break. La sua omissione permette la verifica dei rimanenti blocchi case e la conseguente esecuzione delle istruzioni


C++ istruzione switch

Attenzione alla istruzione break. La sua omissione permette la verifica dei rimanenti blocchi case e la conseguente esecuzione delle istruzioni


C++ istruzione switch

Esercizio:
Scrivere un programma che dato in input un voto da 0 a 10 stampi un giudizio secondo la tabella

Mostra codice

Esercizio13.5.cpp


C++ istruzione switch

Mostra codice
Mostra codice

C++ istruzione switch

Esercizi:

Il termometro:

  • scrivere un programma che dato in input un numero (intero) che indica una temperatura in C° da 35 a 42, stampi i seguenti messaggi: 35->debole, 36->normale, 37->decimi, 38->febbre, 39-40->febbre alta, 41-42->febbre delirante
  • Scrivere un programma che riceve in input un numero n1 (1o operando), un carattere p che indica un operatore (‘+’, ‘-’, ‘*’, ‘/’), e un numero n2 (2o operando), per eseguire l’operazione: n1 p n2
  • Calcolare in una frase qual è la vocale che occorre più volte.
  • Estendere il programma precedente in modo che il risultato dell’operazione sia il primo operando della successiva operazione (ridata in input insieme al nuovo 2o operando): (n1 p n2) p' n3

C++ istruzioni iterative

L’istruzione ciclica do … while:
do {

istruzione;

...

} while (condizione);

dove:

  • condizione è un’espressione logicafunziona come l’istruzione while, con la differenza che la condizione è verificata alla fine di ogni iterazione e pertanto il ciclo è sempre eseguito almeno una volta.
  • Se la condizione è true il programma torna all’inizio del ciclo ed esegue una nuova iterazione, se è false, passa all’istruzione successiva
  • Le parentesi graffe sono obbligatorie, anche se il costrutto controlla una istruzione semplice.

C++ istruzioni iterative

Esempio :
dato un array A contenente n elementi si vuole verificare se la somma dei suoi elementi è maggiore di un certo valore k.

Mostra codice

In definitiva utilizziamo:

  • while ( ) ... quando il corpo del ciclo può anche non essere mai eseguito;
    do ... while ( ) quando il corpo del ciclo deve essere eseguito almeno una volta.

C++ istruzioni iterative

Mostra codice

C++ istruzioni iterative

Esercizi:

a) Scrivere un programma che propone le tabelline per un bambino delle elementari. I due fattori da moltiplicare sono generati in modo random ed il computer deve controllare che l’utente risponda esattamente. Quando risponde esattamente, il programma deve generare a caso una delle seguenti risposte:

1) Bravo!! 2) Ottima risposta. 3) Continua così!! 4) Stai nettamente migliorando.

Nel caso di una risposta errata deve rispondere, sempre a caso, con una delle seguenti:

1) Errato. Riprova. 2) Non è la risposta esatta. 3) Fai più attenzione. Riprova 4) Non arrenderti. Prova ancora.

b) Scrivere un main che legge due numeri reali ed un carattere: se il carattere è ‘T’ chiama la prima procedura, se il carattere è ‘R’ chiama la seconda, se è ‘E’ chiama la terza, se è ‘N’ esce dal ciclo inviando un messaggio di saluto, altrimenti stampa: ‘carattere errato’.

  • Contenuti protetti da Creative Commons
  • Feed RSS
  • Condividi su FriendFeed
  • Condividi su Facebook
  • Segnala su Twitter
  • Condividi su LinkedIn
Progetto "Campus Virtuale" dell'Università degli Studi di Napoli Federico II, realizzato con il cofinanziamento dell'Unione europea. Asse V - Società dell'informazione - Obiettivo Operativo 5.1 e-Government ed e-Inclusion