Funzioni. Moreno Marzolla Dipartimento di Informatica Scienza e Ingegneria (DISI) Università di Bologna

Documenti analoghi
Funzioni. Libro cap. 5. Moreno Marzolla Dipartimento di Informatica Scienza e Ingegneria (DISI) Università di Bologna

Algoritmi su Array. Moreno Marzolla Dipartimento di Informatica Scienza e Ingegneria (DISI) Università di Bologna

Funzioni in C. Emilio Di Giacomo

Tipi e Valori. Moreno Marzolla Dipartimento di Informatica Scienza e Ingegneria (DISI) Università di Bologna

Algoritmi su Array. Moreno Marzolla Dipartimento di Informatica Scienza e Ingegneria (DISI) Università di Bologna

Funzioni in C. Informatica Generale - Funzioni in C Versione 1.0, aa p.1/25

Esercizi sulle istruzioni del C (Parte I)

int main(){ int numero; /* numero di cui voglio calcolare il fattoriale */ int fatt; /* memorizzo il fattoriale di numero */ int somma=0;

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

Gli array Libro cap. 6 Moreno Marzol a Dipartimento di Informatica Scienza e Ingegneria (DISI) Università di Bologna

Strategie di programmazione

Elementi DI INFORMATICA. Linguaggio C

Istruzioni Condizionali

Linguaggio C: Espressioni

Linguaggio C: Espressioni

Tipi e Valori. Moreno Marzolla Dipartimento di Informatica Scienza e Ingegneria (DISI) Università di Bologna

Laboratorio di informatica Ingegneria meccanica

Passaggio dei parametri

Passaggio dei parametri. Passaggio dei parametri

Linguaggio C: Espressioni

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

Il linguaggio C Strutture

Linguaggio C: le funzioni

Passaggio dei parametri Per valore Il valore viene copiato dall environment esterno all environment della funzione o procedura Cambiamenti dei paramet

Istruzioni di Ciclo. Unità 4. Domenico Daniele Bloisi

Istruzioni Condizionali

Il linguaggio C Strutture

FUNZIONI. Esempi (pseudo-c): dare un nome a una espressione rendere tale espressione parametrica. float f(){ * sin(0.75); } float f1(int x) {

Linguaggio C: strutture di controllo

Una funzione riceve dati di ingresso in corrispondenza ai parametri

Introduzione al C. Lez. 2. Funzioni e Puntatori

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

Istruzioni di Controllo in C. Emilio Di Giacomo

Linguaggio C: strutture di controllo

FUNZIONI FUNZIONI COME COMPONENTI SW

FUNZIONI FUNZIONI COME COMPONENTI SW

Istruzioni di Ciclo. Unità 4. Corso di Laboratorio di Informatica Ingegneria Clinica BCLR. Domenico Daniele Bloisi

Funzioni e. Alessandra Giordani Mercoledì 16 maggio 2012

Ambienti di Programmazione per il Software di Base

Istruzioni di ciclo. Unità 4. Corso di Laboratorio di Informatica Ingegneria Clinica BCLR. Domenico Daniele Bloisi

FUNZIONI. Ivan Lanese

ESERCIZIO: Analisi di un programma. Dato il seguente programma C:

Variabili e Funzioni. Informatica 1 / 19

DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE. Funzioni e Procedure. Marco D. Santambrogio Ver. aggiornata al 11 Marzo 2014

Funzioni. Unità 1. Domenico Daniele Bloisi. Corso di Programmazione e Metodi Numerici Ingegneria Aerospaziale BAER

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

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

2 Operatori matematici e costrutto if

Astrazione Funzionale

Capitolo 5 - Funzioni

Funzioni. Unità 1. Corso di Laboratorio di Informatica Ingegneria Clinica BCLR. Domenico Daniele Bloisi Alberto Pretto

FUNZIONI. attribuire un nome ad un insieme di istruzioni parametrizzare l esecuzione del codice

Le Funzioni in C. Fondamenti di Informatica Anno Accademico 2010/2011. Corso di Laurea in Ingegneria Civile Politecnico di Bari Sede di Foggia

ISTRUZIONI DI ITERAZIONE

Introduzione al C. Lez. 2 Funzioni e Puntatori

Funzioni. (Dichiarazione, Prototipo, Chiamata) Concetto di funzione

Matrici. Parte 7. Domenico Daniele Bloisi. Corso di Fondamenti di Informatica Ingegneria delle Comunicazioni BCOR Ingegneria Elettronica BELR

Controllo del flusso

cout << "Inserisci un numero:" << endl; cin >> n; ris = n*2; cout << "Il doppio di " << n << " e " << ris << endl;

Definizione di classi. Walter Didimo

Corso di Laurea Ingegneria Civile Fondamenti di Informatica. Dispensa 15 Definizione di metodi. Carla Limongelli Maggio Definizione di metodi 1

Cominciamo con un esempio... Utilizzando un sottoprogramma 16/12/2017

Preprocessore, linker e libreria standard

Tecniche della Programmazione, lez.9

PROGRAMMAZIONE: I sottoprogrammi

METODI in Java. Prof.Angela Bonifati. Metodi e Sottoprogrammi

3 Costrutti while, for e switch

Introduzione al C. Unità 5 Funzioni

Corso di Informatica A.A

passaggio di vettori come parametri di funzioni/procedure. I Quando si passa un vettore come parametro ad una funzione, in

Tutorato Elementi di Informatica 2018

For e do. Parte 4. Domenico Daniele Bloisi. Corso di Fondamenti di Informatica Ingegneria delle Comunicazioni BCOR Ingegneria Elettronica BELR

Funzioni. Unità 5. Corso di Laboratorio di Informatica Ingegneria Clinica BCLR. Domenico Daniele Bloisi

Il linguaggio C Puntatori

Le classi in java. Un semplice programma java, formato da una sola classe, assume la seguente struttura:

Corso di Laboratorio di Sistemi Operativi A.A

Linguaggio C. strutture di controllo: strutture iterative. Università degli Studi di Brescia. Docente: Massimiliano Giacomin

Concetto di Funzione e Procedura METODI in Java

Dati due punti sul piano calcolare la loro distanza

LEZIONE 1 LE BASI DEL LINGUAGGIO C

LB5 FUNZIONI cap. 7 del testo

Perché il linguaggio C?

ESPRESSIONI. Ivan Lanese

Il linguaggio C. Istruzioni, funzioni, dati strutturati

Funzioni. Unità 1. Corso di Laboratorio di Informatica Ingegneria Clinica BCLR. Domenico Daniele Bloisi

I Metodi. Fondamenti di Informatica A-K

Esercizio 1 Liste: calcolo del numero di elementi ripetuti in una lista

Funzioni di libreria. KP pp , , , 589, DD pp , , ,

Allocazione dinamica della memoria

Do...While() Break Continue Concetto di Funzione e Procedura METODI in Java

Funzioni, Stack e Visibilità delle Variabili in C

Tempo di vita e scope delle variabili

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

For e do. Unità 4. Corso di Laboratorio di Informatica Ingegneria Clinica BCLR. Domenico Daniele Bloisi

Funzioni in C. Fondamenti di Informatica. Daniele Loiacono

Transcript:

Funzioni Moreno Marzolla Dipartimento di Informatica Scienza e Ingegneria (DISI) Università di Bologna http://www.moreno.marzolla.name/

Funzioni 2

Ringraziamenti prof. Stefano Mizzaro, Università di Udine http://users.dimi.uniud.it/~stefano.mizzaro/ Funzioni 3

Funzione Intuitivamente definita come un blocco di istruzioni con un nome Può accettare un certo numero di parametri (anche nessuno) Può restituire un risultato, oppure nessun risultato /* demo-funzioni.c */ #include <stdio.h> double somma(double a, double b) int s = a + b; return s; void stampa(double v) printf("v=%f\n", v); return; /* opzionale */ void saluta( void ) printf("ciao\n"); saluta(); stampa(somma(3.0, 4.0/2.0)); Funzioni 4

Funzione Se la funzione ritorna "void" (cioè nessun risultato) il return è facoltativo se manca, la funzione termina quando l'esecuzione arriva in fondo al corpo Se la funzione ritorna un valore è obbligatorio return expr expr è una espressione il cui valore è quello che verrà restituito dalla funzione /* demo-funzioni.c */ #include <stdio.h> double somma(double a, double b) int s = a + b; return s; void stampa(double v) printf("v=%f\n", v); return; /* opzionale */ void saluta( void ) printf("ciao\n"); saluta(); stampa(somma(3.0, 4.0/2.0)); Funzioni 5

Dichiarazione vs Definizione La dichiarazione di una funzione indica la sua segnatura Nome della funzione; tipo del risultato; tipo dei parametri Il corpo della funzione può venire omesso Una funzione può essere usata dopo che è stata dichiarata La definizione di una funzione indica cosa fa Il corpo della funzione deve essere specificato La definizione funge anche da dichiarazione Funzioni 6

Dichiarazione vs Definizione /* dich.c */ #include <stdio.h> int fattoriale(int); Dichiarazione della funzione fattoriale che accetta un parametro intero e restituisce un intero. int fat5( void ) return fattoriale(5); int fattoriale(int n) int f = 1; while (n > 1) f = f*n; n--; return f; Definizione della funzione fattoriale La funzione fattoriale() può essere usata dopo che è stata dichiarata printf("%d\n", fat5() ); Funzioni 7

Definizione delle funzioni Al di fuori del main e di altre funzioni Intestazione (prima riga) Tipo del risultato restituito (void se non restituisce un risultato) Nome della funzione Parametri e loro tipi (separati da, ) Corpo (fra graffe obbligatorie) Istruzioni return termina esecuzione della funzione return expr è obbligatorio per funzioni che restituiscono un valore Per quelle che non restituiscono un valore si può usare return senza argomento, oppure ometterlo per terminare la funzione alla fine della funzione Funzioni 8

Esecuzione di programma con funzioni L esecuzione comincia da main Anche il main è una funzione Invocazione l esecuzione passa alla funzione Associazione parametri Esecuzione istruzioni della funzione fino al return o alla fine della funzione Poi l esecuzione ritorna al chiamante, all istruzione successiva Funzioni 9

Flusso di esecuzione /* dich.c */ #include <stdio.h> int fattoriale(int); int fat5( void ) return fattoriale(5); int fattoriale(int n) int f = 1; while (n > 1) f = f*n; n--; return f; printf("%d\n", fat5() ); int fattoriale(int n) int f = 1; int fat5( void ) while (n > 1) f = f*n; return fattoriale(5); n--; return f; Funzioni 10

Parametri formali/attuali /* cotangente.c */ #include <stdio.h> #include <math.h> double tangente(double x) return (sin(x) / cos(x)); Parametro formale: usato nella definizione della funzione double cotangente (double x) return (1.0 / tangente(x)); double angolo; printf("inserisci angolo "); scanf("%lf", &angolo); printf("la cotangente di %f e' %f\n", angolo, cotangente(angolo)); Parametro attuale: specifica su quali Funzioni 11 parametri la funzione deve operare

Cosa succede? /* parametri.c */ #include <stdio.h> void inc(int x) x = x + 1; int y = 0; inc(y); printf("%d\n", y); Output 0 Funzioni 12

Perché Il passaggio di parametri avviene per valore Il valore del parametro attuale viene copiato nel parametro formale Ma sono due variabili diverse Quindi ogni modifica al parametro formale non si riflette sul parametro attuale Vedremo più avanti il meccanismo da usare perché una funzione possa modificare i parametri attuali Funzioni 13

Esempio Scrivere una funzione che determina se un numero n positivo è un numero primo oppure no La funzione riceve come parametro un intero n e restituisce 1 se n è primo, 0 altrimenti 1 non è un numero primo 2 è un numero primo Scrivere anche un main() che invoca la funzione in modo appropriato Funzioni 14

Idea Guardo tutti i numeri i minori di n Escluso 1 Basta arrivare a n Controllo per ogni i se è un divisore di n Se trovo un divisore di n, allora n non è primo Ne basta uno; mi fermo subito Se non ne trovo, n è primo Devo guardarli tutti; esco solo alla fine Funzioni 15

#include <stdio.h> SBAGLIATO /* Dato un intero n > 0, restituisce 1 se n e' primo, 0 altrimenti */ int primo(int n) int i; for (i = 2; i*i <= n; i++) if (n % i == 0) else return 1; int v; printf("inserisci un intero "); scanf("%d", &v); if ( primo(v) ) printf( %d e' un numero primo\n, v); else printf( %d NON e' un numero primo\n, v); Funzioni 16

#include <stdio.h> SBAGLIATO /* Dato un intero n > 0, restituisce 1 se n e' primo, 0 altrimenti */ int primo(int n) int i; for (i = 2; i*i <= n; i++) if (n % i == 0) else return 1; int v; printf("inserisci un intero "); scanf("%d", &v); if ( primo(v) ) printf( %d e' un numero primo\n, v); else printf( %d NON e' un numero primo\n, v); Funzioni 17

Il compilatore potrebbe aiutarci...purché abilitiamo tutti i messaggi di avvertimento (warning) come mostrato in precedenza primo.c: In function primo : primo.c:14:1: warning: control reaches end of non-void function [- Wreturn-type] ^ Funzioni 18

#include <stdio.h> Meglio, ma sempre sbagliato /* Dato un intero n maggiore di zero, restituisce 1 se n e' primo, 0 altrimenti */ int primo(int n) int i; for (i = 2; i*i <= n; i++) if (n % i == 0) /* trovato un divisore; n non primo */ return 1; /* nessun divisore; n e' primo */ int v; printf("inserisci un intero "); scanf("%d", &v); if ( primo(v) ) printf("%d e' un numero primo\n", v); else printf("%d NON e' un numero primo\n", v); Funzioni 20

Test Verifichiamo empiricamente la correttezza della funzione primo(n), testando i casi limite n = 1, n = 2 int primo(int n) SBAGLIATO int i; for (i = 2; i*i <= n; i++) if (n % i == 0) /* n non e' primo */ return 1; /* n e' primo */ Funzioni 21

Versione corretta Mettiamoci una pezza /* primo.c */ OK int primo(int n) int i; if ( n == 1 ) else for (i = 2; i*i <= n; i++) if (n % i == 0) return 1; Funzioni 22

Il meccanismo di invocazione delle funzioni Funzioni 23

Esempio a = 3, b = 2 #include <stdio.h> int sq(int x) return x * x; int sumsq(int x, int y) int sqx, sqy; sqx = sq(x); sqy = sq(y); return sqx + sqy; int a = 3, b = 2; printf("%d\n", sumsq(a, b)); Funzioni 24

Esempio a = 3, b = 2 #include <stdio.h> int sq(int x) return x * x; int sumsq(int x, int y) int sqx, sqy; sqx = sq(x); sqy = sq(y); return sqx + sqy; int a = 3, b = 2; printf("%d\n", sumsq(a, b)); Funzioni 25

Esempio a = 3, b = 2 #include <stdio.h> int sq(int x) return x * x; int sumsq(int x, int y) int sqx, sqy; sqx = sq(x); sqy = sq(y); return sqx + sqy; int a = 3, b = 2; printf("%d\n", sumsq(a, b)); x = 3, y = 2, sqx =?, sqy =? int sumsq(int x, int y) int sqx, sqy; sqx = sq(x); sqy = sq(y); return sqx + sqy; Funzioni 26

Esempio a = 3, b = 2 #include <stdio.h> int sq(int x) return x * x; int sumsq(int x, int y) int sqx, sqy; sqx = sq(x); sqy = sq(y); return sqx + sqy; int a = 3, b = 2; printf("%d\n", sumsq(a, b)); x = 3, y = 2, sqx =?, sqy =? int sumsq(int x, int y) int sqx, sqy; sqx = sq(x); sqy = sq(y); return sqx + sqy; Funzioni 27

Esempio a = 3, b = 2 #include <stdio.h> int sq(int x) return x * x; int sumsq(int x, int y) int sqx, sqy; sqx = sq(x); sqy = sq(y); return sqx + sqy; int a = 3, b = 2; printf("%d\n", sumsq(a, b)); x = 3, y = 2, sqx =?, sqy =? int sumsq(int x, int y) int sqx, sqy; x = 3 sqx = sq(x); sqy = sq(y); int sq(int x) return sqx + sqy; return x * x; Funzioni 28

Esempio a = 3, b = 2 #include <stdio.h> int sq(int x) return x * x; int sumsq(int x, int y) int sqx, sqy; sqx = sq(x); sqy = sq(y); return sqx + sqy; int a = 3, b = 2; printf("%d\n", sumsq(a, b)); x = 3, y = 2, sqx = 9, sqy =? int sumsq(int x, int y) int sqx, sqy; x = 3 sqx = sq(x); sqy = sq(y); int sq(int x) return sqx + sqy; return x * x; 9 Funzioni 29

Esempio a = 3, b = 2 #include <stdio.h> int sq(int x) return x * x; int sumsq(int x, int y) int sqx, sqy; sqx = sq(x); sqy = sq(y); return sqx + sqy; int a = 3, b = 2; printf("%d\n", sumsq(a, b)); x = 3, y = 2, sqx = 9, sqy =? int sumsq(int x, int y) int sqx, sqy; sqx = sq(x); sqy = sq(y); return sqx + sqy; Funzioni 30

Esempio a = 3, b = 2 #include <stdio.h> int sq(int x) return x * x; int sumsq(int x, int y) int sqx, sqy; sqx = sq(x); sqy = sq(y); return sqx + sqy; int a = 3, b = 2; printf("%d\n", sumsq(a, b)); x = 3, y = 2, sqx = 9, sqy =? int sumsq(int x, int y) int sqx, sqy; x = 2 sqx = sq(x); sqy = sq(y); int sq(int x) return sqx + sqy; return x * x; Funzioni 31

Esempio a = 3, b = 2 #include <stdio.h> int sq(int x) return x * x; int sumsq(int x, int y) int sqx, sqy; sqx = sq(x); sqy = sq(y); return sqx + sqy; int a = 3, b = 2; printf("%d\n", sumsq(a, b)); x = 3, y = 2, sqx = 9, sqy = 4 int sumsq(int x, int y) int sqx, sqy; x = 2 sqx = sq(x); sqy = sq(y); int sq(int x) return sqx + sqy; return x * x; 4 Funzioni 32

Esempio a = 3, b = 2 #include <stdio.h> int sq(int x) return x * x; int sumsq(int x, int y) int sqx, sqy; sqx = sq(x); sqy = sq(y); return sqx + sqy; int a = 3, b = 2; printf("%d\n", sumsq(a, b)); x = 3, y = 2, sqx = 9, sqy = 4 int sumsq(int x, int y) int sqx, sqy; sqx = sq(x); sqy = sq(y); return sqx + sqy; Funzioni 33

Esempio a = 3, b = 2 #include <stdio.h> int sq(int x) return x * x; int sumsq(int x, int y) int sqx, sqy; sqx = sq(x); sqy = sq(y); return sqx + sqy; int a = 3, b = 2; printf("%d\n", sumsq(a, b)); 13 x = 3, y = 2, sqx = 9, sqy = 4 int sumsq(int x, int y) int sqx, sqy; sqx = sq(x); sqy = sq(y); return sqx + sqy; Funzioni 34

Esempio a = 3, b = 2 #include <stdio.h> int sq(int x) return x * x; int sumsq(int x, int y) int sqx, sqy; sqx = sq(x); sqy = sq(y); return sqx + sqy; int a = 3, b = 2; printf("%d\n", sumsq(a, b)); Funzioni 35

Visibilità delle variabili Funzioni 36

Regola di visibilità delle variabili Una variabile è visibile unicamente all interno del blocco in cui è dichiarata I parametri formali funzionano come le variabili (sono visibili solo nel corpo della funzione cui si riferiscono) Blocco: da a Le variabili globali sono dichiarate al di fuori da ogni blocco e sono accessibili ovunque In qualunque punto del main() e di qualunque altra funzione Funzioni 37

Modello a contorni Utile per capire dove una variabile è visibile Un contorno (rettangolo) intorno a ogni blocco All'interno di un blocco sono visibili Tutte le variabili definite all'inizio di quel blocco Tutte le variabili definite nei blocchi che contengono quel blocco Funzioni 38

Modello a contorni: esempio int va; va void f(int vb)... for (...) int vc; if (...) int vd;... vd vc vb int ve;... ve Funzioni 39

Blocchi annidati È possibile (ma sconsigliato) definire variabili che hanno lo stesso nome di variabili già definite in un blocco più esterno Le variabili definite nel blocco interno nascondono quelle con lo stesso nome definite esternamente Vedi esempio che segue Funzioni 40

Esempio /* nascoste.c */ #include <stdio.h> int x, y; /* variabili globali */ void f( ) int x; x = 1; /* locale */ y = 1; /* globale */ printf( f(): x=%d\n, x); printf( f(): y=%d\n, y); x, y x x = 0; /* globale */ y = 0; /* globale */ f(); printf( main(): x=%d\n, x); printf( main(): y=%d\n, y); f(): x=1 f(): y=1 main(): x=0 main(): y=1 Funzioni 41

Variabili globali vs. passaggio parametri Quando possibile, usare parametri e non variabili globali È più semplice capire cosa fa una funzione Basta leggere la definizione della funzione; non serve far riferimento a tutto il resto del programma Funzioni 42

Alcune funzioni matematiche dichiarate in <math.h> double sqrt(double) Radice quadrata double exp(double x), double exp2(double x), double exp10(double x) e (base dei logaritmi naturali) elevato alla x, 2 elevato alla x, 10 elevato alla x double log(double x), double log2(double x), double log10(double x) logaritmo in base e, in base 2, in base 10 di x double sin(double x), double cos(double x), double tan(double x) seno, coseno, tangente di x double pow(double x, double y) x elevato alla y double fabs(double x) valore assoluto di x double floor(double x), double ceil(double x) arrotonda x all'intero inferiore o superiore Funzioni 43

Uso di <math.h> Le funzioni di cui al lucido precedente (e molte altre) sono solo dichiarate in math.h /* esempio-math.c : esempio di uso di alcune funzioni matematiche */ #include <stdio.h> #include <math.h> double v; for (v=0.0; v < 1.0; v += 0.1) printf("%f %f %f %f\n", v, sin(v), cos(v), tan(v)); Funzioni 44