xCromos (Normal User)
Newbie
Messaggi: 14
Iscritto: 05/12/2008
|
Questo topic è stato chiuso dal moderatore Si lo so sono un idiota.. ma non ci riesco, sono ore che provo varie soluzioni. Devo fare un esercizio che ho trovato sul forum di totem:
Codice sorgente - presumibilmente C# / VB.NET |
Scrivere un programma che costruisca un array di X elementi, con X inserito da tastiera, che richieda l'immissione di questi, sempre da tastiera, e che li ordini, quindi, senza usare alcuna funzione fornita dal Framework.
|
Non riesco proprio a trovare un modo per ordinare gli elementi dell'array. So che dovrei scansionarli tutti e ordinarli uno ad uno ma non trovo il modo di farlo. Grazie a chi mi aiuterà.
|
|
Nitro (Member)
Pro
Messaggi: 72
Iscritto: 17/10/2007
|
Basta utilizzare il ciclo "for" e degli "if" dentro il ciclo "for" per comparare i numeri e vedere chi è maggiore e chi è minore
|
|
lorenzo (Normal User)
Guru
Messaggi: 1178
Iscritto: 15/04/2008
|
ci sono vari algoritmi che lo fanno...tuttavia in modo intuitivo si può fare così:
Codice sorgente - presumibilmente C# / VB.NET |
procedura ordina(V[])
inizio
i = 1 //parto dal SECONDO elemento del vettore
l = lenght(i) //lunghezza del vettore
fai
ancora = 0 //mi dice che devo continuare ad ordinare se è = 1
finché i < l fai
se V[i] < V[i - 1] fai
tmp = V[i - 1]
V[i - 1] = V[i]
V[i] = tmp
ancora = 1
fine
i = i + 1
fine
i = 1
finché ancora = 1
fine
|
è scritto in pseudo-codice, prova a capirlo e ad implementarlo
EDIT: ooops, mi sa che ho scritto una specie di bubble-sort...vabbé è comunque un ordinamento
Ultima modifica effettuata da lorenzo il 21/11/2009 alle 18:21 |
|
xCromos (Normal User)
Newbie
Messaggi: 14
Iscritto: 05/12/2008
|
grazie a tutti e due dell'aiuto, ho provato cosi:
Codice sorgente - presumibilmente VB.NET |
Dim Ancora As Boolean = 1 Dim Temp As Int16 While x < ALength If Nums(1) < Nums(x - 1) Then Temp = Nums(x - 1) Nums(x - 1) = Nums(1) Nums(1) = Temp Ancora = 1 End If x += 1 End While
|
Ma non funziona mi restituisce i numeri nell'ordine con cui li ho immessi..
Edit: E' normale che non riesco o sono impedito?
Ultima modifica effettuata da xCromos il 21/11/2009 alle 18:38 |
|
lorenzo (Normal User)
Guru
Messaggi: 1178
Iscritto: 15/04/2008
|
io però ti ho detto di ragionarci su quel codice...
se leggi il tuo capisci che hai scritto una "cavolata" per dirla terra terra.
Un semplice consiglio prima di inziare: quando un algoritmo non funziona o usi il debugger(che esiste ed è cosa buona e giusta usarlo) oppure prendi carta e penna e fai tu il debug.
Comunque, se hai preso spunto dal mio codice, vedrai immediatamente una nota discordante tra i due: nel mio ci sono due cicli(fai...finché ---- finché....fai) mentre nel tuo uno solo. Ragionando dirai: "Mhh, devo scorrere il vettore per fare i confronti, quando ho finito il primo giro smetto? Oppure continuo? Ovviamente continuo fino a quando non ci sono più modifiche da fare"
Seconda cosa, la codizione dell'IF è sbagliata, come tutte le istruzioni al suo interno. Perché usi sempre Nums(1)??? Usi sempre e perennemente lo stesso elemento dell'array, come la cosa ti possa essere utile non lo capisco proprio.
Finale: Scusa il tono lievemente irritato della risposta ma non si tratta di essere impediti o altro. Semplicemente, se uno si mettere di impegno a ragionare invece di correre urlando AIUTO! da tutte le parti alla fine arriva alla soluzione. Il problema in questo caso è semplicissimo, basta provare a vedere cosa fa il codice riga per riga.
Prova a sistemarlo ragionandoci sopra e vedrai che dirai alla fine che era davvero una cavolata
|
|
xCromos (Normal User)
Newbie
Messaggi: 14
Iscritto: 05/12/2008
|
bhe non è che ci provo da 10 minuti. E' da ieri che cerco una soluzione, ci avrò perso almeno 4 ore senza esagerare. Ho provato cosi. Mi sono fatto i passaggi a mente e secondo i miei ragionamenti dovrebbe funzionare, ma invece non è cosi... ecco il programma completo:
Codice sorgente - presumibilmente VB.NET |
Module Module1 Sub Main() Dim x As Byte = 1 Dim ALength As Byte Console.WriteLine("Inserire la lunghezza dell'array: ") ALength = Console.ReadLine Dim Nums(ALength) As Int16 Console.WriteLine("Inserire " & ALength & " numeri: ") For x = 0 To ALength - 1 Nums(x) = Console.ReadLine() Next Dim Ancora As Boolean Dim Temp As Int16 x = 1 Do Ancora = 0 While x < ALength If Nums(x) < Nums(x - 1) Then Temp = Nums(x - 1) Nums(x - 1) = Nums(x) Nums(x) = Temp Ancora = 1 End If x += 1 End While x = 1 Loop While Ancora = 1 Console.WriteLine() For x = 0 To ALength - 1 Console.WriteLine(Nums(x)) Next Console.ReadKey() End Sub End Module
|
Grazie per la pazienza
|
|
lorenzo (Normal User)
Guru
Messaggi: 1178
Iscritto: 15/04/2008
|
non sono ferratissimo in vb.net ma penso che sia la stessa cosa del c#, le variabili boolean non possono essere implicitamente convertite in interi.
Se dichiari
Codice sorgente - presumibilmente C# / VB.NET |
allora devi assegnarle valore o True o False, non 0/1(va bene in c/c++ ma non nel .NET)
non posso provare il resto perché sono su Linux ma ad una prima occhiata sembrerebbe corretto il codice...prova a modificare il boolean e riprova
|
|
xCromos (Normal User)
Newbie
Messaggi: 14
Iscritto: 05/12/2008
|
Non ci credo, ci ho sbattuto la testa per due giorni e il problema era questo...Grazie mille dell'aiuto sei stato molto bravo.
|
|
lorenzo (Normal User)
Guru
Messaggi: 1178
Iscritto: 15/04/2008
|
come ti avevo detto, era una cavolata
scherzi a parte, cerca di capire bene cosa fa l'algoritmo prima di andare avanti perché ho visto che sei un po insicuro su quello
l'errore questa volta era infido ma credimi se ti dico che la maggior parte delle volte sarà così
ciao e buon lavoro
|
|