25. april 2001 - 22:28Der er
3 kommentarer og 1 løsning
Sortering og beregningsrutine.
Jeg sidder og arbejder på et program, der skal kunne tage en liste af tal, og lave en beregning på hvordan det er smartest at fordele værdierne.
Tallene har hver knyttet en idtekst til sig og ligger hulter til bul- ter i et array i formatet
idtekst, tal
Det jeg søger er hjælp til en rutine, der kan beregne hvordan det vil være smartest at fordele tallene i X antal nye arrays, således at når man lægger tallene sammen i hvert enkelt af de nye arrays, er de for- delt således at værdierne for hvert enkelt array kommer tættest på et max man har forudbestemt....
Så at det eneste array der kommer spild i er array4
Det kunne også være at der er flere array der ikke kan nå op på MAX værdi, men det skulle rutinen jo kunne beregne.
Jeg kan godt sortere et array således at jeg får tallene i rækkefølge efter værdi, det har jeg noget kode til, men jeg mangler en ide til hvordan man kan lave en rutine der kan beregne placeringen i de X antal array der nu er nødvendig i forhold til MAX værdi.
Er der en grænse for hvor mange tal, der må være i hver array ? Eller er det kun vigtigt at summen af arrayet rammer grænseværdien ? Er antallet af arrays vigtige ? Skal der være så få arrys som muligt eller....?
Jeg har tilføjet et gruppenummer til dit array!!! Det er således ikke flere nye arrays, som returneres men derimod opdateres dit nummerfelt
[code start]
Public Type group text As String value As Long number As Long End Type
Public Function testArrayG(maxVærdi As Long)
\' Dan arrayG Dim arrayG(9) As group, i As Integer, j As Integer For i = 1 To 9 arrayG(i).text = \"Tal \" & i arrayG(i).value = Choose(i, 10, 7, 1, 8, 12, 18, 24, 2, 5) arrayG(i).number = 0 Next
\' Sortér arrayG efter faldende værdi For i = 1 To 8 For j = i + 1 To 9 If arrayG(i).value < arrayG(j).value Then arrayG(0) = arrayG(i) arrayG(i) = arrayG(j) arrayG(j) = arrayG(0) End If Next Next
\' Angiv hvilket nummer hvert element tilhører Dim ma As Long, nu As Long While ma <> maxVærdi ma = maxVærdi nu = nu + 1 For i = 1 To 9 If arrayG(i).value <= ma And arrayG(i).number = 0 Then arrayG(i).number = nu ma = ma - arrayG(i).value End If Next Wend
\' udskriv arrayG For i = 1 To 9 MsgBox arrayG(i).text & \": \" & arrayG(i).value & \" - \" & arrayG(i).number Next
Det er vigtigt at summen kommer så tæt på som muligt, den behøver ikke nødvendigvis at ramme grænse værdien.
Der er ingen begrænsninger på hvor mange værdier der må være i et array, men der skal gerne være så få array som muligt.
Jeg ved godt at det er en svær opgave og den kan for så vidt godt løses på den måde som proaccess viser med at tage et mindre og mindre tal indtil at man når den pågældende værdi, men jeg har behov for en mere komplex rutine der kan tage højde for at en værdi måske kunne være udnyttet bedre i et andet array, ved f.eks. at bytte den ud med 2 mindre værdier osv...
Proaccess:
Jeg vil ikke helt afvise dit svar med det samme, for der er en god ide bag det.
Den funktion jeg søger skal kunne bruges på et array med X antal tal, således at jeg f.eks. kan læse værdier ind fra en tekst-fil eller en database.
Alle:
En anden ting i skal lægge mærke til er at der er 2 værdier i mit array, 1 for talværdien og en tekstværdi der er som en slags beskrivelse, teksten skal selvfølgelig følge tallene, men det er kun dem som er vigtige i sorteringen.
Eftersom der ikke er vist yderligere interesse selvom jeg er kommet med flere forklaringer, har jeg selv løst problemet ved at søge hjælp andetsteds.
Desværre.
Synes godt om
Ny brugerNybegynder
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.