21 marzo 2002 (ri-)avvisi: giovedi 28 marzo la lezione e sospesa. nuovo indirizzo di e-mail:...

Post on 02-May-2015

218 Views

Category:

Documents

1 Downloads

Preview:

Click to see full reader

TRANSCRIPT

21 marzo 2002

(ri-)Avvisi:

• Giovedi 28 marzo la lezione e’ sospesa.

• Nuovo indirizzo di e-mail:

labinfo1@mat.uniroma2.it

Spedire messaggi e esercizi solo qui!!!

La struttura di selezione multipla switch

• Formatoswitch ( variabile ){

case val-1:azioni

case val-2:azioni

……case val-k:

azioni

default:azioni

}

 

val-1, val-2,…… val-k sono k valori di costanti intere per variabile

Sommario

1. Inizializzazione

2. Input dei dati

2.1 switch loop per aggiornare count

1 /* Fig. 4.7: fig04_07.c2 Counting letter grades */3 #include <stdio.h>45 int main()6 {7 int grade;8 int aCount = 0, bCount = 0, cCount = 0, 9 dCount = 0, fCount = 0;1011 printf( "Enter the letter grades.\n" );12 printf( "Enter the EOF character to end input.\n" );1314 while ( ( grade = getchar() ) != EOF ) {1516 switch ( grade ) { /* switch nested in while */1718 case 'A': case 'a': /* grade was uppercase A */19 ++aCount; /* or lowercase a */20 break;2122 case 'B': case 'b': /* grade was uppercase B */23 ++bCount; /* or lowercase b */24 break;2526 case 'C': case 'c': /* grade was uppercase C */27 ++cCount; /* or lowercase c */28 break;2930 case 'D': case 'd': /* grade was uppercase D */31 ++dCount; /* or lowercase d */32 break;

Sommario

2.1 Use switch loop to update count

3. Print results

33

34 case 'F': case 'f': /* grade was uppercase F */

35 ++fCount; /* or lowercase f */

36 break;

37

38 case '\n': case' ': /* ignore these in input */

39 break;

40

41 default: /* catch all other characters */

42 printf( "Incorrect letter grade entered." );

43 printf( " Enter a new grade.\n" );

44 break;

45 }

46 }

47

48 printf( "\nTotals for each letter grade are:\n" );

49 printf( "A: %d\n", aCount );

50 printf( "B: %d\n", bCount );

51 printf( "C: %d\n", cCount );

52 printf( "D: %d\n", dCount );

53 printf( "F: %d\n", fCount );

54

55 return 0;

56 }

Precisazione

• while ( ( grade = getchar() ) != EOF )

 

EOF e’ il carattere “end-of-file” . Dipende dal sistema operativo:

•MS-DOS ctrl-z

•Unix ctrl-d

Valore numerico di EOF e’ solitamente –1 (comunque un valore negativo)

Le istruzioni break e continue

• break– Causa una uscita immediata da una struttura while, for, do/while o switch

– L’esecuzione del programma continua con la prima istruzione dopo la struttura

– Uso consueto dell’istruzione break• Uscire prima da un loop

• Saltare la parte rimanente della struttura switch

Sommario

1. Inizializzazione delle variabili

2. Loop

3. Print

Output

1 /* Fig. 4.12: fig04_12.c2 Usare l’istruzione break in una structura for */3 #include <stdio.h>45 int main()6 {7 int x;8 9 for ( x = 1; x <= 10; x++ ) {1011 if ( x == 5 ) 12 break; /* interrompe il ciclo solo13 if x == 5 */14 15 printf( "%d ", x ); 16 }17 18 printf( "\n Broke out of loop at x== %d\“, x );19 return 0;20 }

1 2 3 4 Broke out of loop at x== 5

Le istruzioni break e continue

• continue– Salta le istruzioni restanti nel corpo di una struttura while, for , do/while

• Procede con l’iterazione successiva nel loop– while , do/while

• La condizione di continuazione del ciclo e’ valutata immediatamente dopo che viene eseguita l’istruzione continue

– for• Viene eseguita l’espressione di incremento, poi

viene valutata la condizione di iterazione

Sommario

Inizializzazione delle variabili

Loop

Print

Output

1 /* Fig. 4.12: fig04_12.c2 Uso di continue in una struttura for */3 #include <stdio.h>45 int main()6 {7 int x;8 9 for ( x = 1; x <= 10; x++ ) {1011 if ( x == 5 ) 12 continue; /* salta il codice restante del13 ciclo solo if x == 5 */14 15 printf( "%d ", x ); 16 }17 18 printf("\nUsed continue to skip printing value 5\n");19 return 0;20 }

1 2 3 4 6 7 8 9 10Used continue to skip printing the value 5

Osservazioni su break e continue

– break , continue violano le norme della programmazione strutturata, ma sono “tollerate” poiche’ sono piu’ efficienti (se usate bene!) delle corrispondenti tecniche strutturate….

Operatori Logici

• && (AND logico ) – Restituisce true se entrambe le condizioni sono true

• || (OR logico ) – Restituisce true se almeno una delle condizioni e’ true

• ! (NOT logico, negazione logica)– Inverte la verita’/falsita’ della sua condizione

– Operatore unario

• Molto utili come condizioni per i loopEspressione Risultato

true && false falsetrue || false true

!false true

Confondere l’operatore di uguaglianza (==)

con l’operatore di assegnamento (=)

• Errore pericoloso– Non causano generalmente errori di sintassi

– Ogni espressione che produce un valore puo’ essere usata in una struttura di controllo

– Valori Nonzero sono true, Valori zero sono false

• Esempio: if ( payCode == 4 ) printf( "You get a bonus!\n" );

– Controlla paycode, se e’ 4 allora viene dato un bonus

Confondere l’operatore di uguaglianza (==)

con l’operatore di assegnamento (=)

• Se sostituiamo == con =if ( payCode = 4 )printf( "You get a bonus!\n" );

– Questo assegna a paycode il valore 4

– 4 e’ nonzero, dunque l’espressione e’ true, e il bonus viene dato indipendentemente da quanto fosse il valore di paycode

– Errore logico, non di sintassi

Programmazione Strutturata

• Tutti i programmi si possono dividere in tre parti: Sequenza -

Selezione - if, if/else, o switch

Iterazione - while, do/while, or for

Ogni selezione si puo’ riscrivere come istruzione if,

Ogni iterazione si puo’ riscrivere come istruzione while

• I programmi si possono ridurre a :– Sequenza

– Struttura if (selezione)

– Struttura while (iterazione)

• Le strutture di controllo si possono combinare solo in due modi: nidificazione (reg. 2) e accatastamento (reg.3)

Le funzioni

• Divide et impera – Costruire un programma da piccoli pezzi detti moduli

– Ogni pezzo e’ “maneggiabile” piu’ facilmente dell’intero problema.

Funzioni

– Moduli di programmi in C– Programmi vengono scritti combinando

funzioni definite dall’utente e funzioni della libreria• La libreria standard del C ha una grande

varieta’ di funzioni• Rende il lavoro del programmatore piu’

semplice….

… si evita di riinventare la ruota…

Funzioni

• Chiamate di funzioni– Specifica il nome della funzione e delle informazioni

(gli argomenti) necessari per la sua esecuzione.

– Esegue operazioni o manipolazioni

– Restituisce dei risultati

• Una analogia– Il boss chiede all’operaio di svolgere un compito

– L’operaio prende le informazioni necessarie, svolge il compito e riporta i risultati

– Information hiding: il boss non conosce i dettagli

Funzioni della libreria matematica

• Per eseguire tutti i comuni calcoli matematici– #include <math.h>

• Formato per la chiamata di funzioni– FunctionName (argument);

• Vari argomenti si scrivono separati da virgola– printf( "%.2f", sqrt( 900.0 ) );

• Chiama la funzione sqrt, che calcola la radice quadrata del suo argomento

• Tutte le funzioni matematiche restituiscono un tipo double

– Gli argomenti possono essere costanti, variabili o espressioni.

Funzioni

• Tutte le variabili dichiarate all’interno di funzioni sono variabili locali .

– Note solo nella definizione della funzione

• Parametri

– Comunicano informazioni tra funzioni

Definizione di funzioni

• Formato per definizione di funzioni

tipo-restituito nome-funzione( lista-parametri ){ dichiarazioni e istruzioni}

Definizione di funzioni

– Tipo-restituito: tipo di dato del risultato (default int)•void – la funzione non restituisce nulla

– Nome-funzione: qualunque nome di identificatore valido

Definizione di funzioni

– Lista-parametri: dichiarazione dei parametri, separati da virgole che saranno ricevuti dalla funzione.

• Se non deve ricevere alcun valore uso void oppure ()• Ogni parametro deve essere specificato con il suo tipo

(default int)

(float x, y)(float x,int y)

(float x, float y)NO!

SI!

Definizione di funzioni

– Dichiarazioni e istruzioni: corpo della funzione (blocco)• Si possono dichiarare variabili all’interno di

blocchi (variabili locali)• Non si puo’ dichiarare come variabile locale un

parametro della funzione• Non si puo’ definire una funzione dentro

un’altra funzione

Definizione di funzioni

– Ritorno del controllo

• Se nulla deve essere restituito –return; – o, si raggiunge semplicemente la parentesi }

• Se qualcosa deve essere restituito –return espressione;

Sommario

Prototipo Funzione

(3 parametr)

Input

Chiamata funzione

Definizione funzione

Prototipi di funzione

Function prototy

pe

Function

name

Parameters - what the

function

takes in

Return type

- data type function

returns

(default int)

Used to validate

functions

Prototype

only needed if function

definition comes

after use in

program

int maximum( int,

int,

int );

Takes in

3 ints

Returns an int

Promotion rules and

conversions

Converting to

lower

types can lead to

errors

1 /* Fig. 5.4: fig05_04.c2 trovare il massimo di tre interi */3 #include <stdio.h>45 int maximum( int, int, int ); /* prototipo67 int main()8 {9 int a, b, c;1011 printf( "Enter three integers: " );12 scanf( "%d%d%d", &a, &b, &c );13 printf("Maximum is: %d\n", maximum( a, b, c ));1415 return 0;16 }1718 /* Definizione della funzione massimo */19 int maximum( int x, int y, int z )20 {21 int max = x;2223 if ( y > max )24 max = y;2526 if ( z > max )27 max = z;2829 return max;30 }

funzione */

Prototipi di funzioni

– Nome della funzione– Parametri ricevuti dalla funzione– Tipo restituito dalla funzione (default int)– Si usano per validare le funzioni– Sono necessari solo se la definizione della

funzione viene dopo il suo utilizzo nel programma

int maximum( int, int, int );• Prende 3 int• Restituisce int

Header File (File di intestazione)

• Header File – Contiene i prototipi delle funzioni di una certa libreria– <stdlib.h> , <math.h> , etc

– Si includono con #include <filename>

#include <math.h>

• Header file personalizzati– Creo file con i prototipi delle “mie” funzioni

– Lo salvo come filename.h– Lo includo nei programmi con #include "filename.h"– Permette di riutilizzare delle funzioni fatte da noi

Generazione di numeri random

• funzione rand– Si trova in <stdlib.h>– Restituisce un numero "random" 0 e RAND_MAX

(almeno 32767)

i = rand();

• Pseudorandom– Sequenza prefissata di numeri "random"

– Stessa sequenza ogni volta che si chiama la funzione

Generazione di numeri random

• Scaling– Per avere un numero random tra number tra 1 e n

1 + ( rand() % n )

rand % n restituisce un numero tra 0 e n-1

1 + ( rand() % 6) // numero tra 1 e 6

Generazione di numeri random

• funzione srand– Si trova in <stdlib.h>– Prende un intero seed – salta in una locazione

della sequenza "random“ srand( seed );

– srand( time( NULL ) );

//load <time.h>•time( NULL )- ora corrente espressa in sec.

Sommario

1. Dichiara la variabile seed

2. Input valore per seed

2.1 Usa srand per cambiare la sequenza random

2.2 Definisce Loop 3. Genera e da’ in output numeri random

1 /* Fig. 5.9: fig05_09.c

2 Randomizing die-rolling program */

3 #include <stdlib.h>

4 #include <stdio.h>

5

6 int main()

7 {

8 int i;

9 unsigned seed;

10

11 printf( "Enter seed: " );

12 scanf( "%u", &seed );

13 srand( seed );

14

15 for ( i = 1; i <= 10; i++ ) {

16 printf( "%10d", 1 + ( rand() % 6 ) );

17

18 if ( i % 5 == 0 )

19 printf( "\n" );

20 }

21

22 return 0;

23 }

Sommario

OutputEnter seed: 867

2 4 6 1 6 1 1 3 6 2

 Enter seed: 67 6 1 4 6 2 1 6 1 6 4

Enter seed: 67 6 1 4 6 2 1 6 1 6 4

Esercizi:

• Esercizio 4.33 Scrivere un programma che visualizzi una tabella

contenente tutti i numeri romani in corrispondenza dei numeri interi decimali da 1 a 100.

top related