Sotto programmi - Funzioni in C

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

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

Progettazione Top Down e funzioni in C. Prof. Francesco Accarino IIS Altiero Spinelli Sesto San Giovanni

Corso sul linguaggio Java

Informatica (A-K) 12. Linguaggio C -3

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

Implementazione dell albero binario in linguaggio C++

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

Fondamenti di Informatica II 3. Funzioni in C++ (parte 1)

Assegnazione di una variabile

Strategie di programmazione

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

Corso di Informatica Modulo T3 2 Ambiente locale e globale

Programmazione Procedurale in Linguaggio C++

Programmazione a moduli in C

Programmazione Procedurale in Linguaggio C++

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

Sommario Obiettivo della programmazione e ciclo di sviluppo di programmi. Programmi. Ciclo di sviluppo di programmi. Obiettivo

PROGRAMMAZIONE: I sottoprogrammi

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

Fondamenti di Informatica

FILE DI TESTO e SOTTOPROGRAMMI

Linguaggio C: PUNTATORI

Introduzione al linguaggio C Puntatori

Nel seguito, istruzione1 e istruzione2 possono essere un blocco di codice { }, cioè più istruzioni

Unità A1 Funzioni MODULO Java 2

Tempo di vita e scope delle variabili

Introduzione ai puntatori

Ambienti di Programmazione per il Software di Base

Università degli Studi di Ferrara

Concetto di stream. c i a o \0. c i a o \0. c i a o \0

7 - Programmazione procedurale: Dichiarazione e chiamata di metodi ausiliari

Le funzioni: dichiarazione, definizione e chiamata Il passaggio degli argomenti per valore e riferimento La funzione main() Le regole di visibilità

Funzioni, Stack e Visibilità delle Variabili in C

Introduzione al C++ Parte 2

Introduzione ai puntatori in C Definizione

PROGETTAZIONE TOP-DOWN E BOTTOM-UP

La struttura dati ad albero binario

Evoluzione del FORTRAN 14/03/2016. LABORATORIO DI PROGRAMMAZIONE Corso di laurea in matematica 15 IL LINGUAGGIO FORTRAN

Introduzione al linguaggio C Puntatori

8. Modalità di passaggio dei parametri

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

Il linguaggio C funzioni e puntatori

Standard Input e Standard Output

Classe Squadra. #include <iostream> using namespace std;

Definizione di classi. Walter Didimo

Programmazione Procedurale in Linguaggio C++

Introduzione al C. Lez. 2. Funzioni e Puntatori

FUNZIONI FUNZIONI COME COMPONENTI SW

Esempio: quanto mi piace questo corso! qufuafantofo mifi pifiafacefe qufuefestofo coforsofo!

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

Procedura. Procedure e funzioni. Esempio di procedura in C. Procedure in C. Esempio con prototipo. Esecuzione del codice

Esercitazione 3. Espressioni booleane I comandi if-else e while

Programmazione Procedurale in Linguaggio C++

ELABORAZIONE DELLE INFORMAZIONI (ALGORITMI E LINGUAGGI DI PROGRAMMAZIONE)

RICORSIONE, PUNTATORI E ARRAY. Quarto Laboratorio

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

Passaggio dei parametri

Perché il linguaggio C?

Fondamenti di Informatica

Laboratorio di Informatica

Dati due punti sul piano calcolare la loro distanza

10. Visibilità e tempo di vita delle variabili. Andrea Marongiu Paolo Valente

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

Implementazione di DFA in C

Programma del corso. Elementi di Programmazione. Introduzione agli algoritmi. Rappresentazione delle Informazioni. Architettura del calcolatore

Informatica A (per gestionali) A.A. 2004/2005. Esercizi di programmazione C Funzioni: passaggio di parametri per indirizzo, passaggio di array.

laboratorio di python

Introduzione al linguaggio C Puntatori

Come scrivere bene codice? (1 di 1)

Variabili e input/ Alessandra Giordani Lunedì 18 marzo

Definizione Allocazione e deallocazione di variabili Allocazione e deallocazione di vettori

Introduzione al C++ (continua)

L AMBIENTE CODE BLOCKS E L IO

Corso di Informatica A.A

Nozioni fondamentali su Algoritmi e programmazione

a.a Codice corso: 21012

Inizio programma principale. Preparare antipasto. Preparare. pasta. Sottoproblema 1 Sottoproblema 2

Lezione 8: Stringhe ed array multidimensionali

Scope, Memoria e Tabella dei Simboli

Procedure e funzioni A. Ferrari

Lezione 6. Visibilità degli identificatori e tempo di vita degli oggetti

INTRODUZIONE ALLA PROGRAMMAZIONE

Modularizzazione del software

La copia di un file. contare di quanti caratteri sia composto il file (e quindi determinare la dimensione del file di origine)

Laboratorio di Programmazione Lezione 2. Cristian Del Fabbro

Teoria dell Informazione

Lezione 8. Visibilità degli identifcatori e tempo di vita degli oggetti

Introduzione agli Algoritmi

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

Lo scopo. Il primo esperimento. Soluzione informale. Le variabili

Concetto di Funzione e Procedura METODI in Java

Ottenere una modifica del parametro attuale

Definizione di metodi in Java

Perché il linguaggio C?

Esercizio 2: Algebra dei Puntatori e Puntatori a Puntatori

Transcript:

Sotto programmi - Funzioni in C R. Gallo Settembre 2009 Sommario Le funzioni C/C++ sono l'implementazione in codice C/C++ di uno strumento presente in tutti i linguaggi di programmazione: i sottoprogrammi 1 Introduzione Per la progettazione e successiva realizzazione di un programma, una delle tecniche risolutive impiegate é quella che prende il nome di metodologia topdown. Secondo le indicazioni contenute in questa procedura, un problema relativamente complesso, viene scomposto in sotto problemi di piú semplice soluzione. Questo metodo si applica ricorsivamente nché la scomposizione non é piú applicabile perché le unitá ottenute dal problema originario, sono molto semplici da risolvere tali da poter passare direttamente allo schizzo di un algoritmo e della sua implementazione in linguaggio di programmazione. Questa metodologia suggerisce che un programma sia composto da diverse parti piú o meno indipendenti fra di loro, che originano tutte da una sezione principale che chiamiamo main Convenzioni tipograche 1 2 SubProgram Qualunque linguaggio di programmazione possiede la sintassi per dichiarare dei sotto-programmi. Un sotto-programma consiste in una sezione di codice che risolve un'unitá del problema originale, che abbiamo scomposto secondo la metodologia top-down. Quando si scrive un sotto-programma rendiamo il programma: leggibile modulare 1 L'articolo è stato scritto con dimensione caratteri superiore alla norma e gli esercizi si è cercato di concentrarli in una sola pagina, per dare l'ooportunità di vederne per intero lo svolgimento e lasciare spazio all'alunno di apporre le proprie note 1

Sub-program 2 di piú semplice correzione riusabile Dobbiamo immaginare, a questo punto, che il nostro programma, visto come una grande scatola, al suo interno contenga altre scatolette che comunicano fra di loro e che eseguono i calcoli per ottenere i risultati. Questa rappresentazione é molto utile perché permette di specicare meglio come le scatolette (sotto-programmi) comunicano fra di loro e, quindi, di denire delle regole precise su come le scatolette (sotto-programmi) ricevono in ingresso e comunicano in uscita i dati 2.1 Sotto-Programi in C/C++ In C i sotto programmi si chiamano funzioni. Una funzione in C riprende il concetto matematico di funzione. In matematica una funzione f rappresenta un operatore che applicato a un elemento di un insieme, restituisce un elemento dello stesso insieme o di un altro, dopo aver applicato le sue regole di trasformazione. Il linguaggio C riprende questo concetto relativamente al trattamento dei dati di ingresso/uscita. Molto importante sottolineare che una funzione in C, controlla con molta cura il tipo di dati dei parametri passati, così come una funzione matematica esiste solo se applicata a un insieme con certe proprietá. Per approfondimenti sulla denizione di funzione si rimanda al corso di Matematica. 2.1.1 Funzioni in C Una funzione in C è una sezione di codice con le proprietá viste in (2). Una funzione in C, come si dice in genere, viene chiamata da un'altra sezione di codice (in genere dal main). Una funzione in C puó, a sua volta, chiamare un'altra funzione. Non sono permesse, come invece avviene in Pascal, chiamate annidate, ovvero non é possibile scrivere all'interno di una funzione C, un'altra funzione. Tutte le funzioni in C occupano lo stesso livello. Il programma principale di un programma in C (ovvero il main) é esso stesso una funzione. Il main, come si vedrá in altra parte di questo lavoro, é chiamato dal sistema operativo. Il linguaggio C prevede che venga scritto un prototipo della funzione. Il prototipo è necessario per comunicare al compilatore che sono presenti nel programma delle funzioni e che queste ricevono/restituscono variabili. Inoltre va sepcicato il tipo delle variabili ricevute/restituite Diamo ora alcuni esempi di programmi che fanno uso di funzioni

Sub-program 3 2.1.2 Esempio: Input di un numero da tastiera tramite funzione // prototipo della funzione con nome leggi // variabili ricevute: nessuna (si usa la parola chiave void // variabili restituite: il valore letto int leggi (void); int n; n = leggi(); cout << "Valore letto tramite funzione leggi = " << n+1; int leggi() int x; // si usa una variabile di comodo cout << "Inserisci valore da tastiera..."; cin >> x; return x; Il programma va interpretato in questo modo. 1. il main deve leggere un valore intero. 2. usa la funzione leggi() per leggere il valore da tastiera. 3. il main richiama la funzione leggi() 4. la funzione leggi parte, dichiara una variabile di comodo x 5. si legge da tastiera il valore di x 6. la funzione termina restituendo il valore di x letto 7. il valore di x viene assegnato al nome della funzione, quindi leggi = x; 8. la funzione termina e la memoria occupata viene cancellata (si cancellano tutte le variabili usate dalla funzione, quindi si cancella x) 9. il controllo ritorna al main che riceve il valore nella variabile leggi 10. il main assegna ad n il lvlaore di leggi 11. il main stampa il valore successivo a n

Sub-program 4 2.1.3 Esempio: calcolo della potenza di un numero tramite funzione In questo esempio si usano variabili intere. Il main legge 2 valori: base e esp rispettivamente base ed esponente. Il main richiama una funzione che si chiama potenza per il calcolo di base esp // prototipo della funzione con nome potenza // variabili ricevute: base tipo intero, exp tipo intero // variabili restituite: la potenza int potenza (int b, int e); int p, base, esp; cout << "Inserisci valore base... "; cin >> base; cout << "Inserisci valore esponente... "; cin >> esp; p = potenza (base, esp); cout << "Valore potenza = " << p; int potenza(int b, int e) int p = 1, i; for (i=0; i<e; i++) p *= b; return p; La funzione calcola volutamente il valore della potenza, tramite un ciclo for, per mostrare di nuovo l'uso delle variabili di comodo dichiarate nella funzione potenza. Sia il main sia la funzione dichiarano la variabile p. Le due variabili, pero' sono poste in locazioni di memoria diverse, quindi anche se hanno lo stesso nome, in realtà sono due variabili diverse. La variabile p, dichiarata nella funzione potenza, è una variabile locale e nasconde la variabile p, dichairata nel main. Anche p nel main è una variabile locale, in questo case si dice essere locale al main, mentre l'altra p è locale a potenza. Come nel caso precedente, quando potenza termina, tutta la memeoria allocata per il suo funzionamento viene cancellata.

Sub-program 5 2.1.4 Esempio: funzione che non riceve/restituisce valori In questo esempio vediamo una funzione che non usa nessun parametro sia in ingresso sia in uscita // prototipo della funzione con nome print_err // variabili ricevute: nessuna // variabili restituite: nessuna void print_err (void); int a, b; cout << "Inserisci valore a... "; cin >> a; cout << "Inserisci valore b... "; cin >> b; if (a==0) print_err(); else cout << "Valore di x = " << -b/a; void print_err() cout << "Impossibile calcolare il valroe di x " << endl; E' buona norma scrivere una serie di funzioni di comodo, che stmapano dei messaggi di errore quando si verifca una condizione nella quale il programma non può andare avanti. Questa buona abitudine rende il programma di facile lettura e di facile correzione.

Sub-program 6 2.1.5 Esempio: funzione che restituisce più valori In questo esempio vediamo una funzione che non restituisce nulla ma riceve due valori dal main che deve modicare // prototipo della funzione con nome swap // variabili ricevute: puntatore a x, puntaotre a y // variabili restituite: nessuna void swap (int *, int *); int a, b; cout << "Inserisci valore a... "; cin >> a; cout << "Inserisci valore b... "; cin >> b; swap (&a, &b); cout << "Inserisci valore a... " << a << endl; cout << "Inserisci valore b... " << b << endl; void swap (int *x, int *y) int com; com = *x; *x = *y; *y = com; Nel main la chaiamta a funzione avviene usando il simbolo di de-referenziazione, il quale indica alla funzione che riceve in ingresso non i valori reali delle variabili, ma il loro indirizzo. Si ricorda che il C eettua una chiamata a funzione passando i parametri per copia ovvero il main copia i valori delle variabili nella zona di memoria della funzione. La funzione usa questi valori e alla sua chiusura, questi vengono cancellati, restituendo il controllo al main. Cosa susccede se la funzione deve restituire al main più valori modicati? Questo è il classico esempio riportato dai libri, nel quale una funzione deve restituire più valori al main. Si usa la lista dei parametri per risolvere il problema e il nome della funzione non restituisce alcunche. Nel caso della funzione swap, se x, y fossero stati passati per copia, lo scambio sarebbe avvenuto nello spazio di memoria della funzione, ritornando ai valori originali (a, b) nel main, quando la funzione terminava.

Sub-program 7 Questo esempio inoltre illustra l'uso dei puntatori senza i quali lo swap non sarebbbe possibile. Infatti la sintassi del prototipo indica che la funzione non lavorerà sui valori copia, ma su quelli originali che sono memorizzati nello spazio di memroia del main.

Sub-program 8 2.1.6 Esempio: funzione swap modicata // prototipo della funzione con nome swap // variabili ricevute: puntatore a x, puntaotre a y // variabili restituite: nessuna void swap (int *, int *); int a, b; cout << "Inserisci valore a... "; cin >> a; cout << "Inserisci valore b... "; cin >> b; swap (&a, &b); cout << "Inserisci valore a... " << a << endl; cout << "Inserisci valore b... " << b << endl; void swap (int *x, int *y) int *com; com = x; x = y; y = com; In questo esempio, uguale al precedente, lo swap non si eettua sul contenuto delle celle di memoria, ma sui loro indirizzi.

Sub-program 9 Riferimenti bibliograci [1] Kernigham-Ritche, Linguaggio C, Addison Wesley, 2 Edizione Italiana [2] MS-Windows Msdn Help, fstream class [3] Wikipedia, ricerca sottoprogrammi e funzioni in C