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);