Sei sulla pagina 1di 34

Controllo di Flusso

Stefano Melacci

Utilit del Controllo di Flusso


1. Definire percorsi alternativi allinterno del programma (selezioni) 2. Ripetere lesecuzione di un medesimo blocco di codice (cicli)
ControllodiFlusso

Selezioni

Cicli

if (condizione) { istruzioni; } else { istruzioni; }

switch (variabile) { caseval1: istruzioni; break; casevalN: istruzioni; break; default: istruzioni; }

while (condizione) { istruzioni; }

do { istruzioni; } while (condizione)

for (condizione) { istruzioni; }

FondamentidiInformatica(20112012)

Utilit del Controllo di Flusso


1. Definire percorsi alternativi allinterno del programma (selezioni) 2. Ripetere lesecuzione di un medesimo blocco di codice (cicli)
ControllodiFlusso

Selezioni

Cicli

if (condizione) { istruzioni; } else { istruzioni; }

switch (variabile) { caseval1: istruzioni; break; casevalN: istruzioni; break; default: istruzioni; }

while (condizione) { istruzioni; }

do { istruzioni; } while (condizione)

for (condizione) { istruzioni; }

FondamentidiInformatica(20112012)

if else
include<stdio.h> int main() { int a; printf(Introdurreunnumerointero:\n); scanf(%d,&a); if (a0) { printf(Ilnumeroenegativo.\n); a=a*2; printf(Ildoppiovale%d.\n,a); } else { printf(Ilnumeroepositivo.\n); } printf(Fineprogramma.\n); return 0; }
FondamentidiInformatica(20112012) 4

Se lespressione tra parentesi vera, si esegue il blocco dopo if, altrimenti quello dopo else Le espressioni si scrivono sempre tra parentesi tonde! E ormai chiaro che le parentesi graffe in C servono a racchiudere un blocco di istruzioni (esattamente come nelle funzioni!) Le parentesi graffe non sono necessarie se listruzione da eseguire dopo if o else solo una (blocco con una sola istruzione)! Listruzione printf(Fine programma.\n); viene eseguita sempre, indipendentemente da if, else, e dalla condizione usata Notare lindentazione!

Espressioni condizionali
Espressioni condizionali in C
! minore maggiore minore o uguale maggiore o uguale uguale diverso

Vero o falso? In C corrispondono a 1 e 0 (da ricordare!), oppure a >=1 e 0 Esempio:


Espressione 10 01 00 1!1 11 110 Valore 1 0 1 1 1 0

Se scrivo if(1) che succede? e if(0) ?


FondamentidiInformatica(20112012) 5

Espressioni condizionali
Una espressione condizionale di base nasce dal confronto tra una coppia di valori
Oppure dal confronto tra pi espressioni!

Come si combinano espressioni condizionali?


AND logico: &&
Vera solo se sono vere entrambe le espressioni confrontate

OR logico: ||
Vera solo se vera anche solo una delle espressioni confrontate

NEGAZIONE: ! Attenzione alle parentesi!

if (a>5) if (a>=4) if (a==b) if (a>b &&a<5) if (a>b &&a<5 &&a!=3) if (a>c ||a>8) if ((a>b&&a<5&&a!=3)||(a>c||a>8)) if (!(a>c))
6

FondamentidiInformatica(20112012)

Esercizi
E possibile innestare (o annidare) una selezione (if else) allinterno di unaltra (if else) e cos via
Attenzione alle parentesi! Nel dubbio, una soluzione perfetta consiste nellusare sempre le parentesi per ogni blocco dopo if ed else

Scrivere il programma che legge due numeri reali da tastiera e stampa il maggiore dei due Scrivere il programma che legge un numero intero da tastiera e stampa se si tratta di un numero pari o dispari Scrivere il programma che legge tre numeri reali da tastiera e stampa il maggiore dei tre Scrivere il programma che legge un carattere da tastiera e riconosce se vengono inseriti a, o b, o c Scrivere il programma che legge i lati di un triangolo e stampa il tipo corrispondente (equilatero, isoscele, scaleno) [vari modi!!!]
FondamentidiInformatica(20112012) 7

switch
#include <stdio.h> int main(){ int a; switch (a) { case1: n=n*2; printf("Ildoppiodelnumeroe'%d\n",n); break; case2: n=n; printf("Ilnumerocambiatodisegnoe'%d\n",n); break; default: printf("Haiinseritounasceltanonvalida!\n"); } printf("Fineprogramma.\n"); return 0; }

Lespressione tra parentesi deve essere di tipo intero (es: variabile intera o carattere) La scrittura case 1: equivale a se la variabile tra parentesi vale 1 esegui le seguenti istruzioni break termina il blocco di istruzioni dentro al case (stavolta non ci sono le parentesi graffe!) default il caso generale. Se la variabile tra parentesi non ha nessuno dei valori dei precedenti case, viene eseguito il blocco dopo default. Notare ancora lindentazione!
8

FondamentidiInformatica(20112012)

switch
#include <stdio.h> int main(){ char c; switch (c) { case%: break; casev: caseu: break; default: } printf("Fineprogramma.\n"); return 0; }

Se voglio eseguire la medesima operazione quando la mia variabile assume pi valori, devo ripetere i blocchi di istruzioni? (Es: se la variabile controllata dallo switch vale 1 o 2 esegui la stessa operazione) Risposta: No, posso costruire dei case in cascata Nellesempio a destra, se c=v o c=u si esegue il medesimo blocco di istruzioni In questo esempio la variabile gestita dallo switch un carattere (char) Notare gli apici nei singoli case!

FondamentidiInformatica(20112012)

Esercizio
Scrivere un programma che legge due numeri reali ed un carattere da tastiera. Il carattere pu essere uno tra +,-,*,/. In base al carattere inserito, il programma deve stampare rispettivamente la somma, la differenza, il prodotto o la divisione tra i due numeri reali. Se viene inserito un carattere non ammesso, deve stampare un messaggio di avvertimento. Utilizzare listruzione switch

FondamentidiInformatica(20112012)

10

Utilit del Controllo di Flusso


1. Definire percorsi alternativi allinterno del programma (selezioni) 2. Ripetere lesecuzione di un medesimo blocco di codice (cicli)
ControllodiFlusso

Selezioni

Cicli

if (condizione) { istruzioni; } else { istruzioni; }

switch (variabile) { caseval1: istruzioni; break; casevalN: istruzioni; break; default: istruzioni; }

while (condizione) { istruzioni; }

do { istruzioni; } while (condizione)

for (condizione) { istruzioni; }

Prima di iniziare: Ogni esecuzione delle istruzioni allinterno di un ciclo detta ITERAZIONE
FondamentidiInformatica(20112012) 11

while

#include <stdio.h> int main(){ int i; i=0; while (i<10) { printf(Scriverquestomessaggio10volte!\n); i=i+1; } printf("Fineprogramma.\n"); return 0; }

while (traduzione: mentre o finch) seguito da una espressione (tra parentesi) Finch lespressione vera, il blocco di istruzioni che lo segue viene eseguito in modo ripetuto Quando lespressione diventa falsa, si prosegue con le istruzioni che seguono la } Se lespressione vera e non cambia mai, il ciclo infinito (ossia il mio programma NON termina!) Se lespressione contiene una variabile non inizializzata, il comportamento imprevedibile!

FondamentidiInformatica(20112012)

12

while
#include <stdio.h> int main(){ int i; i=0; while (i<10) { printf(Scriverquestomessaggio10volte!\n); i=i+1; } printf("Fineprogramma.\n"); return 0; }

Spesso si conosce il numero di volte in cui il ciclo verr eseguito Serve una variabile contatore per tenere traccia di quante volte stato eseguito il ciclo La variabile contatore deve essere: Inizializzata FUORI dal ciclo Incrementata (o decrementata) ad ogni iterazione, ossia DENTRO al ciclo Attenzione a dove si incrementa (o decrementa), ossia se inizio o fine ciclo!
13

FondamentidiInformatica(20112012)

Nota
i +1:
i=i+1; i++; // postincremento ++i; // preincremento

i -1:
i=i-1; i--; // postdecremento --i; // predecremento

Per somma, differenza, prodotto, divisione, modulo, le seguenti espressioni sono equivalenti (esempio con il prodotto)
i=i*5; i*=5;
FondamentidiInformatica(20112012) 14

do while

#include <stdio.h> int main(){ int i; i=0; do { printf(Scriverquestomessaggio10volte!\n); i=i+1; } while (i<10); printf("Fineprogramma.\n"); return 0; }

Identico al while, ma la prima iterazione viene eseguita SEMPRE, indipendentemente dalla condizione verificata la condizione controllata a FINE ciclo, e non pi ad INIZIO ciclo Questo significa che per convertire un ciclo while in un do while non sempre basta spostare while alla fine ed aggiungere do: Cosa sarebbe successo se la condizione dellesempio a sinistra fosse stata while(i!=0) ? E necessario cambiare la condizione del ciclo o linizializzazione del contatore!

FondamentidiInformatica(20112012)

15

Esercizio
Scrivere il programma che legge un intero da tastiera, ed effettua la somma di 5 numeri uguali a quello, restituendo il risultato
Modificare il programma precedente, in modo che venga richiesto allutente di specificare quante volte effettuare la somma Modificare il programma precedente, in modo che non venga accettata la richiesta di un numero di somme negativo Modificare il programma precedente passando da while a do while o viceversa

FondamentidiInformatica(20112012)

16

for
#include <stdio.h> int main(){ int i; for (i=0;i<10;i++) { printf(Scriverquestomessaggio10volte!\n); } printf("Fineprogramma.\n"); return 0; }

for il modo pi sintetico per scrivere un ciclo Inizializzazione, condizione e incremento sono tutte contenute in ununica istruzione! (separate da punto e virgola)

for (inizializzazione; condizionedaviolareperterminareilciclo; incremento) { istruzioni }


FondamentidiInformatica(20112012) 17

Esercizio
E possibile innestare (o annidare) un ciclo dentro un altro. Per ogni iterazione del ciclo padre si eseguono tutte le iterazioni del ciclo figlio, e cos via
Attenzione alle parentesi!

Scrivere il programma che calcola il fattoriale di un numero, usando un ciclo for Modificare il precedente programma in modo che non produca risultati maggiori di 150, usando listruzione breake senza usarla!
FondamentidiInformatica(20112012) 18

Esercizio: interpretare il codice del gioco dei 15 fiammiferi


#include <stdio.h> int main () { int matches_on_the_table, computer_matches, adversary_matches; printf("Welcome to MatchesGame \n \n"); printf("Hi dear,\nI'm your adversary in the MatchesGame; you can take one, two, or three matches, and we play in sequence.\nThe looser is the one who takes the last match. \n"); printf("Let me move first ...\n \n"); matches_on_the_table=15; computer_matches=2; printf("I take %d matches \n",computer_matches); matches_on_the_table-=computer_matches; do { do { printf("How many matches do you take?"); scanf("%d",&adversary_matches); if (adversary_matches < 1 || adversary_matches > 3) printf("Hey ...please, don't cheat!\n"); } while (adversary_matches < 1 || adversary_matches > 3); computer_matches = 4 - adversary_matches; /* the winning strategy for the computer */ printf("I take %d matches \n",computer_matches); matches_on_the_table -= computer_matches + adversary_matches; } while (matches_on_the_table != 1); printf("Ah ah ... I'm the winner ... as usual!!!\n"); return 0; }

FondamentidiInformatica(20112012)

19

Controllo di Flusso Ultime note


Stefano Melacci

break, continue
break; continue; sono due parole chiave che servono per alterare il naturale svolgimento di un ciclo
Avevamo gi usato break per il costrutto switch!

break; termina lesecuzione del ciclo, indipendentemente dallo stato della condizione del ciclo continue; provoca linterruzione delliterazione corrente e si prosegue con la successiva
Utile se non si vuol eseguire una porzione del blocco di codice del ciclo Attenzione ai contatori!

ATTENZIONE: break produce codice NON strutturato

FondamentidiInformatica(20112012)

21

Esempio
#include <stdio.h> int main(){ int n,i; printf("Stampadi10000000asterischi...\n\n"); for (i=0;i<10000000;i++){ if (i==3) continue; printf("*"); if (i==5) break; } printf("\n\nIlcontatoredovevaarrivarea10000000masie'fermatoalvalore%d",i); return 0; }

Ouput: ***** 5

FondamentidiInformatica(20112012)

22

Altri Operatori
Stefano Melacci

Operatore sizeof()
Restituisce la dimensione in byte di un tipo di dato o di unespressione Il valore restituito di tipo: unsigned int Quali sono i valori che vengono stampati? Perch?
#include <stdio.h> int main() { unsigned int s;
Variabile che user per memorizzare il valore restituito da sizeof()

sizeof(tipo di dato) s = sizeof(int); printf("Dim di un int: %d byte\n",s);

printf("Dim di un float: %d byte\n",sizeof(float)); printf("Dim di un double: %d byte\n",sizeof(double)); printf("Dim di 3+5: %d byte\n",sizeof(3+5)); printf("Dim di 3.0+5: %d byte\n", sizeof(3.0+5)); return 0; }
FondamentidiInformatica(20112012)

sizeof(espressione)

24

Operatore ?
Operatore condizionale
E lunico operatore ternario del linguaggio C E solo un modo abbreviato per scrivere if else
if (x<y) z x; else z y; if (j<0) printf(Ecco %d, j); else printf(Ecco %d, k);
FondamentidiInformatica(20112012) 25

z = ((x<y) ? x : y)

printf(Ecco %d, j<0 ? j : k);

Funzioni
Stefano Melacci

Esempio di sorgente C - Funzioni


#include <stdio.h> #include "mylib.h" float area_triangolo(int base, int altezza) { float area; area = (base*altezza)/2; return area; } void stampa_messaggio() { printf("Calcolo dell'area del triangolo\n"); } int leggi_base() { int b; printf("Inserisci base:\n"); scanf("%d",&b); return b; } . . int leggi_altezza() { int h; printf("Inserisci altezza:\n"); scanf("%d",&h); return h; } int main() { float area; int bas,alt; stampa_messaggio(); bas = leggi_base(); alt = leggi_altezza(); area = area_triangolo(bas,alt); printf("Area triangolo: %f\n",area); alt = leggi_altezza(); bas = leggi_base(); area = area_triangolo(bas,alt); printf("Area triangolo: %f\n",area); stampa_avviso_finale(); return 0; }

Chiamate a Funzioni

Ciascun riquadro (blu) una definizione di funzione!

FondamentidiInformatica(20112012)

27

Funzioni 1) Definizione
Definizione della funzione:
Gi introdotta precedentemente Dichiarazione, che definisce il nome, il numero ed il tipo degli argomenti ed il comportamento della funzione (istruzioni del corpo della funzione) Definisce anche il tipo di dato restituito (se non serve restituire valori si usa il tipo void)
float area_triangolo(int base, int altezza) { float area; area = (base*altezza)/2; return area; }
FondamentidiInformatica(20112012) 28

Funzioni 2) Chiamata
Chiamata di funzione:
Invocazione di una funzione, che ha come effetto il trasferimento del controllo del programma alla funzione chiamata Al termine della funzione chiamata, lesecuzione riprende dallistruzione immediatamente successiva alla chiamata I tipi dei parametri passati devono corrispondere ai tipi richiesti dalla funzione in questione (ed anche il numero di parametri!)
int main() { int bas,alt; float area; area = area_triangolo(bas,alt); return 0; } float area_triangolo(int base, int altezza) { float ar; ar = (base*altezza)/2; return ar; }

FondamentidiInformatica(20112012)

29

Esempi di Chiamate a Funzioni Utili


Dati: int y,z,b; char c; float x; Da stdio.h: printf(prova: %d\n ,y); scanf( %d ,&z); c=getchar(); // legge un carattere da tastiera e lo memorizza in c Da math.h: x=pow(y,z); // eleva y alla z, e restituisce il risultato x=sqrt(y); // esegue la radice quadrata di y e restituisce il risultato

Da ctype.h b=isalpha(c); /* se il carattere c una lettera restituisce un intero >0 (true), altrimenti restituisce 0 (false) */
FondamentidiInformatica(20112012) 30

Passaggio di Parametri a Funzione


In generale: per Valore o per Indirizzo In C: per Valore
Parametro ATTUALE int main() { int bas,alt; float area; area = area_triangolo(bas,alt); return 0; }
La variabile bas viene COPIATA per essere utilizzata dentro al corpo della funzione

Parametro FORMALE

float area_triangolo(int base, int altezza) { float ar; ar = (base*altezza)/2; return ar; }

FondamentidiInformatica(20112012)

31

Passaggio di Parametri a Funzione


Le modifiche effettuate su parametri formali si perdono a fine funzione Lunico elemento propagato al di fuori il valore restituito con return Per completezza:
Nel passaggio per indirizzo, i parametri formale ed attuale fanno riferimento alla stessa area di memoria: ossia la modifica del valore di un parametro formale si ripercuoter anche su quello attuale (non il caso di C, ma si pu realizzare un meccanismo analogo anche in C usando i puntatori!)
FondamentidiInformatica(20112012) 32

Valori Restituiti - return


Le funzioni possono restituire direttamente un solo valore, mediante listruzione return
Il valore restituito pu essere di tipo qualunque, eccetto array o funzione Se la funzione non restituisce valori, return pu essere omesso
void nomefunz(parametri)

return pu essere collocato in qualsiasi punto delle funzione (non necessariamente alla fine) In una funzione pu essere specificato pi di un return Quando viene incontrato return, la funzione termina IN QUEL PUNTO
FondamentidiInformatica(20112012) 33

Esempio: Funzione Cubo


Domanda: quanto vale n alla fine del programma? #include <stdio.h> float cubo(float a) { float c; c = a*a*a; // Alterazione del parametro formale a = 7; return c; } } return 0; int main() { float n; float r; printf("Inserisci un numero:\n"); scanf("%f",&n); r = cubo(n); printf("Il cubo del numero vale: %f\n",r);

FondamentidiInformatica(20112012)

34

Potrebbero piacerti anche