Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - bubble sort
Forum - C/C++ - bubble sort

Avatar
zaire90 (Normal User)
Rookie


Messaggi: 46
Iscritto: 16/10/2009

Segnala al moderatore
Postato alle 22:43
Venerdì, 13/11/2009
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...

Codice sorgente - presumibilmente C++

  1. /*   QUESTO PROGRAMMA ACQUISISCE DA TASTIERA UN NUMERO INTERO n<30 E LE
  2.      COMPONENTI DI UN VETTORE u DI DIMENSIONE n. SUCCESSIVAMENTE RIORDINA LE
  3.      COMPONENTI DEL VETTORE u IN SENSO CRESCENTE E LE STAMPA SUL VIDEO    
  4.      [Bubblesort]                                                             */
  5.  
  6. #include <iostream>
  7. using namespace std;
  8.  
  9. int main()
  10. {
  11.      int n,i,j;
  12.      float u[30];
  13.      cout << "\nScrivi il numero della dimensione del vettore" <<endl <<endl;
  14.      cout << "                        n = ";
  15.      cin >> n;
  16.      
  17.           while ((n<2)||(n>29))
  18.                 {
  19.                    cout << "\n\nn deve essere positivo e minore di 29!" <<endl <<endl;
  20.                    cout << "Scrivi il numero della dimensione del vettore"<<endl <<endl;
  21.                    cout << "                        n = ";
  22.                    cin >> n;
  23.                 }
  24.      
  25.      cout << "\n\nScrivi adesso le componenti del vettore u["<<n<<"]:" <<endl;
  26.      for (i=1;i<=n;i++)
  27.          {
  28.             cout << "\nu["<<i<<"] = ";
  29.             cin >> u[i];
  30.          }
  31.          
  32.      for (i=1;i<n;i++)
  33.          for (j=n-1;j>=i;j--)
  34.              if (u[j-1] > u[j])
  35.                 {
  36.                    float c;
  37.                    c=u[j-1];
  38.                    u[j-1]=u[j];
  39.                    u[j]=c;
  40.                 }
  41.      
  42.      cout << "\nEcco il vettore u["<<n<<"] riordinato in ordine crescente:" <<endl;
  43.      
  44.      for (i=0;i<n;i++)
  45.           cout << u[i];
  46.          
  47.      cout <<endl <<endl <<endl;    
  48.      system("PAUSE");
  49.      return 0;
  50. }


Ultima modifica effettuata da zaire90 il 13/11/2009 alle 22:44
PM Quote
Avatar
Lawliet (Normal User)
Expert


Messaggi: 386
Iscritto: 09/04/2009

Segnala al moderatore
Postato alle 0:16
Sabato, 14/11/2009
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:

Codice sorgente - presumibilmente C/C++

  1. for (i=0;i<n;i++)
  2.  
  3. e qui:
  4.  
  5. for (i=1;i<n;i++)



E vedrai che funziona :).

Ultima modifica effettuata da Lawliet il 14/11/2009 alle 0:21
PM Quote
Avatar
zaire90 (Normal User)
Rookie


Messaggi: 46
Iscritto: 16/10/2009

Segnala al moderatore
Postato alle 20:19
Sabato, 14/11/2009
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

PM Quote
Avatar
Lawliet (Normal User)
Expert


Messaggi: 386
Iscritto: 09/04/2009

Segnala al moderatore
Postato alle 21:11
Sabato, 14/11/2009
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:
Codice sorgente - presumibilmente C/C++

  1. float u[30];


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

Codice sorgente - presumibilmente C/C++

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



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

Al for del bubble sort, l'indice di partenza è sbagliato.
Codice sorgente - presumibilmente C/C++

  1. 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 il 14/11/2009 alle 21:12
PM Quote
Avatar
zaire90 (Normal User)
Rookie


Messaggi: 46
Iscritto: 16/10/2009

Segnala al moderatore
Postato alle 10:55
Domenica, 15/11/2009
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:

Codice sorgente - presumibilmente C/C++

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



cioè inserisco in u[1] l'elemento u[0]. Pensi che vada bene oppure cosi faccio qualche passaggio illecito? comunque grazie!:k:

PM Quote
Avatar
Lawliet (Normal User)
Expert


Messaggi: 386
Iscritto: 09/04/2009

Segnala al moderatore
Postato alle 13:44
Domenica, 15/11/2009
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 il 15/11/2009 alle 13:45
PM Quote
Avatar
zaire90 (Normal User)
Rookie


Messaggi: 46
Iscritto: 16/10/2009

Segnala al moderatore
Postato alle 18:04
Domenica, 15/11/2009
Ah....ok. E' solo perchè non mi piaceva che comparisse lo 0 al posto dell'1 come appunto farei nel mettere:

Codice sorgente - presumibilmente Plain Text

  1. for(i=0;i<n;i++)
  2.    {
  3.       cout << "\n u["<<i<<"] = ";
  4.       cin >> u[i];
  5.    }



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:

PM Quote
Avatar
Lawliet (Normal User)
Expert


Messaggi: 386
Iscritto: 09/04/2009

Segnala al moderatore
Postato alle 20:05
Domenica, 15/11/2009
Testo quotato

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:

Codice sorgente - presumibilmente Plain Text

  1. for(i=0;i<n;i++)
  2.    {
  3.       cout << "\n u["<<i<<"] = ";
  4.       cin >> u[i];
  5.    }



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ì:
Codice sorgente - presumibilmente Plain Text

  1. cout << "\n u["<< i+1 <<"] = ";


Inserendo così stampa i+1 senza modificare il valore di i
:)

Ultima modifica effettuata da Lawliet il 15/11/2009 alle 20:06
PM Quote