Avatar billede JZA Nybegynder
07. maj 2012 - 18:08 Der er 14 kommentarer og
1 løsning

Nedskriv største værdi med én.

Jeg har et Array med 6 variabler eks. Array(Y100, YN100, Y200, YN200, Y500, YN500). Ud af disse variabler har kun 2 eller 3 en værdi der er større end nul. resten er nul i sammenhængen.
Hvordan finder jeg variablen med den største værdi og tilskriver den én? Forstået på den måde at hvis eks. Y100 er den største og at den har en værdi på 14. Efterfølgende skal den så være 15.
Avatar billede mireigi Novice
07. maj 2012 - 18:45 #1
Nu er jeg ikke sikker på syntaksen i VB, men noget i denne stil, må du kunne bruge:

Dim index As Int = Int.Min 'Assign minimum value to index

For i = 0 To UBound(Array)
  If Array(i) > index Then
      index = i
  End If
Next

Array(index) = Array(index) + 1
Avatar billede JZA Nybegynder
08. maj 2012 - 20:38 #2
Tak for et godt input.
Jeg har prøvet at arbejde lidt med det og har fortsat et par spørgsmål:
Med ovenstående kode vælger den ikke den største værdi som er forskellig fra nul. den vælger den sidste værdi som er forskellig fra nul i Arrayet.
Hvis Y100 er den største værdi, så skal den stå som den sidste værdi i arrayet. ellers vælges den ikke.
En anden problemstilling er, at jeg skal have tilskrevet værdien 1 til Y100, så jeg kan køre et Do Loop med alle variabler incl. den nye Y100 værdi. Ovenstående Array(index) = Array(index) + 1 ændre ikke Y100 værdien.
Jeg kan ikke skrive Y100 = Y100 + 1, for det er kun tilfældet hvis Y100 er den største.
Avatar billede mireigi Novice
09. maj 2012 - 00:36 #3
My bad, skrev et tidligere udkast om. Det her er sådan det bør være:
Dim index As Int = -1
Dim maxValue As Int = Int.Min 'Assign minimum value to index

For i = 0 To UBound(Array)
  If Array(i) > maxValue Then
      index = i
      maxValue = Array(i)
  End If
Next

Array(index) = Array(index) + 1
Avatar billede JZA Nybegynder
09. maj 2012 - 21:48 #4
Endnu en gang tak for input.
Jeg er nu med på hvordan den største værdi findes i Arrayet. og det er jeg sikker på at jeg nok skal kunne få kombineret ind, så jeg både kan vælge den største og den mindste værdi.
Det eneste jeg nu mangler er at jeg skal have tilskrevet værdien 1 til Y100, så jeg kan køre et Do Loop med alle variabler incl. den nye Y100 værdi. Ovenstående Array(index) = Array(index) + 1 ændre ikke Y100 værdien.
Jeg kan ikke skrive Y100 = Y100 + 1, for det er kun tilfældet hvis Y100 er den største.

Her er lige et udpluk af det program jeg skriver, hvor jeg har brugt din kode:
 
    YValue = Array(Y100, YN100, Y200, YN200, Y500, YN500, Y1000, YN1000, Y2000, YN2000, Y5000, YN5000, Y10000, YN10000)
    If Y100 + YN100 + Y200 + YN200 + Y500 + YN500 + Y1000 + YN1000 + Y2000 + YN2000 + Y5000 + YN5000 + Y10000 + YN10000 < X Then
    For i = 0 To UBound(YValue)
      If YValue(i) > MaxValue Then
          index = i
          MaxValue = YValue(i)
      End If
    Next
    YValue(index) = YValue(index) + 1
    End If

Ovenstående skal jeg have ind i et Do Loop, så hvis summen fortsat er mindre end X, skal køres igen. Det betyder at den største Y/YN værdi (son nu vælges rigtigt) skal tildeles værdien én. Som det er nu, er det kun YValue(index) der justeres med én.
Håber at du også har en løsning på denne problemstilling.
Tak.
Avatar billede mireigi Novice
09. maj 2012 - 22:18 #5
Jeg er ikke helt med på, hvad du gerne vil opnå. Koden jeg har givet forøger netop værdien på en bestemt position i arrayet med 1.
Avatar billede JZA Nybegynder
10. maj 2012 - 08:50 #6
Når jeg debugger til og med End if i nedenstående, og efterfølgende ser værdien på YValue(index) så er den 14 + 1 = 15. Det er helt som det skal være, for Y100 er den største værdi = 14.
Det jeg gerne vil have er, at Y100 også skifter til 15. I nedenstående kode beholder Y100 værdien 14.

Sub LinierInterpolation()
 
    Dim Y100 As Long, YN100 As Long, Y200 As Long, YN200 As Long, Y500 As Long, YN500 As Long, Y1000 As Long
    Dim YN1000 As Long, Y2000 As Long, YN2000 As Long, Y5000 As Long, YN5000 As Long, Y10000 As Long, YN10000 As Long
    Dim Val() As Long, X As Long, Y As Long, Factor As Double, v As Long, k As Long, interval As Integer, interval1 As Integer, interpol As Integer
    Dim index As Integer, MaxValue As Integer, Val2() As Long
    Dim rCell As Range
   
    Y200 = 7
    Y100 = 14
    X = 16
   
YValue = Array(Y100, YN100, Y200, YN200, Y500, YN500, Y1000, YN1000, Y2000, YN2000, Y5000, YN5000, Y10000, YN10000)
    If Y100 + YN100 + Y200 + YN200 + Y500 + YN500 + Y1000 + YN1000 + Y2000 + YN2000 + Y5000 + YN5000 + Y10000 + YN10000 < X Then
    For i = 0 To UBound(YValue)
    If YValue(i) > MaxValue Then
    index = i
    MaxValue = YValue(i)
    End If
    Next
    YValue(index) = YValue(index) + 1
    End If
End Sub
Avatar billede mireigi Novice
10. maj 2012 - 15:55 #7
Kan du ikke bare nøjes med at have værdierne i arrayet?

YValue = Array(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)

Dim Val() As Long
Dim X As Long
Dim Y As Long
Dim Factor As Double
Dim v As Long
Dim k As Long
Dim interval As Integer
Dim interval1 As Integer
Dim interpol As Integer

Dim index As Integer
Dim MaxValue As Integer
Dim totalValue As Long
Dim Val2() As Long

Dim rCell As Range


YValue(2) = 7
YValue(0) = 14
X = 16

For i = 0 To UBound(YValue)
  totalValue = totalValue + YValue(i)
Next

If totalValue < X Then
  For i = 0 To UBound(YValue)
      If YValue(i) > MaxValue Then
        index = i
        MaxValue = YValue(i)
      End If
  Next
  YValue(index) = YValue(index) + 1
End If
Avatar billede JZA Nybegynder
10. maj 2012 - 23:13 #8
Værdierne af Y100 til YN10000 er nogle optalte Case værdier fra tidligere i programmet. Eks. 14 værdier ramme inden for intervallet 1 til 20000 og 7 værdier rammer inden for intervallet 20001 til 30000.

Programafsnit fra et Do loop:

Select Case Val(1, Y - 1) + interval
                    Case 0 To 20000
                        interval = 100
                        Y100 = Y100 + 1
                    Case 20001 To 30000
                        interval = 200
                        Y200 = Y200 + 1
                    Case 30001 To 40000
                        interval = 500
                        Y500 = Y500 + 1
                    Case 40001 To 50000
                        interval = 1000
                        Y1000 = Y1000 + 1
                    Case 50001 To 70000
                        interval = 2000
                        Y2000 = Y2000 + 1
                    Case 70001 To 100000
                        interval = 5000
                        Y5000 = Y5000 + 1
                    Case 100001 To 150000
                        interval = 10000
                        Y10000 = Y10000 + 1

Mener du at jeg kan referere til en bestemt plads i arrayet i stedet for at have en ovenstående variabler? Eks Y100 erstattes med YValue(0)i ovenstående?
Avatar billede mireigi Novice
11. maj 2012 - 01:08 #9
Ja, det ville jeg gøre i stedet for.
Avatar billede JZA Nybegynder
11. maj 2012 - 08:26 #10
Tak for det. det prøver jeg.
Sidste gang jeg skulle overføre point gik det galt og jeg kom til at give dem til mig selv.
Jeg håber at det går bedre denne gang, men ellers må du lige sige til.
Avatar billede JZA Nybegynder
11. maj 2012 - 08:27 #11
Tak for hjælpen
Avatar billede mireigi Novice
11. maj 2012 - 11:58 #12
Velbekomme.

En god regel er aldrig at ligge et svar, medmindre du selv har fundet på løsningen :)
Avatar billede JZA Nybegynder
11. maj 2012 - 13:11 #13
Har du modtaget point?
Avatar billede mireigi Novice
11. maj 2012 - 15:41 #14
Ja, det har jeg :)
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