DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Funzioni e Procedure Marco D. Santambrogio – [email protected] Ver. aggiornata al 21 Marzo 2014 Info di servizio 1 DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE • Vi siete dimostrati volenterosi, quindi teniamo la divisione proposta da voi Questa mattina è arrivato l’ultimo gruppo per lo scambio! 2 Info di servizio 1 DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE 3 Info di servizio 2 DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE • Il lab di lunedì 24 Marzo inizierà alle 3pm invece che alle 3.30pm 4 Info di servizio 3 DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE • Mercoledì 3 Aprile, avete lezione prima di IEIM (10.15am) • Vorrei verificare la possibilità, solo per il 3 Aprile di iniziare alle 9.30am e finire alle 11am 5 Info di servizio 4 DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE • Nuova pagina dei tool! • Caricati dei video su Come installare la VM Come usare Code::Blocks Come scrivere il primo programma http://home.deib.polimi.it/santambr/dida/ie im/2014/tools/video.htm 6 Info di servizio 5 DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE • Progetti alternativi di Informatica Ven 7am – 9am Quando il Ven non fosse possibile (ponti, scioperi, etc.): Gio 8.30am – 10am • Calendario online sul sito del corso 7 Info di servizio 6 DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE • Il NECST lab organizza visite ad altri centri di ricerca Avvicinarsi a/conoscere nuove realtà di ricerca Networking • Centro di Super-computing Svizzero http://www.cscs.ch Data candidata: 22 Aprile 2014 Se interessati, scrivere a me :) 8 DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Obiettivi DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE • Funzioni • Scope delle variabili 10 La calcolatrice? DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Umh…. Meglio! 11 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 12 Prima osservazione: i dati! DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE • Definizione dei dati su cui devo lavorare Quanti dati mi servono? Di che tipo devono essere? Come gestisco l’operazione? 13 Ragioniamo sul fIusso DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE • Inserire i dati (numeri e operazione) • Verificare che l’inserimento dei dati sia corretto • Sulla base dell’operazione selezionata, eseguire la funzione richiesta • Mostrare il risultato Questo NON e’ un algoritmo!!!! -Non e’ “non ambiguo” -I passi non sono atomici 14 Primo compito per casa DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Scrivere l’algoritmo che risolve il problema in esame! 15 Una prima soluzione DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Problema con i char 16 Una 1ma sol corretta ;) DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE E qui cosa succede? 17 IF annidati DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE 18 Osservazioni DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE • Quando abbiamo ragionato sul flusso, abbiamo detto: Sulla base dell’operazione selezionata, eseguire la funzione richiesta • Quali sono le funzioni che potremmo definire? somma, sottrazione, divisione e moltiplicazione • In C, queste vengo chiamate anche sottoprogrammi 19 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) 20 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 21 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 l’invocazione della funzione associa al nome della funzione il valore del risultato calcolato dal sottoprogramma • Sottoprogrammi di tipo funzionale (funzioni) possono essere considerati una astrazione di valore • 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); risultato = somma(A,B); /* procedura*/ /* funzione*/ 22 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: dichiarazione del prototipo della funzione (nella sezione dichiarativa) definizione della funzione invocazione o chiamata della funzione (nel codice che necessita della funzioni) 23 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>); 24 Definizione del sottoprogramma DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE • La definizione del sottoprogramma 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 25 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) 26 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 27 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 28 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 29 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 è float circonferenza (float raggio); Invocare questa funzione significa eseguire l’istruzione c = circonferenza(5.0); 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 30 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 31 Pausa… DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Pausa per 10’ 32 La calcolatrice con le funzioni - prototipi DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE I prototipi Le chiamate 33 La calcolatrice con le funzioni – le funzioni DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE 34 Esempio: passaggio per valore DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Ambiente della funzione somma d1, d2 } Quando invoco la funzione in d1 e d2 vengono copiati i valori di valore1 e valore 2 /* nel main */ float valore1, valore2; float risultato; risultato=somma(valore1,valore2); valore1, valore2 risultato Quando la funzione termina il valore di risultato in smma viene copiato in risultato nel main risultato Ambiente della funzione main 35 Scope delle variabili DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE 36 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 37 Esempi DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE int x; f() { int y; y=1; } • La visibilità di y si estende dal punto di dichiarazione fino alla fine del blocco di appartenenza int x; g(int y, char z) { int k; int l; … } • y e z locali alla funzione g,con visibilità nel blocco racchiuso da parentesi graffe f(int x) { int x; } • k e l hanno la stessa visibilità • Errata! Si tenta di definire due volte la variabile locale x nello stesso blocco 38 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” 39 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 40 Torniamo alla calcolatrice DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Verifichiamo gli ingressi? 41 Non possiamo fare di meglio? DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE 42 Selezione multipla DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE • Operazione e’ uguale in tutti i casi Non posso evitare di ripetere operazione == 43 Lo switch DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE • Lo switch ci permette una alternativa al come selezionare la prossima istruzione da eseguire • Lo switch valuta una espressione, quindi cerca di confrontare un valore con diversi possibili cases switch ( expression ){ case value1 : statement-list1 case value2 : statement-list2 case value3 : statement-list3 case ... } 44 Lo switch DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE • Ciascun case contiene un valore (value) e una lista di istruzioni (statement) • Il flusso di controllo si traferisce attraverso tutte le istruzioni, partendo dal primo case che “corrisponde” switch ( expression ){ case value1 : statement-list1 case value2 : statement-list2 case value3 : statement-list3 case ... } 45 La calcolatrice con lo switch DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE 46 Piccolo problema… DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE 47 Perche’??? DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Flusso 48 Lo switch ed il break DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE 49 Zoom DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Flusso 50 Lo switch: default DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE 51 Fonti per lo studio + Credits DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE • Fonti per lo studio • Credits Gianluca Palermo