GnomixLand




.:PARTE 3 - VETTORI E MATRICI :.


Come già anticipato la volta scorsa, oggi parleremo di vettori, e ordinamento di essi, e matrici. Questi tipi di dati
vengono detti "strutturati", questo perchè, possono contenere al loro interno diversi e più valori contemporaneamente.
Mmmmm... Iniziamo a vedere come funzionano :)

I VETTORI
---------
La differenza essenziale tra un vettore di variabili intere ed una variabile intera stà nel fatto che nel primo caso
abbiamo una serie di valori interi accumunati dallo stesso nome, mentre nella variabile intera abbiamo corrispondenza
1:1 fra valore e numero di variabili (ovvero 1). Facciamo un'esempio visivo:

int Valore=20;

Valore potrà mantenere al suo interno solo un numero, in questo caso il numero 20.

int Valori[10];

Valori invece potrà contenere fino a 10 numeri diversi (questa, è infatti, la dichiarazione di un vettore di 10
elementi). Il problema adesso, potrebbe essere capire come fare ad andarsi a controllare un singolo valore da questo
vettore... Niente di più semplice:

Se ad esempio volessimo andare ad assegnare il valore 12 ad un elemento de vettore basterà fare questo:

Valori[2]=12;

In questo caso avremmo assegnato al 3° elemento del vettore il valore 12. Quel valore tra parentesi quadre si chiama
Indice del Vettore, e potete ben immaginar eperchè. Prima ho detto 3° elemento del vettore anche se lì c'è scritto 2.
Non è un'errore, l'elemento è infatti il 3° del vettore perchè il vettore comprende l'elemento 0 !
Ovvero, dichiarando un vettore come prima , cioè : int Valori[10] , noi avremmo un vettore lungo da [0..9] , dieci
elementi, propio come avevamo specificato!
Sapere utilizzare gli indici dei vettori è una cosa molto importante e, comunque, abbastanza semplice una volta capito
il funzionamento... Facciamo un esempio... Se dovessimo prendere da input tutti gli elementi di un vettore come faremo??
Il metodo che ci può venire in mente è questo:

printf("Inserisci il 1° elemento del vettore:");
scanf("%d",&Valori[0]);
printf("Inserisci il 2° elemento del vettore:");
scanf("%d",&Valori[1]);
printf("Inserisci il 3° elemento del vettore:");
scanf("%d",&Valori[2]);

ecc ecc...

A prima vista potrebbe sembrare un buon metodo... Niente di più sbagliato!! Cosa succederebbe se dovessimo riempire
un vettore di 200 elemeni, o 500 ?? Ecco allora il metodo giusto:

int i;

for(i=0;i<10;i++)
{
printf("nInserisci il %d° elemento del vettore: ",i+1);
scanf("%d",&Valori[i]);
}

Ecco quì il metodo giusto per riempire (ovvero prendere da input tutti gli elementi del vettore) un vettore. Il modo
dovrebbe esservi abbastanza chiaro. Prima di tutto è meglio che spenda due parole sul funzionamento della for... La for
altro non è che un'istruzione di iterazione, ovvero ripete qualcosa finchè è verificata una certa condizione...
La condizione, nel caso della for, è quello che c'è nelle parentesi dopo il primo ; ,ovvero i<10. Questa for, infatti
ripete tutto quello che c'è tra { } finchè i<10 , quando non lo sarà + uscirà da questo ciclo ed andrà ad eseguire le
istruzioni successive. Analizziamo nel dettaglio la for : la prima cosa nelle parentesi è i=0 : ovvero diciamo che in
partenza i deve valere 0 (al primo ciclo), la seconda cosa: i<10 l'abbiamo spiegata prima, la terza : i++ stà a significare
che, ad ogni ciclo effettuato dalla for, i deve incrementarsi di 1. Quindi la prima volta che eseguirà tutto il ciclo varrà
0, la seconda 1, la terza 2, e così via, e, fin quando la condizione i<10 sarà verificata, verrà effettuato il ciclo!
Spese queste doverose parole per spiegarvi il funzionamento della for , proseguiamo a studiare il nostro programma.
Utilizziamo i come indice del vettore per poterlo scorrere. Dopo di che utilizziamo una for per incrementare ad ogni ciclo
i (che parte da 0 fino ad arrivare a 9 [i<10] come abbiamo già detto). Dopodichè nella for andiamo a prendere ogni
elememento
del vettore... L'output dovrebbe essere una cosa del genere:

Inserisci il 1° elemento del vettore: 8
Inserisci il 2° elemento del vettore: 15

e così via... Logicamente 8 e 15 sono i valori immessi dall'utente. Stampare, invece, il contenuto di un vettore sullo
skermo, funziona + o - come il riempimento... Provate a pensarci da soli, se non ci riuscite guardate quì sotto :)

int i;

for(i=0;i<10;i++)
{
printf("Il %d° elemento del vettore ha valore: %d",i+1,Valori[i]);
}

Tutto quì... Le parentesi graffe della for, quando l'istruzione da eseguire nel ciclo è soltanto una, potrebbero anche
essere omesse... Le ho lasciate per far capire meglio la struttura... :)

Bene, ora sappiamo come riempire e stampare un vettore... E se, una volta riempito il vettore, volessimo ordinarlo per
valori crescenti?? Cioè. se avessimo nel vettore tutti valori sparsi tipo 8,3,12,4 e volessimo ordinali in 3,4,8,12 ??
Per farlo non dobbiamo fare altro che utilizzare un algoritmo di ordinamento... L'unico che vedremo, che è anche quello
+ funzionale, è il Bubble Sort...

ORDINAMENTO DI UN VETTORE TRAMITE BUBBLE SORT
---------------------------------------------

Allora, iniziamo col dire subito che in teoria, questo algoritmo è abbastanza semplice, ma è sicuramente la cosa più
difficile che abbiamo fatto fin'ora... Quindi attenzione, please :)
Il metodo in questione consiste in dei confronti successivi fra coppie di valori all'interno del vettore, e di scambi
quando ve ne necessitano. I confronti vengono fatti tra tutti gli elementi (a 2 a 2) del vettore, tutti questi confronti
vengono ripetuti per N-1 volte, dove N è il numero degli elementi nel vettore... Per vederlo sotto forma di codice:

int i,j; // questa volta ci servono 2 indici, che però, scorreranno lo stesso vettore
int comodo;

for(i=0;i<n-1;i++)
{
for(j=n;j>=0;j--)
{
if(Valore[j]<Valore[j-1])
{
comodo=Valore[j];
Valore[j]=Valore[j-1];
Valore[j-1]=comodo;
}
}
}

Questo è l'algoritmo di ordinamento bubble... In questo modo si ordina in modo crescente un qualsiasi vettore non ordinato.
Studiandovi bene l'algoritmo sicuramente capirete come funziona... Tutto quello che fa, quando si verificano le condizioni
che si devono verificare, è scambiare i due valori... Ovvero se Valore[j] è minore di Valore[j-1] scambia questi due valori.
Una cosa che potrebbe aiutarvi a capire meglio è quella di crearvi una tabellina (anche us un pezzo di carta) e vedere come,
istruzione per istruzione, cambino i valori... Buon divertimento :)


LE MATRICI
----------

Dopo aver visto i vettori, sarà molto facile capire cos'è una matrice. Essa, infatti, altro non è che un vettore di 2
dimensioni, ovvero un vettore bidimensionale... Per farvi capire meglio rappresentiamo graficamente sia un vettore
che una matrice, magari già riempiti...

Vettore-> [10][ 9][56][32][43]

Matrice-> [ 1][21][33][12][ 9]
[22][64][28][36][ 5]
[ 6][15][17][13][ 6]

Chiaro no?? Un vettore è un'insieme di valori disposti su una riga immaginaria, mentre la matrice è disposta sia su righe
che su colonne! Ad esempio, quella di sopra, è una matrice di 3 righe e 5 colonne. Quando il numero di righe è diverso
da quello delle colonne si dice che la matrice è rettangolare, quando invece coincidono la matrice si dice quadrata...
E' facile immaginarsi il perchè :)

Vediamo ora come riempire una matrice...

int r,c; // ora gli indici sono due, uno per le righe e uno per le colonne!!

int Matrice[3][5];

for(r=0;r<3;r++)
{
for(c=0;c<5;c++)
{
printf("nInserisci l'elemnto del vettore di riga %d e di colonna %d: ",r+1,c+1);
scanf("%d",&Matrice[r][c]);
}
}

In effetti ci sarebbero due modi diversi per riempire un vettore: per riga o per colonna... In questo caso abbiamo riempito
il vettore per righe, riempirlo per colonna comporta solo invertire le due for... Se guardate bene, è abbastanza logico! :)

Ora stampare gli elementi della matrice dovrebbe essere chiarissimo... Cercate di farlo da soli, se non ci riuscite guardate
quì sotto, ma vi consiglierei di rileggere tutto il Tut ;)

for(r=0;r<3;r++)
{
for(c=0;c<5;c++)
{
printf("nL'elemento di riga %d e di colonna %d , è %d ",r+1,c+1,Matrice[r][c]);
}
}

Tutto quì...

Per quanto riguarda l'ordinamento di una matrice è una cosa piuttosto lunga! In effetti, se ci pensate bene, si tratterebbe
solo di ordinare un'insieme di vettori, uno per uno, a seconda che vogliate ordinare per righe o per colonne...
Quindi, teoricamente, è facile quanto ordinare un vettore, solo che è più lungo e non mi sembra il caso di scriverlo! :)

CONCLUSIONI
-----------

Anche per oggi detto tutto... La prossima volta credo che ci dedicheremo allo studio delle istruzioni iterative (tipo la
for di oggi, tra cui ci sono la do while, la while, ecc). Poi probabilemnte vedremo anche altro, per ora vi saluto, alla
prossima... Bye!!



©  GnomixLand
http://www.gnomixland.com/