Questa è una vecchia versione del documento!
−Indice
Esercitazione: Array e puntatori
Esercizio 1: Funzione swap
Scrivere una funzione di prototipo
void swap (int *a, int*b);
che ha l'effetto di scambiare i valori di due variabili, ad esempio:
int a=5; int b=63; swap(&a,&b); printf("a = %d, b = %d \n", a, b); ....
deve stampare
a = 63, b = 5
Sarebbe stato possibile ottenere lo stesso effetto utilizzando una funzione di prototipo
void swap (int a, int b);
? Perche' ?
Esercizio 2: Somma e prodotto di matrici
Scrivere un programma C costituito da un main()
che legge da standard input due matrici quadrate, le somma, calcola il prodotto e stampa i risultati sullo standard output.
Esercizio 3: Ricerca in un array
Scrivere una funzione di prototipo
int cerca (int * vec, int lung, int x);
che cerca se l'elemento x
e' presente nell'array vec
di lung elementi e restituisce 1 se lo trova e 0 se non lo trova.
Verificare la correttezza della funzione utilizzando un opportuno main()
.
Esercizio 4: Generazione di numero casuali in C
In alcuni casi e' importante riuscire a generare casualmente dei valori all'intero di programmi C per modellare situazioni reali o per testare opportunamente i programmi scritti. In realta' il computer non riesce a generare eventi realmente “a caso” in quanto tutti i programma si basano su una determinata sequenza di azioni. Tuttavia e' possibile avere un comportamento vicino alla casualita' con le sequenze pseudocasuali, che vengono generate con un procedimento deterministico ma mantengono proprieta' statistiche simili a quelle di una vera sequenza casuale.
Inoltre le sequenze pseudocasuali possono, su richiesta, rigenerare la stessa sequenza di numeri. Questo e' molto utile ad esempio in fase di testing del codice.
La generazione di numeri pseudocasuali e' molto complessa. Tutti i linguaggi di programmazione ad alto livello mettono a disposizione delle opportune funzioni per generare una sequenza. In C, per generare una sequenza pseudocasuale si utilizzano due funzioni di stdlib.h: la funzione
void srand(unsigned int seed);
che serve a fissare il seme (seed) ovvero il valore iniziale della sequenza. E la funzione
int rand(void);
che genera un intero nell'intervallo [0,RAND_MAX]
ogni volta che viene chiamata.
La srand()
deve essere chiamata una sola volta per fissare il seme, successivamente la sequenza puo' essere generata con chiamate successive alla rand()
.
Partendo dallo stesso valore iniziale si ottiene sempre la stessa sequenza quindi fornendo lo stessp seme a srand()
possiamo riprodurre piu' volte la stessa sequenza casuale quando occorre (per testing o altro).
Utilizzare le funzioni srand()
e rand()
per scrivere una funzione di prototipo
void init (int * vec, int lung);
che inizializza il vettore vec di lunghezza lung con dei valori pseudocasuali nell'intervallo [0,50] (suggerimento: leggere attentamente il manuale di srand
e rand
e utilizzare l'operatore resto %
)
Esercizio 5: MSS, Maximum Segment Sum
Dato un array di interi positivi e negativi, il segmento di somma massima e' la porzione contigua dell'array in cui la somma deigli elementi ha valore piu' alto. Ad esempio l'array
[2,-4,2,-1,6-3]
ha come SSM il segmento [2,-1,6] di valore 7. Si chiede di definire due funzioni per la stampa e per il calcolo di SSM, con i seguenti prototipi :
/** stampa l'array s di lunghezza n */ void print_array(int s[], int n); /** calcola SSM sull'array s di lunghezza lung \param s array \param n lunghezza \param s_init puntatore alla variabile che conterra' la posizione di inizio dell'SSM \param s_lung puntatore alla variabile che conterra' la lunghezza del segmento di somma massima \retval k la somma degli elementi dell' SSM */ int ssm (int s[], int n, int * s_init, int * s_lung);