G. Amodeo,
C. Gaibisso
Programmazione di Calcolatori
Lezione XV
La struttura di un programma
Programmazione di Calcolatori: la struttura di un programma
1
G. Amodeo,
C. Gaibisso
L’idea …
• Obiettivo:
a) una più efficace gestione del software
b) ridurre i tempi di compilazione
• Idea:
a) organizzare il codice in diversi file
b) organizzare i file in una struttura di
cartelle che ne rifletta l’organizzazione
logica (es. manipolazione di stringhe,
vettori, matrici, ecc.)
c) mantenere nello stesso file definizioni di
funzioni con compiti “omogenei” (es.
funzioni di I/O di matrici, funzioni di
ordinamento di vettori, ecc.)
Programmazione di Calcolatori: la struttura di un programma
2
G. Amodeo,
C. Gaibisso
Definizioni e dichiarazioni
• Utilizzo delle funzioni:
una funzione può essere chiamata all’interno di
un file F se:
- è definita in F precedentemente alla
chiamata, o
- è dichiarata in F precedentemente alla
chiamata e definita altrove
• Definizione di una funzione:
coincide con l’istante di “creazione” della
funzione
• Dichiarazione di una funzione:
“informa” il compilatore della esistenza di una
definizione per la funzione esterna al file in cui è
chiamata evidenziandone le “caratteristiche”
Programmazione di Calcolatori: la struttura di un programma
3
G. Amodeo,
C. Gaibisso
Dichiarazione extern
• Sintassi:
intestazione della corrispondente definizione
preceduta della parola chiave “extern”seguita
da un “;”, dalla quale vengono omessi i nomi dei
parametri formali
• Esempio:
// sorgente Lezione_XV\Es_1\scambia.c
// funzione che scambia il contenuto di due variabili intere
void scambia (int *var1, int *var2)
{
// definisce una variabile di appoggio
int temp;
// scambia le variabili di input utilizzando la variabile di appoggio
temp = *var1;
*var1 = *var2;
*var2 = temp;
};
Programmazione di Calcolatori: la struttura di un programma
4
G. Amodeo,
C. Gaibisso
Definizioni e dichiarazioni
// sorgente Lezione_XV\Es_1\main.c
Chiamo scambia()
#include <stdio.h>
senza che, nel file, sia
// chiamante per lo scambio di due variabili
stata prima definita o
int main ()
{
dichiarata
// definizione e acquisizione delle variabili
int A, B;
printf ("\nDammi il valore della I variabile: ");
scanf ("%d", &A);
printf ("\nDammi il valore della II variabile: ");
scanf ("%d", &B);
// visualizzazione delle variabili prima dello scambio
printf("\nI variabile prima dello scambio: %d\n", A);
printf("II variabile prima dello scambio: %d\n", B);
// chiama la funzione che scambia le variabili
scambia(&A, &B);
// visualizzazione delle variabili prima dello scambio
printf("\nI variabile dopo lo scambio: %d\n", A);
printf("II variabile dopo lo scambio: %d\n", B);
return(1);
}
Programmazione di Calcolatori: la struttura di un programma
5
G. Amodeo,
C. Gaibisso
Definizioni e dichiarazioni
• Compilazione:
• Risultato:
• Problema:
la funzione scambia() è chiamata all’interno del file
main.c senza che sia stata definita o dichiarata
all’interno dello stesso file
Programmazione di Calcolatori: la struttura di un programma
6
G. Amodeo,
C. Gaibisso
Definizioni e dichiarazioni
• Soluzione:
// sorgente Lezione_XV\Es_2\main.c
#include <stdio.h>
// dichiarazione extern della funzione per lo scambio di
// due variabili
extern void scambia(int *, int *);
// chiamante per lo scambio di due variabili
int main ()
{
…
};
• Risultato:
Programmazione di Calcolatori: la struttura di un programma
7
G. Amodeo,
C. Gaibisso
Struttura di un programma
• Proposta:
- assegnare una cartella ad ogni tipo di dato interessato
dall’elaborazione (vettori, matrici, stringhe, ecc.)
All’interno di ogni cartella:
- prevedere un file, con estensione “.h”, contenenete le
direttive per il preprocessore funzionali
all’elaborazione del corripondente tipo di dato
- mantenere all’interno di uno stesso file, con
estensione “.c”, definizioni di funzioni con compiti
omogenei (es. funzioni di I/O, di ordinamento, di
ricerca, ecc. ecc.)
- prevedere per ogni file sorgente contenente
definizioni di funzione, un file omonimo, di estensione
”.h”, contenente una dichiarazione “extern” per
ognuna di tali definizioni
Programmazione di Calcolatori: la struttura di un programma
8
G. Amodeo,
C. Gaibisso
Struttura di un programma
• Proposta:
Infine, includere in testa ad ogni file:
- le dichiarazioni extern delle funzioni chiamate al
suo interno ma dichiarate altrove
- le necessarie direttive per il preprocessore
Attraverso la direttiva per il preprocessore:
#include “path\nome_file.h”
Programmazione di Calcolatori: la struttura di un programma
9
G. Amodeo,
C. Gaibisso
Struttura di un programma
• Esempio:
Ordinare un vettore di N
interi in ordine crescente:
Selection Sort
• Algoritmo:
per ogni posizione P degli elementi del
vettore, ad esclusione dell’ultima:
1. determinare il valore minimo nel
vettore a partire dalla posizione P
inclusa. Sia Q la posizione di tale
valore minimo
2. scambiare il valore nella posizione
P con quello nella posizione Q
Programmazione di Calcolatori: la struttura di un programma
10
G. Amodeo,
C. Gaibisso
Struttura di un programma
Ordinare, in ordine
crescente, un vettore di N
interi:
Selection Sort
• Sottoproblemi:
1. determinare la posizione del
valore minimo nel vettore a
partire da una posizione data
2. scambiare i valori di due variabili
intere
Programmazione di Calcolatori: la struttura di un programma
11
G. Amodeo,
C. Gaibisso
Struttura di un programma
Determinare la
posizione del valore
minimo nel vettore
a partire da una
posizione data
Descrizione variabili:
indice per la
scansione del vettore
vett[ ]: vettore interessato
dal processamento
start: posizione dalla quale
ha inizio il
processamento
max: massimo valore
individuato dalla
posizione start alla
posizione curs
pos:
posizione del valore
memorizzato in max
Start
Nome:
PosMinVett
Variabili: int curs, pos, start
int vett[N]
curs  start
min = vett[start]
pos  start
curs:
End
curs  curs+1
false
true
curs = N
pos
false
vett[curs] < min
true
pos  curs
min  vett[curs]
Programmazione di Calcolatori: la struttura di un programma
12
G. Amodeo,
C. Gaibisso
Struttura di un programma
Scambiare i
valori di due
variabili
intere
Start
Nome: ScambiaInt
Variabili: int A, B, aux
Descrizione variabili:
A:
memorizza il
primo valore
intero
B:
memorizza il
secondo
valore intero
aux: variabile di
appoggio
aux  A
A B
B  aux
End
Programmazione di Calcolatori: la struttura di un programma
13
G. Amodeo,
C. Gaibisso
Struttura di un programma
Ordinare, in ordine
crescente, un
vettore di N interi:
Selection Sort
Descrizione variabili:
indice per la
scansione del
vettore
vett[ ]: vettore
interessato dal
processamento
pos:
posizione del
minimo
elemento del
vettore a
partire dalla
posizione curs
Start
Nome:
Selection Sort
Variabili: int curs, pos
int vett[N]
curs  0
curs = N-1
curs:
true
End
false
curs  curs+1
Applica PosMinVett a
vett[ ] a partire dalla
posizione curs e lascia il
risultato in pos
Applica ScambiaInt a
vett[curs] e vett[pos]
Programmazione di Calcolatori: la struttura di un programma
14
G. Amodeo,
C. Gaibisso
Struttura di un programma
// sorgente: EsProposti\Lezione_XV\Esercizio_3.c
// inclusione del file delle dichiarazioni extern per le funzioni standard di I/O
#include <stdio.h>
// definizione della dimensione del vettore
#define N 6
// funzione per l'acquisizione del contenuto di un vettore di interi
void AcqVettInt(int Vett[], int dim)
{
// definisce la variabile per la scansione del vettore
int pos;
// scandisce il vettore, acquisendone il contenuto
for (pos = 0; pos < dim; pos++)
{
printf("\nVett[%d]? ", pos);
scanf("%d", &Vett[pos]);
};
};
// funzione per la restituzione del contenuto di un vettore di interi
void ResVettInt(int Vett[], int dim)
{
// definizione della variabile per la scansione del vettore
int pos;
// scansione del vettore e restituzione del suo contenuto
for (pos = 0; pos < dim; pos++)
printf("\nVett[%d]: %d", pos, Vett[pos]);
};
continua …
Programmazione di Calcolatori: la struttura di un programma
15
G. Amodeo,
C. Gaibisso
Struttura di un programma
continua …
// funzione che determina la posizione del minimo elemento di un vettore
int PosMinVett(int *Vett, int dim)
{
// definisce la variabile per la scansione del vettore
int curs;
// definisce e inizializza le variabili per il minimo e per la sua posizione
int min = Vett[0]; int pos = 0;
// scansione del vettore
for (curs = 0; curs < dim; curs ++)
// se necessario aggiorna il minimo e la sua posizione
if(Vett[curs] < min)
{
min = Vett[curs];
pos = curs;
};
// restituisce la posizione del minimo elemento
return(pos);
};
// funzione che scambia il contenuto di due variabili intere
void ScambiaInt(int *A, int *B)
{
// definisce una variabili di appoggio
int aux;
// scambia il contenuto delle due variabili tramite la variabile di appoggio
aux = *A; *A = *B; *B = aux;
};
continua …
Programmazione di Calcolatori: la struttura di un programma
16
G. Amodeo,
C. Gaibisso
Struttura di un programma
continua …
// funzione di ordinamento
void SelectionSort(int *Vett, int dim)
{
// definisce la variabile per la scansione del vettore
int curs;
// scandisce il vettore
for (curs = 0; curs < dim-1; curs++)
{
// definisce la variabile per la posizione del minimo
int pos;
// determina la posizione del minimo a partire da quella corrente
pos = PosMinVett(Vett+curs, dim-curs);
// scambia il valore dell'elemento corrente con quello del minimo
ScambiaInt(Vett+curs, Vett+curs+pos);
};
};
// chiamante
int main ()
{
// definisce il vettore
int vettore[N];
// inizializza, ordina e restituisce il contenuto del vettore
AcqVettInt(vettore, N);
SelectionSort(vettore, N);
ResVettInt(vettore, N);
return(1);
};
Programmazione di Calcolatori: la struttura di un programma
17
G. Amodeo,
C. Gaibisso
Struttura di un programma
• Cartelle:
- vettori:
assegnata al tipo di dato vettori
- utilities:
contiene tutti i file necessari alla
implementazione di funzionalità di
interesse generale (indipendenti dal
particolare tipo di dato)
Programmazione di Calcolatori: la struttura di un programma
18
G. Amodeo,
C. Gaibisso
Struttura di un programma
• Cartella vettori:
- prepro.h
direttive per il preprocessore da utilizzarsi nel
processamento di vettori
- cerca.c
definizione delle funzioni che implementano
ricerche di vario tipo all’interno di un vettore
- cerca.h
dichiarazione delle funzioni definite in cerca.c
- ordina.c
definizione delle funzioni che implementano
diverse modalità di ordinamento di vettori
- ordina.h
dichiarazione delle funzioni definite in ordina.c
Programmazione di Calcolatori: la struttura di un programma
19
G. Amodeo,
C. Gaibisso
Struttura di un programma
• Cartella vettori:
- vett_IO.c
definizione delle funzioni che implementano l’I/O
di vettori
- vett_IO.h
dichiarazioni delle funzioni definite in vett_IO.c
Programmazione di Calcolatori: la struttura di un programma
20
G. Amodeo,
C. Gaibisso
Struttura di un programma
// sorgente: EsProposti\Lezione_XV\Es_4\vettori\prepro.h
// direttive per il preprocessore da utilizzarsi nel processamento di
// vettori
// definizione della dimensione del vettore
#define N 6
// sorgente: EsProposti\Lezione_XV\Es_4\vettori\cerca.c
// funzioni che implementano ricerche di vario tipo all'interno di un
// vettore
// funzione che determina la posizione del minimo elemento
// all'interno di un vettore di interi
int PosMinVett(int *Vett, int dim)
{ … };
// sorgente: EsProposti\Lezione_XV\Es_4\vettori\cerca.h
// dichiarazioni extern per le funzioni che implementano ricerche di
// vario tipo all'interno di un vettore
// dichiarazione extern della funzione che determina la posizione del
// minimo elemento all'interno di un vettore di interi
extern int PosMinVett(int *, int);
Programmazione di Calcolatori: la struttura di un programma
21
G. Amodeo,
C. Gaibisso
Struttura di un programma
// sorgente: EsProposti\Lezione_XV\Es_4\vettori\ordina.c
// inclusione del file delle dichiarazioni extern per le funzioni che
// implementano ricerche di vario tipo all'interno di un vettore
#include "cerca.h“
// inclusione del file delle dichiarazioni extern delle utilities di
// interesse generale
#include "..\utilities\scambia.h"
// funzioni che implementano diverse modalità di ordinamento di
// vettori
// funzione che implementa l'algoritmo di selection sort
void SelectionSort(int *Vett, int dim)
{…; PosMinVett(…); …; ScambiaInt(…); …};
// sorgente: EsProposti\Lezione_XV\Es_4\vettori\ordina.h
// dichiarazioni extern delle funzioni che implementano diversi
// algoritmi di ordinamento di vettori
// dichiarazione extern della funzione che implementa l'algoritmo di
// seelection sort
extern void SelectionSort(int *, int);
Programmazione di Calcolatori: la struttura di un programma
22
G. Amodeo,
C. Gaibisso
Struttura di un programma
// sorgente: EsProposti\Lezione_XV\Es_4\vettori\Vett_IO.c
// inclusione del file delle dichiarazioni extern per le funzioni
// standard di I/O
#include <stdio.h>
// funzioni di I/O di vettori
// funzione per l'acquisizione del contenuto di un vettore di interi
void AcqVettInt(int Vett[], int dim)
{ …; printf(); scanf(); … };
// funzione per la restituzione del contenuto di un vettore di interi
void ResVettInt(int Vett[], int dim)
{ …; printf(); … };
// sorgente: EsProposti\Lezione_XV\Es_4\vettori\vett_IO.h
// dichiarazioni extern delle funzioni di I/O per un vettore
// dichiarazione extern della funzione per l'acquisizione del
// contenuto di un vettore di interi
extern void AcqVettInt(int [], int);
// dichiarazione extern della funzione per la restituzione
// del contenuto di un vettore di interi
extern void ResVettInt(int [], int);
Programmazione di Calcolatori: la struttura di un programma
23
G. Amodeo,
C. Gaibisso
Struttura di un programma
• Cartella utilities:
- scambia.c
definizioni delle funzioni che implementano lo
scambio di variabili
- scambia.h
dichiarazioni delle funzioni definite in scambia.c
Programmazione di Calcolatori: la struttura di un programma
24
G. Amodeo,
C. Gaibisso
Struttura di un programma
// sorgente: EsProposti\Lezione_XV\Es_4\utilities\scambia.c
// funzioni per lo scambio di variabili
// funzione che scambia il contenuto di due variabili intere
void ScambiaInt(int *A, int *B)
{
…
};
// sorgente: EsProposti\Lezione_XV\Es_4\utilities\scambia.h
// file che contiene le dichiarazioni extern delle funzioni per lo
// scambio di variabili
// dichiarazione extern per la funzione che scambia il contenuto di
// due variabili intere
extern void ScambiaInt(int *, int *);
Programmazione di Calcolatori: la struttura di un programma
25
G. Amodeo,
C. Gaibisso
Struttura di un programma
• main():
// sorgente: EsProposti\Lezione_XV\Es_4\main.c
// inclusione del file di direttive per il preprocessore da utilizzarsi nel
// processamento di vettori
#include "vettori\prepro.h"
// inclusione del file delle dichiarazioni extern per le funzioni di
// ingresso-uscita di vettori
#include "vettori\vett_IO.h“
// inclusione del file delle dichiarazioni extern per le funzioni di
// ordinamento di vettori
#include "vettori\ordina.h"
// chiamante
int main ()
{…
int vettore[N];
…
AcqVettInt(vettore, N);
SelectionSort(vettore, N);
ResVettInt(vettore, N);
… };
Programmazione di Calcolatori: la struttura di un programma
26
G. Amodeo,
C. Gaibisso
Ridurre i tempi di compilazione
•
All’interno di ogni cartella generare i file oggetto
(estensione “.o”) per ogni sorgente (estensione “.c”) :
Programmazione di Calcolatori: la struttura di un programma
27
G. Amodeo,
C. Gaibisso
Ridurre i tempi di compilazione
Programmazione di Calcolatori: la struttura di un programma
28
G. Amodeo,
C. Gaibisso
Ridurre i tempi di compilazione
Programmazione di Calcolatori: la struttura di un programma
29
G. Amodeo,
C. Gaibisso
Ridurre i tempi di compilazione
• Si genera l’eseguibile “linkando” il main() e
tutti i file oggetto generati in precedenza:
• Nel caso in cui si modifichi un file:
- si aggiornano i file oggetto generati per ognuno
dei file sorgente il cui contenuto “dipende” da
quello del file modificato
- si genera l’eseguibile “linkando” tutti i file
oggetto (anche quelli che non sono stati
aggiornati)
Programmazione di Calcolatori: la struttura di un programma
30
Scarica

Struttura di un programma