27
Esercitazione 5 Procedure e Funzioni Il comando condizionale: switch

Procedure e Funzioni Il comando condizionale: switchprog1/Esercizi_in_aula/Esercizi5.pdf · Comando: switch-case switch (espressione) { /* espressione deve essere case costante1:

Embed Size (px)

Citation preview

Esercitazione 5

Procedure e FunzioniIl comando condizionale: switch

Comando: switch-case

switch (espressione) { /* espressione deve esserecase costante1: istruzione1 di tipo int o char */

…[break];

case costante2: istruzione2 /* costante2 deve essere… una costante int o char */[break];

case costante3: istruzione3…[break];

[default: istruzione… ] }

Comando: switch-caseswitch (espressione) {

case costante1: istruzione1…[break];

case costante2: istruzione2…[break];

case costante3: istruzione3…[break];

[default: istruzione… ]

}

se il valore di espressione èuguale a costante1 viene eseguita istruzione1

provoca l’uscita immediatadallo switch-case

viene eseguita se espressionenon corrisponde a nessuna

costante

Comando: switch-case

/* Esempio utilizzo switch-case */

#include <stdio.h>int main ( ) {int x;printf (“Digita una cifra: ”);scanf (“%d”, &x);switch (x) {

case 0 : printf (“zero\n”);break;

case 1 : printf (“uno\n”);break;

case 2 : printf (“due\n”);break;

case 3 : printf (“tre\n”);break;

case 4 : printf (“quattro\n”);break;

case 5 : printf (“cinque\n”);break;

default : printf(“non previsto”);break;

}}

Comando: switch-case/* Scrivere un programma che riceve in input un numero intero x e stampa “pari” se x∈{0,2,4}, “dispari” se x∈{1,3,5}, altrimenti “altro” */

#include <stdio.h>int main ( ) {int x;printf (“Digita una cifra: ”);scanf (“%d”, &x);switch (x) {

case 0 :case 2 : case 4 : printf (“pari\n”);

break;

case 1 :case 3 :case 5 : printf (“dispari\n”);

break;default : printf (“altro\n”);

break;}

}

Esercizio

Scrivere un programma che legge una data (il giorno, il mese e l’ anno) e determina la data del giorno successivo.

#include <stdio.h>int main ( )

{ int giorno, mese, anno,giorni_del_mese;

/* lettura della data */printf("Data (giorno, mese, anno) ? ");scanf("%d%d%d", &giorno, &mese, &anno);

/* calcola il numero dei giorni del mese */switch (mese) {case 1: case 3: case 5: case 7: case 8: case 10: case 12:

giorni_del_mese = 31;break;

case 4: case 6: case 9: case 11:giorni_del_mese = 30;break;

case 2: // bisestile se divisib. per 4 ma non per 100 opp. divisib per 400 if ( (anno % 4 == 0 && anno % 100 !=0) || (anno %400 ==0) )

giorni_del_mese = 29;else

giorni_del_mese = 28;break;

} /* fine switch */

/* aggiorna la data del mese successivo */if (giorno == giorni_del_mese) {giorno = 1;if (mese == 12) {mese = 1;anno++; }

elsemese++;

}elsegiorno++;

/* stampa la data aggiornata */printf("\n Il giorno successivo e’: %d/%d/%d", giorno, mese, anno);

} /* fine */

Esercizio Scrivere un programma che calcola l’area di un poligono che può essereo un triangolo (T) o un rettangolo (R).

ALGORITMO

chiedere all’utente di inserire il carattere ‘T’ se si vuole calcolare l’area di un triangolo, il carattere ‘R’ se si vuole calcolare l’area di un rettangolo

chiedere all’utente di inserire i valori della base e dell’altezza

invocare una funzione generica area che calcola l’area del poligono specificato dall’utente

#include <stdio.h>/* dichiarazione della funzione generica area */

double area (double, double, char);

/* tipo dei parametri formali */

int main ( ) { /* inizio della funzione principale */double b, h, a;char p;

printf (“Inserire poligono (T per triangolo/R per rettangolo): \n”);scanf (“%c ”, &p);

printf (“Inserire base: \n”);scanf (“%lf”, &b);

printf (“Inserire altezza: \n”);scanf (“%lf”, &h);

a = area (b, h, p); /* invocazione della funzione area */

/* parametri attuali */

printf (“Area: %lf”, a);} /* fine della funzione principale main */

/* definizione della funzione area */

double area (double base, double altezza, char poligono) {

/* parametri formali */

switch (poligono) {case ‘T’: return (base * altezza)/2.0; case ‘R’: return base * altezza;default: return -1;

}} /* fine della funzione area */

Esercizio Dire quali delle seguenti invocazioni della funzione area (definita sopra)sono corrette.

double area (double, double, char);

1) char p = ‘T’;a = area (12, 7.0, p);

2) a = area (12, 7.0, ‘T’);

3) a = area (‘T’, 12, 7.0);

4) a = area (12, 7.0);

Soluzione

1) char p = ‘T’;a = area (12, 7.0, p); /* invocazione corretta */

2) a = area (12, 7.0, ‘T’); /* invocazione corretta */

3) a = area (‘T’, 12, 7.0); /* invocazione errata */

4) a = area (12, 7.0); /* invocazione errata */

I parametri attuali devono essere dello stesso tipo, nello stessonumero e ordine dei parametri formali.

Passaggio dei parametri

I parametri formali sono quelli dichiarati per tipo, numero e ordine nella definizione della funzione.

I parametri attuali sono invece quelli che vengono passati alla funzione all’atto della chiamata (o invocazione).

Passaggio dei parametri per valoreIn C il passaggio dei parametri avviene sempre e soltanto per valore.Ciò significa che all’atto dell’invocazione di una funzione ogni parametroformale è inizializzato con il valore del corrispondente parametro attuale.

Passaggio dei parametri

#include <stdio.h>

void f (int y) {y++;return;

}

main ( ) {int x = 4;f (x);

}

ambiente di f

ambiente di main

x4

4 y

Esercizio

/* Scrivere una funzione che calcola il fattoriale di un numero dato */

int fattoriale (int n) /* n è il parametro formale della procedura */{

int i; /* i e fact sono variabili locali alla procedura */int fact =1;

for (i=2; i<=n; i++)fact = fact *i;

return fact;}

Craps: un gioco di dadi

Scriviamo un programma che simula il noto gioco d’azzardo “craps” basato sull’uso di una coppia di dadi a sei facce.

Il gioco inizia con un giocatore che lancia due dadi:

se ha totalizzato 7 o 11 il giocatore ha vinto,

se ha totalizzato 2 o 12 il giocatore ha perso,

altrimenti, se il totale è il numero n, il giocatore deve continuare a lanciare i dadi fino a quando

• o totalizza di nuovo il numero n, e in questo caso ha vinto• oppure totalizza un 7 e così ha perso

Craps: un gioco di dadi

Scriviamo l’algoritmo per il programma craps:

lancia due dadi e trovane la somma

se la somma è 7 o 11 il giocatore ha vinto,

se la somma è 2 o 12 il giocatore ha perso,

altrimenti, se la somma è il numero n, fisso il punteggio ad n econtinuo il gioco

finché non ho né vinto né perso• lancio di nuovo i dadi• se la somma è uguale al punteggio il giocatore ha vinto• se la somma è 7 il giocatore ha perso

stampa a video il risultato del gioco

Funzione tira_dadi

Funzione stampa_risultato

Craps: un gioco di dadi

/**************************************************************************************************** programma per giocare a craps *****************/

#include<stdio.h>#include<stdlib.h>

/* prototipi prototipi delle funzioni usate */

int tira_dadi(void); /* simula il lancio dei dadi */

void stampa_risultati(int risult); /* se l’argomento è 1 stampa “Hai vinto”se l’argomento è 2 stampa “Hai perso” */

int main ( ) {int stato_gioco, somma_dadi, punteggio;

somma_dadi = tira_dadi( ); /* effettua il primo lancio */

switch(somma_dadi) {case 7:case 11: stato_gioco=1; break; /* vince al primo lancio */case 2:case 12: stato_gioco=2; break; /* perde al primo lancio */

default: stato_gioco=0; /* memorizzo il punteggiopunteggio=somma_dadi; } e continuo a giocare */

while (stato_gioco==0) { // continua a lanciare finché nonsomma_dadi = tira_dadi( );if (somma_dadi ==punteggio) stato_gioco=1; // vince con il punteggioelse if (somma_dadi==7) stato_gioco=2; // opp perde con il 7}

stampa_risultati( stato_gioco);} /* chiusa la funzione main */

/** definizionidefinizioni delle funzioni usate **/int tira_dadi ( ) {int dado1, dado2, somma;dado1 = 1+ rand()%6;dado2 = 1+ rand()%6;somma = dado1+dado2;printf(“Il giocatore ha tirato %d + %d = %d”, dado1, dado2, somma);return somma;

}

void stampa_risultati (int finale) {if (finale == 1)

printf(“Hai vinto!\n”);else printf(“Hai perso \n”);return;

}

Scrivere una funzione ricorsiva che dato un numero intero positivo nstampa la sua rappresentazione binaria.ESEMPIO: Convertire il numero 35 dalla base 10 alla base 2

Conversione di base

35 : 2 = 17 resto 117 : 2 = 8 resto 18 : 2 = 4 resto 04 : 2 = 2 resto 02 : 2 = 1 resto 01 : 2 = 0 resto 1

La rappresentazione binaria del numero 35 é 100011

#include <stdio.h>void convert (int n) {

int k;k = n/2;if (k > 0) convert(k);printf(“%d”, n%2);

} int main( ) {

int n;printf (“Dammi un numero intero positivo: \n”);scanf(“%d”, &n);printf(“la conversione binaria di %d e’: ”, n);convert(n); }

Soluzione

Esercizio

Dire per quali valori dei parametri attuali la seguente procedura termina.

int prova_costrutti (int x, int y){

int z = 0;

if (y = z)return 1;

else {while (x != y)

prova_costrutti (2*x, 2*y);return z;

}}

Esercizio

int prova_costrutti (int x, int y){

int z = 0;

if (y = z)return 1;

else {while (x != y)

prova_costrutti (2*x, 2*y);return z;

}}

La procedura termina quando viene chiamata con x = 0.

x = ?y = 0 z = 0

x = ? y = ?z = 0

Esercizio

Per quali valori dei parametri attuali la seguente procedura termina correttamente ? Quali sono i possibili valori restituiti ?

int foo (int a, int b) {int z=0;if (b=0)

return 3;else {

while (a == 3)z = foo(a, 2*b);

return z;}

}

Soluzione

int foo (int a, int b) { /* procedura ricorsiva */int z=0;if (b=0) /* la condizione è sempre falsa */

return 3;else {

while (a == 3) /* se viene eseguito questo ciclo z = foo(a, 2*b); non termina mai */

return z;}

}

La procedura termina se a != 3. In tal caso restituisce 0.