Oppure

Loading
13/11/09 21:43
zaire90
Salve sto facendo un semplice programma di bubble sort ma quando lo eseguo non mi scrive i numeri in ordine, cosa sbaglio? Sicuramente è sbagliato qualcosa nel ciclo della stampa...

/*   QUESTO PROGRAMMA ACQUISISCE DA TASTIERA UN NUMERO INTERO n<30 E LE
     COMPONENTI DI UN VETTORE u DI DIMENSIONE n. SUCCESSIVAMENTE RIORDINA LE
     COMPONENTI DEL VETTORE u IN SENSO CRESCENTE E LE STAMPA SUL VIDEO    
     [Bubblesort]                                                             */

#include <iostream>
using namespace std;

int main()
{
     int n,i,j;
     float u[30];
     cout << "\nScrivi il numero della dimensione del vettore" <<endl <<endl;
     cout << "                        n = ";
     cin >> n;
     
          while ((n<2)||(n>29))
                {
                   cout << "\n\nn deve essere positivo e minore di 29!" <<endl <<endl;
                   cout << "Scrivi il numero della dimensione del vettore"<<endl <<endl;
                   cout << "                        n = ";
                   cin >> n;
                }
     
     cout << "\n\nScrivi adesso le componenti del vettore u["<<n<<"]:" <<endl;
     for (i=1;i<=n;i++)
         {
            cout << "\nu["<<i<<"] = ";
            cin >> u[i];
         }
         
     for (i=1;i<n;i++)
         for (j=n-1;j>=i;j--)
             if (u[j-1] > u[j])
                {
                   float c;
                   c=u[j-1];
                   u[j-1]=u[j];
                   u[j]=c;
                }
     
     cout << "\nEcco il vettore u["<<n<<"] riordinato in ordine crescente:" <<endl;
     
     for (i=0;i<n;i++)
          cout << u[i];
         
     cout <<endl <<endl <<endl;     
     system("PAUSE");
     return 0;
}
Ultima modifica effettuata da zaire90 13/11/09 21:44
aaa
13/11/09 23:16
Lawliet
Semplicemente perchè gli array hanno come indice di partenza u[0] fino a u[n-1].
Tu invece fai partire dall'indice 1 fino a n, ed è sbagliato :)

Le modifiche da fare sono qui:

 for (i=0;i<n;i++)

e qui:

for (i=1;i<n;i++)



E vedrai che funziona :).
Ultima modifica effettuata da Lawliet 13/11/09 23:21
aaa
14/11/09 19:19
zaire90
No scusami non ho capito cosa devo cambiare! Devo quindi far partire il ciclo for della stampa da 1 invece che da 0? Per favore spiegati meglio:)grazie
aaa
14/11/09 20:11
Lawliet
Perdonami se non mi sono spiegato bene.
Ora ti spiego:

Avrai studiato cosa sono gli array, giusto? Quindi per allocare un array nello stack bisogna dichiararlo e l'hai fatto:
float u[30];

un array composto da 30 elementi float, cioè da 0 a 29.
Prendiamo il tuo ciclo dove inserisci gli elementi:

for (i=1;i<=n;i++)
         {
            cout << "\nu["<<i<<"] = ";
            cin >> u[i];
         } 


Così parti da indice 1 fino a indice n, così hai corrotto lo stack.

Al for del bubble sort, l'indice di partenza è sbagliato.
 for (i=1;i<n;i++) 


Invece per la stampa è giusto il ciclo :D
Spero che ora ti sia chiaro :S
Ultima modifica effettuata da Lawliet 14/11/09 20:12
aaa
15/11/09 9:55
zaire90
Hai ragione, nel ciclo dove scrivo gli elementi ho cambiato i=0 e i<n, e adesso funziona perfettamente!
Però ho notato che funziona lo stesso anche se scrivo cosi:

for (i=1;i<=n;i++)
         {
            cout << "\nu["<<i<<"] = ";
            cin >> u[i-1];
         }


cioè inserisco in u[1] l'elemento u[0]. Pensi che vada bene oppure cosi faccio qualche passaggio illecito? comunque grazie!:k:
aaa
15/11/09 12:44
Lawliet
Eh no, così corrompi lo stack del compilatore. Pure io facevo questo errore all'inizio, anche perchè in altri linguaggi si parte da 1 a n.
Ti faccio un esempio: un palazzo che ha 5 piani, tu parti da 0 a 4. Se vuoi andare al 5 piano, non puoi perchè non esiste!! :).
PS. L'hai visto tu stesso cosa causa ciò che avevi fatto.
Ultima modifica effettuata da Lawliet 15/11/09 12:45
aaa
15/11/09 17:04
zaire90
Ah....ok. E' solo perchè non mi piaceva che comparisse lo 0 al posto dell'1 come appunto farei nel mettere:


for(i=0;i<n;i++)
   {
      cout << "\n u["<<i<<"] = ";
      cin >> u[i];
   }



Comunque ok, inizierò a fare sempre cosi! Però scusami ancora ma non c'è un modo per fare come vorrei io, cioè come ho scritto prima, senza corrompere niente??:hail:
aaa
15/11/09 19:05
Lawliet
Postato originariamente da zaire90:

Ah....ok. E' solo perchè non mi piaceva che comparisse lo 0 al posto dell'1 come appunto farei nel mettere:


for(i=0;i<n;i++)
   {
      cout << "\n u["<<i<<"] = ";
      cin >> u[i];
   }



Comunque ok, inizierò a fare sempre cosi! Però scusami ancora ma non c'è un modo per fare come vorrei io, cioè come ho scritto prima, senza corrompere niente??:hail:


Allora se è solo su video che vuoi far apparire il numero che inserisci come appunto il 1 elemento fino a n elemento, potresti fare così:
cout << "\n u["<< i+1 <<"] = ";

Inserendo così stampa i+1 senza modificare il valore di i
:)
Ultima modifica effettuata da Lawliet 15/11/09 19:06
aaa