La presentazione è in caricamento. Aspetta per favore

La presentazione è in caricamento. Aspetta per favore

Politecnico di Milano Esercizi FUNZIONI Passaggio di parametri per valore, variabili e tipi locali e globali, prototipo.

Presentazioni simili


Presentazione sul tema: "Politecnico di Milano Esercizi FUNZIONI Passaggio di parametri per valore, variabili e tipi locali e globali, prototipo."— Transcript della presentazione:

1 Politecnico di Milano Esercizi FUNZIONI Passaggio di parametri per valore, variabili e tipi locali e globali, prototipo

2 - 2 - Funzioni Definizione: tipo_ritornato nome (lista di parametri) { istruzioni; } int calcolatrice(char operazione,int a,int b) { … } Prototipo: tipo_ritornato nome (lista di parametri); Deve essere in accordo con la definizione Segnatura (signature)

3 - 3 - Funzioni Parametri: Definizione: tipo nome Parametri formali ed attuali Passati per copia Valore di ritorno: Istruzione: return espressione; Il tipo di espressione deve essere in accordo con tipo_ritornato Posso usare più return. /* definizione */ int somma(int a, int b) { return a + b; } … void main() { int x, u=3, w=5; /* chiamata */ x = somma (u, w); }

4 - 4 - Regole di visibilità #include int g, h; float funz1() { char b, g; funz2(5.0); return 33.0; } void funz2(float x); void main() { float a, b, h; a = funz1(); funz2(5.0); } void funz2(float x) { printf( "%f", pow(x,2)); } Ambiente globale g, h funz1() b, g main() a, b, h, funz1(), funz2() funz2() funz1() Manca stdlib.h funz2() non ancora def.

5 - 5 - Regole di visibilità E necessario definire ogni identificatore (tipo, variabile o funzione) prima di usarlo Variabili (e tipi) locali e globali: Visibili nel blocco allinterno del quale sono definiti ed in tutti i suoi sotto-blocchi E possibile usare lo stesso nome in blocchi diversi: Blocchi disgiunti: nessuna interferenza Blocchi innestati: la definizione più interna maschera quelle più esterne Funzioni: Sono visibili da ogni altra funzione definita successivamente Prototipo globale/locale #include

6 - 6 - Riassumendo: quando usare… Variabili locali: Quando la variabile deve essere vista (cioè, utilizzata) solo dalla funzione nella quale è definita Variabili globali: Quando la variabile deve essere vista da tutte le funzioni del programma Usate le variabili locali! Per trasferire dati tra una funzione e laltra, usare il passaggio di parametri ed il meccanismo del valore di ritorno.

7 - 7 - Elevamento a potenza Scrivere una funzione in grado di calcolare a b, con a e b interi Lutente inserisce la base e lesponente; lelaboratore esegue il calcolo, controllando e segnalando eventuali situazioni di errore Ricordiamo che: Se a = 0 e b < 0 errore! Altrimenti: Se b < 0 risultato = 1 / a |b| Se b = 0 risultato = 1.

8 - 8 - Elevamento a potenza #include int matError; /* Variabile globale */ float eleva (int a, int b) { unsigned int i; /* Variabili locali a eleva()*/ float tot = 1; /* Se b==0, tot=1… */ if (a == 0 && b < 0) { matError = -1; }.

9 - 9 - Elevamento a potenza else { matError = 0; /* abs() calcola valore assoluto; stdlib.h */ for (i = 1; i <= abs (b); i++) /* Se b==0… */ { tot = tot * a; } if (b < 0) { tot = 1.0 / tot; } } return tot; } /* Fine funzione eleva() */.

10 Elevamento a potenza void main() { int base, esponente; /* Var. locali al main()*/ float risultato; printf ("Base (intera): "); scanf ("%d", &base); printf ("Esponente (intero): "); scanf ("%d", &esponente); risultato = eleva (base, esponente);.

11 Elevamento a potenza if (matError == 0) { printf ("Risultato: %.8f\n", risultato); } else { printf ("Errore!\n"); } } Notare "%.8f"

12 Operazioni con numeri complessi Si implementino i sottoprogrammi che effettuano le operazioni di somma e prodotto tra numeri complessi Si assuma che i due numeri complessi su cui operare vengano sempre passati come parametro ai sottoprogrammi da implementare e che il risultato dell'operazione venga ritornato mediante il meccanismo del valore di ritorno Lutente inserirà i due numeri complessi e lelaboratore calcolerà somma e prodotto Un esempio di numero complesso: 23,5 + 3,4 i.

13 Operazioni con numeri complessi #include /* tipo globale */ typedef struct { float Re; float Imm; } Complesso; /* dichiarazione dei prototipi delle funzioni somma() e prodotto()*/ Complesso somma (Complesso c1, Complesso c2); Complesso prodotto (Complesso c1, Complesso c2);.

14 Operazioni con numeri complessi /* adesso definiamo il main() posso usare somma() e prodotto() perché ho dichiarato in precedenza il loro prototipo */ void main() { Complesso n1, n2, n3; printf ("reale immaginario: "); scanf ("%f %f", &n1.Re, &n1.Imm); printf ("reale immaginario: "); scanf ("%f %f", &n2.Re, &n2.Imm); n3 = somma (n1, n2); printf("n1 + n2 = %f%+fi\n", n3.Re, n3.Imm); n3 = prodotto (n1, n2); printf("n1 * n2 = %f%+fi\n", n3.Re, n3.Imm); }.

15 Operazioni con numeri complessi /* Adesso definiamo le due funzioni */ Complesso somma (Complesso c1, Complesso c2) { Complesso ris; ris.Re = c1.Re + c2.Re; ris.Imm = c1.Imm + c2.Imm; return ris; } Complesso prodotto (Complesso c1, Complesso c2) { Complesso ris; ris.Re = c1.Re * c2.Re - c1.Imm * c2.Imm; ris.Imm = c1.Imm * c2.Re + c2.Imm * c1.Re; return ris; }.

16 Calcolatrice Lutente inserisce un carattere (+, -, *, /, ^), che rappresenta loperazione da eseguire, e due operandi. Loperazione viene eseguita, se possibile. Implementare la funzione: float calcola(char operazione,float op1,float op2) che esegue il calcolo. Se durante il calcolo dovesse verificarsi una condizione di errore, la funzione deve utilizzare la variabile globale errore per segnalarlo. Il main() chiede allutente quale operazione effettuare e gli operandi; chiama la funzione calcola() e, in base al valore ottenuto ed al valore della variabile errore, comunica allutente il risultato.

17 Calcolatrice #include #define NO_ERR 0 #define DIV_ERR 1 #define OP_ERR 2 unsigned int errore; float calcola (char operazione, float op1, float op2); void main() { float operando1, operando2, risultato; char oper; printf ("Operazione (+,-,*,/,^): "); scanf ("%c", &oper);.

18 Calcolatrice printf ("Primo operando: "); scanf ("%f", &operando1); printf ("Secondo operando: "); scanf ("%f", &operando2); risultato = calcola (oper, operando1, operando2); switch (errore) { case NO_ERR: printf ("%f\n", risultato); break; case DIV_ERR: printf ("Divisione per zero\n"); break; case OP_ERR: printf ("Operazione errata\n"); break; } }.

19 Calcolatrice float eleva (int a, int b) /* un po modificata… */ { unsigned int i; float tot = 1; if (a == 0 && b < 0) errore = DIV_ERR; else { for (i = 1; i <= abs (b); i++) tot = tot * a; if (b < 0) tot = 1.0 / tot; } return tot; }.

20 Calcolatrice float calcola (char operazione, float op1, float op2) { float totale; errore = NO_ERR; switch (operazione) { case '+': totale = op1 + op2; break; case '-': totale = op1 - op2; break; case '*': totale = op1 * op2; break;.

21 Calcolatrice case '/': if (op2 != 0) { totale = op1 / op2; } else { errore = DIV_ERR; } break; case '^': totale = eleva (op1, op2); break; default: errore = OP_ERR; } return totale; }.

22 Lettura codice segreto Si vuole leggere un codice numerico naturale, dando allutente un numero prefissato di tentativi Se lutente non inserisce il codice corretto entro il numero previsto di tentativi il calcolatore visualizza codice errato, altrimenti visualizza codice corretto Utilizzare le funzioni per: Leggere il codice Verificare se è corretto Visualizzare il risultato.

23 Lettura codice segreto #include typedef enum {falso, vero} Booleano; /* Tipo globale */ void main() { /* Prototipi locali al main() */ Booleano leggiCodice (unsigned int nTentativi, unsigned int codice); void visualizza(Booleano corretto); /* Variabile locale al main() */ Booleano ok; ok = leggiCodice(3, 1234); visualizza(ok); }.

24 void visualizza (Booleano corretto) { if (corretto) { printf ("Codice corretto\n"); } else { printf ("Codice errato\n"); } }. Lettura codice segreto

25 Booleano leggiCodice (unsigned int nTentativi, unsigned int codCorr) { /* Prototipo locale a leggiCodice() */ int leggi(unsigned int i); /* Variabili locali a leggiCodice() */ int codTent; unsigned int i = 0; do { codTent = leggi(i); i++; } while (i < nTentativi && codTent != codCorr);. Lettura codice segreto

26 if (codTent == codCorr) { return vero; } else { return falso; } }. Lettura codice segreto

27 int leggi(unsigned int i) { /* Variabile locale a leggi() */ int codLetto; printf ("Codice (tentativo %u): ", i + 1); scanf ("%d", &codLetto); return codLetto; }. Lettura codice segreto


Scaricare ppt "Politecnico di Milano Esercizi FUNZIONI Passaggio di parametri per valore, variabili e tipi locali e globali, prototipo."

Presentazioni simili


Annunci Google