Sei sulla pagina 1di 25

Introduzione al linguaggio C Istruzioni di selezione Istruzioni di iterazione

Introduzione al linguaggio C (Parte 2)

Nicola Maugeri

Liceo "G. Galilei"


Introduzione al linguaggio C Istruzioni di selezione Istruzioni di iterazione

Algoritmi
La soluzione di qualsiasi problema di calcolo implica l’esecuzione di una serie di azioni
in un ordine specifico.

Una procedura per la risoluzione di un problema nei termini di


1 azioni da eseguire
2 ordine in cui queste azioni vanno eseguite è chiamata algoritmo.

L’esempio seguente dimostra quanto sia importante specificare correttamente l’ordine


di esecuzione delle azioni.
Esempio
Considerate “l’algoritmo sveglia!” eseguito da un giovane dirigente d’azienda per
alzarsi dal letto e andare al lavoro:
1 alzarsi dal letto,
2 togliersi il pigiama,
3 farsi una doccia,
4 vestirsi,
5 fare colazione,
6 andare al lavoro.
Introduzione al linguaggio C Istruzioni di selezione Istruzioni di iterazione

Esempio (Continua...)
Queste azioni di routine gli consentono di arrivare al lavoro ben preparato per prendere
decisioni cruciali.
Supponiamo che gli stessi passi siano compiuti con un ordine leggermente diverso:
1 alzarsi dal letto,
2 togliersi il pigiama,
3 vestirsi,
4 farsi una doccia,
5 fare colazione,
6 andare al lavoro.
In questo caso il nostro giovane dirigente d’azienda si presenterebbe al lavoro bagnato
fradicio!!
Introduzione al linguaggio C Istruzioni di selezione Istruzioni di iterazione

Strutture di controllo

Normalmente le istruzioni in un programma sono eseguite una dopo l’altra nell’ordine


in cui sono scritte. Questa semplice modalità è chiamata esecuzione sequenziale.
Varie istruzioni in C che presto esamineremo vi permetteranno di specificare come
istruzione successiva da eseguire una diversa da quella successiva nella sequenza.
Questa modalità è chiamata trasferimento del controllo.

E’ stato dimostrato che tutti i programmi potrebbero essere scritti in termini di sole tre
strutture di controllo, ossia la struttura sequenziale, la struttura di selezione e la
struttura di iterazione.

La struttura sequenziale è semplice: a meno che non venga specificato diversamente,


il computer esegue le istruzioni in C una dopo l’altra nell’ordine in cui sono scritte.

Un diagramma di flusso è una rappresentazione grafica di un algoritmo o di una


porzione di un algoritmo. I diagrammi di flusso sono disegnati usando certi simboli
specifici come rettangoli, rombi, rettangoli arrotondati e cerchietti; questi simboli sono
collegati da frecce chiamate linee di flusso.
Introduzione al linguaggio C Istruzioni di selezione Istruzioni di iterazione

Istruzioni di selezione in C

Il C fornisce tre tipi di strutture di selezione nella forma di istruzioni.


L’istruzione di selezione if seleziona (esegue) un’azione se una condizione è vera
o salta l’azione se la condizione è falsa. E’ chiamata istruzione di selezione
singola poiché essa seleziona o ignora un’azione singola.
L’istruzione di selezione if. . . else esegue un’azione se una condizione è vera ed
esegue un’azione diversa se la condizione è falsa. E’ chiamata istruzione di
selezione doppia perché effettua una selezione tra due azioni differenti.
L’istruzione di selezione switch esegue una fra varie azioni differenti, a seconda
del valore di un’espressione. E’ chiamata istruzione di selezione multipla perché
effettua una selezione tra varie azioni differenti.
Introduzione al linguaggio C Istruzioni di selezione Istruzioni di iterazione

Istruzioni di iterazione in C

Il C fornisce tre tipi di strutture di iterazione nella forma di istruzioni: cioè while,
do. . .while e for (che saranno esaminate in seguito).

Il linguaggio C ha soltanto sette istruzioni di controllo: sequenza, tre tipi di selezione e


tre tipi di iterazione. Ogni programma in C è formato dalla combinazione di tante
istruzioni di controllo di ognuno di questi tipi quante sono quelle appropriate per
l’algoritmo che il programma implementa.
Introduzione al linguaggio C Istruzioni di selezione Istruzioni di iterazione

L’istruzione if

if (condizione) {
istruzione;
} // fine di if

La precedente verifica se la condizione è verificata, in tal caso viene eseguita


l’istruzione. Se la condizione è falsa, l’istruzione all’interno dell’if viene ignorata e viene
eseguita nell’ordine la successiva istruzione del programma.
Introduzione al linguaggio C Istruzioni di selezione Istruzioni di iterazione

Esempio di utilizzo di if

Il programma chiede in ingresso il voto riportato da uno studente in una verifica. Se il


voto è maggiore o uguale a 60, allora il programma produce a schermo la scritta
"Esame superato".

#include<stdio.h>
int main ()
{
int voto;
printf ("Inserire il voto riportato dallo studente: ");
scanf ("%d", &voto);
if (voto >= 60)
{
printf ("Esame superato");
}
}
Introduzione al linguaggio C Istruzioni di selezione Istruzioni di iterazione

If . . . else

L’istruzione di selezione if esegue un’azione indicata solo quando la condizione è vera;


altrimenti l’azione viene saltata. L’istruzione di selezione if. . . else vi permette di
specificare che vanno eseguite azioni differenti quando la condizione è vera e quando
è falsa.

if (condizione) {
istruzione1;
} // fine di if
else {
istruzione2;
} // fine di else

In entrambi i casi, dopo che avviene la stampa, viene “eseguita” la successiva


istruzione in sequenza nel codice.
Introduzione al linguaggio C Istruzioni di selezione Istruzioni di iterazione

Esempio di utilizzo di if. . .else

#include<stdio.h>
int main ()
{
int voto;
printf ("Inserire il voto riportato dallo studente: ");
scanf ("%d", &voto);

if (voto >= 60){


printf("Esame superato con %d/100 punti", voto);
}

else{
printf("Esame non superato con %d/100 punti", voto);
}
}
Introduzione al linguaggio C Istruzioni di selezione Istruzioni di iterazione

If annidati 1/3

Le istruzioni annidate if...else effettuano test su casi multipli attraverso il piazzamento


di istruzioni if...else all’interno di altre istruzioni if...else. Vediamo il seguente esempio:

Supponiamo di voler scrivere un programma che stampi A per i voti dell’esame


maggiori o uguali a 90, B per i voti maggiori o uguali a 80 (ma meno di 90), C per i voti
maggiori o uguali a 70 (ma meno di 80), D per i voti maggiori o uguali a 60 (ma meno
di 70) e F per tutti gli altri voti.
Se la variabile grade è maggiore o uguale a 90, tutte e quattro le condizioni saranno
vere, ma soltanto l’istruzione puts dopo il primo test sarà eseguita. Dopo l’esecuzione
di puts, la parte else dell’istruzione if...else “esterna” viene saltata.
Introduzione al linguaggio C Istruzioni di selezione Istruzioni di iterazione

If annidati 2/3

if ( voto >= 90 ) {
printf( "A" );
} // fine di if
else {
if ( voto >= 80 ) {
printf( "B" );
} // fine di if
else {
if ( voto >= 70 ) {
printf( "C" );
} // fine di if
else {
if ( voto >= 60 ) {
printf( "D" );
} // fine di if
else {
printf( "F" );
} // fine di else
} // fine di else
} // fine di else
} // fine di else
Introduzione al linguaggio C Istruzioni di selezione Istruzioni di iterazione

If annidati 3/3

if ( voto >= 90 ) {
printf( "A" );
} // fine di if
else if ( voto >= 80 ) {
printf( "B" );
} // fine di else if
else if ( voto >= 70 ) {
printf( "C" );
} // fine di else if
else if ( voto >= 60 ) {
printf( "D" );
} // fine di else if
else {
printf( "F" );
} // fine di else

Per quanto riguarda il compilatore C, le due forme sono equivalenti. L’ultima forma è la più comune,
dal momento che evita la profonda indentazione a destra del codice. Tale indentazione lascia
spesso poco spazio su una riga, facendo sì che le righe siano spezzate con conseguente riduzione
della leggibilità del programma.
Introduzione al linguaggio C Istruzioni di selezione Istruzioni di iterazione

switch case

Un’altra soluzione è data dal costrutto switch-case, che consente di implementare


decisioni multiple basandosi sul confronto fra il risultato di un’espressione (int o char).
switch(espressione) {
case costante1:
istruzione
...
break;
case costante2:
istruzione
...
break;
case costante3;
istruzione
...
break;
...
[default:
istruzione
... ]
}
Introduzione al linguaggio C Istruzioni di selezione Istruzioni di iterazione

La parola switch è seguita da una espressione, racchiusa tra parentesi tonde, il cui
risultato deve essere di tipo int o char. Il resto del costrutto è formato da un’istruzione
composta, costituita da un numero qualsiasi di sottoparti, ciascuna delle quali inizia
con la parola chiave case, seguita da un’espressione costante intera o carattere.
Questa è separata, tramite un simbolo di due punti, da una o più istruzioni. In fase di
esecuzione, viene valutata espressione e il risultato viene confrontato con costante1:
se i due valori sono uguali il controllo passa alla prima istruzione che segue i due punti
corrispondenti, altrimenti si prosegue confrontando il risultato dell’espressione con
costante2, e così di seguito. Spesso, nell’utilizzo di questo costrutto, il programmatore
desidera che vengano eseguite solamente le istruzioni associate a un singolo case. A
questo scopo si inserisce, al termine di ogni case, l’istruzione break, che causa l’uscita
immediata dallo switch. Se l’espressione non corrisponde a nessuna delle costanti, il
controllo del programma è trasferito alla prima istruzione che segue la parola riservata
default (se presente).
Introduzione al linguaggio C Istruzioni di selezione Istruzioni di iterazione

Esempio utilizzo switch case 1/2

Esempio
Scrivere un programma che visualizzi il seguente menu:
MENU DI PROVA
a) Per immettere dati
b) Per determinare il maggiore
c) Per determinare il minore
d) Per ordinare
e) Per visualizzare
Scelta:
quindi attenda l’immissione di un carattere da parte dell’utente e visualizzi una scritta
corrispondente alla scelta effettuata, del tipo: “In esecuzione l’opzione a”. Se la scelta
non è tra quelle proposte (a, b, c, d, e) deve essere visualizzata la scritta: “Opzione
inesistente”.
Introduzione al linguaggio C Istruzioni di selezione Istruzioni di iterazione

Esempio utilizzo switch case 2/2


#include <stdio.h>
int main() {
char choice;
printf("MENU DI PROVA\n");
printf("a) Per immettere dati\n");
printf("b) Per determinare il maggiore\n");
printf("c) Per determinare il minore\n");
printf("d) Per ordinare\n");
printf("e) Per visualizzare\n");
printf("Scelta:");
scanf("%c",&choice);

switch(choice){
case ’a’: printf("In esecuzione l’opzione a");
break;
case ’b’: printf("In esecuzione l’opzione b");
break;
case ’c’: printf("In esecuzione l’opzione c");
break;
case ’d’: printf("In esecuzione l’opzione d");
break;
case ’e’: printf("In esecuzione l’opzione e");
break;
default:
printf("Opzione inesistente");
break;
} }
Introduzione al linguaggio C Istruzioni di selezione Istruzioni di iterazione

istruzione for

Quando si desidera ripetere una operazione un determinato numero di volte, si può


riscrivere sequenzialmente l’istruzione corrispondente. Ma nel caso di un alto numero
di ripetizioni è preferibile usare un’istruzione di iterazione.

for(inizializzazione; condizione; variazione){


istruzione;
}

Il ciclo inizia con l’esecuzione di inizializzazione, la quale non verrà mai più eseguita.
Quindi viene esaminata condizione. Se condizione risulta vera, viene eseguita
istruzione, altrimenti il ciclo non viene percorso neppure una volta. Successivamente
viene eseguita variazione e di nuovo valutata condizione che se risulta essere vera dà
luogo a una nuova esecuzione di istruzione. Il processo si ripete finché condizione non
risulta essere falsa.
Introduzione al linguaggio C Istruzioni di selezione Istruzioni di iterazione

Esempio di utilizzo di for

/* Esempio di utilizzo dell’istruzione for


Calcola la somma di cinque numeri interi immessi dall’utente */
#include <stdio.h>
int i, somma, numero;
main()
{
printf("SOMMA 5 NUMERI\n");
somma = 0;
for(i=1; i<=5; i=i+1) {
printf("\nInser. intero n.%d: ", i);
scanf("%d", &numero);
somma = somma + numero;
}
printf("Somma: %d\n",somma);
}

Inser. intero n.1: 32


Inser. intero n.2: 111
Inser. intero n.3: 2
Inser. intero n.4: 77
Inser. intero n.5: 13
Somma: 235
Introduzione al linguaggio C Istruzioni di selezione Istruzioni di iterazione

Operatori di incremento e decremento

Invece di utilizzare l’espressione i=i+1 è possibile scrivere i++; quest’ultimo è detto


operatore di incremento. Analogamente esiste l’operatore i-- per decrementare il valore
di i di un unità.

Gli operatori di incremento e decremento possono sia precedere sia seguire una
variabile:
++i;
i++;
Le due istruzioni precedenti hanno lo stesso effetto, ma se gli operatori vengono
utilizzati all’interno di espressioni che coinvolgono più elementi valgono le seguenti
regole:
se l’operatore ++ (–) precede la variabile, prima il valore della variabile viene
incrementato (decrementato) epoi viene valutata l’intera espressione;
se l’operatore ++ (–) segue la variabile, prima viene valutata l’intera espressione e
poi il valore della variabile viene incrementato (decrementato).
Introduzione al linguaggio C Istruzioni di selezione Istruzioni di iterazione

Esempio

j=0;
for(i=1; ++i<=3;)
printf("Ciclo: %d\n", ++j);
printf("Cicli:%d i:%d\n", j, i);

j=0;
for(i=1; i++<=3;)
printf("Ciclo: %d\n", ++j);
printf("Cicli:%d i:%d\n", j, i);

Le visualizzazioni prodotte saranno rispettivamente:


Ciclo:1
Ciclo:2
Cicli: 2 i:4
Ciclo:1
Ciclo:2
Ciclo:3
Cicli: 3 i:5
Introduzione al linguaggio C Istruzioni di selezione Istruzioni di iterazione

Priorità degli operatori

++ –
* / %
+ -
> >= < <=
== !=
&&
||
= += -= *= /=
Introduzione al linguaggio C Istruzioni di selezione Istruzioni di iterazione

Anche l’istruzione while, come l’istruzione for, permette di ottenere la ripetizione ciclica
di una istruzione:

while(condizione){
istruzione;
}

Viene verificato che condizione sia vera, nel qual caso viene eseguita istruzione. Il ciclo
si ripete fintantoché condizione risulta essere vera. Naturalmente, ancora una volta,
istruzione può essere un blocco. Riprendiamo il programma che calcola la somma dei
valori immessi dall’utente e modifichiamolo in modo da controllare il ciclo con while.
Introduzione al linguaggio C Istruzioni di selezione Istruzioni di iterazione

Riprendiamo il programma che calcola la somma dei valori immessi dall’utente e


modifichiamolo in modo da controllare il ciclo con while:
i = 1;
while(i<=5) { for(i=1; i<=5; i++) {
printf("Inser. intero: "); printf("Inser. intero: ");
scanf("%d", &numero); scanf("%d", &numero);
somma = somma+numero; somma = somma+numero;
i++; } }

L’inizializzazione della variabile che controlla il ciclo deve precedere l’inizio del while e
l’incremento della stessa variabile deve essere inserito come ultima istruzione del
blocco. In generale, quando il numero d’iterazioni è noto a priori, per passare da un for
a un while vale la seguente equivalenza:
inizializzazione;
while(condizione){ for(inizializzazione; condizione; variazione){
corpo_del_ciclo corpo_del_ciclo
variazione} }
Introduzione al linguaggio C Istruzioni di selezione Istruzioni di iterazione

Conviene utilizzare il costrutto while quando la condizione di chiusura del ciclo non è
nota a priori.

/* Calcola la somma dei valori interi passati dall’utente. Termina quando viene
#include <stdio.h>
main()
{
int somma, numero;
printf("SOMMA NUMERI\n");
printf("zero per terminare\n");
numero = 1;
somma = 0;
while(numero!=0) {
printf("Inser. intero: ");
scanf("%d", &numero);
somma = somma+numero;
}
printf("Somma: %d\n",somma);
} }

Potrebbero piacerti anche