Il linguaggio C Le funzioni C Language Il passaggio dei parametri

Slides:



Advertisements
Presentazioni simili
Introduzione al linguaggio C++
Advertisements

INFORMATICA Altre Istruzioni di I/O
Il linguaggio C Le funzioni Ancora sull’ordinamento La funzione main()
LINGUAGGIO DI PROGRAMMAZIONE C
Sottoprogrammi: funzioni e procedure
© 2007 SEI-Società Editrice Internazionale, Apogeo Unità F2 Selezione.
Procedure e funzioni A. Ferrari.
Procedure e funzioni ricorsive
LE FUNZIONI IN C Sommario 1 Introduzione 2 Moduli di programma in C
Fondamenti di Informatica CDL in Ingegneria Gestionale (B)- A.A CDL in Ingegneria Gestionale (B)- A.A Programmazione Ricorsiva.
Introduzione al linguaggio C
Anno accademico Il preprocessore del linguaggio C.
Anno accademico Le classi di memorizzazione.
Fondamenti di Informatica I a.a Il linguaggio C Il preprocessore La sostituzione di macro Le compilazioni condizionali Linclusione di file C.
Anno accademico Le funzioni in C. Anno accademico Sommario Le funzioniLe funzioni Il passaggio dei parametri Il passaggio dei.
Anno accademico Array e puntatori in C.
La ricorsione Simulazione. Il Main /* Programma che usa una funzione ricorsiva*/ #include #define MAX_N 8 main() int valore, dato; printf(Introduci n:
1 Istruzioni, algoritmi, linguaggi. 2 Algoritmo per il calcolo delle radici reali di unequazione di 2 o grado Data lequazione ax 2 +bx+c=0, quali sono.
FUNZIONI DI BIBLIOTECA
Fondamenti di Informatica II Ingegneria Informatica / Automatica (A-I) Meccanica Prof. M.T. PAZIENZA a.a – 3° ciclo.
Argomenti dalla linea dei comandi Gli argomenti possono essere passati a qualsiasi funzione di un programma, compresa la main(), direttamente dalla linea.
Funzioni definite dall’utente
Prof.ssa Chiara Petrioli -- Fondamenti di programmazione, a.a. 2009/2010 Corso di Fondamenti di programmazione a.a. 2009/2010 Prof.ssa Chiara Petrioli.
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Puntatori Marco D. Santambrogio – Ver. aggiornata al 21 Marzo 2013.
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Stringhe e Puntatori Marco D. Santambrogio – Ver. aggiornata al 18 Marzo 2013.
Process synchronization
Informatica 2. Concetti fondamentali di programmazione Programmare vuol dire scrivere un algoritmo in un linguaggio che faccia funzionare un calcolatore.
Allocazione dinamica della memoria
Laboratorio di Linguaggi lezione VIII Marco Tarini Università dellInsubria Facoltà di Scienze Matematiche, Fisiche e Naturali di Varese Corso di Laurea.
1 Corso di Laurea in Biotecnologie Informatica (Programmazione) Introduzione a JAVA Anno Accademico 2009/2010.
1 Corso di Informatica (Programmazione) Lezione 12 (19 novembre 2008) Programmazione in Java: i metodi statici.
Fondamenti di Informatica I a.a Il linguaggio C Il controllo di flusso La selezione condizionale Listruzione switch I cicli Le istruzioni break,
Procedure e funzioni nei linguaggi di alto livello Lab Programmazione - turno /2006.
A.A. 2010/2011Ambienti di Programmazione per il Software di Base1 (Es. – 6) Ambienti di Programmazione per il Software di Base Le Stringhe in C Input.
Esercizi FUNZIONI Passaggio di parametri per valore, variabili e tipi locali e globali, prototipo.
Strutture di controllo in C -- Flow Chart --
Esercizi Puntatori, struct con campi puntatore, puntatori a struct, rapporto tra array e puntatori. FUNZIONI Passaggio di parametri per indirizzo, passaggio.
La Programmazione Ricorsiva
I File.
Il Linguaggio C.
Le funzioni.
Espressioni condizionali
FUNZIONI: IL MODELLO APPLICATIVO 1) Valutazione, nellenvironment corrente, del simbolo che denota il nome della funzione; 2) Valutazione, nellenvironment.
FUNZIONI... Una funzione permette di dare un nome a una espressione rendendola parametrica float f(){ return * sin(0.75); } float f1(int x) { return.
2000 Prentice Hall, Inc. All rights reserved. Capitolo 6 (Deitel) I vettori Sommario Introduzione Vettori Dichiarazione di vettori 6.4.
Prof.ssa Chiara Petrioli -- Fondamenti di programmazione, a.a. 2009/2010 Corso di Fondamenti di programmazione a.a. 2009/2010 Prof.ssa Chiara Petrioli.
Unità Didattica 3 Linguaggio C
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Array e stringhe Marco D. Santambrogio – Ver. aggiornata al 9 Agosto 2013.
1 Parte 5 Fondamenti di Programmazione. 2 Programmazione Concetti base: dati istruzioni Dati: variabili tipi Istruzioni: istruzioni base strutture di.
Fopndamenti di programmazione. 2 La classe String Una stringa è una sequenza di caratteri La classe String è utilizzata per memorizzare caratteri La classe.
2000 Prentice Hall, Inc. All rights reserved. Capitolo 5 (Deitel) Le funzioni Indice degli argomenti Introduzione Moduli nei programmi C 5.3.
2000 Prentice Hall, Inc. All rights reserved. Attivazione di funzioni La chiamata/attivazione di funzione viene indicata citando il nome della funzione.
Complessità di un algoritmo
1 Fabio Scotti ( ) Laboratorio di programmazione per la sicurezza Valentina Ciriani ( ) Laboratorio di programmazione Lezione 11 e 12 -
CORSO DI PROGRAMMAZIONE II Lezione 22
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Corso di Programmazione 1 a.a.2006/2007 Prof.ssa Chiara Petrioli Corso di Laurea.
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Funzioni e Procedure Marco D. Santambrogio – Ver. aggiornata al 3 Aprile 2015.
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Puntatori Marco D. Santambrogio – Ver. aggiornata al 11 Ottobre 2014.
Fondamenti di Informatica II Ingegneria Informatica (A-I) Prof. M.T. PAZIENZA a.a – 3° ciclo.
Informatica 4 Funzioni. FUNZIONE: definizione MATEMATICA Relazione (o applicazione) binaria tra due insiemi A e B che associa a ogni elemento di A un.
Sottoprogrammi e funzioni
1 Il linguaggio C Precisazioni sull’esperienza in laboratorio.
Operatori di incremento e decremento
Linguaggio C: Le basi Stefano Cagnoni e Monica Mordonini
Copyright © Istituto Italiano Edizioni Atlas
Il C `e un linguaggio di programmazione di uso generale, originariamente sviluppato per la scrittura del sistema operativo Unix, ed oggi disponibile su.
1 Metodo I metodi sono uno strumento che i programmatori usano per strutturare i programmi, sia per renderli più facili da capire che per permettere il.
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Funzioni e Procedure Marco D. Santambrogio – Ver. aggiornata al 4 Aprile 2016.
10. Programmazione Ricorsiva Ing. Simona Colucci Informatica - CDL in Ingegneria Industriale- A.A
Linguaggio C: Funzioni e Puntatori Laboratorio di Programmazione Gruppo 1.
Transcript della presentazione:

Il linguaggio C Le funzioni C Language Il passaggio dei parametri Le dichiarazioni e le chiamate I prototipi di funzione La ricorsione C Language

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

La sintassi della definizione di funzione Nome funzione ( ) , Tipo restituito 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 { Dichiarazione argomento Corpo funzione }

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 L’argomento passato viene detto parametro attuale, mentre la copia ricevuta è il parametro formale Passaggio per indirizzo 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 Parametro attuale Indirizzo del parametro Parametro formale Passaggio per valore Parametro attuale Valore del parametro Parametro formale

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 Esempio La funzione printf() non stampa 3, ma 2, in quanto il parametro formale received_arg in f() è una copia del parametro attuale a include <stdio.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(received_arg) int received_arg; received_arg  3;

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

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 La sintassi di un’istruzione return è Espressione return

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

Le allusioni a funzione  1 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 Per lo stesso motivo: omettere allusioni a funzioni non utilizzate, per evitare ambiguità Classe di memorizzazione Nome funzione Tipo restituito ) ( La sintassi dell’allusione a funzione

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: 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 void func(int, float, char *); void func(int a, float b, char *pc);

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

Le chiamate di funzione  1 Una chiamata di funzione, detta anche invocazione di funzione, trasferisce il controllo del programma alla funzione specificata Una chiamata di funzione è un’espressione e può quindi comparire ovunque è 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… Nome funzione ( ) , Argomento a  1/3; a  f()/3;

La ricorsione  1 Una funzione è ricorsiva se richiama se stessa Nei programmi ricorsivi, è necessario prevedere una condizione di terminazione, altrimenti il programma non si interrompe void recurse() { static count1; printf(“%d\n”, count); count; recurse(); } main( ) extern void 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 1 2 3 … Infine, il calcolatore esaurirà la memoria disponibile per lo stack ed il programma verrà interrotto (con segnalazione di errore)

La ricorsione  2 void recurse() { static count1; if (count > 3) return; else printf(“%d\n”, count); count; recurse(); } main( ) extern void 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

Esempi di funzioni ricorsive  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1) return 1; else return (nrfatt(n1)); } Funzione non ricorsiva Funzione ricorsiva

Esempi di funzioni ricorsive  2 I numeri di Fibonacci Si consideri la sequenza di numeri interi 0,1,1,2,3,5,8,13,21… nota come successione di Fibonacci La legge di generazione della successione è espressa mediante la relazione di ricorrenza F0  0 F11 Fn  Fn1 Fn2 Nota: La legge di Fibonacci (Leonardo Pisano, detto il Fibonacci, Pisa 1170) descrive la crescita del numero di coppie di conigli a partire da una singola coppia, supponendo che ogni coppia procrei, ogni mese, una nuova coppia di conigli, che sia in grado di riprodursi a partire dal mese successivo

Esempi di funzioni ricorsive  3 Algoritmo di Euclide per il calcolo del M.C.D. int mcd (int m, int n); main (void) { int numero1, numero2; printf(“Inserisci i due numeri ”); scanf(“%d %d”, &numero1, &numero2); printf(“Il MCD tra %d e %d è %d\n”, numero1, numero2, mcd(numero1, numero2)); } int mcd(int m, int n) if (m == 0) return n; /* caso m = 0 */ else if ((n == 0) || (m == n)) return m; /* caso n = 0 o m = n */ else if (m > n) return mcd (n, m%n); /* caso m>n */ else return mcd (m, n%m); /* caso m<n */ Prototipo della funzione mcd()