DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Funzioni e Procedure Marco D. Santambrogio – [email protected] Ver. aggiornata al 3 Aprile 2015 Regole esame DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE • Compitini di INFO: 24 Aprile 2015 • 4.15pm @ C.G.1 (Ed. 9) 21 Maggio 2015 • 10.30am @ S.0.2 (Ed. 3) 17 Giugno 2015 • 1.30pm @ I.0.1 (Ed. 4) 2 Regole esame DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE • Compitini di INFO: 24 Aprile 2015 • 4.15pm @ C.G.1 (Ed. 9) 21 Maggio 2015 • 10.30am @ S.0.2 (Ed. 3) 17 Giugno 2015 • 1.30pm @ I.0.1 (Ed. 4) • Si passa con 50% (11.5) o 60% (13.8)? 3 Regole esame DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE • Compitini di INFO: 24 Aprile 2015 • 4.15pm @ C.G.1 (Ed. 9) 21 Maggio 2015 • 10.30am @ S.0.2 (Ed. 3) 17 Giugno 2015 • 1.30pm @ I.0.1 (Ed. 4) • Si passa con 50% (11.5) o 60% (13.8)? Nel dubbio… con 60% && orale obbligatorio! 4 Regole esame DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE 5 DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE 1 Aprile 6 Regole esame DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE • Compitini di INFO: 24 Aprile 2015 • 4.15pm @ C.G.1 (Ed. 9) 21 Maggio 2015 • 10.30am @ S.0.2 (Ed. 3) 17 Giugno 2015 • 1.30pm @ I.0.1 (Ed. 4) • Si passa con 50% (11.5) o 60% (13.8)? Nel dubbio… con 55% 7 Torniamo al 27 Marzo… DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE http://th06.deviantart.net/fs70/PRE/i/2012/025/2/c/time_turner_1_by_jamieg09-d4ne7ba.jpg 8 Il fattoriale DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE • Dato n, intero positivo, si definisce n fattoriale e si indica con n! il prodotto dei primi n numeri interi positivi minori o uguali di quel numero. In formule • Nota: 0! = 1 1! = 1 2! = 2, 3! = 6,… 9 Il fattoriale: codice DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE 10 Dal fattoriale… DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE 11 Dal fattoriale… DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE … al coefficiente binomiale 12 Coefficiente binomiale DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE • Il numero di scelte di k oggetti fra quelli che costituiscono un insieme di n elementi • Quindi il numero dei sottoinsiemi di k elementi di un dato insieme di n oggetti, è dato dal cosiddetto coefficiente binomiale: 13 Tornando ad oggi… DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE 14 Obiettivi DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE • Funzioni • Scope delle variabili 15 Coefficiente binomiale DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE • Il numero di scelte di k oggetti fra quelli che costituiscono un insieme di n elementi • Quindi il numero dei sottoinsiemi di k elementi di un dato insieme di n oggetti, è dato dal cosiddetto coefficiente binomiale: 16 Coefficiente binomiale: flusso DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE 1. Inserire K e N 2. Verifico K e N 3. Se corretti A. B. C. D. Calcolare il fattoriale di N (FatN) Calcolare il fattoriale di K (FatK) Calcolare il fattoriale di N-K (FatNK) CoefBin = FatN/(FatK)*FatNK 4. Altrimenti torno a 1 17 Ma quindi… DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Cosa è Calcolare il fattoriale di N? 18 Ma quindi… DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Cosa è Calcolare il fattoriale di N? Cosa è Calcolare il fattoriale di K? 19 Ma quindi… DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Cosa è Calcolare il fattoriale di N? Cosa è Calcolare il fattoriale di K? Cosa è Calcolare il fattoriale di N-K? 20 Ma quindi… DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Cosa è Calcolare il fattoriale di N? Cosa è Calcolare il fattoriale di K? Cosa è Calcolare il fattoriale di N-K? Sono tutti SOTTOPROGRAMMI!! 21 Sottoprogrammi DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE • Un sottoprogramma è: un insieme di istruzioni dotato di nome descritto (definito) una sola volta attivabile (richiamabile o invocabile) all’interno del programma o di un altro sottoprogramma • Alcuni sottoprogrammi sono già definiti si pensi alla scanf e alla printf dietro a questi nomi vi sono una serie di istruzioni in grado di, rispettivamente, intercettare la pressione dei tasti e di visualizzare un carattere sullo schermo chi richiama queste funzioni non si preoccupa di come sono fatte, basta sapere solo cosa fanno (visione black box) 22 Sottoprogrammi: motivazioni DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE • Astrazione e leggibilità: enucleano parti di codice, nascondendo dettagli algoritmici e di codifica il nome di programma si presenta come “un’operazione elementare” • Strutturazione e scomposizione funzionale del programma: consentono una stesura del programma che riflette un’analisi funzionale del problema • Collaudo: verifica di correttezza della soluzione facilitata dal poter verificare la correttezza prima dei singoli sottoprogrammi e poi dell’intero programma visto come insieme di chiamate che si scambiano informazioni • Compattezza ed efficienza del codice: si evita di ripetere sequenze di istruzioni in più parti del programma • Modificabilità: una sola modifica vale per tutte le attivazioni del sottoprogramma • Riuso: sottoprogrammi non troppo specifici possono essere raccolti in librerie utilizzabili da programmi diversi 23 Sottoprogrammi: funzioni e procedure DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE • I sottoprogrammi si differenziano per la logica di definizione per l’uso e per la modalità di chiamata e possono essere di tipo funzionale di tipo procedurale • Sottoprogrammi di tipo funzionale (funzioni) possono essere considerati una astrazione di valore l’invocazione della funzione associa al nome della funzione il valore del risultato calcolato dal sottoprogramma • Sottoprogrammi di tipo procedurale (procedure) possono essere considerati una astrazione di operazioni l’invocazione della procedura è associata all’esecuzione delle istruzioni del sottoprogramma che realizzano l’operazione specificata dal sottoprogramma • Ad esempio: leggi(A,B); /* procedura*/ risultato = somma(A,B); /* funzione*/ 24 Funzioni e procedure in C DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE • In C esistono solo le funzioni Le procedure sono particolari funzioni che non restituiscono nulla (VOID) • Quindi parleremo solo di funzioni intendendo sia le funzioni che le procedure • Definire una funzione secondo il linguaggio C implica: 1. Dichiarazione del prototipo della funzione (nella sezione dichiarativa) 2. Definizione della funzione 3. Invocazione o chiamata della funzione (nel codice che necessita della funzioni) 25 1. Dichiarazione del prototipo DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE • Il prototipo definisce: il nome della funzione il tipo (funzione, procedura) il tipo dei parametri in ingresso e in uscita • Chi utilizzerà la funzione dovrà rispettare la sintassi definita nel prototipo • Prototipo funzione <tipo_ris> <nome_funz> (<lista tipi dei parametri>); • Prototipo procedura (void è una parola chiave del C che indica assenza di tipo) void <nome_funz> (<lista tipi dei parametri>); 26 2. Definizione della funzione DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE • • La definizione della funzione va messa dopo il main. Ha la stessa struttura del main (anche il main, come sappiamo è una funzione): Una parte dichiarativa Una parte esecutiva <tipo> <nome> (tipo par_for1, tipo par_for2 ...) { parte dichiarativa locale parte esecutiva } • • <tipo> <nome> (tipo par_for1, tipo par_for2 ...) è la testata della funzione par_for1, par_for2 sono i nomi dei parametri formali della funzione, il cui tipo deve corrispondere in modo ordinato ai tipi elencati nella dichiarazione del prototipo 27 3. Invocazione o chiamata DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE • Nel corpo del main o di un’altra funzione indica il punto in cui va eseguita la parte del codice presente nella definizione di funzione • Invocazione di funzione come operando in una espressione <espressione> = <… nomefunzione(par_att1 …)…>; • Invocazione di procedura come un’istruzione nomeprocedura(par_att1, …); • In entrambi i casi: par_att1,… sono i parametri attuali che devono corrispondere per ordine e per tipo ai parametri formali I parametri attuali possono essere variabili, costanti o espressioni definite nell’ambiente chiamante, i cui valori all’atto della chiamata vengono copiati nei parametri formali 28 Chimante/Chiamato DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE • • • All’atto della chiamata, il controllo dell’esecuzione passa dal chiamante al chiamato Il codice del chiamato viene eseguito codice chiamante Inizio programma Istruzione 1 Istruzione 2 Chiama funzione Istruzione 3 Passaggio del controllo Al termine dell’esecuzione il controllo ritorna al chiamante, all’istruzione successiva a quella della chiamata funzione chiamata Ritorno del controllo Istruzione 1 Istruzione 2 Istruzione 3 Istruzione 4 return 29 Istruzione return DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE • Parola chiave C utilizzata solo nelle funzioni • Sintassi return <espressione> • È l’ultima istruzione di una funzione e indica: il punto in cui il controllo torna al chiamante il valore restituito • In una funzione deve esserci almeno un’istruzione di return possono esserci più istruzioni di return ma in alternativa la funzione può restituire un solo valore 30 Tornando al coefficiente binomiale DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE 1. Inserire K e N 2. Verifico K e N 3. Se corretti A. B. C. D. Calcolare il fattoriale di N (FatN) Calcolare il fattoriale di K (FatK) Calcolare il fattoriale di N-K (FatNK) CoefBin = FatN/(FatK)*FatNK 4. Altrimenti torno a 1 31 Coefficiente binomiale: codice DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE 32 Coefficiente binomiale: codice DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE 33 Coefficiente binomiale: codice DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE 34 Coefficiente binomiale: codice DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE 35 Comunicazione tra chiamante e chiamato DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE 36 Passaggio dei parametri DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE • Il passaggio dei parametri consiste nell’associare, all’atto delle chiamata di un sottoprogramma, ai parametri formali i parametri attuali Se il prototipo di una funzione è int fat (int valore); Invocare questa funzione significa eseguire l’istruzione FatK = fat(K); In questo modo la variabile raggio (il parametro formale) assumerà per quella particolare invocazione il valore 5 (il parametro attuale). • Lo scambio di informazioni con passaggio dei parametri tra chiamante e chiamato può avvenire in due modi: Passaggio per valore Passaggio per indirizzo 37 Parametri formali DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Le funzioni in C sono funzioni in senso matematico, il tipo del valore di ritorno definisce il Codominio mentre i valori possibili dei parametri in ingresso corrispondono al Dominio • Parametri Formali: Rappresentano un riferimento simbolico (identificatori) a oggetti utilizzati all’interno della funzione Sono utilizzati dalla funzione come se fossero variabili dichiarate localmente Il valore iniziale di parametri formali viene definito all’atto della chiamata della funzione tramite i parametri attuali (passaggio di parametri) 38 Passaggio per VALORE DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE • All’atto della chiamata il valore del parametro attuale viene copiato nelle celle di memoria del corrispondente parametro formale. Il parametro formale e il parametro attuale si riferiscono a due diverse celle di memoria • Il sottoprogramma in esecuzione lavora nel suo ambiente e quindi sui parametri formali • I parametri attuali non vengono modificati 39 Esempio: passaggio per valore DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Ambiente della funzione fat valore } /* nel main */ int K; int FatK; FatK=fat(K); Quando invoco la funzione fat, il valore in K nel main viene copiato in valore K fattoriale Quando la funzione fat termina, il valore di fattoriale viene copiato in FatK nel main FatK Ambiente della funzione main 40 Visibilità DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE 41 Scope/visibilità delle variabili DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE 42 Visibilità DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE • Visibilità di un identificatore: indicazione della parte del programma in cui tale identificatore può essere usato • Ambiente globale del programma insieme di identificatori (tipi, costanti, variabili) definiti nella parte dichiarativa globale regole di visibilità: visibili a tutte le funzioni del programma • Ambiente locale di una funzione insieme di identificatori definiti nella parte dichiarativa locale e degli identificatori definiti nella testata (parametri formali) Regole di visibilità: visibili alla funzione e ai blocchi in essa contenuti • Ambiente di blocco insieme di identificatori definiti nella parte dichiarativa locale del blocco regole di visibilità: visibili al blocco e ai blocchi in esso contenuti 43 Mascheramento (shadowing) DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE • Un nome ridefinito all’interno di un blocco nasconde il significato precedente di quel nome • Tale significato è ripristinato all’uscita del blocco più interno • In caso di omonimia di identificatori in ambienti diversi è visibile quello dell’ambiente più “vicino” 44 Mascheramento (shadowing) DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE • Un nome ridefinito all’interno di un blocco nasconde il significato precedente di quel nome • Tale significato è ripristinato all’uscita del blocco più interno • In caso di omonimia di identificatori in ambienti diversi è visibile quello dell’ambiente più “vicino” 45 Visibilità DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE char g1, g2, g3; main() { int a, b; … {/*blcco1*/ double a,c; } … } void f1(){ … {/*blocco2*/ char a,d; } … {/*blocco3*/ float d … } } g1,g2,g3 a,b Livello globale main a,c blocco1 f1 a,d blocco2 d blocco3 46 Esempi DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE int x; f() { int y; y=1; } int x; g(int y, char z) { int k; int l; … } f(int x) { int x; } • La visibilità di y si estende dal punto di dichiarazione fino alla fine del blocco di appartenenza • y e z locali alla funzione g,con visibilità nel blocco racchiuso da parentesi graffe • k e l hanno la stessa visibilità • Errata! Si tenta di definire due volte la variabile locale x nello stesso blocco 47 La calcolatrice! DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE 48 La calcolatrice? DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Umh…. 49 La calcolatrice! DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Umh…. Meglio! 50 La calcolatrice! DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE • Problema Si scriva un programma in C che, dati due numeri, permette all’utente di calcolarne la somma, sottrazione, moltiplicazione, e la divisione tra essi • L’utente, per ogni coppia di numeri inseriti, potrà eseguire una e una sola operazione 51 Fonti per lo studio + Credits DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE • Fonti per lo studio • Credits Gianluca Palermo