Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
Struttura modulare
Per semplificare la struttura di un programma
complesso è possibile suddividerlo in moduli
Un modulo è un blocco di codice che assolve
Le funzioni
ad un compito preciso (ad es. calcola la radice
quadrata) e a cui è stato dato un nome
Un programma consta di un modulo principale
Ver. 2.4 (il main) ed eventuali altri moduli di supporto
Quando un modulo richiama un altro modulo,
il chiamante viene sospeso finché il chiamato
non ha terminato la sua esecuzione
In C i moduli sono chiamati funzioni
Ogni funzione può richiamare (far eseguire)
© 2010 - Claudio Fornaro - Corso di programmazione in C qualsiasi altra funzione (anche se stessa)
3 4
7 8
11 12
15 16
19 20
23 24
27 28
31 32
35 36
39 40
43 44
47 48
extern extern
Lo specificatore di classe di allocazione La dichiarazione di una variabile extern può
extern permette di estendere la visibilità essere sia interna ad una funzione, sia esterna
delle variabili esterne #include<...>
La clausola extern viene premessa ad una extern int due; dichiarazione
definizione di variabile per trasformarla in funz4() esterna a funz
dichiarazione (non riserva memoria)
extern int x; {
extern long uno; dichiarazione
Indica al compilatore che la variabile è
definita (con allocazione di memoria, senza int tre; interna a funz
extern) altrove (più avanti nello stesso file o tre = uno + due;
in un altro file) }
In seguito il linker ricondurrà tutte le long uno = 0, due = 0; definizioni
dichiarazioni all’unica definizione di var esterne
51 52
55 56
Esercizi Esercizi
1. Si scriva un programma che per 10 volte 2. Si scriva un programma che chieda all’utente
chieda all’utente un valore e ne calcoli il 10 valori e di questi calcoli la radice quadrata.
logaritmo in base 2. Per il calcolo della radice quadrata si scriva
Per il calcolo del logaritmo si scriva una una funzione con prototipo:
funzione con prototipo: double radice(double a, double prec);
double log2(double a); che calcoli il valore approssimato della radice
che calcoli il valore utilizzando la formula: quadrata di a con il metodo di Newton:
1 a
log 2 x
log e x xi 1 xi
log e 2 2 xi
xi sono approssimazioni successive della radice
quadrata di a. Si assuma x0= a e si iteri
fintanto che xi – xi+1 > prec.
59 60
Esercizi Esercizi
3. Si scriva una funzione con prototipo: 4. Si scriva una funzione con prototipo:
double media(double v[], int len); void rovescia(char s[]);
che calcoli e restituisca la media di un vettore che rovesci la stringa passata come
di double passato come argomento. argomento (modifica del parametro). Si scriva
Si scriva un programma che riempia due un programma che chieda una stringa, la
vettori di lunghezza differente (es. a[8] e passi a rovescia e la visualizzi.
b[10], li passi a media e visualizzi il risultato 5. Si scriva una funzione con prototipo:
per ciascuno di essi. La funzione non esegua int contastr(char a[], char x[]);
che conti quante volte la stringa x sia
operazioni di input/output.
contenuta in a. N.B. “bb” in “bbb”: 2 volte
6. Si scriva una funzione undup che modifichi
una stringa eliminandone i caratteri duplicati:
esempio: “ciao come va?” “ciao mev?”
61 62
Esercizi Esercizi
7. Si scriva una funzione con prototipo: 8. Si scriva la funzione sommaVett che calcoli la
void ordina(int v[], int len, somma di due vettori. Si scriva un main che
int ord); chieda la dimensione dei vettori (max 100),
che ordini in senso crescente e decrescente il ne chieda i valori, li passi alla funzione e
vettore di int passato come argomento. visualizzi il vettore dei risultati. Non si alteri il
Il senso dell’ordinamento venga indicato dal contenuto dei due vettori da sommare. La
parametro ord (decrescente=0, crescente=1). funzione non faccia input/output.
Si scriva un main di test. Per non usare variabili esterne o variabili
locali static, alla funzione bisogna passare
anche il vettore dei risultati (il contenuto
iniziale non è rilevante).
63 64
Esercizi Esercizi
9. Un file di testo denominato Parole.txt 10. Si scriva una funzione con prototipo:
contiene una lista di parole, una per riga. double media(double M[][10],
Non è noto a priori di quante righe sia int righe, int colonne);
composto. Si scriva un programma che che calcoli e restituisca la media di una
chieda all’utente di introdurre una parola e generica matrice di 10 colonne passata come
visualizzi tutte le parole presenti nel file che argomento. Si scriva un programma che
anagrammate danno la parola introdotta. Si riempia due matrici di dimensioni richieste
scrivano due funzioni: una che riordina all’utente (massime 8x10 e 12x10, il massimo
alfabeticamente le lettere di una stringa di 10 colonne ciascuna è per coerenza con il
(“telefono” “eeflnoot”) e un’altra che prototipo), le passi a media e visualizzi il
modifichi una stringa trasformandone tutti i risultato per ciascuna di esse.
caratteri in minuscolo. La funzione non faccia input/output.
65 66
Esercizi Esercizi
11. Scrivere una funzione con prototipo Soluzione a stati
int parseToIntVect(char *stringa, ws=white space
int vett[], int n); t=stringa per contenere i caratteri da trasf. in numero
cont=contatore valori
che analizzi la stringa data estraendo da
c=carattere i-esimo della stringa ct[i]
essa i primi n valori numerici interi e li
inserisca nel vettore vett[]. Se vi sono più cont++
di n valori, i successivi vengano ignorati. La !ws
!ws ct[0]
67 68
71 72
75 76
Esercizi La coda
13. Scriverein un file separato la realizzazione di Una coda è una struttura dati di tipo FIFO
uno stack basato su un vettore di interi. Si (First In First Out) in cui i valori vengono
realizzino le funzioni push e pop (con prelevati nello stesso ordine di introduzione
opportuni parametri ) che restituiscano 1 in
caso di errore (stack pieno o vuoto) e 0 Introduzione: enqueue
altrimenti (non devono fare I/O). Si scriva un Prelievo: dequeue
main a menu in grado di verificarne il
funzionamento. I prototipi siano in un file .h.
A B A C B A
Il vettore deve essere static perché solo coda testa
push e pop ne abbiano accesso. Si utilizzi un
puntatore p che punti alla prima locazione
libera utilizzando le seguenti espressioni:
per push: *p++ = val; C B C
per pop: val = *--p;
79 80