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
Scarica

Linguaggio C