COMPITO A Q1) Cos'è un vettore? Come si dichiara? Come si accede a un elemento di un vettore? Fornire un esempio. Soluzione: Un vettore è un array, cioè una struttura dati omogenea e lineare, monodimensionale. In generale, una struttura dati è una collezione di dati che possiamo memorizzare con uno stesso nome. Per dichiarare un vettore occorre scrivere il tipo degli elementi, il nome, e il numero massimo di elementi che può contenere tra parentesi quadre. tipo nome[numero elementi]; Ad esempio, per dichiarare un vettore che si chiama vet e che contiene 10 elementi di tipo intero, si scrive int vet[10]. Per accedere a un elemento di un vettore occorre scrivere il nome del vettore e la posizione dell'elemento tra parentesi quadre. Ad esempio, per accedere all'elemento in prima posizione del vettore vet dell'esempio di sopra, basta scrivere vet[0]. Q2) A cosa serve il flag nella ricerca lineare? Cosa non sarebbe possibile senza di esso? Soluzione: Il flag o bandiera è una variabile intera usata per indicare se abbiamo trovato o no l'elemento durante la ricerca. Inizialmente il flag è abbassato (flag=0), poi quando troviamo l'elemento cercato alziamo il flag (flag=1). L'uso del flag è necessario per poter rispondere, alla fine della ricerca, se l'elemento non è presente. E1) Siamo i direttori sportivi del nostro team, e curiamo alcune statistiche dei nostri giocatori. Dopo aver dichiarato un vettore NumeroMaglia con al massimo 22 dati interi, dove verranno memorizzati i numeri di maglia dei nostri giocatori, e un vettore MinutiGiocati con al massimo 22 dati di tipo float, dove verranno memorizzati i tempi di utilizzo di ogni giocatore nel campionato, scrivere le funzioni per - caricare entrambi i vettori con N elementi - visualizzare il numero di maglia del giocatore che ha giocato per più tempo - ordinare i due vettori per numero di maglia crescente con un algoritmo di ordinamento a scelta (suggerimento: effettuare lo scambio su entrambi i vettori) Soluzione: int NumeroMaglia[22],N,i,j,pos; float MinutiGiocati[22],max; /* caricamento */ printf("quanti giocatori? "); scanf("%d", &N); for(i=0; i<N; i++) // per ogni posizione... { printf("numero di maglia del giocatore %d: ", i); scanf("%d", &NumeroMaglia[i]); // carica vettore con numero di maglia printf("minuti giocati dal giocatore %d: ", i); scanf("%f", &MinutiGiocati[i]); // carica vettore con minuti giocati } /* giocatore che ha giocato di più */ max=0; for(i=0; i<N; i++) // per ogni giocatore... if(MinutiGiocati[i]>max) // confronta i minuti giocati dal giocatore col massimo { max = MinutiGiocati[i]; // aggiorna massimo pos = i // salva posizione del massimo } printf("il giocatore che ha giocato per più tempo e' %d e ha giocato per %f minuti\n",pos,max); /* ordina numeri di maglia (ordinamento per selezione) */ for(i=0; i<N-1; i++) for(j=i+1; j<N; j++) if(NumeroMaglia[i] > NumeroMaglia[j]) { ScambiaInt(&NumeroMaglia[i],&NumeroMaglia[j]); ScambiaFloat(&MinutiGiocati[i],&MinutiGiocati[j]); } /* funzione che scambia due dati interi */ void ScambiaInt(int *a, int *b) { int temp; temp = *a; *a = *b; *b = temp; } /* funzione che scambia due dati float */ void ScambiaInt(float *a, float *b) { float temp; temp = *a; *a = *b; *b = temp; } E2) Caricare una matrice di 3 righe e 3 colonne di interi, quindi calcolare la somma degli elementi della diagonale principale Soluzione: int mat[3][3],i,j,somma; /* caricamento */ for(i=0; i<3; i++) for(j=1; j<3; j++) { printf("elemento della matrice in riga %d e colonna %d: ",i,j); scanf("%d", &mat[i][j]); // carica elemento della matrice in riga i e colonna j } /* somma diagonale principale */ somma = mat[0][0]+mat[1][1]+mat[2][2]; printf("la somma degli elementi della diagonale principale e' %d\n", somma); COMPITO B Q1) Cos’è una matrice? Come si dichiara? Come si accede a un elemento di una matrice? Fornire un esempio. Soluzione: Una matrice è un array, cioè una struttura dati omogenea e lineare, bidimensionale. In generale, una struttura dati è una collezione di dati che possiamo memorizzare con uno stesso nome. Per dichiarare una matrice occorre scrivere il tipo degli elementi, il nome, e poi il numero massimo di righe tra parentesi quadre e il numero massimo di righe tra parentesi quadre. tipo nome[numero righe] [numero colonne]; Ad esempio, per dichiarare una matrice che si chiama mat e che contiene 80 elementi di tipo intero, disposti su 8 righe e 10 colonne, si scrive int mat[8] [10]. Per accedere a un elemento di una matrice occorre scrivere il nome della matrice, la posizione di riga dell'elemento tra parentesi quadre e la posizione di riga dell'elemento tra parentesi quadre. Ad esempio, per accedere all'elemento in riga 1 e colonna 2 della matrice mat dell'esempio di sopra, basta scrivere mat[1] [2]. Q2) Cos’è una stringa? Perché quando si legge in input una stringa con l’istruzione scanf non va messo l’operatore &? Soluzione: Una stringa è un vettore di caratteri che termina con il carattere speciale di fine stringa \0. Quando si legge in input una stringa non occorre usare l’operatore & (indirizzo di) come per gli altri tipi di dato perché essendo la stringa un array, come tutti gli array il nome contiene già un indirizzo di memoria (in particolare, l’indirizzo di memoria del primo elemento del vettore). ESERCIZIO 1. Siamo stati assunti dalla regione Sardegna e dobbiamo tenere aggiornati i dati anagrafici della popolazione dell’isola. Dopo aver dichiarato un vettore NumeroAbitanti contenente 8 dati di tipo intero, dove verrà memorizzato il numero di abitanti di ogni provincia della Sardegna, e un vettore Superficie di 8 dati di tipo float, dove verrà memorizzata l’estensione di ogni provincia, scrivere le funzioni per: - caricare i due vettori; - cercare il numero di abitanti e la superficie di una provincia, data in input la sua posizione; - cercare la densità di popolazione più bassa. Soluzione: int NumeroAbitanti[8],N,i,j,pos; float Superficie[8],d,min; /* caricamento */ for(i=0; i<8; i++) // per ogni posizione... { printf("numero di abitanti della provincia %d: ", i); scanf("%d", &NumeroAbitanti[i]); // carica vettore con numero di abitanti printf("superficie in km quadrati della provincia %d: ", i); scanf("%f", &Suferficie[i]); // carica vettore con minuti giocati } /* numero di abitanti e superficie di una data provincia */ printf("quale provincia? "); scanf("%d", &pos); // chiedi in input quale posizione dei vettori printf("il numero di abitanti e’ %d e la superficie e’ %f\n”, NumeroAbitanti[pos], Superficie[pos]); /* cerca la densità di popolazione più bassa */ min = 1000000; for(i=0; i<N-1; i++) { d = NumeroAbitanti[i] / Superficie[i]; if(d < min) min = d; } printf("la densità di popolazione più bassa è di %f\n”, min); ESERCIZIO 2. Caricare una matrice di 2 righe e 2 colonne di float, quindi calcolare il suo determinante (il determinante di una matrice 2x2 è dato dal prodotto degli elementi della diagonale principale meno il prodotto degli elementi della diagonale secondaria). Soluzione: int mat[2][2],i,j,det; /* caricamento */ for(i=0; i<2; i++) for(j=1; j<2; j++) { printf("elemento della matrice in riga %d e colonna %d: ",i,j); scanf("%d", &mat[i][j]); // carica elemento della matrice in riga i e colonna j } /* determinante */ det = mat[0][0]* mat[1][1]- mat[1][0]* mat[0][1]; printf("il determinante e' %d\n", det);