G. Amodeo, C. Gaibisso Programmazione di Calcolatori Lezione XV La struttura di un programma...

30
G. Amodeo, C. Gaibisso Programmazione di Calcolatori Programmazione di Calcolatori Lezione XV La struttura di un programma Programmazione di Calcolatori: la struttura di un programma 1

Transcript of G. Amodeo, C. Gaibisso Programmazione di Calcolatori Lezione XV La struttura di un programma...

Page 1: G. Amodeo, C. Gaibisso Programmazione di Calcolatori Lezione XV La struttura di un programma Programmazione di Calcolatori: la struttura di un programma.

G. Amodeo,C. Gaibisso

Programmazione di CalcolatoriProgrammazione di Calcolatori

Lezione XVLa struttura di un

programma

Programmazione di Calcolatori: la struttura di un programma 1

Page 2: G. Amodeo, C. Gaibisso Programmazione di Calcolatori Lezione XV La struttura di un programma Programmazione di Calcolatori: la struttura di un programma.

G. Amodeo,C. Gaibisso

L’idea … L’idea …

Programmazione di Calcolatori: la struttura di un programma 2

• 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.)

Page 3: G. Amodeo, C. Gaibisso Programmazione di Calcolatori Lezione XV La struttura di un programma Programmazione di Calcolatori: la struttura di un programma.

G. Amodeo,C. Gaibisso

Definizioni e dichiarazioniDefinizioni e dichiarazioni

Programmazione di Calcolatori: la struttura di un programma 3

• 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”

Page 4: G. Amodeo, C. Gaibisso Programmazione di Calcolatori Lezione XV La struttura di un programma Programmazione di Calcolatori: la struttura di un programma.

G. Amodeo,C. Gaibisso

Dichiarazione externDichiarazione extern

Programmazione di Calcolatori: la struttura di un programma 4

• 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; };

Page 5: G. Amodeo, C. Gaibisso Programmazione di Calcolatori Lezione XV La struttura di un programma Programmazione di Calcolatori: la struttura di un programma.

G. Amodeo,C. Gaibisso

Definizioni e dichiarazioniDefinizioni e dichiarazioni

Programmazione di Calcolatori: la struttura di un programma 5

// sorgente Lezione_XV\Es_1\main.c#include <stdio.h>// chiamante per lo scambio di due variabiliint main () { // 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); }

Chiamo scambia() senza che, nel file, sia stata prima definita o dichiarata

Page 6: G. Amodeo, C. Gaibisso Programmazione di Calcolatori Lezione XV La struttura di un programma Programmazione di Calcolatori: la struttura di un programma.

G. Amodeo,C. Gaibisso

• 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

Definizioni e dichiarazioniDefinizioni e dichiarazioni

Programmazione di Calcolatori: la struttura di un programma 6

Page 7: G. Amodeo, C. Gaibisso Programmazione di Calcolatori Lezione XV La struttura di un programma Programmazione di Calcolatori: la struttura di un programma.

G. Amodeo,C. Gaibisso

• Soluzione:

Definizioni e dichiarazioniDefinizioni e dichiarazioni

Programmazione di Calcolatori: la struttura di un programma 7

// sorgente Lezione_XV\Es_2\main.c#include <stdio.h>

// chiamante per lo scambio di due variabiliint main () { … };

• Risultato:

// dichiarazione extern della funzione per lo scambio di// due variabili

extern void scambia(int *, int *);

Page 8: G. Amodeo, C. Gaibisso Programmazione di Calcolatori Lezione XV La struttura di un programma Programmazione di Calcolatori: la struttura di un programma.

G. Amodeo,C. Gaibisso

Struttura di un programma Struttura di un programma

Programmazione di Calcolatori: la struttura di un programma 8

• 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

Page 9: G. Amodeo, C. Gaibisso Programmazione di Calcolatori Lezione XV La struttura di un programma Programmazione di Calcolatori: la struttura di un programma.

G. Amodeo,C. Gaibisso

Struttura di un programma Struttura di un programma

Programmazione di Calcolatori: la struttura di un programma 9

• 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”

Page 10: G. Amodeo, C. Gaibisso Programmazione di Calcolatori Lezione XV La struttura di un programma Programmazione di Calcolatori: la struttura di un programma.

G. Amodeo,C. Gaibisso

Struttura di un programmaStruttura di un programma

Programmazione di Calcolatori: la struttura di un programma 10

Ordinare un vettore di N interi in ordine

crescente:Selection Sort

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 minimo2.scambiare il valore nella

posizione P con quello nella

posizione Q

• Algoritmo:

• Esempio:

Page 11: G. Amodeo, C. Gaibisso Programmazione di Calcolatori Lezione XV La struttura di un programma Programmazione di Calcolatori: la struttura di un programma.

G. Amodeo,C. Gaibisso

Struttura di un programmaStruttura di un programma

Programmazione di Calcolatori: la struttura di un programma 11

Ordinare, in ordine crescente, un vettore di

N interi:Selection Sort

1. determinare la posizione del valore minimo nel vettore a partire da una posizione data

2. scambiare i valori di due variabili intere

• Sottoproblemi:

Page 12: G. Amodeo, C. Gaibisso Programmazione di Calcolatori Lezione XV La struttura di un programma Programmazione di Calcolatori: la struttura di un programma.

G. Amodeo,C. Gaibisso

Struttura di un programmaStruttura di un programma

Programmazione di Calcolatori: la struttura di un programma 12

Determinare la posizione del valore minimo nel vettore a

partire da una posizione data

curs curs+1

StartNome: PosMinVettVariabili: int curs, pos, start

int vett[N]

curs startmin = vett[start]

pos start

curs = N

End

true

false

pos

vett[curs] < min

pos cursmin vett[curs]

true

false

Descrizione variabili:

curs: indice per la scansione del vettorevett[ ]: vettore interessato dal processamentostart: posizione dalla quale ha inizio il processamentomax: massimo valore individuato dalla posizione start alla posizione curspos: posizione del valore memorizzato in max

Page 13: G. Amodeo, C. Gaibisso Programmazione di Calcolatori Lezione XV La struttura di un programma Programmazione di Calcolatori: la struttura di un programma.

G. Amodeo,C. Gaibisso

Struttura di un programmaStruttura di un programma

Programmazione di Calcolatori: la struttura di un programma 13

Scambiare i valori di

due variabili intere

StartNome: ScambiaIntVariabili: int A, B, aux

End

aux AA B

B aux

Descrizione variabili:

A:memorizza il primo valore interoB:memorizza il secondo valore interoaux: variabile di appoggio

Page 14: G. Amodeo, C. Gaibisso Programmazione di Calcolatori Lezione XV La struttura di un programma Programmazione di Calcolatori: la struttura di un programma.

G. Amodeo,C. Gaibisso

Struttura di un programmaStruttura di un programma

Programmazione di Calcolatori: la struttura di un programma 14

Ordinare, in ordine

crescente, un

vettore di N interi:

Selection Sort

StartNome: Selection SortVariabili: int curs, pos

int vett[N]

false

curs = N-1 true

curs 0

End

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]

Descrizione variabili:

curs: indice per la scansione del vettorevett[ ]: vettore interessato dal processamentopos: posizione del minimo elemento del vettore a partire dalla posizione curs

Page 15: G. Amodeo, C. Gaibisso Programmazione di Calcolatori Lezione XV La struttura di un programma Programmazione di Calcolatori: la struttura di un programma.

G. Amodeo,C. Gaibisso

Struttura di un programmaStruttura di un programma

Programmazione di Calcolatori: la struttura di un programma 15

// 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 interivoid 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 interivoid 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 …

Page 16: G. Amodeo, C. Gaibisso Programmazione di Calcolatori Lezione XV La struttura di un programma Programmazione di Calcolatori: la struttura di un programma.

G. Amodeo,C. Gaibisso

Struttura di un programmaStruttura di un programma

Programmazione di Calcolatori: la struttura di un programma 16

continua …// funzione che determina la posizione del minimo elemento di un vettoreint 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 interevoid 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 …

Page 17: G. Amodeo, C. Gaibisso Programmazione di Calcolatori Lezione XV La struttura di un programma Programmazione di Calcolatori: la struttura di un programma.

G. Amodeo,C. Gaibisso

Struttura di un programmaStruttura di un programma

Programmazione di Calcolatori: la struttura di un programma 17

continua …// funzione di ordinamentovoid 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); }; };// chiamanteint 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); };

Page 18: G. Amodeo, C. Gaibisso Programmazione di Calcolatori Lezione XV La struttura di un programma Programmazione di Calcolatori: la struttura di un programma.

G. Amodeo,C. Gaibisso

Struttura di un programma Struttura di un programma

Programmazione di Calcolatori: la struttura di un programma 18

• 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)

Page 19: G. Amodeo, C. Gaibisso Programmazione di Calcolatori Lezione XV La struttura di un programma Programmazione di Calcolatori: la struttura di un programma.

G. Amodeo,C. Gaibisso

Struttura di un programma Struttura di un programma

Programmazione di Calcolatori: la struttura di un programma 19

• Cartella vettori:- prepro.h

direttive per il preprocessore da utilizzarsi nel processamento di vettori

- cerca.cdefinizione delle funzioni che implementano

ricerche di vario tipo all’interno di un vettore- cerca.hdichiarazione delle funzioni definite in cerca.c- ordina.cdefinizione delle funzioni che implementano

diverse modalità di ordinamento di vettori- ordina.hdichiarazione delle funzioni definite in ordina.c

Page 20: G. Amodeo, C. Gaibisso Programmazione di Calcolatori Lezione XV La struttura di un programma Programmazione di Calcolatori: la struttura di un programma.

G. Amodeo,C. Gaibisso

Struttura di un programma Struttura di un programma

Programmazione di Calcolatori: la struttura di un programma 20

• Cartella vettori:- vett_IO.cdefinizione delle funzioni che implementano

l’I/O di vettori- vett_IO.hdichiarazioni delle funzioni definite in vett_IO.c

Page 21: G. Amodeo, C. Gaibisso Programmazione di Calcolatori Lezione XV La struttura di un programma Programmazione di Calcolatori: la struttura di un programma.

G. Amodeo,C. Gaibisso

Struttura di un programma Struttura di un programma

Programmazione di Calcolatori: la struttura di un programma 21

// 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 interiint 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 interiextern int PosMinVett(int *, int);

Page 22: G. Amodeo, C. Gaibisso Programmazione di Calcolatori Lezione XV La struttura di un programma Programmazione di Calcolatori: la struttura di un programma.

G. Amodeo,C. Gaibisso

Struttura di un programma Struttura di un programma

Programmazione di Calcolatori: la struttura di un programma 22

// 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 sortvoid 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 sortextern void SelectionSort(int *, int);

Page 23: G. Amodeo, C. Gaibisso Programmazione di Calcolatori Lezione XV La struttura di un programma Programmazione di Calcolatori: la struttura di un programma.

G. Amodeo,C. Gaibisso

Struttura di un programma Struttura di un programma

Programmazione di Calcolatori: la struttura di un programma 23

// 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 interivoid AcqVettInt(int Vett[], int dim) { …; printf(); scanf(); … }; // funzione per la restituzione del contenuto di un vettore di interivoid 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 interiextern void AcqVettInt(int [], int);// dichiarazione extern della funzione per la restituzione// del contenuto di un vettore di interiextern void ResVettInt(int [], int);

Page 24: G. Amodeo, C. Gaibisso Programmazione di Calcolatori Lezione XV La struttura di un programma Programmazione di Calcolatori: la struttura di un programma.

G. Amodeo,C. Gaibisso

Struttura di un programma Struttura di un programma

Programmazione di Calcolatori: la struttura di un programma 24

• Cartella utilities:- scambia.cdefinizioni delle funzioni che implementano lo

scambio di variabili- scambia.hdichiarazioni delle funzioni definite in scambia.c

Page 25: G. Amodeo, C. Gaibisso Programmazione di Calcolatori Lezione XV La struttura di un programma Programmazione di Calcolatori: la struttura di un programma.

G. Amodeo,C. Gaibisso

Struttura di un programma Struttura di un programma

Programmazione di Calcolatori: la struttura di un programma 25

// sorgente: EsProposti\Lezione_XV\Es_4\utilities\scambia.c// funzioni per lo scambio di variabili// funzione che scambia il contenuto di due variabili interevoid 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 intereextern void ScambiaInt(int *, int *);

Page 26: G. Amodeo, C. Gaibisso Programmazione di Calcolatori Lezione XV La struttura di un programma Programmazione di Calcolatori: la struttura di un programma.

G. Amodeo,C. Gaibisso

Struttura di un programma Struttura di un programma

Programmazione di Calcolatori: la struttura di un programma 26

// 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"// chiamanteint main () { … int vettore[N]; … AcqVettInt(vettore, N); SelectionSort(vettore, N); ResVettInt(vettore, N); … };

• main():

Page 27: G. Amodeo, C. Gaibisso Programmazione di Calcolatori Lezione XV La struttura di un programma Programmazione di Calcolatori: la struttura di un programma.

G. Amodeo,C. Gaibisso Ridurre i tempi di Ridurre i tempi di

compilazionecompilazione

Programmazione di Calcolatori: la struttura di un programma 27

• All’interno di ogni cartella generare i file oggetto (estensione “.o”) per ogni sorgente (estensione “.c”) :

Page 28: G. Amodeo, C. Gaibisso Programmazione di Calcolatori Lezione XV La struttura di un programma Programmazione di Calcolatori: la struttura di un programma.

G. Amodeo,C. Gaibisso Ridurre i tempi di Ridurre i tempi di

compilazionecompilazione

Programmazione di Calcolatori: la struttura di un programma 28

Page 29: G. Amodeo, C. Gaibisso Programmazione di Calcolatori Lezione XV La struttura di un programma Programmazione di Calcolatori: la struttura di un programma.

G. Amodeo,C. Gaibisso Ridurre i tempi di Ridurre i tempi di

compilazionecompilazione

Programmazione di Calcolatori: la struttura di un programma 29

Page 30: G. Amodeo, C. Gaibisso Programmazione di Calcolatori Lezione XV La struttura di un programma Programmazione di Calcolatori: la struttura di un programma.

G. Amodeo,C. Gaibisso Ridurre i tempi di Ridurre i tempi di

compilazionecompilazione

Programmazione di Calcolatori: la struttura di un programma 30

• 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)