zaire90 (Normal User)
Rookie
Messaggi: 46
Iscritto: 16/10/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++ |
/* 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 il 13/11/2009 alle 22:44 |
|
Lawliet (Normal User)
Expert
Messaggi: 386
Iscritto: 09/04/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++ |
for (i=0;i<n;i++)
e qui:
for (i=1;i<n;i++)
|
E vedrai che funziona .
Ultima modifica effettuata da Lawliet il 14/11/2009 alle 0:21 |
|
zaire90 (Normal User)
Rookie
Messaggi: 46
Iscritto: 16/10/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 megliograzie
|
|
Lawliet (Normal User)
Expert
Messaggi: 386
Iscritto: 09/04/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++ |
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++ |
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.
Codice sorgente - presumibilmente C/C++ |
Invece per la stampa è giusto il ciclo
Spero che ora ti sia chiaro :S
Ultima modifica effettuata da Lawliet il 14/11/2009 alle 21:12 |
|
zaire90 (Normal User)
Rookie
Messaggi: 46
Iscritto: 16/10/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++ |
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!
|
|
Lawliet (Normal User)
Expert
Messaggi: 386
Iscritto: 09/04/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 |
|
zaire90 (Normal User)
Rookie
Messaggi: 46
Iscritto: 16/10/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 |
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??
|
|
Lawliet (Normal User)
Expert
Messaggi: 386
Iscritto: 09/04/2009
|
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 |
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?? |
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 |
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 |
|