Proponiamo un semplice esercizio con le matrici in C.
Si vuole realizzare un programma che richieda all’utente di inserire i voti corrispondenti a 7 prove sostenute in Matematica durante l’anno da 6 studenti della classe e calcoli la media di ogni prova e la media di ogni studente.
Ogni linea deve contenere pertanto i voti dello studente e la rispettiva media; quindi ci saranno 7 righe e 8 colonne. L’ottava colonna dunque conterrà la media delle prove sostenute da ciascun studente e la settima riga conterrà la media di ciascuna prova di tutti gli studenti.
Es: Nella riga 1 inserisco quindi i voti delle 7 prove sostenute nell’anno da uno studente.
Studente 1: 8, 10, 7, 7, 9, 7, 8
Il programma dovrà aggiungere la media nell’ottava colonna cioè:
Studente 1: 8, 10, 7, 7, 9, 7, 8, 8
Allo stesso modo per le altre righe.
Facciamo lo stesso discorso per le colonne. Nella prima colonna ci saranno tutti i voti della prima prova sostenuta da ciascun studente, aggiungiamo nell’ultima riga la media.
Prova1
studente1
6
studente2
7
studente3
8
studente4
9
studente5
10
studente6
8
media
8
Continuiamo così per ogni colonna.
Procedimento algoritmo esercizio con le matrici in C
Innanzitutto occorre definire il numero di righe e di colonne. Come dicevamo prima aggiungeremo una riga e una colonna per la media.
Quindi:
#define M 8
#define N 7
Inseriamo i dati come abbiamo già spiegato negli esempi precedenti e dopo calcoliamo la media. L’unico accorgimento è quello di fermarsi ad N-1 ed M-1 in quanto dobbiamo inserire 6 righe e 7 colonne, l’ultima riga e l’ultima colonna è riservata alla media.
Per fare la media di ciascun studente, cioè la media per riga, basta scorrere la matrice con i due cicli, avendo l’accortezza di inizializzare la somma a zero e sommare tutti gli elementi della riga:
a[i][M-1]=a[i][M-1]+a[i][j];
e dopo occorre dividere per n-1
a[N-1][j]=a[N-1][j]/(N-1);
Lo stesso ragionamento per la colonna.
Ecco il listato completo.
#include<stdio.h>
#define M 8
#define N 7
int main(){
float a[N][M];
int i,j;
printf("\nInseriamo i voti nella matrice \n");
for(i=0;i<N-1;i++)
for(j=0;j<M-1;j++) {
printf("Studente %d \tprova %d: ", i, j);
scanf("%f", &a[i][j]);
}
printf("\nCalcolo media delle prove \n");
for(j=0;j<M;j++) {
a[N-1][j]=0;
for(i=0;i<N-1;i++)
a[N-1][j]=a[N-1][j]+a[i][j];
a[N-1][j]=a[N-1][j]/(N-1);
}
printf("\nCalcolo media studente \n");
for(i=0;i<N-1;i++){
a[i][M-1]=0;
for(j=0;j<M-1;j++)
a[i][M-1]=a[i][M-1]+a[i][j];
a[i][M-1]=a[i][M-1]/(M-1);
}
printf("\nStampiamo i dati \n");
for (i=0;i<N;i++) {
printf("\n");
for(j=0;j<M;j++)
printf("\t%7.2f", a[i][j]);
}
}
Questo è solo un esempio di possibile risoluzione dell’esercizio con le matrici in C.
Oggi sviluppiamo l’algoritmo selection sort con Scratch. Infatti anche con Scratch è possibile implementare anche gli algoritmi di ordinamento che di solito si sviluppano con i vari linguaggi di programmazione.
Come sviluppare l’algoritmo selection sort con Scratch?
Occorre premettere che per realizzare questo algoritmo bisogna saper utilizzare le liste.
Liste in Scratch
Le liste ricordiamo sono dei contenitori che permettono di contenere più valori alla volta e di organizzare i dati in maniera sequenziale. È inoltre possibile aggiungere elementi alla lista durante l’esecuzione di un programma. Per accedere agli elementi della lista dobbiamo accedere alla sua posizione.
Procedimento algoritmo selection sort con Scratch
Occorre innanzitutto creare la lista, in questo caso di numeri, che chiamo senza troppa fantasia numeri!
Chiedo dunque quanti elementi inserire e memorizzo la risposta in una variabile che chiamo N. Successivamente con un ciclo popolo la mia lista di numeri.
In che modo?
Creo una variabile contatore che chiamo conta che ha la funzione di tenere traccia dei numeri che a mano a mano verranno inseriti. Tale variabile deve essere inizializzata a zero, si incrementerà per ogni inserimento e si fermerà quando raggiungerà N, ovvero il numero di elementi richiesti.
All’interno del ciclo chiedo ogni volta di inserire un numero.
In questo modo ho popolato la mia lista con dei numeri a caso che ho inserito da tastiera.
Elenco sotto le variabili che ho utilizzato. Le variabili min, j e temp verranno spiegate più avanti.
Chiedo dunque di visualizzare gli elementi della lista con una semplice lettura della lista stessa.
Utilizzo lo stesso contatore che inizializzo nuovamente a zero e creo un ciclo che consentirà di leggere tutti gli elementi della lista, grazie al comando delle liste di Scratch: elemento …. di numeri, che visualizzerà prima l’elemento con indice 0, poi l’elemento con indice 1 e così via.
Adesso dobbiamo ordinare l’array e per farlo procediamo in questo modo.
Ci servono le variabili:
min
j
temp
Assegniamo a min il valore di conta, così da farlo partire dalla posizione zero e a j assegniamo il valore di conta + 1, in modo tale da fare partire l’indice dalla posizione 1.
Poi scorriamo la lista e se l’elemento di posizione j della lista è minore dell’elemento di posizione min allora assegno a min il valore j.Altrimenti vado avanti incrementando j e utilizzando una variabile temporanea che ad esempio chiamo temp per effettuare lo scambio.
Non ci resta che visualizzare l’array ordinato.
Allego lo script nell’immagine sotto.
Questo è solo un esempio di sviluppo dell’algoritmo selection sort con Scratch, proponete pure la vostra nei commenti sotto.