9. Funzioni e procedure
Ing. Simona Colucci
Fondamenti di Informatica
CDL in Ingegneria Meccanica (B) - A.A. 2009-2010
Sistemi Informativi
DEE - Politecnico di Bari
•
•
•
•
•
•
Indice
Necessità di sottoprogrammi(funzioni e procedure)
Struttura completa di un programma in C
Funzioni
Procedure
Comunicazione con i sottoprogrammi
Sottoprogrammi predefiniti
Fondamenti di Informatica
CDL in Ingegneria Meccanica (B) - A.A. 2009-2010
Sistemi Informativi
DEE - Politecnico di Bari
Il concetto di sottoprogramma (1)
• I sottoprogrammi implementano operazioni non predefinite sui
tipi di dati
• Ai meccanismi di astrazione sui dati visti finora mancano infatti le
operazioni:
– Esempio (di tipi di dati definiti):
typedef struct {
int
DescrizioneFatture
} ElencoFatture;
NumFatture;
Sequenza[MaxNumFatture];
typedef struct { int
Descrizionecosti
} ElencoCosti;
NumCosti;
Sequenza[MaxNumCosti]
MaxNumFatture e MaxNumCosti costanti
DescrizioneFatture e DescrizioneCosti tipi definiti (in precedenza):
Fondamenti di Informatica
CDL in Ingegneria Meccanica (B) - A.A. 2009-2010
Sistemi Informativi
DEE - Politecnico di Bari
•
•
Il concetto di sottoprogramma (2)
I sottoprogrammi racchiudono in maniera astratta le righe di codice
necessarie ad eseguire un’operazione
Vantaggi:
– Scrivere direttamente il risultato
RisultatoDiGestione = FatturatoTotale (ArchivioFatture) – SommaCosti (ArchivioCosti);
è meglio che scrivere tutte le istruzioni necessarie ad ottenerlo
FatturatoTotale = 0;
for (Cont = 0; Cont < ArchivioFatture.NumFatture; Cont++)
{
FatturatoTotale = FatturatoTotale + ArchivioFatture.Sequenza[Cont].Importo;
}
SommaCosti= 0;
for (Cont = 0; Cont < ArchivioCosti.NumCosti; Cont++)
{
SommaCosti = SommaCosti + ArchivioCosti.Sequenza[Cont].Importo;
}
RisultatoDiGestione = FatturatoTotale – SommaCosti;
– Se l’operazione deve essere ripetuta più volte l’utilizzo dei sottoprogrammi è ancora
più vantaggioso
Fondamenti di Informatica
CDL in Ingegneria Meccanica (B) - A.A. 2009-2010
Sistemi Informativi
DEE - Politecnico di Bari
Il concetto di sottoprogramma (3)
• I sottoprogrammi sono lo strumento per realizzare astrazioni sulle
operazioni
• Due tipi (concettualmente):
– Funzioni: sottoprogrammi descrivibili come vere e proprie
funzioni matematiche e possiedono un dominio ed un codominio
– Procedure: sottoprogrammi che modificano lo stato di alcune
variabili di programma
• L’utilizzo dei sottoprogrammi necessita di:
– Definizione del sottoprogramma
– Chiamata del sottoprogramma
Fondamenti di Informatica
CDL in Ingegneria Meccanica (B) - A.A. 2009-2010
Struttura di un programma C
Sistemi Informativi
DEE - Politecnico di Bari
 Struttura completa:
 Direttive al preprocessore;
 parte dichiarativa globale
 contiene la dichiarazione di tutti gli elementi che sono condivisi dal
programma principale e dai sottoprogrammi
 Programma principale(main) a sua volta costituito da parte dichiarativa ed
esecutiva
 definizioni di sottoprogrammi  funzioni o procedure  a seguire il
programma principale.
 Il main è un particolare sottoprogramma tra gli altri;
 Il main e ciascun sottoprogramma possono usare tutti e soli gli elementi che
sono stati dichiarati nella loro propria parte dichiarativa, nonché quelli che
sono stati dichiarati nella parte dichiarativa globale
Fondamenti di Informatica
CDL in Ingegneria Meccanica (B) - A.A. 2009-2010
Sistemi Informativi
DEE - Politecnico di Bari
•
Funzioni: Definizione
Struttura della definizione :
 testata (header);
 due parti, racchiuse fra parentesi graffe:
• la parte dichiarativa locale: definisce tutti gli oggetti necessari
alla realizzazione dell’operazione astratta, in particolare le variabili
locali
• la parte esecutiva (detta corpo della funzione):
– Istruzioni per l’esecuzione dell’operazione
– Istruzione di return: serve a restituire il risultato della funzione, del tipo
specificato nella testata e identificato tramite il nome della funzione
Fondamenti di Informatica
CDL in Ingegneria Meccanica (B) - A.A. 2009-2010
Sistemi Informativi
DEE - Politecnico di Bari
Funzioni : Definizione
• La testata contiene:
– tipo del risultato(codominio della funzione)
• Una funzione non può restituire array o funzioni ma può
restituire un puntatore a qualsiasi tipo
– identificatore del sottoprogramma
– lista dei parametri (formali) cui la funzione viene
applicata con il relativo tipo(dominio della funzione):
• Ogni parametro formale è un identificatore di tipo seguito da
un identificatore
• Si chiamano formali perché non hanno valore proprio ma
sono riferimenti simbolici agli argomenti delle funzioni
Fondamenti di Informatica
CDL in Ingegneria Meccanica (B) - A.A. 2009-2010
Sistemi Informativi
DEE - Politecnico di Bari
Funzioni : Definizione
Esempi di testate:
•
int FatturatoTotale(ElencoFatture par)
•
boolean Precede(StringaCaratteri par1, StringaCaratteri par2)
•
boolean Esiste(int par1, SequenzaInteri par2)
/* Stabilisce se il primo parametro, di tipo intero, appartiene all'insieme di interi contenuti nel
secondo parametro: una sequenza di interi */
•
MatriceReali10Per10 *MatriceInversa(MatriceReali10Per10 *par)
Fondamenti di Informatica
CDL in Ingegneria Meccanica (B) - A.A. 2009-2010
Sistemi Informativi
DEE - Politecnico di Bari
Funzioni : Definizione
Funzione completa:
int
FatturatoTotale (ElencoFatture
parametro)
{
int
Totale, Cont;
Totale = 0;
for (Cont = 0; Cont < parametro.NumFatture; Cont++)
Totale = Totale + parametro.Sequenza[Cont].Importo;
return Totale;
}
Fondamenti di Informatica
CDL in Ingegneria Meccanica (B) - A.A. 2009-2010
Sistemi Informativi
Funzioni : Definizione
DEE - Politecnico di Bari
Funzione completa:
int
RadiceIntera (int
par)
{
int cont;
cont = 0;
while (cont*cont <= par)
cont = cont + 1;
return (cont – 1);
}
Fondamenti di Informatica
CDL in Ingegneria Meccanica (B) - A.A. 2009-2010
Sistemi Informativi
DEE - Politecnico di Bari
Funzioni: Chiamata
• Consentono di utilizzare le operazioni implementate dalle
funzioni
• Una funzione applicata a un valore dell’argomento,
appartenente al suo dominio, fornisce un valore
appartenente al suo codominio
• Struttura della chiamata:
– Identificatore della funzione
– Lista dei parametri attuali, tra parentesi tonde:
• Sono i valori degli argomenti rispetto ai quali la funzione deve
essere calcolata
• Corrispondono in numero, ordine e tipo ai parametri formali
dichiarati
Fondamenti di Informatica
CDL in Ingegneria Meccanica (B) - A.A. 2009-2010
Sistemi Informativi
DEE - Politecnico di Bari
Funzioni: chiamata
Esempi:
•
•
•
•
•
x = sin(y) – cos(PiGreco – alfa);
x = cos(atan(y) – beta);
x = sin(alfa);
y = cos(alfa) – sin(beta);
z = sin(PiGreco) + sin(gamma);
•
RisultatoGestione = FatturatoTotale(ArchivioFatture) - SommaCosti(ArchivioCosti);
•
•
Det1 = Determinante(Matrice1);
Det2 = Determinante(MatriceInversa(Matrice2));
•
•
•
TotaleAssoluto = Sommatoria(Lista1) + Sommatoria(Lista2);
ElencoOrdinato = Ordinamento(Elenco);
OrdinatiAlfabeticamente = Precede(nome1, nome2);
Fondamenti di Informatica
CDL in Ingegneria Meccanica (B) - A.A. 2009-2010
Sistemi Informativi
DEE - Politecnico di Bari
•
•
Prototipo delle funzioni
All’interno di un programma C una funzione può essere chiamata purché risulti
definita oppure dichiarata(definizione e dichiarazione non sono termini
equivalenti)
La dichiarazione di una funzione (prototipo):
– si limita a richiamarne la testata
– Utile quando la chiamata di una funzione precede, nel codice, la definizione della
funzione, oppure le funzioni utilizzate da un programma sono definite in file propri
del sistema C (e.g., le funzioni di libreria)
– Aiuta il compilatore ed è buono stile di programmazione
Fondamenti di Informatica
CDL in Ingegneria Meccanica (B) - A.A. 2009-2010
Esecuzione delle funzioni
e passaggio dei parametri
Sistemi Informativi
DEE - Politecnico di Bari
/* Programma Contabilità (1) */
/* Parte direttiva */
#include <stdio.h>
#define MaxNumFatture
1000
/* Parte dichiarativa globale */
typedef char
String [30];
typedef struct { int giorno;
int mese;
int anno;
} Data;
typedef struct
{
typedef struct
{
String
int
Data
} DescrizioneFatture;
int
DescrizioneFatture
} ElencoFatture;
Indirizzo;
Ammontare;
DataFattura;
NumFatture;
Sequenza[MaxNumFatture];
Fondamenti di Informatica
CDL in Ingegneria Meccanica (B) - A.A. 2009-2010
Sistemi Informativi
DEE - Politecnico di Bari
Esecuzione delle funzioni
e passaggio dei parametri
/* Programma Contabilità (2)*/
main()
{
ElencoFatture
int
int
ArchivioFatture1, ArchivioFatture2;
Fatt1, Fatt2, Fatt;
FatturatoTotale(ElencoFatture parametro);
/* Prototipo della funzione FatturatoTotale */
....
Fatt1 = FatturatoTotale(ArchivioFatture1);
Fatt2 = FatturatoTotale(ArchivioFatture2);
Fatt = Fatt1 + Fatt2;
....
}
/* Fine del main del programma Contabilità */
Fondamenti di Informatica
CDL in Ingegneria Meccanica (B) - A.A. 2009-2010
Sistemi Informativi
DEE - Politecnico di Bari
Esecuzione delle funzioni
e passaggio dei parametri
/* Definizione della funzione FatturatoTotale */
int FatturatoTotale (ElencoFatture parametro)
{
int Totale, Cont;
Totale = 0;
for (Cont = 0; Cont < parametro.NumFatture; Cont++)
Totale = Totale + parametro.Sequenza[Cont].Importo;
return Totale;
}
Fondamenti di Informatica
CDL in Ingegneria Meccanica (B) - A.A. 2009-2010
Sistemi Informativi
DEE - Politecnico di Bari
Esecuzione di funzioni:
macchine astratte master e slave
ArchivioFatture1
Parametro
ArchivioFatture2
Totale
Cont
Fatt1
FatturatoTotale
Fatt2
MASTER: chiama la
funzione passando i
parametri attuali
SLAVE: calcola il risultato
dopo aver manipolato i
parametri formali
Fondamenti di Informatica
CDL in Ingegneria Meccanica (B) - A.A. 2009-2010
Sistemi Informativi
DEE - Politecnico di Bari
Esecuzione di funzioni:
macchine astratte master e slave
• Le due macchine hanno ciascuna il proprio ambiente di
esecuzione:
– La macchina slave ha un ambiente locale di funzione
caratterizzato da:
• Variabili locali
• Variabili corrispondenti ai parametri formali
• Variabile che contiene il valore da restituire (tramite l’istruzione
return), che corrisponde all’identificatore della funzione nel modulo
master
– La macchina master ha un ambiente caratterizzato dalle variabili
che utilizza il programma chiamante, tra cui quelle passate come
parametri attuali
Fondamenti di Informatica
CDL in Ingegneria Meccanica (B) - A.A. 2009-2010
Sistemi Informativi
DEE - Politecnico di Bari
Passaggio di parametri
L’istruzione:
Fatt1 = FatturatoTotale(ArchivioFatture1);
provoca il seguente flusso:
– La macchina master chiama la macchina slave per il valore di
FatturatoTotale passando i parametri ad essa:il passaggio dei
parametri consiste nella copiatura dei parametri attuali nella
cella dei parametri formali
– Il controllo viene ceduto alla macchina slave, che procede con
l’esecuzione come un normale programma fino al return o alla
chiusura di parentesi graffa
– Il controllo viene restituito alla macchina master con la
restituzione del valore della funzione
Fondamenti di Informatica
CDL in Ingegneria Meccanica (B) - A.A. 2009-2010
Sistemi Informativi
DEE - Politecnico di Bari
Esecuzione delle funzioni
e passaggio dei parametri
x = sin(atan(y) – acos(z));
Equivale a :
temp1 = atan(y); temp2 = acos(z);
temp3 = temp1 – temp2
x = sin(temp3);
Fondamenti di Informatica
CDL in Ingegneria Meccanica (B) - A.A. 2009-2010
Sistemi Informativi
DEE - Politecnico di Bari
Procedure
• Sono sottoprogrammi che non corrispondono a funzioni
matematiche
• Le procedure non servono a produrre dei valori di un
certo tipo ma a modificare lo stato del programma che
ne chiede l’esecuzione
• In C una procedura viene definita come una funzione
che ha come tipo del risultato il tipo speciale void
Fondamenti di Informatica
CDL in Ingegneria Meccanica (B) - A.A. 2009-2010
Sistemi Informativi
DEE - Politecnico di Bari
typedef enum
typedef struct
TipoSemaforo
Procedure: esempio 1
{VerdeSinistra, VerdeDestra} TipoStato;
{
TipoStato
Stato;
int
CodaSinistra;
int
CodaDestra;
} TipoSemaforo;
Semaforo;
AggiornaSemaforo :
•
Diminuisce di un valore costante il campo CodaSinistra o CodaDestra a
seconda che lo stato del semaforo sia VerdeSinistra o VerdeDestra;
•
Legge dal terminale i valori NuoviArriviSinistri e NuoviArriviDestri e li somma,
rispettivamente, a CodaSinistra e CodaDestra;
•
Dà al campo Stato il valore VerdeSinistra se CodaSinistra > Coda Destra e
viceversa.
Fondamenti di Informatica
CDL in Ingegneria Meccanica (B) - A.A. 2009-2010
Sistemi Informativi
DEE - Politecnico di Bari
Procedure : esempio 2
/*Programma Contabilità (1)*/
#include<stdio.h>
#define
MaxNumFatture 1000
...
typedef struct
{
String
indirizzo;
int
ammontare;
Data
DataFattura;
} DescrizioneFatture;
typedef struct
{
int
NumFatture;
DescrizioneFatture Sequenza[MaxNumFatture];
} ElencoFatture;
ElencoFatture
ArchivioFatture;
Fondamenti di Informatica
CDL in Ingegneria Meccanica (B) - A.A. 2009-2010
Sistemi Informativi
DEE - Politecnico di Bari
Procedure: esempio 2
/*Programma Contabilità (2)*/
main()
{
Data
DataOdierna;
DescrizioneFatture
Fattura1, Fattura2;
void
InserisciFattura(DescrizioneFatture
Fattura);
boolean
Precede(Data Num1, Data Num2);
…
/* Sequenza di istruzioni che leggono i dati di una fattura in Fattura1 */
InserisciFattura(Fattura1);
...
/* Sequenza di istruzioni che leggono i dati di una fattura in Fattura2 */
if
(Precede(Fattura2.DataEmissione, DataOdierna))
InserisciFattura(Fattura2);
...
}
Fondamenti di Informatica
CDL in Ingegneria Meccanica (B) - A.A. 2009-2010
Sistemi Informativi
DEE - Politecnico di Bari
Procedure : esempio 2
/*Programma Contabilità (3)*/
void
{
InserisciFattura(DescrizioneFatture Fattura)
if
(ArchivioFatture.NumFatture == MaxNumFatture)
printf("L'archivio è pieno.\n");
else
{
ArchivioFatture.NumFatture = ArchivioFatture.NumFatture + 1;
ArchivioFatture.Sequenza[ArchivioFatture.NumFatture–1] = Fattura;
}
}
Fondamenti di Informatica
CDL in Ingegneria Meccanica (B) - A.A. 2009-2010
Sistemi Informativi
DEE - Politecnico di Bari
Esecuzione delle procedure
ArchivioFatture
Ambiente globale
DataOdierna
Fattura
...
Fattura1
Ambiente locale di
InserisciFattura
Fattura2
Ambiente di main di
Programma Contabilità
Fondamenti di Informatica
CDL in Ingegneria Meccanica (B) - A.A. 2009-2010
Sistemi Informativi
DEE - Politecnico di Bari
void
Passaggio parametri per indirizzo (1)
InserisciFattura( DescrizioneFatture Fattura, ElencoFatture
ArchivioFatture)
/*In questa versione della procedura, sia la fattura da inserire sia l'archivio in cui inserirla
sono dei parametri */
{
if
(ArchivioFatture.NumFatture == MaxNumFatture)
printf("L'archivio è pieno.");
else
{
ArchivioFatture.NumFatture =
ArchivioFatture.NumFatture + 1;
ArchivioFatture.Sequenza[ArchivioFatture.NumFatture–1] =
}
}
/*Fine della procedura InserisciFattura */
InserisciFattura (Fattura1, ArchivioFatture5);
Non funziona! Perché?
Fondamenti di Informatica
CDL in Ingegneria Meccanica (B) - A.A. 2009-2010
Fattura;
Sistemi Informativi
DEE - Politecnico di Bari
Passaggio parametri per indirizzo (2)
Parametri attuali
Ind(x) = 2034
Ind(y) = 1004
243
Parametri formali
243
y
A
413
1004
Passaggio
per valore
Passaggio per
indirizzo
Fondamenti di Informatica
CDL in Ingegneria Meccanica (B) - A.A. 2009-2010
Sistemi Informativi
DEE - Politecnico di Bari
Passaggio parametri per indirizzo (3)
In C la modalità di passaggio dei parametri a un
sottoprogramma è sempre quella di passaggio per
valore. Per simulare il passaggio per indirizzo:
• utilizzare il costruttore puntatore per la
definizione dei parametri formali della
funzione;
• usare l’operatore di dereferenziazione di
puntatore (operatore * o –>) all’interno del
corpo della funzione;
• passare al momento della chiamata della
funzione come parametro attuale un indirizzo
di variabile (usando l’operatore &).
Fondamenti di Informatica
CDL in Ingegneria Meccanica (B) - A.A. 2009-2010
Sistemi Informativi
DEE - Politecnico di Bari
Passaggio parametri per indirizzo (4)
/*Programma Contabilità (1)*/
...
main()
{
ElencoFatture
Data
DescrizioneFatture
void
Boolean
ArchivioFatture5;
/* Qui ArchivioFatture5 è una variabile locale del main. */
DataOdierna;
Fattura1, Fattura2;
InserisciFattura (
DescrizioneFatture Fattura,
ElencoFatture
*PointToArchivioFatture);
/* Prototipo della procedura InserisciFattura */
Precede(Data Num1, Data Num2);
/* Prototipo della funzione Precede */
Fondamenti di Informatica
CDL in Ingegneria Meccanica (B) - A.A. 2009-2010
Sistemi Informativi
DEE - Politecnico di Bari
Passaggio parametri per indirizzo (5)
/*Programma Contabilità (2)*/
...
/* Sequenza di istruzioni che leggono i dati di una fattura in Fattura1 */
InserisciFattura(Fattura1, &ArchivioFatture5);
/* Chiamata della procedura InserisciFattura: alla procedura viene passato il valore di
Fattura1 e l'indirizzo di ArchivioFatture5 */
...
/* Sequenza di istruzioni che leggono i dati di una fattura in Fattura2 */
if
(Precede(Fattura2.DataEmissione, DataOdierna)
InserisciFattura(Fattura2,&ArchivioFatture5);
/* Nuova chiamata della procedura InserisciFattura: alla procedura viene passato il
valore di Fattura2 e -nuovamente- l'indirizzo di Archivio Fatture5 (ma potrebbe
essere un altro) */
...
}
Fondamenti di Informatica
CDL in Ingegneria Meccanica (B) - A.A. 2009-2010
Sistemi Informativi
DEE - Politecnico di Bari
Passaggio parametri per indirizzo (6)
/*Programma Contabilità (3)*/
...
/* Definizione della procedura InserisciFattura */
void InserisciFattura(
DescrizioneFatture
Fattura,
ElencoFatture
*PointToArchivioFatture)
/* In questa versione della procedura, la fattura da inserire e l'indirizzo dell'archivio in cui
inserirla sono dei parametri */
{
if
(PointToArchivioFatture–>NumFatture == MaxNumFatture)
/* PointToArchivioFatture è una variabile che punta a una struttura
avente un campo di nome NumFatture */
printf("L'archivio è pieno.\n");
else
{
PointToArchivioFatture–>NumFatture = PointToArchivioFatture–>
NumFatture +1;
PointToArchivioFatture–>
Sequenza[PointToArchivioFatture–>NumFatture – 1] = Fattura;
}
}
Fondamenti di Informatica
CDL in Ingegneria Meccanica (B) - A.A. 2009-2010
Sistemi Informativi
Parametri di tipo array
DEE - Politecnico di Bari
•
L’indirizzo di base dell’array viene passato “per valore” alla funzione.
typedef
•
double
TipoArray[MaxNumElem]
Le tre testate di funzione riportate di seguito sono equivalenti:
double
sum(TipoArray
double
double
sum(double
sum(double
a, int
n)
/* n è la dimensione dell'array passato */
*a, int n)
a[ ], int n)
Fondamenti di Informatica
CDL in Ingegneria Meccanica (B) - A.A. 2009-2010
Sistemi Informativi
DEE - Politecnico di Bari
double
Parametri di tipo array
mul(double a[ ], int
n)
/* n è la dimensione dell'array passato */
{
int
i;
double ris;
ris = 1.0;
for (i=0; i < n; i=i+1)
ris = ris * a[i];
return ris;
}
•
v array di 50 elementi:
Chiamata
Valore calcolato e restituito
mul(v, 50)
mul(v, 30)
mul(&v[5], 7)
mul(v+5, 7)
v[0]*v[1]* ... *v[49]
v[0]*v[1]* ... *v[29]
v[5]*v[6]* ... *v[11]
v[5]*v[6]* ... *v[11]
Fondamenti di Informatica
CDL in Ingegneria Meccanica (B) - A.A. 2009-2010
Sistemi Informativi
DEE - Politecnico di Bari
•
Parametri di tipo struttura
Una struttura può essere passata per valore anche quando contiene un
componente di tipo array.
Fondamenti di Informatica
CDL in Ingegneria Meccanica (B) - A.A. 2009-2010
Sistemi Informativi
DEE - Politecnico di Bari
•
•
I blocchi
Un blocco è composto da due parti racchiuse tra parentesi graffe:
 una parte dichiarativa (facoltativa);
 una sequenza di istruzioni.
Diversi blocchi possono comparire internamente al main o alle funzioni che
compongono un programma C. I blocchi possono risultare paralleli o
annidati
Fondamenti di Informatica
CDL in Ingegneria Meccanica (B) - A.A. 2009-2010
Sistemi Informativi
I blocchi annidati
DEE - Politecnico di Bari
/* Programma ComplessoInStruttura */
#include <stdio.h>
/* Parte dichiarativa globale */
int
char
int
main ()
{
int
int
g1, g2;
g3;
f1(int par1, int
par2); ...
a, b;
f2(int
par1); ...
par3, int
/* blocco1 */
{
char
...
a, c;
/* blocco2 annidato nel blocco1 */
{
float
...
a;
}
/* Fine blocco2 */
}
/* Fine blocco1 */
}
/* Fine main */
Fondamenti di Informatica
CDL in Ingegneria Meccanica (B) - A.A. 2009-2010
Sistemi Informativi
I blocchi paralleli
DEE - Politecnico di Bari
int
{
f1(int
int
...
par1, int
par2)
d;
/* blocco3 */
{
int
...
e;
}
/* Fine blocco3 */
/* blocco4 */
{
int
...
d;
}
/* Fine blocco4 */
}
/* Fine f1 */
Fondamenti di Informatica
CDL in Ingegneria Meccanica (B) - A.A. 2009-2010
Sistemi Informativi
DEE - Politecnico di Bari
I blocchi : funzioni
/* Definizione della funzione f2 */
int
{
f2(int
int
...
par3, int
par4)
f;
}
/* Fine f2 */
Fondamenti di Informatica
CDL in Ingegneria Meccanica (B) - A.A. 2009-2010
Sistemi Informativi
DEE - Politecnico di Bari
Visibilità all’interno dei blocchi
Fondamenti di Informatica
CDL in Ingegneria Meccanica (B) - A.A. 2009-2010
Sistemi Informativi
DEE - Politecnico di Bari
La durata delle variabili
•
variabili fisse o statiche (static): i loro valori vengono mantenuti anche
all’esterno del loro ambito di visibilità.
•
variabili automatiche (auto): i loro valori non vengono mantenuti
all’esterno del proprio ambito di visibilità.
•
Sono variabili fisse le variabili globali del programma
Fondamenti di Informatica
CDL in Ingegneria Meccanica (B) - A.A. 2009-2010
Sistemi Informativi
La durata delle variabili: esempio
DEE - Politecnico di Bari
/* Definizione della funzione f1 */
int
f1(int
par1, int par2)
{
static int d;
/* blocco3 */
{
int
e;
...
}
/*Fine blocco3 */
/* blocco4 */
{
int
d;
...
}
/* Fine blocco4 */
}
/* Fine f1 */
Fondamenti di Informatica
CDL in Ingegneria Meccanica (B) - A.A. 2009-2010
Effetti collaterali (1)
Sistemi Informativi
DEE - Politecnico di Bari
int x;
/* Variabile globale */
int PrimoEsempio(int par)
{
return (par + x)
}
•
Nel corso del seguente frammento di programma:
x = 1;
x = PrimoEsempio(1);
x = PrimoEsempio(1);
•
La sua chiamata produce, la prima volta, il risultato “2”, la seconda volta “3”.
Fondamenti di Informatica
CDL in Ingegneria Meccanica (B) - A.A. 2009-2010
Effetti collaterali (2)
Sistemi Informativi
DEE - Politecnico di Bari
int SecondoEsempio(int
{
*par = *par + 1;
return *par;
}
*par)
y = SecondoEsempio(&z);
•
Assegna alla variabile y il valore di z+1, ma anche z assume lo stesso valore. effetto collaterale (side
effect)
Fondamenti di Informatica
CDL in Ingegneria Meccanica (B) - A.A. 2009-2010
Effetti collaterali (3)
Sistemi Informativi
DEE - Politecnico di Bari
int x;
/* Variabile globale */
int TerzoEsempio(int par)
{
x = par + 2;
return (par + 1);
}
•
Altro effetto collaterale:
z = TerzoEsempio(4);
•
Assegna a z il valore “5”, ma anche il valore “6” a x.
A
Fondamenti di Informatica
CDL in Ingegneria Meccanica (B) - A.A. 2009-2010
Uso interscambiabile
di procedure e funzioni
Sistemi Informativi
DEE - Politecnico di Bari
int f(int par1)
{
...
return risultato;
}
•
Essa può essere trasformata nella procedura seguente:
void
f(int
{
...
*par2 = risultato;
}
•
par1, int
*par2)
Successivamente, una chiamata come:
y = f(x);
verrà trasformata in:
f(x, &y);
Fondamenti di Informatica
CDL in Ingegneria Meccanica (B) - A.A. 2009-2010
Sistemi Informativi
DEE - Politecnico di Bari
•
•
•
La standard library del C
Sottoprogrammi di largo uso predefiniti:
– Matematica
– I/O
– Grafica
Librerie di sottoprogrammi:
– Predefinite
– Costruite dai programmatori applicativi
Però l’uso di librerie diminuisce la portabilità a meno che anche le
librerie (almeno le fondamentali) non siano standardizzate: la grande
forza del C: la libreria standard
Fondamenti di Informatica
CDL in Ingegneria Meccanica (B) - A.A. 2009-2010
Sistemi Informativi
DEE - Politecnico di Bari
Esempio
#include <stdio.h>
/* Programma Concatenazione di stringhe */
#include <string.h>
#define LunghezzaArray 50
main()
{
char
PrimaStringa[LunghezzaArray], SecondaStringa[LunghezzaArray],
StringaConc[2 * LunghezzaArray];
unsigned
LunghezzaConc;
scanf(“%s”, PrimaStringa);
scanf(“%s”, SecondaStringa);
if
(strcmp(PrimaStringa, SecondaStringa) <= 0)
{
strcpy(StringaConc, PrimaStringa);
strcat(StringaConc, SecondaStringa);
}
else
{
strcpy(StringaConc, SecondaStringa);
strcat(StringaConc, PrimaStringa);
}
LunghezzaConc = strlen(StringaConc);
printf(“La stringa ottenuta concatenando le due stringhe lette è %s.
Essa è lunga %d caratteri\n”, StringaConc, LunghezzaConc);
}
Fondamenti di Informatica
CDL in Ingegneria Meccanica (B) - A.A. 2009-2010
Sistemi Informativi
DEE - Politecnico di Bari
•
I file header
Le funzioni della libreria sono disponibili in C come file di codice
compilato
È compito del programmatore inserire nel programma i prototipi delle
funzioni che verranno usate
• La libreria C comprende alcuni file, chiamati header file, che
•
contengono i prototipi di un insieme di funzioni di libreria
#include <stdio.h>
e altre
#include <xxx.h>
•
Il preprocessore copia il contenuto del file stdio.h nel programma,
inserendo i prototipi delle funzioni che appartengono al gruppo di cui
xxx.h è il file testata
Fondamenti di Informatica
CDL in Ingegneria Meccanica (B) - A.A. 2009-2010
Scarica

funzioni e procedure - SisInf Lab