• Non ci sono risultati.

Istruzioni decisionali Istruzioni decisionali

N/A
N/A
Protected

Academic year: 2021

Condividi "Istruzioni decisionali Istruzioni decisionali"

Copied!
34
0
0

Testo completo

(1)

91

Istruzioni decisionali Istruzioni decisionali 1. if

2. if-else

3. switch

92

if- if -else else Sintassi Sintassi

if (espressione) istruzione_1 else

istruzione_2

(2)

93

if- if -else else : semantica : semantica

Viene valutata espressione

Se l’espressione è vera (cioè assume valore diverso da zero) viene eseguita

istruzione_1

Se l’ espressione è falsa (cioè assume valore nullo) viene eseguita istruzione_2

if- if -else else : diagramma di flusso : diagramma di flusso

I0;

if (E) I1;

else I2;

I3;

I0

I2

I3

vero E falso

I1

la struttura introduce due possibili sequenze:

1. la sequenza (se E è vera):

I0 I1 I3

2. la sequenza (se E è falsa):

I0 I2 I3

(3)

95

Esempio Esempio

/* Utilizzo if-else */

#include <stdio.h>

main() {

int i;

printf("Dammi un intero: ");

scanf("%d", &i);

if (i<100)

printf("Minore di 100\n");

else

printf("Maggiore o uguale a 100\n");

}

Stampa "Minore di 100"

se il numero letto è minore di 100 Stampa "Maggiore o uguale a 100"

se il numero letto è maggiore o uguale di 100

96

blocco blocco if- if -else else + istruzione composta + istruzione composta

#include <stdio.h>

main() {

int i;

int mag_100=0;

int min_100=0;

printf("Dammi un intero: ");

scanf("%d", &i);

if (i<100) {

printf("Minore di 100\n");

min_100=1;

} else {

printf("Maggiore o uguale a 100\n");

mag_100=1;

} }

(4)

97

; errore

Osservazione Osservazione

#include<stdio.h>

main() {int x;

scanf("%d", &x);

if (x==0) {

printf("pippo "); printf("pluto ");

} else

printf("minnie");

}

if if annidati annidati

Le istruzioni che compaiono nell’if non sono soggette ad alcuna restrizione, per cui possono essere anch’esse if:

if if annidati annidati

(5)

99

Ambiguità in caso di

Ambiguità in caso di if if annidati annidati else è relativa al più vicino degli if che lo precedono che manchi dell’else

if (E1) if(E2)

istr1 else

istr2

if (E1){

if(E2) istr1 else

istr2 }

if (E1) { if(E2)

istr1 }

else

istr2 equivalenti

diversi

100

Esercizi Esercizi

… su if-else

(6)

101

Esercizio Esercizio

Scrivere un programma che richiede in ingresso 2 valori interi e stampa il maggiore

Diagramma di flusso Diagramma di flusso

n1>n2

Maggiore è n1

falso vero

Maggiore è n2

(7)

103

Soluzione Soluzione

#include <stdio.h>

main() {

int n1, n2;

printf("Dammi 2 interi separati dallo spazio: \n");

scanf("%d", &n1);

scanf("%d", &n2);

if (n1>n2)

printf("Il maggiore è: %d", n1);

else

printf("Il maggiore è: %d", n2);

}

104

Esercizio Esercizio

Scrivere un programma che richieda in

ingresso un valore intero e stampa “pari” se il numero è pari, “dispari” altrimenti.

Esempio Esempio

7 7         Il numero è Il numero è dispari dispari

90 90         Il numero è Il numero è pari pari

(8)

105

Soluzione Soluzione

#include <stdio.h>

main() {

int n;

printf("Dammi un intero: \n");

scanf("%d", &n);

if (n%2==0)

printf("Il numero è pari");

else

printf("Il numero è dispari");

}

Esercizio Esercizio

Scrivere un programma per il calcolo delle radici di un’equazione di secondo grado con coefficienti reali: a, b, c.

ax

2

+ bx + c = 0

a e b sono 0  degenere

a==0  I grado

delta < 0  determinante negativo

(9)

107

Soluzione Soluzione

#include <stdio.h>

#include <math.h>

main() {

float a, b, c, r1, r2, delta;

printf("Questo progr risolve un'equazione di II grado: \n");

printf("ax^2 + bx + c: \n");

printf("Dammi il coefficiente a: \n");

scanf("%f", &a);

printf("Dammi il coefficiente b: \n");

scanf("%f", &b);

printf("Dammi il coefficiente c: \n");

scanf("%f", &c);

108

Soluzione (

Soluzione (cont cont.) .)

if (a==0 && b==0)

printf("equazione degenere\n");

else if (a==0) { r1=-c/b;

printf("equazione di I grado \n");

printf("radice = %f \n", r1);

} else {

delta = b*b - 4*a*c;

if (delta<0) printf("determinante negativo\n");

else {

delta = sqrt(delta);

r1 = (-b + delta) / (2*a);

r2 = (-b - delta) / (2*a);

printf("equazione di II grado\n");

printf("radici = %f e %f \n", r1, r2);

} }

} // chiude il main

(10)

109

Esercizio Esercizio

In accordo alle regole del Calendario Gregoriano un anno è bisestile se è un multiplo di 4 e non è un secolo, oppure un secolo multiplo di 400.

Scrivere un programma che verifichi se l’anno inserito da tastiera è bisestile.

Esempio Esempio

1992 bisestile (multiplo di 4)

1800 no (multiplo di4, secolo non multiplo di 400) 2000 bisestile (secolo multiplo di 400)

Soluzione Soluzione

#include<stdio.h>

main() {int anno;

int ris;

printf("Dammi l'anno: ");

scanf("%d", &anno);

ris = ((anno %4 ==0) && (anno % 100 !=0))

|| (anno %400 == 0);

if (ris == 1) printf("Anno bisestile");

else printf("Anno NON bisestile");

}

(11)

111

Esercizio Esercizio

Scrivere un programma che richiede in ingresso tre valori interi e stampa il maggiore

112

n1<=n2 e n2<=n3

---|---|---|---->

n1 n2 n3

n1>n2 e n1<=n3

---|---|---|---->

n2 n1 n3

n1>n2

n1>n3 n2>n3

Magg n3 Magg n2 Magg n3 Magg n1

falso

falso

falso vero

vero vero

(12)

113

Soluzione Soluzione

#include <stdio.h>

main() {

int n1, n2, n3;

printf("Dammi 3 interi separati dallo spazio: \n");

scanf("%d", &n1);

scanf("%d", &n2);

scanf("%d", &n3);

if (n1>n2) if (n1>n3)

printf("Il maggiore è: %d", n1);

else

printf("Il maggiore è: %d", n3);

else

if (n2>n3)

printf("Il maggiore è: %d", n2);

else

printf("Il maggiore è: %d", n3);

}

Vuol dire che: n1<=n2 ---|---|--->

n1 n2

Vuol dire che: n1>n2 e n1<=n3 ---|---|---|---->

n2 n1 n3

Vuol dire che: n1<=n2 e n2<=n3 ---|---|---|---->

n1 n2 n3

oppure oppure

#include <stdio.h>

main() {

int n1, n2, n3;

printf("Dammi 3 interi separati dallo spazio: \n");

scanf("%d", &n1);

scanf("%d", &n2);

scanf("%d", &n3);

if ((n1>n2) && (n1>n3))

printf("Il maggiore è: %d", n1);

else if (n2>n3)

printf("Il maggiore è: %d", n2);

else

printf("Il maggiore è: %d", n3);

}

(13)

115

oppure oppure

#include <stdio.h>

main() {

int n1, n2, n3, max;

printf("Dammi 3 interi separati dallo spazio: \n");

scanf("%d", &n1);

scanf("%d", &n2);

scanf("%d", &n3);

max=n1;

if (n2 > max) max=n2;

if (n3 > max) max=n3;

printf("Il maggiore è: %d", max);

}

116

Esercizio Esercizio

Scrivere un programma che richiede in input due date nel formato g,m,a e determina la più recente.

Esempio

1 12 1998

10 12 1998 più recente

(14)

117

Istruzioni decisionali Istruzioni decisionali 1. if

2. if-else

3. switch

switch switch

Struttura di scelta plurima che controlla se

una espressione assume un valore all’interno

di un certo insieme di costanti e si comporta

di conseguenza

(15)

119

switch switch

I0

In

IU E

I2

I1 I

default

c1 c2 cn

120

switch

switch : sintassi : sintassi

switch (espressione){

case costante1: sequenza_di_istruzione1; break;

case costante2: sequenza_di_istruzione2; break;

case costanteN: sequenza_di_istruzioneN; break;

default: sequenza_di_istruzioneDefault; break;

}

(16)

121

switch

switch : semantica : semantica

Valuta espressione

se ha valore costante1 esegui sequenza_di_istruzione1; break se ha valore costante2 esegui sequenza_di_istruzione2; break

se ha valore costanteN esegui sequenza_di_istruzioneN;break

altrimenti (se il valore di espressione è

diverso da costante1 ,..., costanteN ) esegui sequenza_di_istruzioneDefault;break(opzionale)

break provoca l’uscita immediata dallo switch

Esempio Esempio

#include<stdio.h>

main() {

int num;

scanf("%d", &num);

switch (num) {

case 1: printf("*\n"); break;

case 2: printf("**\n"); break;

case 3: printf("***\n"); break;

default: printf("!\n"); break;

}

}

(17)

123

Osservazione Osservazione

Valori ammessi come possibili scelte devono essere costanti

124

Esempio Esempio

#include<stdio.h>

main() {int num;

int uno=1;

int due=2;

scanf("%d", &num);

switch (num) {

case uno: printf("pippo1\n"); break;

case due: printf("pippo2\n"); break;

default: printf("pippo_default\n");

} }

SBAGLIATO

Valori non costanti

(18)

125

Osservazione Osservazione

break non è strettamente indispensabile.

Se non è presente viene eseguita

sequenzialmente ogni istruzione a partire dal case che è stato raggiunto

Esempio senza

Esempio senza break break

#include<stdio.h>

main() {

int num;

scanf("%d", &num);

switch (num) {

case 1: printf("*\n");

case 2: printf("**\n");

case 3: printf("***\n");

default: printf("!\n");

}

}

(19)

127

Un altro esempio Un altro esempio

#include<stdio.h>

main() {char car;

scanf("%c", &car);

switch (car) {

case 'a': case 'e': case 'i':

case 'o': case 'u':

printf("Vocale minuscola\n"); break;

case 'A': case 'E': case 'I':

case 'O': case 'U':

printf("Vocale maiuscola\n"); break;

default: printf("Non e' vocale\n"); break;

} }

Possono esserci più etichette per una stessa sequenza di istruzioni

128

Esercizi Esercizi

… su switch

(20)

129

Esercizio Esercizio

Scrivere un programma che visualizza il seguente menu:

Menu di prova 1) Immettere dati 2) Visualizzare dati 3) Modificare dati Scelta:

quindi aspetta l’immissione di un carattere da parte dell’utente e visualizza una scritta corrispondente alla scelta effettuata, del tipo: In esecuzione l’opzione 1

Se la scelta non è tra quelle proposte (1,2,3) deve essere visualizzata la scritta Opzione inesistente

Soluzione Soluzione

#include<stdio.h>

main() {

int num;

printf("Menu di prova\n");

printf("1) Immettere dati\n");

printf("2) Visualizzare dati\n");

printf("3) Modificare dati\n");

printf("Scelta: ");

scanf("%d", &num);

switch (num) {

case 1: printf("In esecuzione l’opzione 1"); break;

case 2: printf("In esecuzione l’opzione 2"); break;

case 3: printf("In esecuzione l’opzione 3"); break;

default: printf("Opzione inesistente"); break;

} }

(21)

131

Esercizio Esercizio

Scrivere un programma che riceve in ingresso un mese (numero intero) e stampa quanti giorni ha quel mese

4,6,9,11     30 1,3,5,7,8,10,12     31

2     28

m ∉ ∉ ∉ ∉[1..12]     non esistente

132

Soluzione Soluzione

#include<stdio.h>

main() {

int num;

printf("Dammi un mese (numero): ");

scanf("%d", &num);

switch (num) {

case 1: printf("31 giorni"); break;

case 2: printf("28 giorni"); break;

case 3: printf("31 giorni"); break;

case 4: printf("30 giorni"); break;

case 5: printf("31 giorni"); break;

case 6: printf("30 giorni"); break;

case 7: printf("31 giorni"); break;

case 8: printf("31 giorni"); break;

case 9: printf("30 giorni"); break;

case 10: printf("31 giorni"); break;

case 11: printf("30 giorni"); break;

case 12: printf("31 giorni"); break;

default: printf("Mese inesistente"); break;

} }

(22)

133

oppure oppure

#include<stdio.h>

main() {

int num;

printf("Dammi un mese (numero): ");

scanf("%d", &num);

switch (num) {

case 4: case 6: case 9: case 11: printf("30 giorni");break case 1: case 3: case 5: case 7:

case 8: case 10: case 12: printf("31 giorni"); break;

case 2: printf("28 giorni"); break;

default: printf("Mese inesistente"); break;

} }

Strutture di controllo del flusso Strutture di controllo del flusso Le strutture di controllo del flusso specificano l’ordine secondo il quale le operazioni devono essere effettuate

 istruzione composta

 istruzioni decisionali

 istruzioni cicliche

(23)

135

Istruzioni cicliche Istruzioni cicliche

Consentono di realizzare cicli di elaborazione, ossia l’esecuzione ripetuta di una sequenza di istruzioni

il numero di volte per il quale viene ripetuta la esecuzione della sequenza è noto a priori

il numero di volte per il quale la sequenza viene ripetuta non è noto a priori, ma è condizionato dal verificarsi in esecuzione di un evento assegnato

136

Esempi Esempi

 calcolare le paghe dei dipendenti di una azienda noto il numero N dei dipendenti, ripetere N volte la sequenza di calcolo della paga

 superare l’esame di Elementi di Informatica

la sequenza sostenere l’esame va eseguita e

rieseguita fino a quando non si viene promosso

(voto>=18)

(24)

137

Istruzioni cicliche Istruzioni cicliche

 for

 while

 do-while

Esempio Esempio

Vogliamo visualizzare tre volte la scritta Ciao, mondo.

printf("Ciao, mondo.\n");

printf("Ciao, mondo.\n");

printf("Ciao, mondo.\n");

il numero di volte per il quale viene ripetuta la esecuzione della sequenza è noto a priori: 3

(25)

139

Usando il Usando il for for

#include<stdio.h>

main() {

int i;

for (i=1; i<=3; i++)

printf("Ciao, mondo.\n");

}

i=1

uscita ciclo

i++

i<=3 vero

falso

printf

Variabile contatore

140

Sintassi del Sintassi del for for

for (inizializzazione; condizione; incremento) istruzione

(26)

141

for (inizializzazione; condizione; incremento) istruzione

inizializzazione inizializzazione

Viene eseguita una volta sola Serve per impostare le variabili

Può anche non essere presente, ed allora dopo la parentesi tonda aperta viene subito il punto e virgola

Semantica Semantica

Semantica (

Semantica ( cont.) cont .)

for (inizializzazione; condizione; incremento) istruzione

condizione condizione

Viene valutata ogni volta prima di eseguire le istruzioni del ciclo Se condizione è vera si esegue ancora istruzione

Se condizione è falsa si esce dal ciclo for passando all’istruzione successiva del programma

Può anche non essere presente, ed allora lo spazio tra i due punti e virgola rimane vuoto. Il compilatore valuta vera la condizione assente, quindi continua ad eseguire istruzione realizza un loop infinito

(27)

143

Semantica (

Semantica ( cont.) cont .)

for (inizializzazione; condizione; incremento) istruzione

incremento incremento

Viene eseguita alla fine di ogni ciclo

Modificano ad esempio le variabili contatore (incremento o decremento) in generale: espressione

Può anche non essere presente, ed allora dopo il secondo punto e virgola viene subito la parentesi tonda chiusa

144

Importante!!

Importante!!

for (inizializzazione; condizione; incremento) istruzione

inizializzazione

inizializzazione: : eseguita una volta sola condizione:

condizione: valutata ogni volta prima

di eseguire le istruzioni del ciclo incremento:

incremento: eseguita alla fine di ogni ciclo

più in generale è un’espressione

(28)

145

Esempio Esempio

{ int x;

for (x=1; x<=10; x++) printf("%d\n",x);

}

no 11

si 10

si 9

si 8

si 7

si 6

si 5

si 3

si 2

si 1

si 4

x<=10 x

x=1

uscita ciclo

x++

x<=10 vero

falso

printf

1

3 2

9 4 5 6 7 8

10

Esempio Esempio

{ int x;

for (x=10; x>=0; x-=2) printf("%d\n",x);

}

no -2

si 0

si 2

si 6

si 8

si 10

si 4

x>=0 x

10

6 8

4 2 0

(29)

147

Esempio:

Esempio: loop loop infinito infinito

{ int x;

for ( x=0; ; ) printf("loop");

} { int x;

for ( ; ; ) printf("loop");

}

{ int x;

for ( x=0; x==0; ) printf("loop");

}

looplooplooplooplooploop looplooplooplooplooploop looplooplooplooplooploop looplooplooplooplooploop looplooplooplooplooploop looplooplooplooplooploop looplooplooplooplooploop

148

Attenzione!!!

Attenzione!!!

Iterazione infinita

for (i=5; i>=5; i++) …

Compilatore non segnala errore

(30)

149

Osservazioni Osservazioni

Poiché la condizione viene valutata prima di ogni ciclo, il for permette anche di non eseguire nemmeno una volta il ciclo

Esempio Esempio

{

int x;

for (x=9; x<6; x++) printf("%d\n", x);

}

Non stampa nulla

incremento inizializzazione

condizione

Inizializzazione ed incremento, nella sintassi del for, possono contenere più istruzioni, che

dovranno essere separate da virgola.

Esempio Esempio

{

int x, y;

for (x=0, y=0; x+y<10; x++, y+=3) printf("%d\n", x+y);

}

Osservazioni (

Osservazioni (cont cont.) .)

(31)

151

{

int x, y;

for (x=0,y=0; x+y<10; x++,y+=3) printf("%d\n", x+y);

}

no 9

3

si 0

0

si 6

2

si x+y<10

3 1

y x

Cosa Cosa stampa?

stampa?

8 4 0

152

Esempio di uso del Esempio di uso del for for

Calcolare la somma di 5 numeri interi immessi dall’utente

#include<stdio.h>

main() {

int i, somma, numero;

somma=0;

for (i=1; i<=5; i++) {

printf ("Dammi il numero: ");

scanf("%d", &numero);

somma=somma + numero;

}

printf("Somma = %d\n", somma);

}

(32)

153

Esempio (

Esempio (cont cont.) .)

Utile far apparire il numero d’ordine d’inserimento:

#include<stdio.h>

main() {

int i, somma, numero;

somma=0;

for (i=1; i<=5; i++) {

printf ("Dammi il numero %d: ", i);

scanf("%d", &numero);

somma=somma + numero;

}

printf("Somma = %d\n", somma);

}

Esercizio Esercizio

#include<stdio.h>

main() {

int i, n=3;

for (i = 0; i < n; i++) printf("*");

for (i = 0; i < n; i++) printf("!");

}

***!!!

(33)

155

Cosa stampa?

Cosa stampa?

#include<stdio.h>

main() {

int x;

for (x=1; x<=3; x++) {

printf("%d\n", x);

x=x+2;

}

}

156

Soluzione Soluzione

1

(34)

157

… for annidati

Cosa stampa?

Cosa stampa?

#include <stdio.h>

main() {

int a, b;

for(a = 5; a <= 7; a++) {

for(b = 1; b <= 3; b++) printf("%d ", b);

printf ("%d ", a);

}

}

Riferimenti

Documenti correlati

Permette di ripetere l’esecuzione di un blocco di istruzioni finchè viene verificata una condizione logica valutata all’inizio del

In presenza di altri Aiuti De Minimis eventualmente richiesti o ottenuti dal Richiedente e dalle altre Imprese facenti parte della Impresa Unica

3 - allegato solo bilancio XBRL ma erroneamente dichiarato doppio deposito Qualora nella pratica è presente il solo prospetto contabile XBRL ma l'utente avesse

Dopo aver selezionato “F4.Y”, premete il pulsante [+/YES] per abilitare il sub-modo delle funzioni del modo Split e usate poi i pulsanti [TEMPO/FUNCTION t, s] per selezionare

Sono obbligati a sostenere gli esami di idoneità: ogni anno, coloro che assolvono all’obbligo con istruzione parentale; coloro che frequentano una scuola non statale

Vengono automaticamente compilati i campi seguenti con il codice documento “BILANCIO XBRL B06”, il codice atto “711” – Bilancio ordinario di esercizio o comunque un

Scegliere il tipo di bilancio e indicare la data di chiusura, nel caso di distribuzione utili spuntare l’apposito check, nel campo relativo al formato XBRL

Nord Italia: 15 agosto - 30 settembre Centro Italia: fine agosto - 15 ottobre Densità di semina. 40 - 45 piante