Avatar billede kamak Praktikant
18. december 2001 - 21:12 Der er 6 kommentarer og
1 løsning

Værdier i variabler skal sorteres i andre variabler!!!

Dim iTal(1 to 6) As Integer
Dim iTalSorter(1 to 6) As Integer

Under afviklingen af programmet får iTal(1) og iTal(2) osv. nogle tilfældige værdier.

Eksempel:
iTal(1) = 5
iTal(2) = 2
iTal(3) = 8
iTal(4) = 8
iTal(5) = 4
iTal(6) = 5


Jeg skal nu bruge en kode der kan sortere disse tal således, at hvis iTal(3) har den højeste værdi får iTalSorter(3) værdien 1. Hvis iTal(5) er det næsthøjeste (eller samme værdi) får iTalSorter(5) værdien 2 osv.

Hvis man f.eks. fortsætter med eksemplet fra før skal iTalSorter(1 to 6) se såden ud:

iTalSorter(1) = 3
iTalSorter(2) = 6
iTalSorter(3) = 1
iTalSorter(4) = 2
iTalSorter(5) = 5
iTalSorter(6) = 4

Bemærk at der IKKE må være to ens værdier i iTalSorter Arrayet.

Det er det sidste jeg nævner, der ifølge min mening, er svært at programmere.
Er der nogle der kan løse dette (måske lidt) komplicerede problem. 

/Kamak
Avatar billede proaccess Nybegynder
19. december 2001 - 08:38 #1
Dim iTal(1 To 6) As Integer
Dim iTalSorter(1 To 6) As Integer

Private Sub Form_Load()
 
  Dim iLoop As Integer
 
  iTal(1) = 5
  iTal(2) = 2
  iTal(3) = 8
  iTal(4) = 8
  iTal(5) = 4
  iTal(6) = 5
 
  Sorter
 
  For iLoop = 1 To 6
    Debug.Print iTal(iLoop), iTalSorter(iLoop)
  Next

End Sub

Private Sub Sorter()
 
  Dim iTalUdvalgt(1 To 6) As Integer
  Dim iTemp As Integer, iLoop As Integer, jLoop As Integer
 
  For iLoop = 1 To 6
    iTalSorter(iLoop) = iTal(iLoop)
  Next
 
  For iLoop = 1 To 5
    For jLoop = iLoop + 1 To 6
      If iTalSorter(iLoop) < iTalSorter(jLoop) Then
        iTemp = iTalSorter(iLoop)
        iTalSorter(iLoop) = iTalSorter(jLoop)
        iTalSorter(jLoop) = iTemp
      End If
    Next
  Next
 
  For iLoop = 1 To 6
    iTemp = iTalSorter(iLoop)
    For jLoop = 1 To 6
      If iTal(jLoop) = iTemp And iTalUdvalgt(jLoop) = 0 Then
        iTalUdvalgt(jLoop) = iLoop
        Exit For
      End If
    Next
  Next
 
  For iLoop = 1 To 6
    iTalSorter(iLoop) = iTalUdvalgt(iLoop)
  Next
 
End Sub

Avatar billede proaccess Nybegynder
19. december 2001 - 08:39 #2
Sjov lille opgave ;-)
Avatar billede kamak Praktikant
19. december 2001 - 23:44 #3
Jeg er imponeret. Det virker simpelthen perfekt. Jeg har svært ved at overskue det, når der er for-next løkker inden i for-next løkker. vil du ikke kort forklarer hvad der sker i de 2 store for-next løkker (de 2 i midten).

Det virker som om du er utrolig dygtig til dette her så jeg har lige et andet spørgsmål:

Lad os antage at vi også har et array der hedder:
Dim iTal2(1 to 6) As Integer

og

iTal(3) = 8
iTal(4) = 8
iTal(1) = 5
iTal(6) = 5

hvilket giver

iTalSorter(3) = 1
iTalSorter(4) = 2
iTalSorter(1) = 3
iTalSorter(6) = 4

Når f.eks iTal(3) og iTal(4) har den samme værdi, som også er den højeste. Så er det iTalSorter(3) der får værdien 1 og iTalSorter(4) der får værdien 2.

Kan man lave det sådan at hvis to iTal variabler har den samme værdi, skal der tages højde for hvilken iTal2 værdi der er den højeste, når iTalSorter skal bestemmes

Eksempel:

iTal(3) = 8
iTal(4) = 8
iTal(1) = 5
iTal(6) = 5

og

iTal2(3) = 35
iTal2(4) = 50
iTal2(1) = 40
iTal2(6) = 80

Skal give

iTalSorter(3) = 2
iTalSorter(4) = 1
iTalSorter(6) = 3
iTalSorter(1) = 4


Du HAR sikret dig de 50 point. Men hvis du kan løse det overstående får du 20 point mere. Hvis du ikke gider (jeg kunne forestille mig at, koden ville blive rimelig kompliceret) eller ikke kan, skal du bare sige til, så får du straks de 50 point.
På forhånd tak

/Kamak
Avatar billede proaccess Nybegynder
20. december 2001 - 08:44 #4
Det at have 2 for-next løkker inden i hinanden er ikke så svært, man skal blot huske at den inderste køres igennem for hver gang en ydre kører...

For A=1 to 3
  For B=A+1 to 4
    Print A, B
  Next
Next

Vil give dette: (hvor A er første tal og B det andet)
1 2
1 3
1 4
2 3
2 4
3 4

Det er også dette jeg udnytter, når jeg laver min sortering (den første \"store\" blok)
For hvert af de 5 første (jeg behøver ikke den 6\'e, den bliver allivevel mindst til sidst) elementer i dit array, gennemløber jeg resten, for at se om der skulle være en større, hvis det er tilfældet, så byttes de om, og sammenligningen fortsætter.

I den anden store blok, løber jeg hvert af vores sorterede tal igennem, og for hvert af dem løber jeg gennem vores oprindelige tal for at finde det første, som ikke allerede er udvalgt. Dette tal bliver så udvalgt med nummeret for placeringen i vores sorterede array.
Disse udvælgelser lægges til sidst ind i iTalSorter() og er således resultatet.

Med hensyn til et 2.array\'s indblanding så er det en større omgang, som jeg desværre ikke lige kan overskue...

MEN du kunne jo prøve at forestille dig at samle iTal() og iTal2() til et komma-tal, og derefter at køre sorteringen igennem...

Jeg laver lige et eksempel:
Avatar billede proaccess Nybegynder
20. december 2001 - 09:13 #5
Så beregner den med dicimaltal mellem 0 og 99, hvis du skal bruge tal større end 99, må du forøge 100 (i beregninger) til 1000 eller 10000...

Option Explicit

Dim iTal(1 To 6) As Integer
Dim iTal2(1 To 6) As Integer
Dim iTalSorter(1 To 6) As Integer

Private Sub Form_Load()
 
  Dim iLoop As Integer
 
  iTal(1) = 5
  iTal(2) = 2
  iTal(3) = 8
  iTal(4) = 8
  iTal(5) = 4
  iTal(6) = 5
 
  iTal2(1) = 40
  iTal2(2) = 30
  iTal2(3) = 35
  iTal2(4) = 50
  iTal2(5) = 25
  iTal2(6) = 80

  Sorter
 
  For iLoop = 1 To 6
    Debug.Print iTal(iLoop), iTal2(iLoop), iTalSorter(iLoop)
  Next

End Sub

Private Sub Sorter()
 
  Dim iTalDecimal(1 To 6, 1 To 2) As Single, iDeci As Single
  Dim iTalUdvalgt(1 To 6) As Integer
  Dim iLoop As Integer, jLoop As Integer
 
  For iLoop = 1 To 6
    For jLoop = 1 To 2
      iTalDecimal(iLoop, jLoop) = iTal(iLoop) + iTal2(iLoop) / 100
    Next
  Next
 
  For iLoop = 1 To 5
    For jLoop = iLoop + 1 To 6
      If iTalDecimal(iLoop, 1) < iTalDecimal(jLoop, 1) Then
        iDeci = iTalDecimal(iLoop, 1)
        iTalDecimal(iLoop, 1) = iTalDecimal(jLoop, 1)
        iTalDecimal(jLoop, 1) = iDeci
      End If
    Next
  Next
 
  For iLoop = 1 To 6
    For jLoop = 1 To 6
      If iTalDecimal(jLoop, 2) = iTalDecimal(iLoop, 1) And iTalUdvalgt(jLoop) = 0 Then
        iTalUdvalgt(jLoop) = iLoop
        Exit For
      End If
    Next
  Next
 
  For iLoop = 1 To 6
    iTalSorter(iLoop) = iTalUdvalgt(iLoop)
  Next
 
End Sub

Avatar billede kamak Praktikant
21. december 2001 - 00:26 #6
Tak for for-next forklaringen, jeg begynder af kunne se logikken i det :-)
Din løsning til den anden opgave virker også perfekt. Det er genialt.
Avatar billede kamak Praktikant
21. december 2001 - 23:41 #7
Hov - Jeg havde nær glemt de 20 point du skulle have for at løse mit andet problem.
Få dem her http://www.eksperten.dk/spm/149566
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester