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
 
I corsi di Scienze Matematiche Fisiche e Naturali
 
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