Funzioni e. Alessandra Giordani Mercoledì 16 maggio 2012

Documenti analoghi
C: panoramica. Violetta Lonati

Funzioni in C. Funzioni. Strategie di programmazione. Funzioni in C. Come riusare il codice? (2/3) Come riusare il codice? (1/3)

Strategie di programmazione

Elementi lessicali. Lezione 4. La parole chiave. Elementi lessicali. Elementi lessicali e espressioni logiche. Linguaggi di Programmazione I

Linguaggio C. Generalità sulle Funzioni. Variabili locali e globali. Passaggio di parametri per valore.

Linguaggio C: le funzioni. Introduzione e sintassi

Lezione 9: Puntatori a funzioni. Tipi enumerativi e orientati ai bit

Unità Didattica 4 Linguaggio C. Vettori. Puntatori. Funzioni: passaggio di parametri per indirizzo.

Funzioni, Stack e Visibilità delle Variabili in C

Linguaggio C: le funzioni. Introduzione e sintassi

Programmazione (imperativa)

Complementi. - Ridefinizione di tipo - - Costrutto switch - - Programmazione su più file - - Parametri della funzione main - Funzione system -

Esercitazione 11. Liste semplici

Introduzione al linguaggio C Puntatori

Ottenere una modifica del parametro attuale

Corso di Fondamenti di Programmazione canale E-O. Un esempio. Funzioni ricorsive. La ricorsione

Corso di Fondamenti di Informatica

Funzioni. Unità 1. Domenico Daniele Bloisi. Corso di Fondamenti di Informatica Ingegneria delle Comunicazioni BCOR Ingegneria Elettronica BELR

Il linguaggio C Il linguaggio C. Caratteristiche del C. Caratteristiche del C. Linguaggi di Programmazione I. Ferdinando Cicalese

Parametri by reference. Funzioni. Passaggio dei parametri. Parametri by reference. Soluzione. Problemi

Linguaggio C - sezione dichiarativa: costanti e variabili

Definizione di metodi in Java

Il linguaggio C. Puntatori e dintorni

Tipi di dati scalari (casting e puntatori) Alessandra Giordani Lunedì 10 maggio 2010

Corso di Fondamenti di Informatica. Puntatori e Allocazione Dinamica

Introduzione. Le funzioni in C. Funzioni. Cosa succede

LABORATORIO di INFORMATICA

Il linguaggio C. Notate che...

Funzioni in C. Architetture multi-componente

Indirizzi e tipi puntatore a

Università degli Studi di Cassino Corso di Fondamenti di Informatica Tipi strutturati: Stringhe. Anno Accademico 2010/2011 Francesco Tortorella

Strutture Dati Dinamiche

Le funzioni. Fondamenti di programmazione

nome (lista_parametri) Funzioni funzioni predefinite: sqrt(x) log(x) usare queste funzioni significa: specificare il valore degli argomenti

Definizione di classi. Walter Didimo

1 PANORAMICA SUL LINGUAGGIO C

JavaScript Core Language. Prof. Francesco Accarino IIS Atiero Spinelli Sesto San Giovanni via leopardi 132

Unità Didattica 1 Linguaggio C. Fondamenti. Struttura di un programma.

ERRATA CORRIGE. void SvuotaBuffer(void); void SvuotaBuffer(void) { if(getchar()!=10) {svuotabuffer();} }

Tipi di dati strutturati e Linguaggio C. Record o strutture Il costruttore struct in C

Funzioni. (Passaggio dei parametri per riferimento) Passaggio dei parametri

Laboratorio di Informatica Ingegneria Clinica Lezione 14-16/11/2011

Linguaggio C I puntatori

Perché il linguaggio C?

Esercitazione 5. Procedure e Funzioni Il comando condizionale: switch

FUNZIONI COME COMPONENTI SW FUNZIONI COME COMPONENTI SW FUNZIONI MODELLO CLIENTE/SERVITORE

Le strutture. Una struttura C è una collezione di variabili di uno o più tipi, raggruppate sotto un nome comune.

I puntatori sono tipi di variabili il cui valore rappresenta un indirizzo della memoria.

Uso avanzato dei puntatori Allocazione dinamica della memoria

Programmare in C. Maurizio Palesi Salvatore Serrano. Valori. Operazioni. Un insieme di valori del tipo. Per operare su tali valori Tipi

Precedenza e associatività. Complementi sul C - 2. Esempi. Esempi

Esercizio 2 (punti 7) Dato il seguente programma C: #include <stdio.h> int swap(int * nome, int length);

Si possono applicare solo a variabili (di tipi interi, floating o puntatori), ma non a espressioni generiche (anche se di questi tipi).

Esercizio 1: funzione con valore di ritorno di tipo puntatore

L'Allocazione Dinamica della Memoria nel linguaggio C

Funzioni di libreria. Richiedono tutte. #include <math.h> fabs(x) sqrt(x) pow(x,a) exp(x) log(x)

Le funzioni, e le istruzioni di input/output

Ogni variabile in C è una astrazione di una cella di memoria a cui corrisponde un nome, un contenuto e un indirizzo.

Unità Didattica 3 Linguaggio C. Generalità sulle Funzioni. Variabili locali e globali. Passaggio di parametri per valore.

Lezione 8 Struct e qsort

uguale livello gerarchico non vi sono funzioni più importanti di altre main main

Concetto di Funzione e Procedura METODI in Java

I puntatori. Un puntatore è una variabile che contiene l indirizzo di un altra variabile. puntatore

La gestione della memoria dinamica Heap

Unità F1. Obiettivi. Il linguaggio C. Il linguaggio C++ Linguaggio C. Pseudolinguaggio. Primi programmi

Esercizi Programmazione I

Utilizza i tipi di dati comuni a tutto il framework.net Accesso nativo ai tipi.net (C# è nato con.net) Concetti fondamentali:

Non ci sono vincoli sul tipo degli elementi di un vettore Possiamo dunque avere anche vettori di

Scope delle variabili e passaggio parametri. Danilo Ardagna Politecnico di Milano

#include <iostream> // libreria che gestisce flusso di input e output. using namespace std; // uso di librerie standard del C++

Scrittura formattata - printf

Struct, enum, Puntatori e Array dinamici

Il sistema C è formato dal linguaggio C, dal preprocessore, dal compilatore, dalle librerie e da altri strumenti di supporto.

Puntatori. Fondamenti di Programmazione

Tipi di dato semplici

Associazione Variabile-Indirizzo

Esercizi. La funzione swapint() primo tentativo

Esercitazione 6. Array

Lezione 8. Sottoprogrammi

Input/Output di numeri

Introduzione al linguaggio C

System call per la gestione di processi

Input/Output. Lettura e scrittura Caratteri e Stringhe: Terminale e file. Input/output. caratteri stringhe formattato ascii binari

Qualsiasi programma in C++ segue lo schema:

Informatica 1 Tipi e dichiarazioni in C++ C++ - Tipi e dichiarazioni 1

Capitolo 5 - Funzioni

Fondamenti di Informatica 6. Algoritmi e pseudocodifica

7 - Programmazione procedurale: Dichiarazione e chiamata di metodi ausiliari

Corso di Reti di Calcolatori L-A

9 - Array. Programmazione e analisi di dati Modulo A: Programmazione in Java. Paolo Milazzo

Appunti del corso di Informatica 1. 6 Introduzione al linguaggio C

Funzioni, puntatori, strutture. Lab. Calc. AA 2006/07

Tempo di vita e scope delle variabili

Puntatori. Un puntatore contiene un numero che indica la locazione di memoria dove è presente la variabile puntata

Passare argomenti al programma

Appunti del corso di Informatica 1 (IN110 Fondamenti) 6 Introduzione al linguaggio C

Introduzione a Matlab

Funzioni. Il modello console. Interfaccia in modalità console

RICORSIONE. Informatica B - A.A. 2013/2014

Lezione 21 e 22. Valentina Ciriani ( ) Laboratorio di programmazione. Laboratorio di programmazione. Lezione 21 e 22

Transcript:

Funzioni e passaggio parametri Alessandra Giordani agiordani@disi.unitn.it Mercoledì 16 maggio 2012 http://disi.unitn.it/~agiordani/

Cosa vedremo oggi Le funzioni Il passaggio dei parametri Le dichiarazioni e le chiamate I prototipi di funzione La ricorsione La funzione main() 2

Il passaggio dei parametri 1 Gli argomenti di una funzione costituiscono il mezzo per passare dati al sottoprogramma In C, gli argomenti sono passati per valore (by value), ovvero viene passata una copia dell argomento la funzione chiamata può modificare il valore della copia, ma non dell argomento originale Parametro attuale Parametro attuale Passaggio per indirizzo Indirizzo del parametro Passaggio per valore Valore del parametro Parametro formale Parametro formale Nella chiamata per indirizzo, i parametri formale ed attuale fanno riferimento alla stessa area di memoria; nel caso di chiamata per valore, il parametro formale è una copia del parametro attuale L argomento passato viene detto parametro attuale, mentre la copia ricevuta è il parametro formale 3

Il passaggio dei parametri 2 Dato che in C gli argomenti vengono passati per valore, la funzione chiamata può modificare il parametro formale, senza che ciò si ripercuota sul parametro attuale La funzione printf() non stampa 3, ma 2, in quanto il parametro formale b in f() è una copia del parametro attuale a #include <stdio.h> #include <stdlib.h> main() extern void f(); int a=2; f(a); /* passa una copia di a ad f() */ printf( %d\n, a); exit(0); void f(int b) b = 3; 4

Il passaggio dei parametri 3 In C, il parametro attuale, usato nella chiamata, ed il corrispondente parametro formale, usato nella definizione della funzione, vengono associati, indipendentemente dai nomi adottati Il primo parametro attuale viene a corrispondere al primo parametro formale, il secondo parametro attuale al secondo parametro formale, etc. È necessario che i tipi dei parametri attuali coincidano con quelli dei corrispondenti parametri formali Inoltre, se occorre che una funzione modifichi il valore di un oggetto, è necessario passare un puntatore all oggetto ed assegnare all oggetto un valore mediante l operatore di accesso all indirizzo contenuto nel puntatore 5

Il passaggio dei parametri 4 void scambia(int *x, int *y) main() int temp; temp = *y; *y = *x; *x = temp; int a=2, b=3; Esempio scambia(&a, &b) printf( a=%d\t b=%d\n, a, b); L esecuzione del programma produce a=3 b=2 Nota: Il passaggio degli argomenti per valore chiarisce la necessità di usare l operatore indirizzo di, &, nelle chiamate alla funzione scanf() : se venissero passate direttamente le variabili, scanf() non potrebbe modificarle; passandone gli indirizzi, scanf() può accedere alle variabili ed assegnare i valori letti 6

Le dichiarazioni e le chiamate Le funzioni possono apparire in un programma in una delle tre forme seguenti: Definizione dichiarazione, che definisce il numero ed il tipo degli argomenti ed il comportamento della funzione Allusione a funzione dichiarazione di una funzione definita altrove, che specifica la natura del valore restituito dalla funzione (con la prototipazione possono essere specificati anche il numero ed il tipo degli argomenti) Chiamata di funzione invocazione di una funzione, che ha come effetto il trasferimento del controllo del programma alla funzione chiamata; al termine della funzione chiamata, l esecuzione riprende dall istruzione (del programma chiamante) immediatamente successiva alla chiamata completata 7

La sintassi della definizione di funzione Nome funzione ( ), Tipo restituito Argomento Corpo funzione Dichiarazione argomento È possibile specificare un numero qualsiasi di argomenti Se non altrimenti specificato, il tipo restituito si intende int Se la funzione non restituisce alcun valore, deve essere specificato void come tipo restituito 8

La dichiarazione degli argomenti La dichiarazione degli argomenti segue le stesse regole delle dichiarazioni di variabili, con le seguenti eccezioni: Oggetti di tipo char e short sono convertiti in int, mentre oggetti di tipo float sono convertiti in double (con la prototipazione, le conversioni automatiche possono essere evitate) Un parametro formale dichiarato come array viene convertito in un puntatore ad un oggetto del tipo base dell array In una dichiarazione, non può essere presente una inizializzazione La dichiarazione di un argomento può essere omessa: il tipo dell argomento è int per default 9

I valori restituiti 1 Le funzioni possono restituire direttamente un solo valore, mediante l istruzione return Il valore restituito può essere di tipo qualunque, eccetto array o funzione È possibile restituire indirettamente più di un valore mediante la restituzione di un puntatore ad un tipo composto Inoltre, una struttura o un unione possono essere restituite direttamente (anche se ciò è sconsigliato per motivi di efficienza) La sintassi di un istruzione return è return Espressione 10

I valori restituiti 2 In una funzione possono essere presenti un numero qualsiasi di istruzioni return: la prima incontrata nell evolvere del flusso restituisce il controllo al programma chiamante Il valore restituito deve essere compatibile con il tipo della funzione Se non esiste alcuna istruzione return, il controllo del programma ritorna alla funzione chiamante quando si raggiunge la parentesi graffa chiusa che conclude il corpo della funzione: il valore restituito è indefinito Un istruzione return senza espressione può essere utilizzata (senza effetti collaterali) per restituire il controllo al chiamante dall interno di una funzione dichiarata void 11

I valori restituiti 3 Esempio: valori restituiti da return, implicitamente convertiti dal compilatore, per una funzione che dovrebbe restituire un float float f() float f2; int a; char c; f2 = a; /* OK, conversione implicita di a in float */ return a; /* OK, conversione implicita di a in float */ f2 = c; /* OK, conversione implicita di c in float */ return c; /* OK, conversione implicita di c in float */ 12

Le allusioni a funzione Un allusione a funzione è una dichiarazione di una funzione definita altrove: serve principalmente per informare il compilatore sul tipo restituito dalla funzione Poiché, se non specificato, il tipo di una funzione è int per default, le allusioni a funzioni intere potrebbero essere omesse È comunque buona norma inserire le allusioni a tutte le funzioni possibilità di determinare tutte le funzioni richiamate dalla lettura delle frasi dichiarative, senza dover scandire tutto il sorgente 13

I prototipi di funzione 1 I prototipi di funzione (introdotti nel C++) consentono di includere nelle allusioni la specifica del tipo degli argomenti Il compilatore può controllare che il tipo dei parametri attuali nelle chiamate di funzione sia compatibile con il tipo dei parametri formali specificati nell allusione Le conversioni automatiche non sono più necessarie (e non vengono effettuate) migliorando le prestazioni dei programmi che utilizzano pesantemente interi corti e floating point in singola precisione Esempi: extern void func(int, float, char *); extern void func(int a, float b, char *pc); I due prototipi sono uguali: i nomi degli argomenti aumentano la leggibilità, ma non viene loro riservata memoria, né si creano conflitti con variabili omonime 14

I prototipi di funzione 2 La prototipazione assicura che venga passato il numero esatto di argomenti e impedisce il passaggio di argomenti che non possono essere convertiti implicitamente nel tipo corretto In assenza di argomenti, occorre specificare il tipo void Se una funzione gestisce un numero di argomenti variabile, può essere utilizzata la forma Esempio: il prototipo di printf() è: int printf(const char *format, ); che asserisce che il primo elemento è una stringa di caratteri costante, seguita da un numero non specificato di argomenti 15

Le chiamate di funzione 1 Una chiamata di funzione, detta anche invocazione di funzione, trasferisce il controllo del programma alla funzione specificata Nome funzione (, ) Argomento Una chiamata di funzione è un espressione e può quindi comparire ovunque sia ammessa un espressione Salvo il caso in cui il tipo restituito è void, il valore restituito dalla funzione viene sostituito alla chiamata Esempio: se f() restituisce 1 a = f()/3; a = 1/3; 16

Le chiamate di funzione 2 I valori di ritorno vengono ignorati solo quando la funzione restituisce void Se si desidera ignorare deliberatamente un valore restituito, è buona norma convertirlo esplicitamente in void (void) f(); f(); Questa regola è stata trasgredita ogni volta che sono state usate le funzioni printf() e scanf(), che restituiscono valori interi (in particolare l intero restituito da printf() /scanf() è il numero di oggetti scritti/letti) 17

Le conversioni automatiche degli argomenti 1 In mancanza di prototipazione, tutti gli argomenti scalari di dimensioni minori di un int vengono convertiti in int e gli argomenti float vengono convertiti in double Se il parametro formale è dichiarato essere un char o uno short o un float, anche la funzione chiamata, che si aspetta di ricevere int o double, rispettivamente, riconverte ai tipi più corti Ogni volta che viene passato come parametro un char, uno short o un float vengono effettuate due conversioni, nel programma chiamante e nella funzione chiamata 18

Le conversioni automatiche degli argomenti 2 Esempio char a; short b; float c; foo(a,b,c); /* a e b vengono convertiti in interi * c viene convertito in double */ foo(x,y,z) char x; /* L argomento ricevuto è convertito da int a char */ short y; /* L argomento ricevuto è convertito da int a short */ float z; /* L argomento ricevuto è convertito da double a float */ Nell ipotesi di coincidenza fra i tipi dei parametri formali ed attuali, gli argomenti vengono passati correttamente Tuttavia le conversioni automatiche possono far diminuire l efficienza del programma La prototipazione evita le conversioni automatiche degli argomenti 19

La ricorsione 1 Una funzione è ricorsiva se richiama se stessa void recurse() static count=1; printf( %d\n, count); count++; recurse(); main( ) recurse(); La funzione stampa il valore di count (che è 1, inizialmente), incrementa count ed infine richiama se stessa; la seconda volta count vale 2 il procedimento viene ripetuto all infinito Nei programmi ricorsivi, è necessario prevedere una condizione di terminazione, altrimenti il programma non si interrompe 1 2 3 Infine, il calcolatore esaurirà la memoria disponibile per lo stack ed il programma verrà interrotto (con segnalazione di errore) 20

La ricorsione 2 void recurse() static count=1; if (count > 3) return; else printf( %d\n, count); count++; recurse(); main() extern void recurse(); recurse(); La condizione che conclude la ricorsione è detta condizione base Se count avesse durata automatica anziché fissa, il programma non terminerebbe mai perché, ad ogni nuova chiamata, count verrebbe re inizializzata ad 1 Nella ricorsione, ad ogni nuova chiamata di funzione, il compilatore crea un nuovo insieme completo di variabili automatiche che, pur avendo lo stesso nome, occupano aree di memoria distinte 21

Il valore restituito da chiamate ricorsive L uso di variabili fisse è una delle modalità di controllo della ricorsione, l altra è l uso di valori d ingresso Esempio: Calcolo della somma degli interi da 1 ad n int sum(n) int n; if (n <= 1) return n; else return (n+sum(n 1)); sum(5) 15 5+sum(4) 4+sum(3) 3+sum(2) 10 6 3 2+sum(1) 1 22

Esempi di funzioni ricorsive 1 1) Fattoriale int fatt (n) int n; int t, result; result = 1; for (t=2; t<=n; t++) result = t; return result; int rfatt (n) int n; if (n==0) return 1; else return (n rfatt(n 1)); Funzione ricorsiva Funzione non ricorsiva 23

La funzione main() 1 Tutti i programmi C devono contenere una funzione, il main(), che è la prima eseguita all interno di un programma e la cui conclusione determina la fine del programma Il compilatore gestisce main() come le altre funzioni, con l eccezione che, al momento dell esecuzione, l ambiente deve fornire due argomenti: argc, è un int che rappresenta il numero di argomenti presenti sulla linea di comando all atto dell invocazione del comando argv, è un array di puntatori agli argomenti della linea di comando 24

La funzione main() 2 Un puntatore al comando stesso è memorizzato in argv[0]: nell esempio, è stato utilizzato l operatore di incremento prefisso per non visualizzare il comando main (int argc, char *argv[]) /* visualizza argomenti della linea di comando */ while ( argc > 0) printf( %s, *++argv); printf( \n ); exit(0); Nei sistemi UNIX esiste un programma simile, detto echo, che visualizza gli argomenti della linea di comando Quando viene eseguito un programma, gli argomenti della linea di comando devono essere separati da uno o più caratteri di spaziatura 25

La funzione main() 3 Gli argomenti della linea di comando sono sempre passati a main() come stringhe di caratteri Se rappresentano valori numerici, devono essere convertiti esplicitamente Esistono le apposite funzioni della libreria di run time: atoi() converte una stringa in int, atof() converte una stringa in float, etc. #include <math.h> #include <stdlib.h> main (int argc, char *argv[]) float x, y; if (argc < 3) printf( Uso: power <number>\n ); printf( Restituisce arg1 ^ arg2\n ); return; x = atof(*++argv); y = atof(*++argv); printf( %f\n, pow(x, y)); 26