Aokiji
Quello che stanno cercando di farti capire Weierstrass e oregon è che manca un dato formale fondamentale all'interno di questo ciclo
while(x<n-1)
{
while(y<n-1)
{
if (array[y]>array[y+1])
{
temp=array[y];
array[y]=array[y+1];
array[y+1]=temp;
}
y++;
}
x++;
}
ovvero l'
inizializzazione.
Per inizializzazione si intende l'assegnazione di un valore ad una variabile, nel nostro caso ad un
contatore.
Il contatore è una variabile il cui incremento (o che più generalmente, "la cui modifica") permette di regolare, in seguito all'apposizione di una condizione di verifica, l'esecuzione di un ciclo. Ma attenzione, è una variabile come qualsiasi altra, e ciò comporta delle conseguenze. Analizziamo la porzione di codice qui sopra:
1) correttamente dichiarate all'inizio del main, hai scelto come variabili contatore
x e
y;
2) incontriamo il primo
while: è
x<n-1 ? x=0<n-1=4 ----> VERO, e dunque entriamo nel ciclo;
3) incontriamo il secondo while: è y<n-1 ? y=0<n-1=4 ----> VERO, e dunque entriamo nel ciclo;
4) la struttura dell'
if è sintatticamente corretta. Non mi dilungo nell'analisi, ma sta di fatto che fa il suo dovere: confronta le due celle contigue del vettore e posiziona il valore più grande nella cella
y+1;
5) eseguito o meno l'if, si arriva a
y++;, incrementiamo la y e si torna a verificare la condizione del while interno;
6) è y<n-1 ? y=1<n-1=4 ----> VERO, e dunque si entra di nuovo nel ciclo;
Senza soffermarci sul singolo passaggio, bypasso il processo e ti dico che la fine della prima esecuzione del while interno ordina il vettore così:
"7, 56, 33, 22, 99"
Fatto ciò si esce dal ciclo (in quanto y=4 e y<n-1 ----> FALSO) dunque incontriamo
x++;, e si torna a verificare la condizione del primo while
1) è x<n-1 ? x=1<n-1=4 ----> VERO, e si rientra nel ciclo;
2) è y<n-1 ?
...e adesso che succede? beh, il programma verifica y<n-1, ma
la y è sempre uguale a 4 ! nessuno le ha detto di ritornare a zero, per cui la condizione è falsa e
non viene eseguito il ciclo interno!
Difatti non verrà più eseguito per tutta la durata del ciclo esterno, e come output tornerà il vettore sopracitato, che scommetto ti risulti familiare.
Il problema si può facilmente ovviare in questo modo:
while(x<n-1)
{
y=0;
while(y<n-1)
{
if (array[y]>array[y+1])
{
temp=array[y];
array[y]=array[y+1];
array[y+1]=temp;
}
y++;
}
x++;
}
Il tutto risulta però facinoroso e ridondante, per cui in questi casi si preferisce utilizzare il ciclo
for (come consigliato già da Weierstrass), la cui peculiarità è la possibilità di avere sott'occhio in una sola riga di codice l'inizializzazione del contatore, la condizione di verifica e l'incremento.
Il ciclo apparirebbe così:
for(x=0; x<n-1; x++){
for(y=0; y<n-1; y++){
if(array[y]>array[y+1]){
temp=array[y];
array[y]=array[y+1];
array[y+1]=temp;
}
}
}
P.s. usa meno variabili per i tuoi cicli/programmi, sono riutilizzabili.
ne hai usate 6, ne bastavano 3