Linguaggio C - Strutture Strutture di controllo: Normalmente le istruzioni di un programma vengono eseguite una dopo l’altra nell’ordine in cui sono scritte. Questa semplice modalità è chiamata esecuzione sequenziale. Esistono in C delle strutture di controllo che permettono di modificare la sequenza di esecuzione. Selezione (if … else; switch) Iterazione (for, while, do … while) if Nel costrutto if (semplice) una determinata azione (istruzione) viene eseguita se la condizione specificata è vera. La condizione va sempre racchiusa tra parentesi. Sintassi: if (condizione) istruzione Es.: if (n > 0) printf("valore positivo \n"); printf("istruzione successiva\n"); // viene eseguita comunque. Nota: se le istruzioni da eseguire nell’if sono più di una, dobbiamo inserirle in un blocco {} Es.: if ( x + y * 2 == 100) { printf("risultato pari a 100 \n"); var = 0; // … altre istruzione } Corso di Informatica 2 A.A 2015/16 Linguaggio C – Selezione if … else Sintassi: if (condizione) istruzione1 else istruzione2 Se la condizione è vera si esegue l’istruzione1 altrimenti l’istruzione2. Es.: if (n > 0) printf("valore positivo \n"); else printf("valore negativo o nullo \n"); printf("istruzione successiva\n"); // viene eseguita comunque. if (n > 0) { printf("valore positivo \n"); // … altre istruzioni } else { printf("valore negativo o nullo \n"); // … altre istruzioni } printf("istruzione successiva\n"); // viene eseguita comunque. if … else annidati Sintassi: if (condizione1) istruzione1 else if (condizione2) istruzione2 else …… Corso di Informatica 2 A.A 2015/16 Linguaggio C – Selezione if (n > 0) { printf("valore positivo \n"); // … altre istruzioni } else if (n = 0) { printf("valore nullo \n"); // … altre istruzioni } else { printf("valore negativo \n"); // … altre istruzioni } printf("istruzione successiva\n"); // viene eseguita comunque. Nota: si provi a togliere l’indentazione - illeggibile. Possiamo avere anche: if (condizione1) if (condizione2) istruzione1 else istruzione2 else istruzione3 In alcuni casi il blocco if…else corrisponde all’operatore ternario (?:) es.: if ( x > y ) z=1; else z=0; equivale a: z=(x>y)? 1 : 0; Corso di Informatica 2 A.A 2015/16 Linguaggio C – Selezione Altro esempio: if (i % 2) printf("%d è un numero dispari", i); else printf("%d è un numero pari", i); Equivale a: (i % 2) ? printf("%d è un numero dispari", i) : printf("%d è un numero pari", i); Esercizio_1: (in relazione a if…else annidati) Scrivere un programma in C che legga da tastiera i valori delle lunghezze dei tre lati di un triangolo (detti A, B e C) e determini: se il triangolo e equilatero (A=B=C) se il triangolo e isoscele (A=B o A=C o B=C) se il triangolo e scaleno (A != B != C) se il triangolo e rettangolo (Teorema di Pitagora) (Verificare che sia un triangolo) Esercizio_2: Scrivere un programma in C che risolva un’equazione di primo grado: ax+b = 0 Acquisisca da tastiera a e b e determini la soluzione ( x = -b/a con a!=0 altrimenti errore ! ) Esercizio_3: Scrivere un programma in C che risolva un’equazione di secondo grado ax2+bx+c = 0 Acquisisca da tastiera a, b e c e determini le soluzioni x1,x2 ( discriminante >= 0 ….. ). Corso di Informatica 2 A.A 2015/16 Linguaggio C – Selezione Switch: Il blocco switch permette di eseguire una determinata istruzione in base al valore di una espressione (o variabile) Sintassi: switch (espressione) { case valore1: sequenza istruzioni break; case valore2: sequenza istruzioni break; ··· case valoreN sequenza istruzioni break; default: sequenza istruzioni break; } • Il valore dell’espressione può essere di tipo char, int o enum. Alla prima corrispondenza viene eseguito il blocco di istruzioni corrispondenti. • L'istruzione break interrompe l'elaborazione del blocco switch; è opzionale, ma se non viene usata, vengono eseguite le istruzioni dei casi seguenti. • Il blocco default (opzionale) viene eseguito quando nessuna corrispondenza è verificata. Corso di Informatica 2 A.A 2015/16 Linguaggio C – Selezione /* Crea menu */ #include <stdio.h> int main(){ int scelta; printf("Menu \n: "); printf("1 - Inserimento dati \n "); printf("2 - Eliminazione dati \n "); printf("3 - Stampa report \n "); printf("0 - Uscita\n "); printf("Scegliere un’opzione: "); scanf("%d", &scelta); switch(scelta){ case 1: printf("Scelta 1\n"); break; case 2: printf("Scelta 2\n"); break; case 3: printf("Scelta 3\n"); break; case 0: printf("Uscita \n"); break; default: printf("Altra Scelta\n"); break; } } Corso di Informatica 2 A.A 2015/16 Linguaggio C – Selezione Nota: Potrebbe essere necessario eseguire lo stesso codice in corrispondenza di due o più valori dell’espressione: switch (espressione) { case valore1: case valore2: // sequenza istruzioni break; case valore3: // sequenza istruzioni ……. Esercizio: (in relazione a switch ) Scrivere un programma in C che legga da tastiera un valore intero ( 1…12) e stampi a video il mese corrispondente. Corso di Informatica 2 A.A 2015/16 Linguaggio C – Iterazione Strutture Iterative (ripetizione) Quando dobbiamo ripetere l’esecuzione di un’istruzione (o di un blocco di istruzioni) possiamo utilizzare le strutture iterative. for: Permette di ripetere l’esecuzione di una istruzione un numero prefissato di volte. Sintassi: for(espres1; espres2; espres3) istruzione // for(inizializzazione; condizione; incremento) istruzione espres1: inizializza la variabile di controllo del ciclo. espres2: è la condizione che indica quante volte ripetere il ciclo. espres3: incrementa la variabile di controllo. es.: int i; // stampa a video i numeri da 1 a 10 for(i=1; i <= 10; i++) printf(“%d\n”, i); Corso di Informatica 2 /* Somma di cinque numeri interi */ #include <stdio.h> int main() { int i, somma, numero; printf("Somma 5 numeri\n"); somma = 0; for(i=1; i <= 5; i++) { printf("Inserisci intero %d: ", i); scanf("%d", &numero); somma = somma + numero; } printf("Somma : %d\n", somma); return 0; } A.A 2015/16 Linguaggio C – Iterazione Altre forme interessanti: int i; • for(i=10; i >= 0; i--) printf("valore: %d\n",i); // equivale a: for( i=10; i >= 0; i=i-1) ….. • for(i=100; i > 0; i=i-10) printf("valore: %d\n",i); // equivale a: for(i=100; i > 0; i-=10) …. int x = 1; • for(; x <= 100; x++) printf("valore: %d\n",x); // inizializzazione esterna int x = 1; • for(; x <= 100; ){ printf("%d", x); x++; } // incremento all’interno Operatore virgola (,): consente di inserire più istruzioni all’interno delle espressioni: • for(x = 0, y = 0; x + y <= 50; x++, y += 4) // più variabili di controllo printf("x = %d, y = %d\n", x,y); • for( ; ; ) printf("loop\n"i); // ciclo infinito, attenzione nell’utilizzo Corso di Informatica 2 /* Calcolo di n fattoriale */ #include <stdio.h> main() { int i, fattoriale, n=0; printf("Calcolo di n fattoriale \n"); printf("Inserisci un intero positivo : "); scanf("%d", &n); fattoriale=1; for (i=1; i<=n; i++) fattoriale=fattoriale*i; printf("Fattoriale di %d è pari a: %d\n", n, fattoriale); } A.A 2015/16 Linguaggio C – Iterazione for annidati: for(i=1; i <= 10; i++) for(j=1; j <= 5; j++) printf ("i = %d j = %d \n", i,j); Nota: for annidati sono molto utilizzati nella gestione delle matrici. Esercizio: scrivere un programma che acquisisca 10 numeri e per ognuno scriva se è un numero primo; in aggiunta ne conti il numero (dei num. primi). while Analogamente al for, questo costrutto iterativo consente di ripetere l’esecuzione di una istruzione (o di un blocco di istruzioni). Sintassi: while (condizione) istruzione L’istruzione viene eseguita fintanto che la condizione risulta vera. Si esce dal blocco while quando la condizione diventa falsa. Può accadere che l’istruzione non venga mai eseguita. int i = 1; while(i <= 10){ printf("Numero: %d\n", i); i++; } Corso di Informatica 2 A.A 2015/16 Linguaggio C – Iterazione Si noti l’analogia del while con il for : inizializzazione; while(condizione) { istruzione; incremento; } for(inizializzazione; condizione; incremento) istruzione; Es.: int i= 1; while(i <= 5){ printf("Inserisci un numero intero : "); scanf("%d" &n); somma = somma + numero; i++; } for(i=1; i <= 5; i++) { printf("Inserisci un numero intero : "); scanf("%d", &n); somma = somma + numero; } Possiamo scrivere anche: int i=1; while(i++ <= 5){ printf("Inserisci un numero intero : "); scanf("%d", &n); somma = somma + numero; // somma += numero; } Ovvero inserire l’incremento nella condizione. Corso di Informatica 2 A.A 2015/16 Linguaggio C – Iterazione Oppure: i=5; while(i--){ // si esce dal ciclo quando i=0 ovvero falso printf("Inserisci un numero intero : "); scanf("%d", &n); somma += numero; #include <stdio.h> } #include <limits.h> main(){ int i, somma = 0, numero = 1; Analizzare il programma, int max = 0; capire cosa fa. // oppure max = INT_MIN; per accettare interi negativi printf("descrizione programma\n"); i = 0; while(numero != 0 && i <= 10){ printf("Inserisci un intero: "); scanf("%d", &numero); somma = somma + numero; if ( max < numero) max=numero; i++; } printf("Somma : %d Valore_Max: %d\n", somma,max); } Corso di Informatica 2 A.A 2015/16 Linguaggio C – Iterazione do … while Questo costrutto, viene utilizzato (preferito al while) quando l’istruzione deve essere comunque eseguita almeno una volta. Sintassi: do { istruzione; } while (condizione); Prima si esegue l’istruzione poi si valuta la condizione, se risulta vera il ciclo si ripete. #include<stdio.h> int main() { int n, i, max, j=0; printf("Numero di interi da inserire: \n"); scanf("%d",&n); do{ printf("Inserisci numero: "); scanf("%d",&i); if (j==0) max = i; if (max < i) max = i; } while(n > ++j); printf("il massimo è %d", max); return 0; } Corso di Informatica 2 A.A 2015/16 Linguaggio C – Iterazione break e continue: L’istruzione break se inserita in un blocco iterativo ( for, while, do while ) consente di uscire dal ciclo; l’esecuzione riprende dall’istruzione immediatamente dopo il ciclo. Ad esempio nel programma che somma 10 numeri e trova il massimo: i=1; while(numero != 0){ printf("Inserisci un intero: "); scanf("%d", &numero); somma = somma + numero; if ( max > numero) max=numero; if (i >10 ) break; i++; } printf("Somma : %d Valore_Max: %d\n", somma, max); Nota: in caso di iterazioni annidate, l’istruzione break provoca l’uscita solo dal ciclo più interno. L’istruzione continue permette di saltare all’iterazione successiva senza uscire dal ciclo; ovvero si saltano le istruzioni successive fino al termine del ciclo e si riparte con una nuova iterazione. Corso di Informatica 2 A.A 2015/16 Linguaggio C – Iterazione Es.: int i; for(i=1; i<=10; i++){ if(i==5) continue; /// Il num. 5 viene saltato printf("Il numero è %d", i); } Tornando al programma che somma 10 numeri e trova il massimo: while(numero != 0 && i <= 10){ printf("Inserisci un intero: "); scanf("%d", &numero); if (numero < 0) continue; // si saltano i valori negativi somma = somma + numero; if ( max > numero) max=numero; i++; } Esercizi: - Programma che trovi ( per approssimazioni successive ) lo zero di f(x)=2x3 -4x+1 funzione continua nell’intervallo [a,b] e f(a)*f(b) <0 cosicchè esiste un valore x: f(x) = 0 . - Programma che effettui la conversione da decimale a binario di un numero in input. - Programma che data una sequenza di numeri conti i positivi/negativi/nulli. - Implementare l’Algoritmo di Euclide per il calcolo del MCD. Corso di Informatica 2 A.A 2015/16