Sei sulla pagina 1di 25

Corso di Programmazione e strutture dati 2020/21

Docenti di Laboratorio:
• Biagio Cosenza bcosenza@unisa.it
• Mattia De Rosa matderosa@unisa.it

ESERCITAZIONE 1:
ASTRAZIONE E MODULARITÀ
Realizzare un programma in Linguaggio C che
consenta di effettuare, tramite un semplice menu a
caratteri, le seguenti operazioni su un vettore di
numeri interi:
1. Immissione elementi in un dato array
2. Stampare il contenuto di un dato array
3. Ricerca di un elemento in un dato array
4. Ricercare il minimo in un dato array
5. Ordinare un dato array
6. Eliminare un elemento in un dato array

ESERCITAZIONE 7. Inserimento di un elemento in un dato array

Realizzare (almeno) due moduli (librerie) ed un


cliente:
• Vettore: contenente le funzionalità per la manipolazione dell’array
• Utils: contenente funzionalità di utilità generale (es. swap)
• Main: è il cliente che utilizzerà le funzionalità del modulo vettore

Compilare ed eseguire il programma usando make


Progettazione: l’insieme delle attività relative al
concepimento della soluzione informatica di un
problema:
• definizione dell’architettura
• analisi dei dati da manipolare
• studio delle tecniche algoritmiche

La progettazione si sviluppa a partire da una


specifica prodotta in fase di analisi

ORGANIZZAZIONE E PROGETTAZIONE DEL


CODICE
1. Astrazione

2. Information Hiding

3. Riuso del codice

4. Modularità

PRINCIPI DELLA PROGETTAZIONE


ASTRAZIONE
Procedimento mentale che consente di:
1. Evidenziare le caratteristiche pregnanti di un problema
2. Offuscare o ignorare gli aspetti che si ritengono secondari
rispetto ad un determinato obiettivo
Pratica che consiste nel presentare il software in una maniera
ridotta che contiene solo i dettagli essenziali al suo utilizzo
ASTRAZIONE: TIPOLOGIE
Astrazione funzionale e procedurale:
1. Una funzionalità di un programma è delegata ad un sottoprogramma (funzione o
procedura)
2. È definita ed usabile indipendentemente dall’algoritmo che la implementa (es.
algoritmi di ordinamento di un array)

Astrazione sui dati:


• un dato o un tipo di dato è totalmente definito insieme alle operazioni che sul dato
possono essere fatte; pertanto, sia le operazioni che il dato (o il tipo di dato) sono
usabili a prescindere dalle modalità di implementazione
INFORMATION HIDING
Nascondere il funzionamento interno (deciso in fase di progetto) di una parte di un
programma

Vantaggi:
1. Parti del programma che non devono essere modificate sono inaccessibili
2. Correzione degli errori facilitata: un errore presente in un modulo può essere
corretto modificando soltanto quel modulo
RIUSO DEL CODICE
Pratica, estremamente comune nella programmazione, di richiamare o invocare parti
di codice precedentemente già scritte ogni qualvolta risulta necessario, senza doverle
riscrivere daccapo.
Si può ottenere per esempio sviluppando funzioni e relative librerie
MODULARITÀ
Tecnica di suddividere un progetto software. Dividere aiuta a gestirne la complessità.

Modulo:
• unità di programma che mette a disposizione risorse e servizi computazionali (dati, funzioni, …)
• Elevata coesione: le varie funzionalità messe a disposizione da un singolo modulo sono strettamente
correlate
• Indipendenza: sviluppabili separatamente dal resto del programma, con compilazione e testing
separati
• Modalità di interazione ben definite

Implementazione di moduli: funzioni, procedure, classi, package


MODULARITÀ: IL MODULO
Una unità di programma costituita da:
Una Interfaccia:
1. definisce le risorse ed i servizi (astrazioni) messi a disposizione dei “clienti” (programma o altri
moduli)
2. completamente visibile ai clienti
Una sezione implementativa (body)
1. implementa le risorse ed i servizi esportati
2. completamente occultato

 Un modulo può usare altri moduli


 Un modulo può essere compilato indipendentemente dal modulo (o programma) che lo usa
MODULARITÀ: IL LINGUAGGIO C
In C non esiste un apposito costrutto per realizzare un modulo; di solito
un modulo coincide con un file

Per esportare le risorse definite in un file (modulo), il C fornisce un


particolare tipo di file, chiamato header file (estensione .h)
Un header file rappresenta l’interfaccia di un modulo verso gli altri
moduli
Per accedere alle risorse messe a disposizione da un modulo bisogna
includere il suo header file
Il modulo
«utils»
Concetto già incontrato per le librerie predefinite: ad esempio
#include <stdio.h> …

Per i moduli definiti dall’utente: #include "modulo.h" ...


MODULARITÀ: IL LINGUAGGIO C
Il modulo mette a disposizione attraverso la sua interfaccia funzioni e procedure
il modulo si presenta come una “libreria” di funzioni

Per sviluppare il principio dell’information hiding:


•Non usare variabile globali
•Funzioni di servizio nascoste
MODULARITÀ:
IL LINGUAGGIO C
Il cliente può usare le risorse e i servizi
esportati dal modulo
void input_array(int a[], int n); vettore.h
void output_array(int a[], int n);
ESEMPIO DEL
void ordina_array(int a[], int n); MODULO
int ricerca_array(int a[], int n, int elem); ARRAY
int minimo_array(int a[], int n);

#include <stdio.h> vettore.c
#include "utils.h" // contiene funzione scambia
int minimo_i(int a[], int i, int n); // dichiarazione locale

void input_array(int a[], int n) { … }


void output_array(int a[], int n) { … }
void ordina_array(int a[], int n) { … }
int ricerca_array(int a[], int n, int elem) { … }
int minimo_array(int a[], int n) { … }
int minimo_i(int a[], int i, int n) { … } // usata da ordina_array

14
IL PROGRAMMA PRINCIPALE

// file main.c

# include <stdio.h> Modulo client del


# include "vettore.h"
# define MAXELEM 100 modulo array
int main()
{

}

15
USO DEI
COMMENTI
I commenti relativi alla specifica di una funzione
possono essere inseriti nell’header file prima del
prototipo della funzione
… serve da documentazione per chi
dovrà usare la funzione (modulo client)
I commenti relativi alla progettazione e
realizzazione di una funzione possono essere
inseriti nel file .c prima della definizione della
funzione (o anche all’interno del corpo della
funzione)
… serve da documentazione per chi dovrà
eventualmente modificare la funzione

16
• I due moduli possono essere compilati indipendentemente
–gcc -c utils.c
–gcc -c vettore.c
–gcc -c main.c
• Possibile anche compilarli insieme
–gcc -c utils.c vettore.c main.c
• In entrambi i casi si ottengono tre file con estensione .o

• Per collegare (link) i tre moduli e produrre l’eseguibile


–gcc utils.o vettore.o main.o -o vettore.exe
•possibile compilazione e collegamento in un sol passo
–gcc utils.c vettore.c main.c -o vettore.exe

COMPILAZIONE ...
17
DAL SORGENTE ALL’ESEGUIBILE

Editor prog.c Compiler

prog.exe Linker prog.o

lib.o

other files/libraries
18
PROGETTO: MAKEFILE E MAKE
Tutti gli ambienti di programmazione consentono di costruire un progetto
Il comando make: compilazione e collegamento dei vari moduli che compongono il
progetto
Il Makefile è costituito da specifiche del tipo:
1. target_file:
2. dipendenze_da_file
3. comandi
… IL MAKEFILE DEL NOSTRO ESEMPIO

20
MAKE: ALCUNE OSSERVAZIONI …
L’ordine delle specifiche non è importante …
… ma è buona norma inserire come prima specifica quella per la
costruzione del programma eseguibile
In questo caso per lanciare il processo basta digitare il comando
make
MAKEFILE E COMANDO MAKE
Nel nostro esempio, come effetto del comando make:
bisogna produrre vettore.exe, ma occorrono utils.o vettore.o main.o
se i due file non esistono, si cercano le specifiche per produrli, e così via

Ordine di esecuzione:
gcc –c utils.c
gcc -c vettore.c
gcc -c main.c
gcc utils.o vettore.o main.o -o vettore.exe
make clean
utile un’azione clean (di solito inserita dopo le altre) per eliminare i file
intermedi prodotti
COSTRUIRE L’ESEGUIBILE CON IL MAKE
 Il Makefile deve risiedere nella cartella dei
sorgenti
 Accedere alla cartella del progetto tramite
console/terminale (cd path_del_progetto)
Digitare « make »
Il comando produrrà i file .o e l’eseguibile

Per cancellare tutti i file prodotti digitare « make


clean»
Attenzione se durante l’esecuzione del « make » viene
generato un errore, può essere utile lanciare il « make clean »
prima di compilare nuovamente
Realizzare un programma in Linguaggio C che
consenta di effettuare, tramite un semplice menu a
caratteri, le seguenti operazioni su un vettore di
numeri interi:
1. Immissione elementi in un dato array
2. Stampare il contenuto di un dato array
3. Ricerca di un elemento in un dato array
4. Ricercare il minimo in un dato array
5. Ordinare un dato array

ESERCITAZIONE 6.
7.
Eliminare un elemento in un dato array
Inserimento di un elemento in un dato array

(SOLO PER RICORDARLO)


Realizzare (almeno) due moduli (librerie) ed un
cliente:
• Vettore: contenente le funzionalità per la manipolazione dell’array
• Utils: contenente funzionalità di utilità generale (es. swap)
• Main: è il cliente che utilizzerà le funzionalità del modulo vettore

Compilare ed eseguire il programma usando make


ESEMPIO
STRUTTURA DEL
PROGETTO

Potrebbero piacerti anche