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# / VB.NET - Ordinare un array di numeri
Forum - C# / VB.NET - Ordinare un array di numeri

Pagine: [ 1 2 3 ] Precedente | Prossimo
Avatar
xCromos (Normal User)
Newbie


Messaggi: 14
Iscritto: 05/12/2008

Segnala al moderatore
Postato alle 17:24
Sabato, 21/11/2009
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

  1. 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à.

PM
Avatar
Nitro (Member)
Pro


Messaggi: 72
Iscritto: 17/10/2007

Segnala al moderatore
Postato alle 17:52
Sabato, 21/11/2009
Basta utilizzare il ciclo "for" e degli "if" dentro il ciclo "for" per comparare i numeri e vedere chi è maggiore e chi è minore

PM
Avatar
lorenzo (Normal User)
Guru


Messaggi: 1178
Iscritto: 15/04/2008

Segnala al moderatore
Postato alle 18:17
Sabato, 21/11/2009
ci sono vari algoritmi che lo fanno...tuttavia in modo intuitivo si può fare così:

Codice sorgente - presumibilmente C# / VB.NET

  1. procedura ordina(V[])
  2. inizio
  3.    i = 1 //parto dal SECONDO elemento del vettore
  4.    l = lenght(i)  //lunghezza del vettore
  5.    fai
  6.       ancora = 0  //mi dice che devo continuare ad ordinare se è = 1
  7.       finché i < l fai
  8.          se V[i] < V[i - 1] fai
  9.             tmp = V[i - 1]
  10.             V[i - 1] = V[i]
  11.             V[i] = tmp
  12.             ancora = 1
  13.          fine
  14.          i = i + 1
  15.       fine
  16.       i = 1
  17.     finché ancora = 1
  18. 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:heehee:

Ultima modifica effettuata da lorenzo il 21/11/2009 alle 18:21
PM
Avatar
xCromos (Normal User)
Newbie


Messaggi: 14
Iscritto: 05/12/2008

Segnala al moderatore
Postato alle 18:33
Sabato, 21/11/2009
grazie a tutti e due dell'aiuto, ho provato cosi:

Codice sorgente - presumibilmente VB.NET

  1. Dim Ancora As Boolean = 1
  2.         Dim Temp As Int16
  3.         While x < ALength
  4.             If Nums(1) < Nums(x - 1) Then
  5.                 Temp = Nums(x - 1)
  6.                 Nums(x - 1) = Nums(1)
  7.                 Nums(1) = Temp
  8.                 Ancora = 1
  9.             End If
  10.             x += 1
  11.         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
PM
Avatar
lorenzo (Normal User)
Guru


Messaggi: 1178
Iscritto: 15/04/2008

Segnala al moderatore
Postato alle 22:22
Sabato, 21/11/2009
io però ti ho detto di ragionarci su quel codice...:nono:
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 ;)

PM
Avatar
xCromos (Normal User)
Newbie


Messaggi: 14
Iscritto: 05/12/2008

Segnala al moderatore
Postato alle 23:34
Sabato, 21/11/2009
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

  1. Module Module1
  2.     Sub Main()
  3.         Dim x As Byte = 1
  4.         Dim ALength As Byte
  5.         Console.WriteLine("Inserire la lunghezza dell'array: ")
  6.         ALength = Console.ReadLine
  7.         Dim Nums(ALength) As Int16
  8.  
  9.         Console.WriteLine("Inserire " & ALength & " numeri: ")
  10.         For x = 0 To ALength - 1
  11.             Nums(x) = Console.ReadLine()
  12.         Next
  13.  
  14.         Dim Ancora As Boolean
  15.         Dim Temp As Int16
  16.         x = 1
  17.         Do
  18.             Ancora = 0
  19.             While x < ALength
  20.                 If Nums(x) < Nums(x - 1) Then
  21.                     Temp = Nums(x - 1)
  22.                     Nums(x - 1) = Nums(x)
  23.                     Nums(x) = Temp
  24.                     Ancora = 1
  25.                 End If
  26.                 x += 1
  27.             End While
  28.             x = 1
  29.         Loop While Ancora = 1
  30.  
  31.         Console.WriteLine()
  32.         For x = 0 To ALength - 1
  33.             Console.WriteLine(Nums(x))
  34.         Next
  35.         Console.ReadKey()
  36.     End Sub
  37. End Module



Grazie per la pazienza

PM
Avatar
lorenzo (Normal User)
Guru


Messaggi: 1178
Iscritto: 15/04/2008

Segnala al moderatore
Postato alle 12:37
Domenica, 22/11/2009
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

  1. Dim ancora as boolean



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

PM
Avatar
xCromos (Normal User)
Newbie


Messaggi: 14
Iscritto: 05/12/2008

Segnala al moderatore
Postato alle 12:40
Domenica, 22/11/2009
Non ci credo, ci ho sbattuto la testa per due giorni e il problema era questo...Grazie mille dell'aiuto sei stato molto bravo.

PM
Avatar
lorenzo (Normal User)
Guru


Messaggi: 1178
Iscritto: 15/04/2008

Segnala al moderatore
Postato alle 13:10
Domenica, 22/11/2009
come ti avevo detto, era una cavolata:D

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:k:

PM
Pagine: [ 1 2 3 ] Precedente | Prossimo