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

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

! Intro metodi/sottoprogrammi. ! Definizione (intestazione e corpo) e uso. ! Parametri formali e attuali, associazione

Comunicazioni di servizio. I metodi - II. Dove siamo. Struttura programma Java. Visibilità (scope) Oggi. Stefano Mizzaro 1

Esercizi sulle istruzioni del C (Parte I)

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. Emilio Di Giacomo

Strategie di programmazione

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

Un programma deve essere scritto come collezione di tante piccole funzioni perché:

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

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

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

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

Elementi DI INFORMATICA. Linguaggio C

Il linguaggio C Strutture

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

Programmazione C. Funzioni e Procedure Call by value

Laboratorio di informatica Ingegneria meccanica

Linguaggio C: Espressioni

Istruzioni Condizionali

Il linguaggio C Strutture

Linguaggio C: Espressioni

Istruzioni Condizionali

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

Linguaggio C: Espressioni

Istruzioni di Controllo in C. Emilio Di Giacomo

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

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

C: primi elementi. Lezione 4

FUNZIONI. Ivan Lanese

Una funzione riceve dati di ingresso in corrispondenza ai parametri

Passaggio dei parametri. Passaggio dei parametri

Linguaggio C: strutture di controllo

Istruzioni di Ciclo. Unità 4. Domenico Daniele Bloisi

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

Definizione di funzione. <tipo> <nome_funzione> (<lista_parametri>) { <definizioni di variabili> <istruzioni> }

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

FUNZIONI FUNZIONI COME COMPONENTI SW

Passaggio dei parametri

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

Linguaggio C: strutture di controllo

Introduzione al C. Lez. 2. Funzioni e Puntatori

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

FUNZIONI FUNZIONI COME COMPONENTI SW

Istruzioni Condizionali

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

Linguaggio C: le funzioni

Esempi (pseudo-c):! float f(){ * sin(0.75); } float f1(int x) { 2 + x * sin(0.75); } Esempio

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

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

Laboratorio di Programmazione Lezione 2. Cristian Del Fabbro

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

Funzioni e. Alessandra Giordani Mercoledì 16 maggio 2012

Variabili e Funzioni. Informatica 1 / 19

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

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

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

Concetto di Funzione e Procedura METODI in Java

Definizione di classi. Walter Didimo

ESPRESSIONI. Ivan Lanese

PROGRAMMAZIONE: I sottoprogrammi

Funzioni, Stack e Visibilità delle Variabili in C

Controllo del flusso

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

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

LB5 FUNZIONI cap. 7 del testo

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

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

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

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

Funzioni, Stack e Visibilità delle Variabili in C

Il linguaggio C. Istruzioni, funzioni, dati strutturati

I Metodi. Fondamenti di Informatica A-K

APPELLO SCRITTO DI PROGRAMMAZIONE 1 CORSO DI LAUREA IN MATEMATICA UNIVERSITÀ DEGLI STUDI DI MILANO VI.2015

3 Costrutti while, for e switch

2 Operatori matematici e costrutto if

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

Astrazione Funzionale

7 - Programmazione procedurale: Dichiarazione e chiamata di metodi ausiliari

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

sqrt #include <iostream> #include <cmath> using namespace std; int main() { int x; cout << Inserire un numero \n ; cin >> x; int main()

Ambienti di Programmazione per il Software di Base

Capitolo 5 - Funzioni

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

Preprocessore, linker e libreria standard

Tipi elementari, costanti. Tipi di dati. VALORI: un insieme dei valori del tipo OPERAZIONI: per operare su tali valori. Tipi. intero reale carattere

C++ funzioni Alberto Ferrari. Alberto Ferrari Programmazione di applicazioni SW

Introduzione. Le funzioni in C. Funzioni. Cosa succede

Esempi di programmi. Corso di Laurea Ingegneria Informatica Fondamenti di Informatica 1. Dispensa E01. A. Miola Settembre 2007

Transcript:

Funzioni Libro cap. 5 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 */ double somma(double a, double b) double 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 */ double somma(double a, double b) double 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ò essere omesso Una funzione può essere usata solo 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 */ 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, se omessi si assume void 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 programmi 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 */ 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 <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 */ 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

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

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

i = 2 i*i <= n int primo(int n) int i; for (i = 2; i*i <= n; i++) if (n % i == 0) else return 1; n%i == 0 return 0 return 1 i = i+1 Funzioni 19

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 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 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 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 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 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 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 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 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 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 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 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 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 dal punto in cui è dichiarata fino alla fine 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 */ int x, y; /* variabili globali */ void f( void ) 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 dichiarate in math.h /* esempio-math.c : esempio di uso di alcune funzioni matematiche */ #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

Esercizio Scrivere una funzione int primofattore(int n) che, dato in input un intero n 1, restituisce il più piccolo fattore primo di n; se n è un numero primo, la funzione restituisce n Es.: primofattore(1) restituisce 1; primofattore(2) restituisce 2; primofattore(4) restituisce 2; primofattore(9) restituisce 3; primofattore(21) restituisce 3 Suggerimento: bastano alcune modifiche alla funzione primo() Scrivere una funzione void fattorizzazione(int n) che stampa la fattorizzazione di un intero n 1 Es.: fattorizzazione(1) stampa 1; fattorizzazione(3) stampa 3; fattorizzazione(21) stampa 3 7; fattorizzazione(16) stampa 2 2 2 2; fattorizzazione(18) stampa 2 3 3 Suggerimento: si può sfruttare la funzione primofattore(), oppure sviluppare una nuova soluzione ad hoc Funzioni 46