Laboratorio di Informaticaswap/labinf1617/6_Programmazione_Modulare_Parte_… · Laboratorio di...

115
Laboratorio di Informatica Programmazione Modulare (Parte 2) Corso di Laurea in Informatica e Tecnologie per la Produzione del Sofware (Track B) - A.A. 2016/2017 docente: Cataldo Musto [email protected]

Transcript of Laboratorio di Informaticaswap/labinf1617/6_Programmazione_Modulare_Parte_… · Laboratorio di...

Page 1: Laboratorio di Informaticaswap/labinf1617/6_Programmazione_Modulare_Parte_… · Laboratorio di Informatica Programmazione Modulare (Parte 2) Corso di Laurea in Informatica e Tecnologie

Laboratorio di InformaticaProgrammazione Modulare

(Parte 2)

Corso di Laurea in Informatica e Tecnologie per la Produzione del Sofware (Track B) - A.A. 2016/2017

docente: Cataldo Musto

[email protected]

Page 2: Laboratorio di Informaticaswap/labinf1617/6_Programmazione_Modulare_Parte_… · Laboratorio di Informatica Programmazione Modulare (Parte 2) Corso di Laurea in Informatica e Tecnologie

Programmazione ModulareRiassunto

04/04/2017 2Cataldo Musto - Programmazione Modulare (Parte 2)

Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2016/2017

Page 3: Laboratorio di Informaticaswap/labinf1617/6_Programmazione_Modulare_Parte_… · Laboratorio di Informatica Programmazione Modulare (Parte 2) Corso di Laurea in Informatica e Tecnologie

Programmazione Modulare - Recap

04/04/2017 3

1) Per aumentare modularità, separazione delle competenze, riusabilità, leggibilità e information hiding è utile dividere il programma in più sotto-programmi

2) Ciascun sotto-programma deve avere uno scopo ben definito e svolgere una sola funzione (separazione delle competenze!)

3) Bisogna pensare attentamente (progettazione modulare) a• Quali porzioni del programma originale dividere in sotto-programmi• Cosa deve fare ciascun sotto-programma

• Quali dati di input ha bisogno (parametri) , quali dati restituisce (return)• IMPORTANTE: non esiste un’unica intestazione di una funzione. E’ una importante scelta

di progetto. Quanto più ampio è il numero di parametro, tanto più generale diventa la funzione.

Cataldo Musto - Programmazione Modulare (Parte 2)Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2016/2017

Page 4: Laboratorio di Informaticaswap/labinf1617/6_Programmazione_Modulare_Parte_… · Laboratorio di Informatica Programmazione Modulare (Parte 2) Corso di Laurea in Informatica e Tecnologie

Esercizio 5.1

• Migliorare l’esercizio relativo al calcolo del BMI (Esercitazione 1) utilizzando la programmazione modulare

1) Il programma deve memorizzare in un vettore il BMI di cinque individui.

2) Il BMI deve essere generato random a partire da valori casuali di altezza e peso (altezza tra 160 e 200, peso tra 60 e 100)

3) Calcolare BMI medio dei cinque individui. Calcolare BMI massimo.

4) Stampare messaggio relativo al BMI medio («il campione è sottopeso», «il campione è sovrappeso»). Stampa messaggio relativo al BMI massimo.

Note: definire le funzioni che si vogliono implementare nel main. Dichiarare i prototipi prima del main.

04/04/2017 4Cataldo Musto - Programmazione Modulare (Parte 2)

Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2016/2017

Page 5: Laboratorio di Informaticaswap/labinf1617/6_Programmazione_Modulare_Parte_… · Laboratorio di Informatica Programmazione Modulare (Parte 2) Corso di Laurea in Informatica e Tecnologie

Esercizio 5.1 - Soluzione

04/04/2017 5Cataldo Musto - Programmazione Modulare (Parte 2)

Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2016/2017

Nella programmazione modulare IDEALE, il main dovrebbe contenere

SOLO chiamate a funzione.

Page 6: Laboratorio di Informaticaswap/labinf1617/6_Programmazione_Modulare_Parte_… · Laboratorio di Informatica Programmazione Modulare (Parte 2) Corso di Laurea in Informatica e Tecnologie

Esercizio 5.1 – Soluzione (cont.)

04/04/2017 6Cataldo Musto - Programmazione Modulare (Parte 2)

Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2016/2017

Page 7: Laboratorio di Informaticaswap/labinf1617/6_Programmazione_Modulare_Parte_… · Laboratorio di Informatica Programmazione Modulare (Parte 2) Corso di Laurea in Informatica e Tecnologie

Esercizio 5.1 – Soluzione (cont.)

04/04/2017 7Cataldo Musto - Programmazione Modulare (Parte 2)

Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2016/2017

Page 8: Laboratorio di Informaticaswap/labinf1617/6_Programmazione_Modulare_Parte_… · Laboratorio di Informatica Programmazione Modulare (Parte 2) Corso di Laurea in Informatica e Tecnologie

Esercizio 5.1 – Soluzione (cont.)

04/04/2017 8Cataldo Musto - Programmazione Modulare (Parte 2)

Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2016/2017

Page 9: Laboratorio di Informaticaswap/labinf1617/6_Programmazione_Modulare_Parte_… · Laboratorio di Informatica Programmazione Modulare (Parte 2) Corso di Laurea in Informatica e Tecnologie

Esercizio 5.1 – Soluzione (cont.)

04/04/2017 9Cataldo Musto - Programmazione Modulare (Parte 2)

Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2016/2017

Page 10: Laboratorio di Informaticaswap/labinf1617/6_Programmazione_Modulare_Parte_… · Laboratorio di Informatica Programmazione Modulare (Parte 2) Corso di Laurea in Informatica e Tecnologie

Esercizio 5.1 – Soluzione (cont.)

04/04/2017 10Cataldo Musto - Programmazione Modulare (Parte 2)

Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2016/2017

Suggerimento: nelle funzioni che restituiscono un valore è utile definire una variabile locale che viene modificata nel corpo della funzione e che viene poi restituita alla fine.

Page 11: Laboratorio di Informaticaswap/labinf1617/6_Programmazione_Modulare_Parte_… · Laboratorio di Informatica Programmazione Modulare (Parte 2) Corso di Laurea in Informatica e Tecnologie

Esercizio 5.1 – Soluzione (cont.)

04/04/2017 11Cataldo Musto - Programmazione Modulare (Parte 2)

Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2016/2017

Page 12: Laboratorio di Informaticaswap/labinf1617/6_Programmazione_Modulare_Parte_… · Laboratorio di Informatica Programmazione Modulare (Parte 2) Corso di Laurea in Informatica e Tecnologie

Programmazione Modulare – Recap

04/04/2017 12

4) Quando una funzione viene chiamata, il compilatore effettua dei controlli sui parametri formali e i parametri attuali.• Viene verificato il numero, il tipo e l’ordine dei parametri. Se non sono corretti, viene

restituito un errore di compilazione. Se sono corretti, i parametri si «legano» e si passa il controllo alla funzione

5) Al termine dell’esecuzione della funzione si ripassa il controllo al programma chiamante e tutte le variabili locali alla funzione vengono distrutte.

6) Nel passaggio per valore, parametri formali e attuali vengono «legati» attraverso una copia del valore (che poi viene perso). Nel passaggio per riferimento invece parametro formale attuale lavorano sulla stessa locazione di memoria (quindi il risultato non viene perso)• Tutte le variabili vengono passate per default per valore• Gli array vengono passati per default per riferimento. • I puntatori (valutaremo in seguito pro e contro) permettono il passaggio per riferimento.

Cataldo Musto - Programmazione Modulare (Parte 2)Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2016/2017

Page 13: Laboratorio di Informaticaswap/labinf1617/6_Programmazione_Modulare_Parte_… · Laboratorio di Informatica Programmazione Modulare (Parte 2) Corso di Laurea in Informatica e Tecnologie

Passaggio per valore: immaginate di «copiare» il valore della variabile in un’altra locazione di memoria. La funzione lavora sulla «nuova» locazione di memoria, la vecchia non viene mai modificata.

04/04/2017 13

int main() {int x = 5;printf(«Fuori: %d», x);quadrato(x);printf(«Fuori: %d», x);

}

Area Dati main()

X 5

Cataldo Musto - Programmazione Modulare (Parte 2)Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2016/2017

Programmazione Modulare – Recap

Page 14: Laboratorio di Informaticaswap/labinf1617/6_Programmazione_Modulare_Parte_… · Laboratorio di Informatica Programmazione Modulare (Parte 2) Corso di Laurea in Informatica e Tecnologie

Passaggio per valore: immaginate di «copiare» il valore della variabile in un’altra locazione di memoria. La funzione lavora sulla «nuova» locazione di memoria, la vecchia non viene mai modificata.

04/04/2017 14

int main() {int x = 5;printf(«Fuori: %d», x);quadrato(x);printf(«Fuori: %d», x);

}

void quadrato (int y) {y = y*yprintf(«Dentro: %d», y);

}

Area Dati main()

Area Dati quadrato(int)

X 5 Y 25

Cataldo Musto - Programmazione Modulare (Parte 2)Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2016/2017

Programmazione Modulare – Recap

Page 15: Laboratorio di Informaticaswap/labinf1617/6_Programmazione_Modulare_Parte_… · Laboratorio di Informatica Programmazione Modulare (Parte 2) Corso di Laurea in Informatica e Tecnologie

Passaggio per valore: immaginate di «copiare» il valore della variabile in un’altra locazione di memoria. La funzione lavora sulla «nuova» locazione di memoria, la vecchia non viene mai modificata.

04/04/2017 15

int main() {int x = 5;printf(«Fuori: %d», x);quadrato(x);printf(«Fuori: %d», x);

}

Area Dati main()

X 5

Cataldo Musto - Programmazione Modulare (Parte 2)Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2016/2017

Programmazione Modulare – Recap

Page 16: Laboratorio di Informaticaswap/labinf1617/6_Programmazione_Modulare_Parte_… · Laboratorio di Informatica Programmazione Modulare (Parte 2) Corso di Laurea in Informatica e Tecnologie

04/04/2017 16

int main() {int x = 5;printf(«Fuori: %d», x);quadrato(&x);printf(«Fuori: %d», x);

}

Area Dati main()

Passaggio per riferimento: sia il parametro formale che il parametro attuale puntano alla stessa locazione di memoria. Le modifiche quindi non vengono perse, anzi, vengono ereditate dal programma chiamante.

X 5

Cataldo Musto - Programmazione Modulare (Parte 2)Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2016/2017

Programmazione Modulare – Recap

Page 17: Laboratorio di Informaticaswap/labinf1617/6_Programmazione_Modulare_Parte_… · Laboratorio di Informatica Programmazione Modulare (Parte 2) Corso di Laurea in Informatica e Tecnologie

04/04/2017 17

int main() {int x = 5;printf(«Fuori: %d», x);quadrato(&x);printf(«Fuori: %d», x);

}

Area Dati main()

Passaggio per riferimento: sia il parametro formale che il parametro attuale puntano alla stessa locazione di memoria. Le modifiche quindi non vengono perse, anzi, vengono ereditate dal programma chiamante.

void quadrato (int* y) {y = y*yprintf(«Dentro: %d», y);

}

Area Dati quadrato(int)

X Y25

Cataldo Musto - Programmazione Modulare (Parte 2)Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2016/2017

Programmazione Modulare – Recap

Page 18: Laboratorio di Informaticaswap/labinf1617/6_Programmazione_Modulare_Parte_… · Laboratorio di Informatica Programmazione Modulare (Parte 2) Corso di Laurea in Informatica e Tecnologie

04/04/2017 18

int main() {int x = 5;printf(«Fuori: %d», x);quadrato(&x);printf(«Fuori: %d», x);

}

Area Dati main()

Passaggio per riferimento: sia il parametro formale che il parametro attuale puntano alla stessa locazione di memoria. Le modifiche quindi non vengono perse, anzi, vengono ereditate dal programma chiamante.

X 25

Cataldo Musto - Programmazione Modulare (Parte 2)Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2016/2017

Programmazione Modulare – Recap

Page 19: Laboratorio di Informaticaswap/labinf1617/6_Programmazione_Modulare_Parte_… · Laboratorio di Informatica Programmazione Modulare (Parte 2) Corso di Laurea in Informatica e Tecnologie

Programmazione ModulareParte 2

04/04/2017 19Cataldo Musto - Programmazione Modulare (Parte 2)

Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2016/2017

Page 20: Laboratorio di Informaticaswap/labinf1617/6_Programmazione_Modulare_Parte_… · Laboratorio di Informatica Programmazione Modulare (Parte 2) Corso di Laurea in Informatica e Tecnologie

Programmazione Modulare

04/04/2017 20

• Funzioni e Procedure sono un meccanismo di astrazione• Le funzioni sono un esempio di astrazione sui dati, perchè

ci permettono di estendere gli operatori disponibili nellinguaggio

• Le procedure sono un esempio di astrazione sulleistruzioni, perchè ci permettono di estendere le istruzioniprimitive disponibili nel linguaggio

Cataldo Musto - Programmazione Modulare (Parte 2)Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2016/2017

Page 21: Laboratorio di Informaticaswap/labinf1617/6_Programmazione_Modulare_Parte_… · Laboratorio di Informatica Programmazione Modulare (Parte 2) Corso di Laurea in Informatica e Tecnologie

Programmazione Modulare

04/04/2017 21

• Funzioni e Procedure sono un meccanismo di astrazione• Le funzioni sono un esempio di astrazione sui dati, perchè

ci permettono di estendere gli operatori disponibili nellinguaggio

Cataldo Musto - Programmazione Modulare (Parte 2)Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2016/2017

Page 22: Laboratorio di Informaticaswap/labinf1617/6_Programmazione_Modulare_Parte_… · Laboratorio di Informatica Programmazione Modulare (Parte 2) Corso di Laurea in Informatica e Tecnologie

Programmazione Modulare

04/04/2017 22

• Funzioni e Procedure sono un meccanismo di astrazione• Le funzioni sono un esempio di astrazione sui dati, perchè

ci permettono di estendere gli operatori disponibili nellinguaggio

Cataldo Musto - Programmazione Modulare (Parte 2)Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2016/2017

Le funzioni introducono nuovi meccanismi per elaborare i dati. Prendono in input dei dati e ne producono altri.

Così come altre funzioni che abbiamo già usato, es: sqrt(99.0) oppure isdigit(‘a’);

Page 23: Laboratorio di Informaticaswap/labinf1617/6_Programmazione_Modulare_Parte_… · Laboratorio di Informatica Programmazione Modulare (Parte 2) Corso di Laurea in Informatica e Tecnologie

Programmazione Modulare

04/04/2017 23

• Funzioni e Procedure sono un meccanismo di astrazione• Le procedure sono un esempio di astrazione sulle

istruzioni, perchè ci permettono di estendere le istruzioniprimitive disponibili nel linguaggio

Cataldo Musto - Programmazione Modulare (Parte 2)Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2016/2017

Le procedure non introducono nuovi dati, ma introducono nuove istruzioni non originariamente disponibili nel linguaggio.

Le procedure tipicamente si concentrano sulla gestione dell’input/output, così come printf() o scanf()

Page 24: Laboratorio di Informaticaswap/labinf1617/6_Programmazione_Modulare_Parte_… · Laboratorio di Informatica Programmazione Modulare (Parte 2) Corso di Laurea in Informatica e Tecnologie

Programmazione Modulare - Scope

04/04/2017 24Cataldo Musto - Programmazione Modulare (Parte 2)

Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2016/2017

Ogni variabile è descritta da due caratteristiche. Lo scope (la sua visibilità) e la sua permanenza in memoria (statica oppure

automatica).

Page 25: Laboratorio di Informaticaswap/labinf1617/6_Programmazione_Modulare_Parte_… · Laboratorio di Informatica Programmazione Modulare (Parte 2) Corso di Laurea in Informatica e Tecnologie

Programmazione Modulare - Scope

04/04/2017 25

• Lo scope (visibilità) di una variabile è il frammento di codice in cui una variabile è «visibile»• Visibile è nota al compilatore e può essere utilizzata nel codice senza

produrre errori.

Cataldo Musto - Programmazione Modulare (Parte 2)Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2016/2017

Page 26: Laboratorio di Informaticaswap/labinf1617/6_Programmazione_Modulare_Parte_… · Laboratorio di Informatica Programmazione Modulare (Parte 2) Corso di Laurea in Informatica e Tecnologie

Programmazione Modulare - Scope

04/04/2017 26

• Lo scope (visibilità) di una variabile è il frammento di codice in cui una variabile è «visibile»• Visibile è nota al compilatore e può essere utilizzata nel codice senza

produrre errori.

• Regola Generale di Scope• Una variabile è visibile nel blocco in cui viene definita e in tutti i blocchi

innestati, a meno di ridefinizioni

• Sulla base di questa regola si definiscono quattro diverse tipologie di scope

Cataldo Musto - Programmazione Modulare (Parte 2)Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2016/2017

Page 27: Laboratorio di Informaticaswap/labinf1617/6_Programmazione_Modulare_Parte_… · Laboratorio di Informatica Programmazione Modulare (Parte 2) Corso di Laurea in Informatica e Tecnologie

Programmazione Modulare - Scope

04/04/2017 27

• Tipologie di scope• File Scope

• Function Scope

• Block Scope

• Function Prototype Scope

Cataldo Musto - Programmazione Modulare (Parte 2)Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2016/2017

Page 28: Laboratorio di Informaticaswap/labinf1617/6_Programmazione_Modulare_Parte_… · Laboratorio di Informatica Programmazione Modulare (Parte 2) Corso di Laurea in Informatica e Tecnologie

Programmazione Modulare - Scope

04/04/2017 28

• Tipologie di scope• File Scope

• Tutti gli identificatori definiti fuori dalle funzioni sono visibili in tutto il file. • Si usa per i prototipi di funzione (che devono poter essere richiamati in ogni

momento) e le variabili globali (che sono utilizzabili e visibili in tutto il codice sorgente)

• Function Scope• Gli identificatori definiti nel corpo di una funzione sono visibili solo in quella

funzione (a meno di ridefinizioni in un blocco)• Si usa per le variabili (locali).

• Block Scope• Tutti gli identificatori definiti in un blocco, sono visibili solo in quel blocco;

• Function Prototype Scope• Gli identificatori definiti nel prototipo di una funzione valgono solo in esso.

Cataldo Musto - Programmazione Modulare (Parte 2)Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2016/2017

Page 29: Laboratorio di Informaticaswap/labinf1617/6_Programmazione_Modulare_Parte_… · Laboratorio di Informatica Programmazione Modulare (Parte 2) Corso di Laurea in Informatica e Tecnologie

Programmazione Modulare - Scope

04/04/2017 29

• Tipologie di scope• File Scope

• Tutti gli identificatori definiti fuori dalle funzioni sono visibili in tutto il file. • Si usa per i prototipi di funzione (che devono poter essere richiamati in ogni

momento) e le variabili globali (che sono utilizzabili e visibili in tutto il codice sorgente)

• Function Scope• Gli identificatori definiti nel corpo di una funzione sono visibili solo in quella

funzione (a meno di ridefinizioni in un blocco)• Si usa per le variabili (locali).

• Block Scope• Tutti gli identificatori definiti in un blocco, sono visibili solo in quel blocco;

• Function Prototype Scope• Gli identificatori definiti nel prototipo di una funzione valgono solo in esso.

Cataldo Musto - Programmazione Modulare (Parte 2)Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2016/2017

Page 30: Laboratorio di Informaticaswap/labinf1617/6_Programmazione_Modulare_Parte_… · Laboratorio di Informatica Programmazione Modulare (Parte 2) Corso di Laurea in Informatica e Tecnologie

Programmazione Modulare - Scope

04/04/2017 30

• Tipologie di scope• File Scope

• Tutti gli identificatori definiti fuori dalle funzioni sono visibili in tutto il file. • Si usa per i prototipi di funzione (che devono poter essere richiamati in ogni

momento) e le variabili globali (che sono utilizzabili e visibili in tutto il codice sorgente)

• Function Scope• Gli identificatori definiti nel corpo di una funzione sono visibili solo in quella

funzione (a meno di ridefinizioni in un blocco)• Si usa per le variabili (locali).

• Block Scope• Tutti gli identificatori definiti in un blocco, sono visibili solo in quel blocco;

• Function Prototype Scope• Gli identificatori definiti nel prototipo di una funzione valgono solo in esso.

Cataldo Musto - Programmazione Modulare (Parte 2)Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2016/2017

Page 31: Laboratorio di Informaticaswap/labinf1617/6_Programmazione_Modulare_Parte_… · Laboratorio di Informatica Programmazione Modulare (Parte 2) Corso di Laurea in Informatica e Tecnologie

Programmazione Modulare - Scope

04/04/2017 31

• Tipologie di scope• File Scope

• Tutti gli identificatori definiti fuori dalle funzioni sono visibili in tutto il file. • Si usa per i prototipi di funzione (che devono poter essere richiamati in ogni

momento) e le variabili globali (che sono utilizzabili e visibili in tutto il codice sorgente)

• Function Scope• Gli identificatori definiti nel corpo di una funzione sono visibili solo in quella

funzione (a meno di ridefinizioni in un blocco)• Si usa per le variabili (locali).

• Block Scope• Tutti gli identificatori definiti in un blocco, sono visibili solo in quel blocco;

• Function Prototype Scope• Gli identificatori definiti nel prototipo di una funzione valgono solo in esso.

Cataldo Musto - Programmazione Modulare (Parte 2)Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2016/2017

Page 32: Laboratorio di Informaticaswap/labinf1617/6_Programmazione_Modulare_Parte_… · Laboratorio di Informatica Programmazione Modulare (Parte 2) Corso di Laurea in Informatica e Tecnologie

Programmazione Modulare - Scope

04/04/2017 32

void function(int var1);

int var2;

int main() {

int var3=0;

if(var3==0) {

int var4 = 1;

}

}

Cataldo Musto - Programmazione Modulare (Parte 2)Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2016/2017

Page 33: Laboratorio di Informaticaswap/labinf1617/6_Programmazione_Modulare_Parte_… · Laboratorio di Informatica Programmazione Modulare (Parte 2) Corso di Laurea in Informatica e Tecnologie

Programmazione Modulare - Scope

04/04/2017 33

void function(int var1); // var1 = visibilità nel prototipo

int var2; // var2 = visibilità globale

int main() {

int var3=0; // var3 = visibilità locale

if(var3==0) {

int var4 = 1; // var4 = visibilità nel blocco

}

}

Cataldo Musto - Programmazione Modulare (Parte 2)Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2016/2017

Page 34: Laboratorio di Informaticaswap/labinf1617/6_Programmazione_Modulare_Parte_… · Laboratorio di Informatica Programmazione Modulare (Parte 2) Corso di Laurea in Informatica e Tecnologie

Programmazione Modulare - Scope

04/04/2017 34

void function(int var1); // var1 = visibilità nel prototipoint var2; // var2 = visibilità globale

int main() {int var3=0; // var3 = visibilità localevar2=1;if(var3==0) {

int var4 = 1; // var4 = visibilità nel bloccovar3 = 2;

}var1 = 3; var4 = 4;

}

Cataldo Musto - Programmazione Modulare (Parte 2)Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2016/2017

Page 35: Laboratorio di Informaticaswap/labinf1617/6_Programmazione_Modulare_Parte_… · Laboratorio di Informatica Programmazione Modulare (Parte 2) Corso di Laurea in Informatica e Tecnologie

Programmazione Modulare - Scope

04/04/2017 35

void function(int var1); // var1 = visibilità nel prototipoint var2; // var2 = visibilità globale

int main() {int var3=0; // var3 = visibilità localevar2=1; // ok, è globaleif(var3==0) {

int var4 = 1; // var4 = visibilità nel bloccovar3 = 2;

}var1 = 3; var4 = 4;

}

Cataldo Musto - Programmazione Modulare (Parte 2)Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2016/2017

Page 36: Laboratorio di Informaticaswap/labinf1617/6_Programmazione_Modulare_Parte_… · Laboratorio di Informatica Programmazione Modulare (Parte 2) Corso di Laurea in Informatica e Tecnologie

Programmazione Modulare - Scope

04/04/2017 36

void function(int var1); // var1 = visibilità nel prototipoint var2; // var2 = visibilità globale

int main() {int var3=0; // var3 = visibilità localevar2=1; // ok, è globaleif(var3==0) {

int var4 = 1; // var4 = visibilità nel bloccovar3 = 2;

}var1 = 3; var4 = 4;

}

Cataldo Musto - Programmazione Modulare (Parte 2)Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2016/2017

Page 37: Laboratorio di Informaticaswap/labinf1617/6_Programmazione_Modulare_Parte_… · Laboratorio di Informatica Programmazione Modulare (Parte 2) Corso di Laurea in Informatica e Tecnologie

Programmazione Modulare - Scope

04/04/2017 37

void function(int var1); // var1 = visibilità nel prototipoint var2; // var2 = visibilità globale

int main() {int var3=0; // var3 = visibilità localevar2=1; // ok, è globaleif(var3==0) {

int var4 = 1; // var4 = visibilità nel bloccovar3 = 2; // ok, è locale

}var1 = 3; var4 = 4;

}

Cataldo Musto - Programmazione Modulare (Parte 2)Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2016/2017

Page 38: Laboratorio di Informaticaswap/labinf1617/6_Programmazione_Modulare_Parte_… · Laboratorio di Informatica Programmazione Modulare (Parte 2) Corso di Laurea in Informatica e Tecnologie

Programmazione Modulare - Scope

04/04/2017 38

void function(int var1); // var1 = visibilità nel prototipoint var2; // var2 = visibilità globale

int main() {int var3=0; // var3 = visibilità localevar2=1; // ok, è globaleif(var3==0) {

int var4 = 1; // var4 = visibilità nel bloccovar3 = 2; // ok, è locale

}var1 = 3; var4 = 4;

}

Cataldo Musto - Programmazione Modulare (Parte 2)Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2016/2017

Page 39: Laboratorio di Informaticaswap/labinf1617/6_Programmazione_Modulare_Parte_… · Laboratorio di Informatica Programmazione Modulare (Parte 2) Corso di Laurea in Informatica e Tecnologie

Programmazione Modulare - Scope

04/04/2017 39

void function(int var1); // var1 = visibilità nel prototipoint var2; // var2 = visibilità globale

int main() {int var3=0; // var3 = visibilità localevar2=1; // ok, è globaleif(var3==0) {

int var4 = 1; // var4 = visibilità nel bloccovar3 = 2; // ok, è locale

}var1 = 3; // errore, visibile solo nel prototipovar4 = 4; // errore, visibile solo nel blocco

}

Cataldo Musto - Programmazione Modulare (Parte 2)Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2016/2017

Page 40: Laboratorio di Informaticaswap/labinf1617/6_Programmazione_Modulare_Parte_… · Laboratorio di Informatica Programmazione Modulare (Parte 2) Corso di Laurea in Informatica e Tecnologie

Programmazione Modulare - Scope

04/04/2017 40

void function(int var1); // var1 = visibilità nel prototipoint var2; // var2 = visibilità globale

int main() {int var3=0; // var3 = visibilità localevar2=1; // ok, è globaleif(var3==0) {

int var4 = 1; // var4 = visibilità nel bloccovar3 = 2; // ok, è locale

}var1 = 3; // errore, visibile solo nel prototipoint var4 = 4; // ?

}

Cataldo Musto - Programmazione Modulare (Parte 2)Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2016/2017

Page 41: Laboratorio di Informaticaswap/labinf1617/6_Programmazione_Modulare_Parte_… · Laboratorio di Informatica Programmazione Modulare (Parte 2) Corso di Laurea in Informatica e Tecnologie

Programmazione Modulare - Scope

04/04/2017 41

void function(int var1); // var1 = visibilità nel prototipoint var2; // var2 = visibilità globale

int main() {int var3=0; // var3 = visibilità localevar2=1; // ok, è globaleif(var3==0) {

int var4 = 1; // var4 = visibilità nel bloccovar3 = 2; // ok, è locale

}var1 = 3; // errore, visibile solo nel prototipoint var4 = 4; // OK! Perché una volta terminato il blocco la

variabile var4 può essere ri-definita.}

Cataldo Musto - Programmazione Modulare (Parte 2)Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2016/2017

Page 42: Laboratorio di Informaticaswap/labinf1617/6_Programmazione_Modulare_Parte_… · Laboratorio di Informatica Programmazione Modulare (Parte 2) Corso di Laurea in Informatica e Tecnologie

Programmazione Modulare - Scope

04/04/2017 42

• In Linguaggio C esistono degli specificatori per «definire» la permanenza in memoria di una variabile• Auto

• Extern

• Static

• Register

Cataldo Musto - Programmazione Modulare (Parte 2)Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2016/2017

Page 43: Laboratorio di Informaticaswap/labinf1617/6_Programmazione_Modulare_Parte_… · Laboratorio di Informatica Programmazione Modulare (Parte 2) Corso di Laurea in Informatica e Tecnologie

Programmazione Modulare - Scope

04/04/2017 43

• In Linguaggio C esistono degli specificatori per «definire» la permanenza in memoria di una variabile• Auto

• Valore di default per le variabili locali (non serve indicarlo). Imposta la permanenza in memoria pari al ciclo di vita del blocco.

• Extern• Valore di default per le variabili locali. Imposta la visibilità a livello di file.

• Static• Visibilità a livello di funzione, ma il suo valore non viene distrutto quando termina

l’esecuzione della funzione

• Register• Memorizza la variabile in registri ad alta velocità, per velocizzarne l’accesso. Utile per

variabili cui si accede spesso, es. i contatori

Cataldo Musto - Programmazione Modulare (Parte 2)Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2016/2017

Page 44: Laboratorio di Informaticaswap/labinf1617/6_Programmazione_Modulare_Parte_… · Laboratorio di Informatica Programmazione Modulare (Parte 2) Corso di Laurea in Informatica e Tecnologie

Programmazione Modulare - Scope

04/04/2017 44

• In Linguaggio C esistono degli specificatori per «definire» la permanenza in memoria di una variabile• Auto

• Valore di default per le variabili locali (non serve indicarlo). Imposta la permanenza in memoria pari al ciclo di vita del blocco.

• Extern• Valore di default per le variabili globali. La permanenza in memoria è pari all’intera

esecuzione del file.

• Static• Visibilità a livello di funzione, ma il suo valore non viene distrutto quando termina

l’esecuzione della funzione

• Register• Memorizza la variabile in registri ad alta velocità, per velocizzarne l’accesso. Utile per variabili

cui si accede spesso, es. i contatori

Cataldo Musto - Programmazione Modulare (Parte 2)Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2016/2017

Page 45: Laboratorio di Informaticaswap/labinf1617/6_Programmazione_Modulare_Parte_… · Laboratorio di Informatica Programmazione Modulare (Parte 2) Corso di Laurea in Informatica e Tecnologie

Programmazione Modulare - Scope

04/04/2017 45

• In Linguaggio C esistono degli specificatori per «definire» la permanenza in memoria di una variabile• Auto

• Valore di default per le variabili locali (non serve indicarlo). Imposta la permanenza in memoria pari al ciclo di vita del blocco.

• Extern• Valore di default per le variabili globali. La permanenza in memoria è pari all’intera

esecuzione del file.

• Static• La permanenza in memoria è pari all’esecuzione di una funzione, ma il suo valore non viene

distrutto quando termina l’esecuzione della funzione

• Register• Memorizza la variabile in registri ad alta velocità, per velocizzarne l’accesso. Utile per variabili

cui si accede spesso, es. i contatori

Cataldo Musto - Programmazione Modulare (Parte 2)Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2016/2017

Page 46: Laboratorio di Informaticaswap/labinf1617/6_Programmazione_Modulare_Parte_… · Laboratorio di Informatica Programmazione Modulare (Parte 2) Corso di Laurea in Informatica e Tecnologie

Programmazione Modulare - Scope

04/04/2017 46

• In Linguaggio C esistono degli specificatori per «definire» la permanenza in memoria di una variabile• Auto

• Valore di default per le variabili locali (non serve indicarlo). Imposta la permanenza in memoria pari al ciclo di vita del blocco.

• Extern• Valore di default per le variabili globali. La permanenza in memoria è pari all’intera

esecuzione del file.

• Static• La permanenza in memoria è pari all’esecuzione di una funzione, ma il suo valore non viene

distrutto quando termina l’esecuzione della funzione

• Register• Memorizza la variabile in registri ad alta velocità, per velocizzarne l’accesso. Utile per variabili

cui si accede spesso, es. i contatori – NB) OBSOLETO, non utilizzato.

Cataldo Musto - Programmazione Modulare (Parte 2)Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2016/2017

Page 47: Laboratorio di Informaticaswap/labinf1617/6_Programmazione_Modulare_Parte_… · Laboratorio di Informatica Programmazione Modulare (Parte 2) Corso di Laurea in Informatica e Tecnologie

Specificatori - Esempio

04/04/2017 47Cataldo Musto - Programmazione Modulare (Parte 2)

Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2016/2017

Page 48: Laboratorio di Informaticaswap/labinf1617/6_Programmazione_Modulare_Parte_… · Laboratorio di Informatica Programmazione Modulare (Parte 2) Corso di Laurea in Informatica e Tecnologie

Specificatori - Esempio

04/04/2017 48Cataldo Musto - Programmazione Modulare (Parte 2)

Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2016/2017

Specificatore utile per le variabili cui si accede spesso. Velocizza l’accesso inserendole nei registri. Obsoleto!

Parametro passato per valore.

Page 49: Laboratorio di Informaticaswap/labinf1617/6_Programmazione_Modulare_Parte_… · Laboratorio di Informatica Programmazione Modulare (Parte 2) Corso di Laurea in Informatica e Tecnologie

Specificatori - Esempio

04/04/2017 49Cataldo Musto - Programmazione Modulare (Parte 2)

Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2016/2017

Page 50: Laboratorio di Informaticaswap/labinf1617/6_Programmazione_Modulare_Parte_… · Laboratorio di Informatica Programmazione Modulare (Parte 2) Corso di Laurea in Informatica e Tecnologie

Specificatori - Esempio

04/04/2017 50Cataldo Musto - Programmazione Modulare (Parte 2)

Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2016/2017

Cosa stampa?

Page 51: Laboratorio di Informaticaswap/labinf1617/6_Programmazione_Modulare_Parte_… · Laboratorio di Informatica Programmazione Modulare (Parte 2) Corso di Laurea in Informatica e Tecnologie

Specificatori – Esempio (Output)

04/04/2017 51Cataldo Musto - Programmazione Modulare (Parte 2)

Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2016/2017

Page 52: Laboratorio di Informaticaswap/labinf1617/6_Programmazione_Modulare_Parte_… · Laboratorio di Informatica Programmazione Modulare (Parte 2) Corso di Laurea in Informatica e Tecnologie

Specificatori – Esempio (Output)

04/04/2017 52Cataldo Musto - Programmazione Modulare (Parte 2)

Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2016/2017

La variabile statica a resta

in memoria, quindi ad ogni invocazione della funzione il valore continua a essere incrementato.

b è un parametro passato

per valore, quindi il suo valore viene azzerato (e inizializzato) ad ogni

invocazione della funzione f

Page 53: Laboratorio di Informaticaswap/labinf1617/6_Programmazione_Modulare_Parte_… · Laboratorio di Informatica Programmazione Modulare (Parte 2) Corso di Laurea in Informatica e Tecnologie

Esercizio 6.1

• Migliorare l’implementazione dell’Esercitazione 3

1) Modularizzare il codice• Definire funzioni e procedure per le varie funzionalità• Valutare le diverse implementazioni possibili

• Un’unica funzione per controllare nome, cognome e indirizzo? Una funzione separata per ogni controllo?

• Valutare le diverse intestazioni delle funzioni• Nella funzione che restituisce il grado di sicurezza della funzione, i valori di sicurezza (>=2,

>=4, etc.) sono dei parametri o sono già presenti nel codice?

• Motivare e Giustificare le scelte (maggiore leggibilità del codice, maggiore riuso ma minore modularità, etc.)

2) La consegna dell’esercitazione 3 (scadenza, 06/04 ore 23.59) dovrà prevedere del codice modulare

04/04/2017 53Cataldo Musto - Programmazione Modulare (Parte 2)

Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2016/2017

Page 54: Laboratorio di Informaticaswap/labinf1617/6_Programmazione_Modulare_Parte_… · Laboratorio di Informatica Programmazione Modulare (Parte 2) Corso di Laurea in Informatica e Tecnologie

Progettazione Modulare

04/04/2017 54Cataldo Musto - Programmazione Modulare (Parte 2)

Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2016/2017

Page 55: Laboratorio di Informaticaswap/labinf1617/6_Programmazione_Modulare_Parte_… · Laboratorio di Informatica Programmazione Modulare (Parte 2) Corso di Laurea in Informatica e Tecnologie

Progettazione Modulare

• L’utilizzo delle funzioni e delle procedure risolve parzialmente il problema della programmazione modulare

• Perché?

04/04/2017 55Cataldo Musto - Programmazione Modulare (Parte 2)

Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2016/2017

Page 56: Laboratorio di Informaticaswap/labinf1617/6_Programmazione_Modulare_Parte_… · Laboratorio di Informatica Programmazione Modulare (Parte 2) Corso di Laurea in Informatica e Tecnologie

Progettazione Modulare

• L’utilizzo delle funzioni e delle procedure risolve parzialmente il problema della programmazione modulare

• Perché?• Il codice sorgente è comunque tutto aggregato in un unico file (anche se

«spacchettato» in diverse funzioni.

• Per implementare totalmente i principi della programmazione modulare è necessario anche dividere «fisicamente» il codice sorgente

• Come?

04/04/2017 56Cataldo Musto - Programmazione Modulare (Parte 2)

Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2016/2017

Page 57: Laboratorio di Informaticaswap/labinf1617/6_Programmazione_Modulare_Parte_… · Laboratorio di Informatica Programmazione Modulare (Parte 2) Corso di Laurea in Informatica e Tecnologie

Progettazione Modulare

• L’utilizzo delle funzioni e delle procedure risolve parzialmente il problema della programmazione modulare

• Perché?• Il codice sorgente è comunque tutto aggregato in un unico file (anche se

«spacchettato» in diverse funzioni.

• Per implementare totalmente i principi della programmazione modulare è necessario anche dividere «fisicamente» il codice sorgente

• Come?• Header Files

• Librerie Statiche

04/04/2017 57Cataldo Musto - Programmazione Modulare (Parte 2)

Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2016/2017

Page 58: Laboratorio di Informaticaswap/labinf1617/6_Programmazione_Modulare_Parte_… · Laboratorio di Informatica Programmazione Modulare (Parte 2) Corso di Laurea in Informatica e Tecnologie

Progettazione Modulare

04/04/2017 58Cataldo Musto - Programmazione Modulare (Parte 2)

Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2016/2017

Header Files Librerie Statiche

Repl.it SI NO

Eclipse SI SI

Page 59: Laboratorio di Informaticaswap/labinf1617/6_Programmazione_Modulare_Parte_… · Laboratorio di Informatica Programmazione Modulare (Parte 2) Corso di Laurea in Informatica e Tecnologie

Progettazione Modulare

04/04/2017 59Cataldo Musto - Programmazione Modulare (Parte 2)

Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2016/2017

Header Files Librerie Statiche

Repl.it SI NO

Eclipse SI SI

Eclipse da la possibilità di implementare la programmazione modulare sia attraverso

l’utilizzo delle librerie statiche che attraverso la definizione degli header files.

Repl.it permette solo di dividere il codice sorgente in più file più piccoli, utilizzando gli

header files

Entrambe le modalità sono accettate.

Page 60: Laboratorio di Informaticaswap/labinf1617/6_Programmazione_Modulare_Parte_… · Laboratorio di Informatica Programmazione Modulare (Parte 2) Corso di Laurea in Informatica e Tecnologie

Progettazione Modulare – Header Files

• Gli header files sono ‘files di intestazione’ (tradotto letteralmente)• Hanno estensione .h (esempio: functions.h)

• Sono accompagnati da un file .c con lo stesso nome (functions.c)

• Contengono le intestazioni delle funzioni e delle procedure che vogliamo separare dal programma principale

• Si creano uno o più nuovi files e si inseriscono le funzioni in questi files• Le funzioni vengono aggregate in diversi header files, in base al loro scopo (es. tutte le

funzioni che si occupano di input/output, tutte le funzioni per operazioni matematiche, etc.)

• Un po’ come avviene nelle funzioni della libreria standard del C (es. <string.h> <ctype.h> etc.)

• Come cambia la struttura dei programmi?

04/04/2017 60Cataldo Musto - Programmazione Modulare (Parte 2)

Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2016/2017

Page 61: Laboratorio di Informaticaswap/labinf1617/6_Programmazione_Modulare_Parte_… · Laboratorio di Informatica Programmazione Modulare (Parte 2) Corso di Laurea in Informatica e Tecnologie

Progettazione Modulare – Header Files

• Gli header files sono ‘files di intestazione’ (tradotto letteralmente)• Hanno estensione .h (esempio: functions.h)

• Sono accompagnati da un file .c con lo stesso nome (functions.c)

• Contengono le intestazioni delle funzioni e delle procedure che vogliamo separare dal programma principale

• Si creano uno o più nuovi files e si inseriscono le funzioni in questi files• Le funzioni vengono aggregate in diversi header files, in base al loro scopo (es. tutte le

funzioni che si occupano di input/output, tutte le funzioni per operazioni matematiche, etc.)

• Un po’ come avviene nelle funzioni della libreria standard del C (es. <string.h> <ctype.h> etc.)

• Come cambia la struttura dei programmi?

04/04/2017 61Cataldo Musto - Programmazione Modulare (Parte 2)

Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2016/2017

Page 62: Laboratorio di Informaticaswap/labinf1617/6_Programmazione_Modulare_Parte_… · Laboratorio di Informatica Programmazione Modulare (Parte 2) Corso di Laurea in Informatica e Tecnologie

Progettazione Modulare – Header Files

04/04/2017 62Cataldo Musto - Programmazione Modulare (Parte 2)

Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2016/2017

void f(int x); // prototipo

int f(int x) { // funzionestatic int a = 0;int b = 0;printf(«Ciclo %d:%d\t%d\n», x,a,b)

}

int main() { // mainfor(int i=1; i<=10; i++) { f(i); // invocazione

}}

main.c

Page 63: Laboratorio di Informaticaswap/labinf1617/6_Programmazione_Modulare_Parte_… · Laboratorio di Informatica Programmazione Modulare (Parte 2) Corso di Laurea in Informatica e Tecnologie

Progettazione Modulare – Header Files

04/04/2017 63Cataldo Musto - Programmazione Modulare (Parte 2)

Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2016/2017

void f(int x); // prototipo

int f(int x) { // funzionestatic int a = 0;int b = 0;printf(«Ciclo %d:%d\t%d\n», x,a,b)

}

int main() { // mainfor(int i=1; i<=10; i++) { f(i); // invocazione

}}

main.c

Header filevoid f(int x); // prototipo

function.h

Page 64: Laboratorio di Informaticaswap/labinf1617/6_Programmazione_Modulare_Parte_… · Laboratorio di Informatica Programmazione Modulare (Parte 2) Corso di Laurea in Informatica e Tecnologie

Progettazione Modulare – Header Files

04/04/2017 64Cataldo Musto - Programmazione Modulare (Parte 2)

Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2016/2017

void f(int x); // prototipo

int f(int x) { // funzionestatic int a = 0;int b = 0;printf(«Ciclo %d:%d\t%d\n», x,a,b)

}

int main() { // mainfor(int i=1; i<=10; i++) { f(i); // invocazione

}}

main.c

Header filevoid f(int x); // prototipo

function.h

Implementazione

#include <stdio.h> // includeint f(int x) { // funzione

static int a = 0;int b = 0;printf(«Ciclo %d:%d\t%d\n», x,a,b)

} function.c

Page 65: Laboratorio di Informaticaswap/labinf1617/6_Programmazione_Modulare_Parte_… · Laboratorio di Informatica Programmazione Modulare (Parte 2) Corso di Laurea in Informatica e Tecnologie

Progettazione Modulare – Header Files

04/04/2017 65Cataldo Musto - Programmazione Modulare (Parte 2)

Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2016/2017

void f(int x); // prototipo

int f(int x) { // funzionestatic int a = 0;int b = 0;printf(«Ciclo %d:%d\t%d\n», x,a,b)

}

int main() { // mainfor(int i=1; i<=10; i++) { f(i); // invocazione

}}

main.c

Header filevoid f(int x); // prototipo

function.h

Implementazione

#include <stdio.h> // includeint f(int x) { // funzione

static int a = 0;int b = 0;printf(«Ciclo %d:%d\t%d\n», x,a,b)

} function.c

Main #include ‘function’.h // virgolette!

int main() { // mainfor(int i=1; i<=10; i++) {

f(i); // invocazione}

} main.c

Page 66: Laboratorio di Informaticaswap/labinf1617/6_Programmazione_Modulare_Parte_… · Laboratorio di Informatica Programmazione Modulare (Parte 2) Corso di Laurea in Informatica e Tecnologie

Progettazione Modulare – Header Files

04/04/2017 66Cataldo Musto - Programmazione Modulare (Parte 2)

Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2016/2017

main.c

Header filevoid f(int x); // prototipo

function.h

Implementazione

#include <stdio.h> // includeint f(int x) { // funzione

static int a = 0;int b = 0;printf(«Ciclo %d:%d\t%d\n», x,a,b)

} function.c

Main

#include ‘function’.h // virgolette!

int main() { // mainfor(int i=1; i<=10; i++) {

f(i); // invocazione}

} main.c

Page 67: Laboratorio di Informaticaswap/labinf1617/6_Programmazione_Modulare_Parte_… · Laboratorio di Informatica Programmazione Modulare (Parte 2) Corso di Laurea in Informatica e Tecnologie

Progettazione Modulare – Header Files

04/04/2017 67Cataldo Musto - Programmazione Modulare (Parte 2)

Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2016/2017

main.c

Header filevoid f(int x); // prototipo

function.h

Implementazione

#include <stdio.h> // includeint f(int x) { // funzione

static int a = 0;int b = 0;printf(«Ciclo %d:%d\t%d\n», x,a,b)

} function.c

Main

#include ‘function’.h // virgolette!

int main() { // mainfor(int i=1; i<=10; i++) {

f(i); // invocazione}

} main.c

Nell’header file andiamo a inserire solo i prototipi di funzione

Page 68: Laboratorio di Informaticaswap/labinf1617/6_Programmazione_Modulare_Parte_… · Laboratorio di Informatica Programmazione Modulare (Parte 2) Corso di Laurea in Informatica e Tecnologie

Progettazione Modulare – Header Files

04/04/2017 68Cataldo Musto - Programmazione Modulare (Parte 2)

Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2016/2017

main.c

Header filevoid f(int x); // prototipo

function.h

Implementazione

#include <stdio.h> // includeint f(int x) { // funzione

static int a = 0;int b = 0;printf(«Ciclo %d:%d\t%d\n», x,a,b)

} function.c

Main

#include ‘function’.h // virgolette!

int main() { // mainfor(int i=1; i<=10; i++) {

f(i); // invocazione}

} main.c

Nell’header file andiamo a inserire solo i prototipi di funzione

Nel file di implementazione (con lo stesso nome!) inseriamo l’implementazione dei prototipi. Se necessario, i file di implementazione possono avere a loro volta delle direttive #include

Page 69: Laboratorio di Informaticaswap/labinf1617/6_Programmazione_Modulare_Parte_… · Laboratorio di Informatica Programmazione Modulare (Parte 2) Corso di Laurea in Informatica e Tecnologie

Progettazione Modulare – Header Files

04/04/2017 69Cataldo Musto - Programmazione Modulare (Parte 2)

Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2016/2017

main.c

Header filevoid f(int x); // prototipo

function.h

Implementazione

#include <stdio.h> // includeint f(int x) { // funzione

static int a = 0;int b = 0;printf(«Ciclo %d:%d\t%d\n», x,a,b)

} function.c

Main

#include ‘function’.h// virgolette

int main() { // mainfor(int i=1; i<=10; i++) {

f(i); // invocazione}

} main.c

Nell’header file andiamo a inserire solo i prototipi di funzione

Nel file di implementazione (con lo stesso nome!) inseriamo l’implementazione dei prototipi. Se necessario, i file di implementazione possono avere a loro volta delle direttive #include

Nel main includiamo il nostro nuovo header files, così come se fosse una delle librerie standard del C, e possiamo utilizzarne le funzioni.Importante: doppie virgolette, non parentesi angolari!

Page 70: Laboratorio di Informaticaswap/labinf1617/6_Programmazione_Modulare_Parte_… · Laboratorio di Informatica Programmazione Modulare (Parte 2) Corso di Laurea in Informatica e Tecnologie

Progettazione Modulare – Header Files

04/04/2017 70Cataldo Musto - Programmazione Modulare (Parte 2)

Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2016/2017

Main.c Function.h

Function.c <stdio.h>

Page 71: Laboratorio di Informaticaswap/labinf1617/6_Programmazione_Modulare_Parte_… · Laboratorio di Informatica Programmazione Modulare (Parte 2) Corso di Laurea in Informatica e Tecnologie

Progettazione Modulare – Header Files

04/04/2017 71Cataldo Musto - Programmazione Modulare (Parte 2)

Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2016/2017

Main.c Function.h

Function.c <stdio.h>

L’utilizzo degli header files cambia la struttura dei programmi. Il main invoca le funzioni implementate in function.h, che a sua volta nella sua implementazione ha bisogno delle funzioni della libreria standard.

Il processo di esecuzione dei programmi può essere rappresentato attraverso un grafo aciclico (perché non ci possono essere dipendenze «circolari» tra librerie)

Page 72: Laboratorio di Informaticaswap/labinf1617/6_Programmazione_Modulare_Parte_… · Laboratorio di Informatica Programmazione Modulare (Parte 2) Corso di Laurea in Informatica e Tecnologie

Progettazione Modulare – Header Files

04/04/2017 72Cataldo Musto - Programmazione Modulare (Parte 2)

Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2016/2017

Main.c Function.h

Function.c <stdio.h>

L’utilizzo degli header files cambia la struttura dei programmi. Il main invoca le funzioni implementate in function.h, che a sua volta nella sua implementazione ha bisogno delle funzioni della libreria standard.

Il processo di esecuzione dei programmi può essere rappresentato attraverso un grafo aciclico (perché non ci possono essere dipendenze «circolari» tra librerie)

(Grafo = insieme di nodi e

archi che collegano i nodi)

Page 73: Laboratorio di Informaticaswap/labinf1617/6_Programmazione_Modulare_Parte_… · Laboratorio di Informatica Programmazione Modulare (Parte 2) Corso di Laurea in Informatica e Tecnologie

Progettazione Modulare – Un Caso Reale

04/04/2017 73Cataldo Musto - Programmazione Modulare (Parte 2)

Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2016/2017

Source: http://scottmcpeak.com/elkhound/

Credits: Corrado Mencar

Page 74: Laboratorio di Informaticaswap/labinf1617/6_Programmazione_Modulare_Parte_… · Laboratorio di Informatica Programmazione Modulare (Parte 2) Corso di Laurea in Informatica e Tecnologie

Progettazione Modulare – Header Files

04/04/2017 74Cataldo Musto - Programmazione Modulare (Parte 2)

Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2016/2017

• Ogni header file è diviso in sette parti1. Prologo

2. Guardia

3. Direttive di inclusione

4. Costanti

5. Tipi di Dato

6. Variabili Globali

7. Prototipi di Funzione

Credits: Corrado Mencar

Page 75: Laboratorio di Informaticaswap/labinf1617/6_Programmazione_Modulare_Parte_… · Laboratorio di Informatica Programmazione Modulare (Parte 2) Corso di Laurea in Informatica e Tecnologie

Progettazione Modulare – Header Files

04/04/2017 75Cataldo Musto - Programmazione Modulare (Parte 2)

Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2016/2017

• Ogni header file è diviso in sette parti1. Prologo

• Si tratta di un «commento», descrive a cosa serve il file e che tipo di informazioni contiene

• Autori, Data, Numero di Versione, Riferimenti e Link esterni, Eventuali informazioni su Licenze e Copyright

Credits: Corrado Mencar

Page 76: Laboratorio di Informaticaswap/labinf1617/6_Programmazione_Modulare_Parte_… · Laboratorio di Informatica Programmazione Modulare (Parte 2) Corso di Laurea in Informatica e Tecnologie

Progettazione Modulare – Header Files

04/04/2017 76Cataldo Musto - Programmazione Modulare (Parte 2)

Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2016/2017

• Ogni header file è diviso in sette parti2. Guardia

• La struttura a «grafo» delle dipendenze può portare ad avere dipendenze multiple

Credits: Corrado Mencar

Page 77: Laboratorio di Informaticaswap/labinf1617/6_Programmazione_Modulare_Parte_… · Laboratorio di Informatica Programmazione Modulare (Parte 2) Corso di Laurea in Informatica e Tecnologie

Progettazione Modulare – Header Files

04/04/2017 77Cataldo Musto - Programmazione Modulare (Parte 2)

Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2016/2017

• Ogni header file è diviso in sette parti2. Guardia

• La struttura a «grafo» delle dipendenze può portare ad avere dipendenze multiple

• La guardia serve a inserire delle condizioni nella definizione delle informazioni che sono contenute nell’header file, per evitare di fornire definizioni multiple.

Thanks to Corrado Mencar

Credits: Corrado Mencar

Page 78: Laboratorio di Informaticaswap/labinf1617/6_Programmazione_Modulare_Parte_… · Laboratorio di Informatica Programmazione Modulare (Parte 2) Corso di Laurea in Informatica e Tecnologie

Progettazione Modulare – Header Files

04/04/2017 78Cataldo Musto - Programmazione Modulare (Parte 2)

Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2016/2017

• Ogni header file è diviso in sette parti2. Guardia

• La struttura a «grafo» delle dipendenze può portare ad avere dipendenze multiple

• La guardia serve a inserire delle condizioni nella definizione delle informazioni che sono contenute nell’header file, per evitare di fornire definizioni multiple.

#ifndef if not defined

(Se il file non è già stato incluso, continua a leggere)

Credits: Corrado Mencar

Page 79: Laboratorio di Informaticaswap/labinf1617/6_Programmazione_Modulare_Parte_… · Laboratorio di Informatica Programmazione Modulare (Parte 2) Corso di Laurea in Informatica e Tecnologie

Progettazione Modulare – Header Files

04/04/2017 79Cataldo Musto - Programmazione Modulare (Parte 2)

Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2016/2017

• Ogni header file è diviso in sette parti3. Inclusioni

• Un modulo può implementare delle funzioni che a loro volta abbiano bisogno di altre librerie

• Nel nostro esempio includevamo <stdio.h> per poter utilizzare l’istruzione printf().

Credits: Corrado Mencar

Page 80: Laboratorio di Informaticaswap/labinf1617/6_Programmazione_Modulare_Parte_… · Laboratorio di Informatica Programmazione Modulare (Parte 2) Corso di Laurea in Informatica e Tecnologie

Progettazione Modulare – Header Files

04/04/2017 80Cataldo Musto - Programmazione Modulare (Parte 2)

Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2016/2017

• Ogni header file è diviso in sette parti4. Definizioni

• Un header file deve includere anche le definizioni di costanti e macro.

• E’ possibile anche qui usare #ifndef per evitare ridefinizioni di costanti già definite nel programma

Credits: Corrado Mencar

Page 81: Laboratorio di Informaticaswap/labinf1617/6_Programmazione_Modulare_Parte_… · Laboratorio di Informatica Programmazione Modulare (Parte 2) Corso di Laurea in Informatica e Tecnologie

Progettazione Modulare – Header Files

04/04/2017 81Cataldo Musto - Programmazione Modulare (Parte 2)

Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2016/2017

• Ogni header file è diviso in sette parti5. Tipi di dato

• Un header file deve includere anche le definizioni di tipi di dato

• Come abbiamo visto, e’ utile definire nuovi tipi di dato con il comando typedef. Tutti i nuovi tipi di dato sono da includere nell’header file.

• Utilità• Astrazione• Leggibilità

Credits: Corrado Mencar

Page 82: Laboratorio di Informaticaswap/labinf1617/6_Programmazione_Modulare_Parte_… · Laboratorio di Informatica Programmazione Modulare (Parte 2) Corso di Laurea in Informatica e Tecnologie

Progettazione Modulare – Header Files

04/04/2017 82Cataldo Musto - Programmazione Modulare (Parte 2)

Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2016/2017

• Ogni header file è diviso in sette parti6. Variabili

• Le variabili definite negli header file hanno visibilità globale, sono visibili da tutte le funzioni o da tutti i moduli.

• Per alcuni problemi può essere utile avere delle variabili globali accessibili da tutti e visibili a tutti.

Credits: Corrado Mencar

Page 83: Laboratorio di Informaticaswap/labinf1617/6_Programmazione_Modulare_Parte_… · Laboratorio di Informatica Programmazione Modulare (Parte 2) Corso di Laurea in Informatica e Tecnologie

Progettazione Modulare – Header Files

04/04/2017 83Cataldo Musto - Programmazione Modulare (Parte 2)

Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2016/2017

• Ogni header file è diviso in sette parti7. Prototipi di funzione

• A livello minimale, un header file deve contenere almeno un prototipo di funzione

Credits: Corrado Mencar

Page 84: Laboratorio di Informaticaswap/labinf1617/6_Programmazione_Modulare_Parte_… · Laboratorio di Informatica Programmazione Modulare (Parte 2) Corso di Laurea in Informatica e Tecnologie

04/04/2017 84Cataldo Musto - Programmazione Modulare (Parte 2)

Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2016/2017

Page 85: Laboratorio di Informaticaswap/labinf1617/6_Programmazione_Modulare_Parte_… · Laboratorio di Informatica Programmazione Modulare (Parte 2) Corso di Laurea in Informatica e Tecnologie

Programmazione Modularesu Repl ed Eclipse

04/04/2017 85Cataldo Musto - Programmazione Modulare (Parte 2)

Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2016/2017

Page 86: Laboratorio di Informaticaswap/labinf1617/6_Programmazione_Modulare_Parte_… · Laboratorio di Informatica Programmazione Modulare (Parte 2) Corso di Laurea in Informatica e Tecnologie

Progettazione Modulare – Header Files (in Repl)

04/04/2017 86Cataldo Musto - Programmazione Modulare (Parte 2)

Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2016/2017

Page 87: Laboratorio di Informaticaswap/labinf1617/6_Programmazione_Modulare_Parte_… · Laboratorio di Informatica Programmazione Modulare (Parte 2) Corso di Laurea in Informatica e Tecnologie

Progettazione Modulare – Header Files (in Repl)

04/04/2017 87Cataldo Musto - Programmazione Modulare (Parte 2)

Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2016/2017

Crea nuovi file sorgente nel progetto

Page 88: Laboratorio di Informaticaswap/labinf1617/6_Programmazione_Modulare_Parte_… · Laboratorio di Informatica Programmazione Modulare (Parte 2) Corso di Laurea in Informatica e Tecnologie

Progettazione Modulare – Header Files (in Repl)

04/04/2017 88Cataldo Musto - Programmazione Modulare (Parte 2)

Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2016/2017

Click Renamerinominare il file in in .h

Page 89: Laboratorio di Informaticaswap/labinf1617/6_Programmazione_Modulare_Parte_… · Laboratorio di Informatica Programmazione Modulare (Parte 2) Corso di Laurea in Informatica e Tecnologie

Progettazione Modulare – Header Files (in Repl)

04/04/2017 89Cataldo Musto - Programmazione Modulare (Parte 2)

Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2016/2017

Page 90: Laboratorio di Informaticaswap/labinf1617/6_Programmazione_Modulare_Parte_… · Laboratorio di Informatica Programmazione Modulare (Parte 2) Corso di Laurea in Informatica e Tecnologie

Progettazione Modulare – Header Files (in Repl)

04/04/2017 90Cataldo Musto - Programmazione Modulare (Parte 2)

Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2016/2017

Header file

Page 91: Laboratorio di Informaticaswap/labinf1617/6_Programmazione_Modulare_Parte_… · Laboratorio di Informatica Programmazione Modulare (Parte 2) Corso di Laurea in Informatica e Tecnologie

Progettazione Modulare – Header Files (in Repl)

04/04/2017 91Cataldo Musto - Programmazione Modulare (Parte 2)

Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2016/2017

Header file

Implementazione

Page 92: Laboratorio di Informaticaswap/labinf1617/6_Programmazione_Modulare_Parte_… · Laboratorio di Informatica Programmazione Modulare (Parte 2) Corso di Laurea in Informatica e Tecnologie

Progettazione Modulare – Header Files (Eclipse)

04/04/2017 92Cataldo Musto - Programmazione Modulare (Parte 2)

Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2016/2017

Creazione ProgettoTasto Destro sulla

cartella dei sorgentiNewHeader File

Creazione dell’header file

(importante, non dimenticare l’estensione del file!)

Page 93: Laboratorio di Informaticaswap/labinf1617/6_Programmazione_Modulare_Parte_… · Laboratorio di Informatica Programmazione Modulare (Parte 2) Corso di Laurea in Informatica e Tecnologie

Progettazione Modulare – Header Files (Eclipse)

04/04/2017 93Cataldo Musto - Programmazione Modulare (Parte 2)

Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2016/2017

Creazione ProgettoTasto Destro sulla

cartella dei sorgentiNewSource File

Creazione del file implementazione

(importante, non dimenticare l’estensione del file!)

Page 94: Laboratorio di Informaticaswap/labinf1617/6_Programmazione_Modulare_Parte_… · Laboratorio di Informatica Programmazione Modulare (Parte 2) Corso di Laurea in Informatica e Tecnologie

Progettazione Modulare – Header Files (Eclipse)

04/04/2017 94Cataldo Musto - Programmazione Modulare (Parte 2)

Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2016/2017

Struttura del progetto

Page 95: Laboratorio di Informaticaswap/labinf1617/6_Programmazione_Modulare_Parte_… · Laboratorio di Informatica Programmazione Modulare (Parte 2) Corso di Laurea in Informatica e Tecnologie

Progettazione Modulare – Header Files (Eclipse)

04/04/2017 95Cataldo Musto - Programmazione Modulare (Parte 2)

Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2016/2017

Struttura del progetto

E’ interessante notare che quando compiliamo un progetto anche il file di implementazione viene compilato e crea il suo file oggetto.

Perché?

Page 96: Laboratorio di Informaticaswap/labinf1617/6_Programmazione_Modulare_Parte_… · Laboratorio di Informatica Programmazione Modulare (Parte 2) Corso di Laurea in Informatica e Tecnologie

Editor Preprocessor Compiler Linker Loader

04/04/2017 96

Recap: compilazione codice sorgente

Scrittura del codice sorgente (in un IDE o con un semplice file di testo)

Risoluzione delle direttive, ad esempio #define(utilizzata per definire costanti, ad esempio) e #include (utilizzata per includere codice scritto in librerie esterne)

Cataldo Musto - Programmazione Modulare (Parte 2)Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2016/2017

Page 97: Laboratorio di Informaticaswap/labinf1617/6_Programmazione_Modulare_Parte_… · Laboratorio di Informatica Programmazione Modulare (Parte 2) Corso di Laurea in Informatica e Tecnologie

Editor Preprocessor Compiler Linker Loader

04/04/2017 97

Recap: compilazione codice sorgente

Scrittura del codice sorgente (in un IDE o con un semplice file di testo)

Risoluzione delle direttive, ad esempio #define(utilizzata per definire costanti, ad esempio) e #include (utilizzata per includere codice scritto in librerie esterne)

Verifica la correttezza sintattica del codice sorgente e costruisce un file oggetto (con estensione .o) che viene salvato su disco.

Errori logici (reversibili o irreversibili) non vengono individuati dal compilatore.

Cataldo Musto - Programmazione Modulare (Parte 2)Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2016/2017

Page 98: Laboratorio di Informaticaswap/labinf1617/6_Programmazione_Modulare_Parte_… · Laboratorio di Informatica Programmazione Modulare (Parte 2) Corso di Laurea in Informatica e Tecnologie

Editor Preprocessor Compiler Linker Loader

04/04/2017 98

Recap: compilazione codice sorgente

Scrittura del codice sorgente (in un IDE o con un semplice file di testo)

Risoluzione delle direttive, ad esempio #define(utilizzata per definire costanti, ad esempio) e #include (utilizzata per includere codice scritto in librerie esterne)

Verifica la correttezza sintattica del codice sorgente e costruisce un file oggetto (con estensione .o) che viene salvato su disco.

Errori logici (reversibili o irreversibili) non vengono individuati dal compilatore.

Cataldo Musto - Programmazione Modulare (Parte 2)Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2016/2017

Collega i vari file oggetto costruiti dal compilatore e unisce eventuali librerie esterne, al fine di generare il file eseguibile

Page 99: Laboratorio di Informaticaswap/labinf1617/6_Programmazione_Modulare_Parte_… · Laboratorio di Informatica Programmazione Modulare (Parte 2) Corso di Laurea in Informatica e Tecnologie

Editor Preprocessor Compiler Linker Loader

04/04/2017 99

Recap: compilazione codice sorgente

Scrittura del codice sorgente (in un IDE o con un semplice file di testo)

Risoluzione delle direttive, ad esempio #define(utilizzata per definire costanti, ad esempio) e #include (utilizzata per includere codice scritto in librerie esterne)

Verifica la correttezza sintattica del codice sorgente e costruisce un file oggetto (con estensione .o) che viene salvato su disco.

Errori logici (reversibili o irreversibili) non vengono individuati dal compilatore.

Cataldo Musto - Programmazione Modulare (Parte 2)Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2016/2017

Collega i vari file oggetto costruiti dal compilatore e unisce eventuali librerie esterne, al fine di generare il file eseguibile

Carica in memoria e lancia l’eseguibile compilato. Il processo è preso in carico dalla CPU che esegue sequenzialmente le istruzioni ed eventualmente alloca della memoria per creare variabili, file su disco, etc.

Page 100: Laboratorio di Informaticaswap/labinf1617/6_Programmazione_Modulare_Parte_… · Laboratorio di Informatica Programmazione Modulare (Parte 2) Corso di Laurea in Informatica e Tecnologie

04/04/2017 100

Recap: compilazione codice sorgente

Cataldo Musto - Programmazione Modulare (Parte 2)Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2016/2017

Thanks to Corrado Mencar

Riferimenti simbolici alle

funzioni

Implementazione delle funzioni

main.o function.o

Page 101: Laboratorio di Informaticaswap/labinf1617/6_Programmazione_Modulare_Parte_… · Laboratorio di Informatica Programmazione Modulare (Parte 2) Corso di Laurea in Informatica e Tecnologie

04/04/2017 101

Recap: compilazione codice sorgente

Cataldo Musto - Programmazione Modulare (Parte 2)Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2016/2017

Thanks to Corrado Mencar

Riferimenti simbolici alle

funzioni

Implementazione delle funzioni

main.o function.o

Il file main.o «sa» che esiste una funzione f (lo sa perché è indicato nel file header).

La funzione però è implementata nel file function.o. Il LINKER si occupa di linkare i riferimenti simbolici con la reale implementazione della funzione.

Page 102: Laboratorio di Informaticaswap/labinf1617/6_Programmazione_Modulare_Parte_… · Laboratorio di Informatica Programmazione Modulare (Parte 2) Corso di Laurea in Informatica e Tecnologie

Progettazione Modulare – Librerie Statiche (in Eclipse)

04/04/2017 102Cataldo Musto - Programmazione Modulare (Parte 2)

Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2016/2017

Modalità alternativa per lo sviluppo di librerie esterne

New C Project Static LibraryEmpty Project

Dare un nome e selezionare ‘MiniGW GCC’ come Toolchains.

Page 103: Laboratorio di Informaticaswap/labinf1617/6_Programmazione_Modulare_Parte_… · Laboratorio di Informatica Programmazione Modulare (Parte 2) Corso di Laurea in Informatica e Tecnologie

Progettazione Modulare – Librerie Statiche (in Eclipse)

04/04/2017 103Cataldo Musto - Programmazione Modulare (Parte 2)

Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2016/2017

Creare una cartella in cui inserire i file .h e .c

Tasto dx sul progetto New Source Folder dare un nome (es. src)

Page 104: Laboratorio di Informaticaswap/labinf1617/6_Programmazione_Modulare_Parte_… · Laboratorio di Informatica Programmazione Modulare (Parte 2) Corso di Laurea in Informatica e Tecnologie

Progettazione Modulare – Librerie Statiche (in Eclipse)

04/04/2017 104Cataldo Musto - Programmazione Modulare (Parte 2)

Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2016/2017

Creare una cartella in cui inserire i file .h e .c

Tasto dx sul progetto New Source Folder dare un nome (es. src)

Si implementano i file .h e .c esattamente come nel caso precedente.

Terminata l’implementazione, si fa il «build» della libreria statica (simbolo del martello)

Page 105: Laboratorio di Informaticaswap/labinf1617/6_Programmazione_Modulare_Parte_… · Laboratorio di Informatica Programmazione Modulare (Parte 2) Corso di Laurea in Informatica e Tecnologie

Progettazione Modulare – Librerie Statiche (in Eclipse)

04/04/2017 105Cataldo Musto - Programmazione Modulare (Parte 2)

Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2016/2017

Il build genera un file .a (archive) che rappresenta la libreria statica.

La libreria statica si può integrare in altri progetti

Come?1) Si copia la libreria statica nel progetto2) Si aggiungono i riferimenti al file .h

Page 106: Laboratorio di Informaticaswap/labinf1617/6_Programmazione_Modulare_Parte_… · Laboratorio di Informatica Programmazione Modulare (Parte 2) Corso di Laurea in Informatica e Tecnologie

Progettazione Modulare – Librerie Statiche (in Eclipse)

04/04/2017 106Cataldo Musto - Programmazione Modulare (Parte 2)

Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2016/2017

Il build genera un file .a (archive) che rappresenta la libreria statica.

La libreria statica si può integrare in altri progetti

Come?1) Si copia la libreria statica nel progetto2) Si aggiungono i riferimenti al file .h

In questo caso non la libreria viene sviluppata in modo totalmente separato dagli altri file, e si integra semplicemente «copiando» il file archivio all’interno del progetto.

Page 107: Laboratorio di Informaticaswap/labinf1617/6_Programmazione_Modulare_Parte_… · Laboratorio di Informatica Programmazione Modulare (Parte 2) Corso di Laurea in Informatica e Tecnologie

Progettazione Modulare – Librerie Statiche (in Eclipse)

04/04/2017 107Cataldo Musto - Programmazione Modulare (Parte 2)

Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2016/2017

Come?1) Si copia la libreria statica nel progetto

Page 108: Laboratorio di Informaticaswap/labinf1617/6_Programmazione_Modulare_Parte_… · Laboratorio di Informatica Programmazione Modulare (Parte 2) Corso di Laurea in Informatica e Tecnologie

Progettazione Modulare – Librerie Statiche (in Eclipse)

04/04/2017 108Cataldo Musto - Programmazione Modulare (Parte 2)

Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2016/2017

Come?1) Si copia la libreria statica nel progetto

Abbiamo due progetti, uno con il file main.c (non ci sono più i file con la libreria esterna!) e una libreria statica implementata come progetto esterno.

L’archivio con estensione .a, output della libreria statica, viene copiato nel primo progetto

Page 109: Laboratorio di Informaticaswap/labinf1617/6_Programmazione_Modulare_Parte_… · Laboratorio di Informatica Programmazione Modulare (Parte 2) Corso di Laurea in Informatica e Tecnologie

Progettazione Modulare – Librerie Statiche (in Eclipse)

04/04/2017 109Cataldo Musto - Programmazione Modulare (Parte 2)

Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2016/2017

Cosa manca?2) Si aggiungono i riferimenti al file .h

2.1 Bisogna far sapere al compilatore che «esiste» questa libreria statica2.2 Bisogna far sapere al compilatore che funzioni implementa!

Page 110: Laboratorio di Informaticaswap/labinf1617/6_Programmazione_Modulare_Parte_… · Laboratorio di Informatica Programmazione Modulare (Parte 2) Corso di Laurea in Informatica e Tecnologie

Progettazione Modulare – Librerie Statiche (in Eclipse)

04/04/2017 110Cataldo Musto - Programmazione Modulare (Parte 2)

Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2016/2017

Cosa manca?2) Si aggiungono i riferimenti al file .h

2.1 Bisogna far sapere al compilatore che «esiste» questa libreria statica

Tasto Dx sul progetto Properties C/C++ Build Settings MiniGW C Linker Libraries

In Libraries si aggiunge (cliccando sul +) il nome della libreria, mentre in Library Search path si clicca su Workspace e si seleziona la cartella di progetto in cui è presenta la libreria che abbiamo importato

Page 111: Laboratorio di Informaticaswap/labinf1617/6_Programmazione_Modulare_Parte_… · Laboratorio di Informatica Programmazione Modulare (Parte 2) Corso di Laurea in Informatica e Tecnologie

Progettazione Modulare – Librerie Statiche (in Eclipse)

04/04/2017 111Cataldo Musto - Programmazione Modulare (Parte 2)

Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2016/2017

Cosa manca?2) Si aggiungono i riferimenti al file .h

2.2 Bisogna far sapere al compilatore che funzioni implementa!

Tasto Dx sul progetto Properties C/C++ Build Settings GCC C Compiler Libraries

In Includes si aggiunge (cliccando sul +) il path del file .h, mentre in Include files si clicca su Workspace e si seleziona proprio il file .h che serve al compilatore per sapere che funzioni sono disponibili nella libreria statica

Page 112: Laboratorio di Informaticaswap/labinf1617/6_Programmazione_Modulare_Parte_… · Laboratorio di Informatica Programmazione Modulare (Parte 2) Corso di Laurea in Informatica e Tecnologie

Progettazione Modulare – Librerie Statiche (in Eclipse)

04/04/2017 112Cataldo Musto - Programmazione Modulare (Parte 2)

Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2016/2017

Terminato il processo di linking manuale della libreria, è possibile eseguire normalmente il progetto.

Importante: in questo caso non abbiamo due file .o , ma un unico file (il main). Questo avviene perché gli altri file sono inclusi nella libreria che abbiamo precedentemente linkato.

Page 113: Laboratorio di Informaticaswap/labinf1617/6_Programmazione_Modulare_Parte_… · Laboratorio di Informatica Programmazione Modulare (Parte 2) Corso di Laurea in Informatica e Tecnologie

04/04/2017 113Cataldo Musto - Programmazione Modulare (Parte 2)

Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2016/2017

Page 114: Laboratorio di Informaticaswap/labinf1617/6_Programmazione_Modulare_Parte_… · Laboratorio di Informatica Programmazione Modulare (Parte 2) Corso di Laurea in Informatica e Tecnologie

Esercizio 6.2

• Implementare il seguente programma, utilizzando i principi della programmazione modulare

1. Costruire una libreria di funzioni matematiche math.h, che implementi le seguenti funzioni• int somma(int,int) int sottrazione(int,int)

• int prodotto(int,int) float divisione(int,int)

• int quadrato(int) int cubo(int)

• int dispari(int) int pari(int)

04/04/2017 114Cataldo Musto - Programmazione Modulare (Parte 2)

Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2016/2017

Page 115: Laboratorio di Informaticaswap/labinf1617/6_Programmazione_Modulare_Parte_… · Laboratorio di Informatica Programmazione Modulare (Parte 2) Corso di Laurea in Informatica e Tecnologie

Esercizio 6.2

• Implementare il seguente programma, utilizzando i principi della programmazione modulare

2. Invocare la libreria in un file main.c , che generi random due numeri a e b e calcoli il valore della seguente espressione (attenti all’utilizzo delle parentesi e alla priorità tra gli operatori)

(a2*b)-(a+b3)

3. Stampare un messaggio diverso a seconda che il risultato sia pari o dispari, utilizzando la funzione implementata

4. Implementare la soluzione sia su Repl (attraverso la divisione in file .h e .c) che su Eclipse (anche attraverso la definizione di una libreria statica)

04/04/2017 115Cataldo Musto - Programmazione Modulare (Parte 2)

Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2016/2017