Esercitazione 3

Esercizio 1. Sono corrette le seguenti dichiarazioni di variabili e comandi C? Che valore ha tmp dopo 1--4?

int a[4]={9,8,7,6}, *p=a, tmp;
/* stm 1 */
tmp = *(a+2);
/* stm 2 */
tmp = p[3];
/* stm 3 */
tmp = (--p)[3];
/* ciclo 4 */
for (tmp=0,p=a;p<a+4;p++){tmp += *p; }

Esercizio 2. Scrivere una funzione C che scambia fra loro il valore di due variabili a e b. Qual'e il prototipo corretto :

void scambia (int a, int b); oppure void scambia (int *a, int *b); ? perche'?

Esercizio 3. Scrivere una funzione sumvect di prototipo

            int sumvect (int s[], int n); 

che restituisce la somma degli elementi del vettore s di lunghezza n(s[0]+...+s[n-1]).

Esercizio 4. (variante dell'esercizio della scorsa volta) Scrivere un programma C che legge una sequenza di studenti da file passato come parametro al programma (argv[1]). Ogni studente e' memorizzato su file in una singola linea contenente tre stringhe di caratteri

nome cognome numero_di_matricola

ogni linea e' terminata da

\n (newline). Notate che NON sono ammessi nomi, cognomi o matricole di piu' di una stringa (es. Di Caprio, Maria Gabriella, 34 56 23)

Il programma memorizza i dati relativi a ciascun studente in un array di strutture di tipo studente opportunamente definito e li stampa in ordine alfabetico. Si richiede di definire due funzioni separate per la lettura e l'ordinamento

int fleggi_stud (char* name, studente s[], int * lung) 
/* legge gli studenti dal file name, li memorizza in s[], restituisce in *lung
il numero di studenti letti, ritorna 0 se l'operazione ha avuto successo -1 altrimenti*/
void ordina_stud (studente s[], int lung)  
/* ordina gli studenti in stud in ordine alfabetico */

Esercizio 5. Scrivere un programma C che calcola il segmento di somma massima (SSM) di una array.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 separate per la stampa e per il calcolo di SSM, con i seguenti prototipi :

void stampa_array(int s[], int n); /* stampa l'array s di lunghezza n */

int ssm (int s[], int lung, int * s_init, int * s_lung);

/* calcola SSM sull'array s di lunghezza lung e restituisce : (1) come valore della funzione il valore del segmento di somma massima (7 nell'esempio), (2) nella variabile s_init la posizione in cui inizia il segmento di somma massima (2 nell'esempio) e (3) nella variabile s_lung la lunghezza del segment odi somma massima (3 nell'esempio) */