Avatar billede ravnborg Nybegynder
20. februar 2005 - 23:11 Der er 7 kommentarer og
2 løsninger

Sortere variabler i størrelse

Jeg har 5 variabler (var1, var2, osv) som jeg vil have skrevet på min side, med den største først. De indholder alle tal.

Er ikke en smart måde at sorter dem på? Så jeg ikke skal bruge det halve af natten på if sætninger.
Avatar billede eagleeye Praktikant
20. februar 2005 - 23:27 #1
Du kan ligge dem ind i et array og så bruge en function som kan sortere et array:


<%

sub SortArray(arrToSort)
  Dim arrWork
  Dim intOuterIndex, intInnerIndex, intSmallestIndex
  Dim varTemp
  arrWork = arrToSort
  For intOuterIndex = 0 To UBound(arrWork)
    intSmallestIndex = intOuterIndex
    For intInnerIndex = intOuterIndex To UBound(arrWork)
      If isNumeric(arrWork(intInnerIndex)) and isNumeric(arrWork(intSmallestIndex)) Then
        If Cdbl(arrWork(intInnerIndex)) < Cdbl(arrWork(intSmallestIndex)) Then
          intSmallestIndex = intInnerIndex
        End If
      ElseIf arrWork(intInnerIndex) < arrWork(intSmallestIndex) Then
        intSmallestIndex = intInnerIndex
      End If
    Next
    If intSmallestIndex <> intOuterIndex Then
      varTemp = arrWork(intOuterIndex) : arrWork(intOuterIndex) = arrWork(intSmallestIndex) : arrWork(intSmallestIndex) = varTemp
    End If
  Next
  for x=0 to ubound(arrWork)
  arrToSort(x) = arrWork(x)
  next
End sub

'Definer arrayet
Dim arr(4)

var1=24
var2=30
var3=54
var4=4
var5=11
'Flyt var1->var5 ind i arrayet
arr(0) = var1
arr(1) = var2
arr(2) = var3
arr(3) = var4
arr(4) = var5

'Sorter arrayet
SortArray arr

'Udskriv arrayet
For i = 0 To UBound(arr)
  Response.Write(arr(i) & "<br>")
Next 
%>
Avatar billede cpufan Juniormester
20. februar 2005 - 23:32 #2
function fnSort(aSort, intAsc)
    Dim intTempStore
    Dim i, j
    For i = 0 To UBound(aSort) - 1
    For j = i To UBound(aSort)
    'Sort Ascending
    if intAsc = 1 Then
    if Cint(aSort(i))  > Cint(aSort(j)) Then
    intTempStore = aSort(i)
    aSort(i) = aSort(j)
    aSort(j) = intTempStore
    End if 'i > j
    'Sort Descending
    Else
    if Cint(aSort(i)) < Cint(aSort(j)) Then
    intTempStore = aSort(i)
    aSort(i) = aSort(j)
    aSort(j) = intTempStore
    End if 'i < j
    End if 'intAsc = 1
    Next 'j
    Next 'i
    fnSort = aSort
    End function 'fnSort
    '-------------------------
    Dim aUnSort(5), aSorted
    aUnSort(0) = var1
    aUnSort(1) = var2
    aUnSort(2) = var3
    aUnSort(3) = var4
    aUnsort(4) = var5
    'call the function
    'second argument:
    ' * ascending sorted = 1
    ' * descending sorting = any other chara
    '    cter
    aSorted = fnSort(aUnSort, 1)
    Erase aUnSort
Avatar billede ravnborg Nybegynder
20. februar 2005 - 23:43 #3
eagleeye:
Kan man ikke vende det om, sådan det største tal kommer først?
Avatar billede eagleeye Praktikant
20. februar 2005 - 23:45 #4
Jo man kan ændre det i funktionen:



sub SortArray(arrToSort)
  Dim arrWork
  Dim intOuterIndex, intInnerIndex, intSmallestIndex
  Dim varTemp
  arrWork = arrToSort
  For intOuterIndex = 0 To UBound(arrWork)
    intSmallestIndex = intOuterIndex
    For intInnerIndex = intOuterIndex To UBound(arrWork)
      If isNumeric(arrWork(intInnerIndex)) and isNumeric(arrWork(intSmallestIndex)) Then
        If Cdbl(arrWork(intInnerIndex)) > Cdbl(arrWork(intSmallestIndex)) Then
          intSmallestIndex = intInnerIndex
        End If
      ElseIf arrWork(intInnerIndex) > arrWork(intSmallestIndex) Then
        intSmallestIndex = intInnerIndex
      End If
    Next
    If intSmallestIndex <> intOuterIndex Then
      varTemp = arrWork(intOuterIndex) : arrWork(intOuterIndex) = arrWork(intSmallestIndex) : arrWork(intSmallestIndex) = varTemp
    End If
  Next
  for x=0 to ubound(arrWork)
  arrToSort(x) = arrWork(x)
  next
End sub
Avatar billede cpufan Juniormester
20. februar 2005 - 23:46 #5
retter / tilføjer lige lidt så du også får noget skrevet ud, jeg har også ændret så der kan bruges decimaltal:

<%
var1 = 3456
var2 = 34.56
var3 = -23
var4 = 0
var5 = 123

function fnSort(aSort, intAsc)
    Dim intTempStore
    Dim i, j
    For i = 0 To UBound(aSort) - 1
    For j = i To UBound(aSort)
    'Sort Ascending
    if intAsc = 1 Then
    if Cdbl(aSort(i))  > Cdbl(aSort(j)) Then
    intTempStore = aSort(i)
    aSort(i) = aSort(j)
    aSort(j) = intTempStore
    End if 'i > j
    'Sort Descending
    Else
    if Cdbl(aSort(i)) < Cdbl(aSort(j)) Then
    intTempStore = aSort(i)
    aSort(i) = aSort(j)
    aSort(j) = intTempStore
    End if 'i < j
    End if 'intAsc = 1
    Next 'j
    Next 'i
    fnSort = aSort
    End function 'fnSort
    '-------------------------
    Dim aUnSort(5), aSorted
    aUnSort(0) = var1
    aUnSort(1) = var2
    aUnSort(2) = var3
    aUnSort(3) = var4
    aUnsort(4) = var5
    'call the function
    'second argument:
    ' * ascending sorted = 1
    ' * descending sorting = any other chara
    '    cter
    aSorted = fnSort(aUnSort, 1)
    Erase aUnSort

for i = 0 to 5
response.write aSorted(i) & "<br>"
next
%>
Avatar billede cpufan Juniormester
20. februar 2005 - 23:48 #6
hvis du vil have det største først med min funktion skal du blot skrive

aSorted = fnSort(aUnSort,0) i 5.nederste linie (ca)
Avatar billede ravnborg Nybegynder
20. februar 2005 - 23:50 #7
Jeg har lige fordoblet point antallet, så i begge kan få.
Opret lige et svar cpufan


Tak for hjælpen.
Avatar billede eagleeye Praktikant
20. februar 2005 - 23:51 #8
Du kan også gøre det sådan her hvor man med en parameter kan vælge DESC eller ASC:

sub SortArray(arrToSort, sort)
  Dim arrWork
  Dim intOuterIndex, intInnerIndex, intSmallestIndex
  Dim varTemp
  arrWork = arrToSort
  For intOuterIndex = 0 To UBound(arrWork)
    intSmallestIndex = intOuterIndex
    For intInnerIndex = intOuterIndex To UBound(arrWork)
      if lcase(sort) = "desc" then
        val1 = arrWork(intSmallestIndex)
        val2 = arrWork(intInnerIndex)
      else
        val1 = arrWork(intInnerIndex)
        val2 = arrWork(intSmallestIndex)
      end if
      If isNumeric(val11) and isNumeric(val2) Then
        If Cdbl(val1) < Cdbl(val2) Then
          intSmallestIndex = intInnerIndex
        End If
      ElseIf val1 < val2 Then
        intSmallestIndex = intInnerIndex
      End If
    Next
    If intSmallestIndex <> intOuterIndex Then
      varTemp = arrWork(intOuterIndex) : arrWork(intOuterIndex) = arrWork(intSmallestIndex) : arrWork(intSmallestIndex) = varTemp
    End If
  Next
  for x=0 to ubound(arrWork)
    arrToSort(x) = arrWork(x)
  next
End sub



og så kalde dne sådan her:

'Sorter arrayet
SortArray arr, "desc"


Ellre sådan her:


'Sorter arrayet
SortArray arr, "asc"
Avatar billede cpufan Juniormester
20. februar 2005 - 23:51 #9
here you go
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