Le funzioni. Fondamenti di programmazione

Documenti analoghi
Funzioni, Stack e Visibilità delle Variabili in C

Il linguaggio C. Puntatori e dintorni

Programmazione (imperativa)

Laboratorio di Programmazione Lezione 3. Cristian Del Fabbro

Ottenere una modifica del parametro attuale

Passare argomenti al programma

Corso di Fondamenti di Informatica

Funzioni e. Alessandra Giordani Mercoledì 16 maggio 2012

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

Strategie di programmazione

Corso sul linguaggio Java

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

ELEMENTI DI INFORMATICA L-B. Ing. Claudia Chiusoli

Tempo di vita e scope delle variabili

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

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

Il C nel C++: Funzioni

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

Struttura dei programmi C

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

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

Il linguaggio C. Notate che...

Input/output da file I/O ANSI e I/O UNIX FLUSSI E FILE FLUSSI FLUSSI di TESTO FLUSSI BINARI FILE

Applicando lo stesso meccanismo al tipo puntatore, possiamo dichiarare un array di puntatori:

Il linguaggio C. Puntatori e dintorni

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

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

Programmazione modulare

Argomenti Avanzati.! I puntatori! Stack! Visibilità delle Variabili

Fondamenti di Informatica

Linguaggio C: le funzioni. Visibilità variabili e passaggio parametri

Perché il linguaggio C?

Linguaggio C - Funzioni

Il blocco che costituisce il corpo di una funzione/procedura può contenere dichiarazioni di variabili. Esempio:

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

Array multidimensionali e stringhe

FUNZIONI RICORSIVE PROGRAMMAZIONE RICORSIVA: Esempi di problemi ricorsivi:

Le basi del linguaggio Java

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

Programmazione Orientata agli Oggetti in Linguaggio Java

Programmazione a moduli in C

Definizione di metodi in Java

Lezione 8. Sottoprogrammi

Uso avanzato dei puntatori Allocazione dinamica della memoria

Introduzione al linguaggio C Puntatori

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

Array. Maurizio Palesi Salvatore Serrano. In C si possono definire tipi strutturati Vi sono due costruttori fondamentali

7 - Programmazione procedurale: Dichiarazione e chiamata di metodi ausiliari

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

4 GLI ARRAY E LE STRINGHE

Fondamenti di Informatica II

Gestione dinamica della memoria

Strutturare il codice: sottoprogrammi

Capitolo 19. Ricorsione

Introduzione ai puntatori in C Definizione

La struttura dati CODA

GESTIONE DEI FILE IN C. Docente: Giorgio Giacinto AA 2008/2009

Il linguaggio C Puntatori

direttive del preprocessore simboli speciali parole chiave identificatori costanti

ARRAY E STRINGHE. ESERCIZIO 2 Scrivere un programma che calcola il numero di doppie e di dittonghi (2 vocali vicine) presenti in una stringa.

Scope, Memoria e Tabella dei Simboli

La gestione della memoria dinamica Heap

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

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

file fisico file logico

Esercizi di riepilogo (Fondamenti di Informatica 1 Walter Didimo)

HOMEWORKS. in modo che il programma stampi N ripetizioni della stringa HelloWorld (su righe diverse), con N inserito dall utente.

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

Calcolatori Elettronici Lezione A4 Programmazione a Moduli

LABORATORIO di INFORMATICA

Allocazione dinamica della memoria

Esercitazione 5. Procedure e Funzioni Il comando condizionale: switch

Esercitazione: Implementazione in linguaggio C dell ADT. Stack con l utilizzo. di linked list

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

Stringhe e allocazione dinamica della memoria

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

Visibilità e tempo di vita delle variabili. (più sintesi di alcuni concetti della prima parte del corso)

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

Mini-dispensa sui puntatori in C

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

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

Primi passi col linguaggio C

Strutture Dati Dinamiche

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

Tipi di dato. Unità 2. Domenico Daniele Bloisi. Corso di Fondamenti di Informatica Ingegneria delle Comunicazioni BCOR Ingegneria Elettronica BELR

Lezione 8 Struct e qsort

Introduzione al C++ (continua)

Linguaggio C: PUNTATORI

Capitolo 5 - Funzioni

Linguaggio C: le funzioni. Introduzione e sintassi

Breve Ripasso del linguaggio C

prova.c #include <stdio.h> char funzione(char); codice oggetto del main()

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

L Allocazione Dinamica della Memoria

Allocazione dinamica della memoria

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

Puntatori. Fondamenti di Programmazione

Array k-dimensionali

ACSO Programmazione di Sistema e Concorrente

6 - Blocchi e cicli. Programmazione e analisi di dati Modulo A: Programmazione in Java. Paolo Milazzo

Transcript:

Le funzioni Fondamenti di programmazione

Moduli I programmi sono spesso abbastanza complessi da dover essere scomposti in pezzi più maneggevoli Un modulo consiste di istruzioni per svolgere un certo compito raggruppate insieme in un unità a cui è dato un nome Vantaggi: il nome può essere usato come sostituto dell intero insieme di istruzioni risparmio di scrittura, organizzazione, riutilizzo

Programmazione modulare Le funzioni in C permettono di realizzare la scomposizione di un programma in sottoprogrammi (o moduli) main Funzioni di I/O scanf,printf Funzioni matematiche sqrt,pow Funzioni scritte dal programmatore

Black box result=sqrt(x); Funzione sqrt Calcolo della x vale 25 Radice quadrata result vale 5.0 y=4.7+sqrt(x); //y vale 9.7 z=sqrt(12.+4.); //z vale 4.0

Caso di studio Programma di conversione da gradi Fahrenheit a Celsius: #include<stdio.h> #include<stdlib.h> #include<stdio.h> #include<stdlib.h> main() { main() { double tc, tf, offset, conv; double tc, tf, offset, conv; offset = 32.; offset = 32.; conv = 5./ 9.; conv = 5./ 9.; /*Acquisizione dati*/ /*Acquisizione dati*/ printf("valore in gradi Fahrenheit = "); /*conversione*/ scanf("%lf", &tf); /*conversione*/ /*stampa risultati*/ tc = converter(tf,offset,conv); /*stampa risultati*/ } printf("valore in gradi celsius = %f\n", tc); }

Dichiarazione (il prototipo) Una funzione deve essere dichiarata prima di poter essere utilizzata tipo_prog nome_funzione(parametri,...) Il prototipo specifica: Il tipo della funzione (ovvero il tipo ritornato) Il nome della funzione Il numero e il tipo dei parametri formali della funzione

Dichiarazione Dove si inserisce? Prima della funzione main() dopo le #define Includendo la libreria standard o utente che contiene il prototipo della funzione Consente al compilatore di tradurre correttamente la chiamata alla funzione in termini di trasferimento del controllo di flusso

Prototipi int main(void) Il tipo può essere omesso (se l'istruzione return è omessa, main restituisce 0) int scanf(const char *format,...); void printf(const char *format,...); double converter(double,double double)

} Dichiarazione #include<stdio.h> #include<stdlib.h> double converter(double,double,double); main() { double tc, tf, offset, conv; offset = 32.; conv = 5./ 9.; printf("valore in gradi Fahrenheit = "); scanf("%lf", &tf); tc = converter(tf,offset,conv); printf("valore in gradi celsius = %f\n", tc);

Definizione Intestazione della funzione (simile al prototipo ma specifica i nomi dei parametri formali e non termina con ; ) Contiene la specifica delle istruzioni della funzione

Definizione tipo nome della funzione parametri formali double converter(double temp_f,double offset, double fat_conv) { return((temp_f-offset)*fat_conv); } Istruzione di ritorno del valore del tipo specificato

Esempi Scrivere una funzione che calcola la somma dei quadrati di due numeri double squaresum(double a, double b) { } return (a * a + b * b);

Esempi Scrivere una funzione che calcola il fattoriale di un intero n unsigned long long int factorial(int n ) { } int i; unsigned long long int p = 1; for (i = 1; i <= n; i++) { p *= i;} return p;

Posizionamento delle funzioni La visibilità di una funzione dipende dalla dichiarazione o dal posizionamento L'ordine in cui vengono definite le funzioni non influisce sull'ordine con cui vengono eseguiti L'ordine di esecuzione dipende dall'ordine delle chiamate

#include<stdio.h> #include<stdlib.h> Ordine di chiamata = ordine di esecuzione main() { double tc, tf, offset, conv; offset = 32.; conv = 5./ 9.; /*Acquisizione dati*/ printf("valore in gradi Fahrenheit = "); scanf("%lf", &tf); /*conversione*/ tc = converter(tf,offset,conv); /*stampa risultati*/ printf("valore in gradi celsius = %f\n", tc); }

Chiamata a funzione #include<stdio.h> #include<stdlib.h> main() { double tc, tf, offset, conv; offset = 32.; conv = 5./ 9.; /*Acquisizione dati*/ printf("valore in gradi Fahrenheit = "); scanf("%lf", &tf); /*conversione*/ tc = converter(tf,offset,conv); /*stampa risultati*/ printf("valore in gradi celsius = %f\n", tc); } double converter(double temp_f,double offset, double fat_conv) { return((temp_f-offset)*fat_conv); }

Parametri formali e attuali L'input per la funzione chiamata viene trasmesso dalla funzione chiamante attraverso i parametri Parametri attuali (funzione chiamante) e parametri formali (funzione chiamata) si devono accordare nel numero e nel tipo ordinatamente Non c'è un legame tra i nomi

Esecuzione della chiamata Il prototipo consente al compilatore di tradurre correttamente la chiamata alla funzione in termini di trasferimento del controllo di flusso dal chiamante al chiamato Al termine della funzione chiamata viene aggiunta una istruzione (nel programma oggetto) che causa il trasferimento di controllo di flusso al chiamante

Esecuzione della chiamata #include<stdio.h> #include<stdlib.h> main() { double tc, tf, offset, conv; offset = 32.; conv = 5./ 9.; /*Acquisizione dati*/ printf("valore in gradi Fahrenheit = "); scanf("%lf", &tf); /*conversione*/ tc = converter(tf,offset,conv); /*stampa risultati*/ printf("valore in gradi celsius = %f\n", tc); } double converter(double temp_f,double offset, double fat_conv) { return((temp_f-offset)*fat_conv); }

Passaggio di dati per valore La funzione chiamata tramite il parametro formale riceve l'attuale valore del dato passato tramite il parametro attuale (ma non ha accesso alla variabile usata come parametro attuale) Per riferimento: la funzione chiamata riceve l'indirizzo della posizione di memoria che contiene il dato

L'esecuzione e la memoria Quando viene eseguito un programma la prima istruzione eseguita è la prima istruzione del main() Quando viene chiamata una funzione, il controllo di flusso viene trasferito alla funzione e in memoria (nello stack) vengono allocate le variabili dichiarate in essa e i parametri Al termine dell'esecuzione della funzione, il controllo viene trasferito e la memoria liberata Il valore restituito (se presente) viene scambiato usando un registro del processore come variabile condivisa Il programma termina dopo aver eseguito l'ultima istruzione del main()

L'esecuzione e la memoria Prima della chiamata: Area di memoria main Area di memoria converter conv 5./9 offset 32. tc? tf 59.

L'esecuzione e la memoria Passaggio di dati per valore: Area di memoria main Area di memoria converter conv offset temp_f offset 5./9 32. 59. 32. tc tf fat_conv? 59. 5./9

L'esecuzione e la memoria Al termine dell'esecuzione di converter: conv Area di memoria main offset Area di memoria converter liberata 5./9 32. tc 15. tf 59.

Parametri del main main(int argc, char *argv[]) Il primo parametro indica la lunghezza +1 di argv Il secondo parametro indica le stringhe in input al programma (argomanti a riga di comando) Se ad es. un programma backup potrebbe richiedere il nome del file di cui eseguire il backup e il nome del file di backup >backup 3 old.txt new.txt

Come posso modificare la variabile in input in una funzione? Come posso ritornare più di un valore? Come posso passare usare un array come parametro di una funzione?

Problema: scrivere una funzione che scambia il contenuto di due variabili

Esempio sbagliato main() { double x, y; x = 3.14; y = 2.72; printf(" prima dello scambio, x = %f, y = %f\n", x, y); wrongswap(x, y); printf(" dopo lo scambio, x = %f, y = %f\n", x, y); } void wrongswap(double a, double b) { double temp; temp = a; a = b; b = temp; }

Area di memoria main Area di memoria wrongswap x y a b 3.14 2.72 3.14 2.72 temp?

Area di memoria main Area di memoria wrongswap x y a b 3.14 2.72 2.72 3.14 temp 3.14

Esempio corretto main() { double x, y; x = 3.14; y = 2.72; printf(" prima dello scambio, x = %f, y = %f\n", x, y); swap(&x, &y); printf(" dopo lo scambio, x = %f, y = %f\n", x, y); system("pause"); } Parametri in ingresso e in uscita void swap(double *a, double *b) { double temp; temp = *a; *a = *b; *b = temp; }

Area di memoria main x 3.14 Area di memoria swap a y b 2.72 temp?

Nota bene: l'inizializzazione dei puntatori come parametri formali avviene attraverso il passaggio di parametri per valore con la chiamata della funzione

Area di memoria main x 2.72 Area di memoria swap a y b 3.14 temp 3.14

main() { double x[n], y[n],z[n]; int n; /*Acquisizione dati per n(=3), e per gli array x e y*/... add_arrays(x,y,z,3);... } array in ingresso array in uscita void add_arrays(const double a[],const double b[],double sum[],int n) { int i; for(i=0;i<n;i++){ sum[i]=a[i]+b[i]; }

Area di memoria main Area di memoria add_arrays x 1.5 2.72 3.2 2.5 a n b 3 y 2. 1.3 2.72 3.2 sum z? 2.72??

Area di memoria main Area di memoria add_arrays x 1.5 2.72 3.2 2.5 a n b 3 y 2. 1.3 2.72 3.2 sum z 3.5 4.5 2.72 5.7

Tempo di vita e visibilità Intervallo temporale durante il quale una variabile è mantenuta in memoria Visibilità: sezione di codice entro il quale il nome della dichiarazione può essere usato Globale: visibile da tutto il programma con durata per tutta l'esecuzione del programma Locale: nel corpo di una funzione, nei parametri formali o in un blocco (nascondono variabili con stesso nome)

Tempo di vita, visibilità e memoria La memoria allocata dal compilatore prima dell'esecuzione del programma può essere gestita staticamente Visibilità globale Tempo di vita: esecuzione del programma La memoria allocata durante l'esecuzione del programma viene gestita dinamicamente (stack) Variabili locali, blocchi di istruzioni, funzioni

Stack e tempo di vita della variabili Stack di sistema: area di memoria che supporta i meccanismi di trasferimento del controllo e la comunicazione tra funzioni Al momento della chiamata di una funzione sullo stack sono memorizzati: L'indirizzo dell'ultima istruzione eseguita nel chiamante Valori attuali dei parametri Variabili locali della funzione Al termine dell'esecuzione della funzione la memoria è liberata

Chiamate successive di una funzione Come posso modificare la variabile in input in una funzione? Come posso ritornare più di un valore? Come posso mantenere il valore di una variabile tra chiamate successive di una funzione? Problema: scrivere un programma che realizza una pila (funzioni push e pop)

Stack Push: Se la pila non è piena (TOS<N) Inserisci l'elemento in TOS Incrementa TOS Pop: Se la pila non è vuota (TOS>0) Decrementa TOS Elimina l'elemento in TOS

Stack Attenzione! L'operazione di pop rende disponibile (al chiamante) l'elemento eliminato dalla pila Se l'elemento è un intero, il parametro corrispondente deve essere un parametro in uscita, quindi un puntatore ad intero

Stack Attenzione! TOS deve mantenere il suo valore tra chiamate successive della funzione Come posso mantenere il valore di una variabile tra chiamate successive di una funzione? Il parametro corrispondente a TOS deve essere un parametro in ingresso e in uscita della funzione

Parametri in ingresso e in uscita I parametri formali di una funzione che permettono la comunicazione dalla funzione chiamante alla funzione chiamata sono parametri in ingresso I parametri formali di una funzione che permettono la comunicazione dalla funzione chiamata alla funzione chiamante sono parametri in uscita I parametri formali di una funzione che permettono la comunicazione dalla funzione chiamante alla funzione chiamata e viceversa sono parametri in ingresso e in uscita

Coda Enqueue: Se la coda non è piena (tail+1<n) Inserisci l'elemento in tail Incrementa tail Dequeue: Se la coda non è vuota (head!=tail) Elimina l'elemento in head Incrementa head

Coda (anello) Enqueue: Se la coda non è piena (tail+1!=head) Dequeue: Inserisci l'elemento in tail Incrementa tail (l'elemento successivo di N-1 è 0) Se la coda non è vuota (head!=tail) Elimina l'elemento in head Incrementa head (l'elemento successivo di N-1 è 0)

Coda (anello) Attenzione! tail e head sono parametri in ingresso e in uscita value è un parametro in ingresso in enqueue value corrisponde ad un parametro in uscita in dequeue

Parametri in ingresso e in uscita Come posso passare usare un array come parametro di una funzione?

Passaggio di parametri: array Problema: Scrivere un programma che somma gli elementi corrispondenti di due array a e b e memorizza i risultati in un terzo array sum void add_arr(int a[],int b[],int sum[],int n);

Array multidimensionali e puntatori int a[3][4]; rappresenta una matrice di 3 righe e 4 colonne L'indice di riga è più lento Possiamo pensarlo come 3 sottoarray di 4 elementi a[0][0]a[0][1]a[0][2]a[0][3] a[1][0]...a[1][3] a[2][0]...a[2][3] a[0] a[1] a[2] a Se si dichiara a[n1][n2] a[i][j] equiv *(*(a+i)+j) equiv *(&a[0][0]+n2*i+j)

Passaggio di parametri La prima dimensione è l'unica che può essere omessa (le altre sono necessarie per l'accesso agli elementi) initialize(int a[][n], int nrows) Il valore memorizzato nel parametro formale di un array è l'indirizzo del primo elemento del parametro attuale es. somma di due matrici in una terza