<% Dim arrRandomNumbers(20), intMaxValue Randomize timer for i = 1 to UBound( arrRandomNumbers ) arrRandomNumbers( i ) = Int( ( UBound( arrRandomNumbers ) + 1) * Rnd ) next
for i = UBound(arrRandomNumbers) - 1 To 0 Step -1 for j= 0 to i if arrRandomNumbers(j)>arrRandomNumbers(j+1) then temp=arrRandomNumbers(j+1) arrRandomNumbers(j+1)=arrRandomNumbers(j) arrRandomNumbers(j)=temp end if next next
for i = 1 to 3 Response.Write arrRandomNumbers( i ) & "<br>" next %>
Jeg ser nu, at programstumpen kun vil virke, hvis tallene er forskellige. Hvis det ikke er tilfældet skal der ændres noget. jeg vender tilbage om lidt.
Hvis 1,2,3,1,2,3,1,2,3 er dine tal, så antager jeg, at det er tallene 3, 2, 1, du vil have pillet ud og ikke 3,3,3. Her er et forbedret forslag: A=tal(0): B=A: C=A for i=1 to Ubound(tal) D=tal(i) if D=A or D=B or D=C then 'Gør ingenting elseif D>A then C=B B=A A=D elseif D>B then C=B B=D elseif D>C then C=D end if next
- du har en række tilfeldige tal (fx 1 9 5 3 1 8 5 9) - af disse skal du hænte ud 1., 2. og 3. "pladsen", hvor 1. pladsen er den aller højeste værdi ( i dette tilfælde, 9 ). - Hvis man sorterer denne række tal, hvor det højeste tal skal være nummer 1, så vil du få rækken 9 9 8 5 5 3 1 1 - Ud fra denne række, skal du så hente de tre første pladser (dvs 9 9 8), eller de 3 højeste værdier (dvs 9 8 5) ?
Hvis du vil have de 3 første pladser, så kan du bruge mit indlæg, postet kl 16/01-2004 18:29:53, hvis du vil have de 3 højeste værdier, så kan du bruge nmh sit forslag, selv om jeg ville have skrevet det på en lidt anden måde som er lidt mere overskuelig:
A=0: B=A: C=A for i=1 to Ubound(tal) if A < tal(i) then A = tal(i) i = 0 elseif B < tal( i ) And tal( i ) < A then B = tal( i ) i = 0 elseif C < tal( i ) And tal( i ) < B then C = tal( i ) end if next Response.Write( A & " : " & B & " : " & C )
If sumsvar > 5 then if Coolness > A then C = B B = A if Asv < Sumsvar then A = Coolness Ar = RS("ID") Asv = Sumsvar end if elseif Coolness > B then C = B if Bsv < Sumsvar then B = Coolness Br = RS("ID") Bsv = Sumsvar end if elseif Coolness > C then if Csv < Sumsvar then C = Coolness Cr = RS("ID") Csv = Sumsvar end if end if end if
Jeg er stadig ikke tilfreds med min løsning. Der vil være situationer, hvor det ikke virker. Vi må først lige have på det rene, hvad der skal ske, hvis der er gengangere. Prøv at sige noget mere om betydningen af D-værdierne i forhold til G-værdierne.
- "for hvert tal der kommer ind" ?? kommer ind hvor ? - "hvis dette tals værdi er for lav, kommer tallet ikke med i beregningen" ?? Hvilken beregning ??
Du snakkede om at hive de 3 højeste tal ud fra en række tal ... du sagde ikke noget om beregninger.
Du begynder at hive ind endu en tabel med tal ... hvad skal denne bruges til ? Er det sådan at forstå at du skal hive de 3 højeste værdier ud fra G og sammenligne disse 3 med de højeste tal fra D. *Hvis* der er en D der er højere end en af de 3 fra G, så skal man bruge D værdien istedenfor ?
- "altid var den G værdi med den højeste D værdi der blev brugt" ... vil det sige at du vil hive ud de 2 højeste værdier fra G og den højeste fra D, eller skal det være de 3 højeste fra de to tabeller til sammen der gælder ?
Det nytter ikke at du kommer med kodeeksempler ... du er nødt til at forklare med ord hvad der er du prøver på !!
jeg har et script... som henter samtlige filer i en mappe...
for hver fil hentes Data om filen i en database..
Fra disse data laves en "D" værdi ogse set som Sumsvar, som er antallet af stemmer på Filen (G)
For hver Fil G, beregnes der en Procent (ABC) og (D = Coolness)
nu kommer If sætningerne...
Hvis Sumsvar er over 5 for filen G, (mere end 5 har stemt på Filen), beregnes ABC dvs.. Fil A har flest stemmer og højest Procent Fil B nestmest Fil C nestmest igen
Dvs ... du skal hive ud alle fra D der er højere end 5 ? Og ud fra disse skal du hive ud dem der har højest værdi ? Altså hive ud de filer der har fået flest stemmer ?
ABC; er dét det samme som Fil A, Fil B og Fil C ?
Jeg er ked af at sige det, men du forklarer dig ikke særlig godt :-|
Du har altså et antal filer, som hver har fået et antal stemmer. Blandt disse vil du kun se på dem, hvor flere end 5 har stemt på filen. Du vil nu finde de filer, blandt filerne med stemmetal>5, der har højst stemmetal. Er det rigtigt forstået? Men hvis tre filer har samme stemmetal og flest stemmer, så er det vel disse tre filer, der skal udvælges. Har jeg forstået dig ret nu?
Jeg er slet ikke med. Prøv at give et konkret eksempel, hvor du for hver fil angiver de data, der er relevante, og hvor du fortæller, hvordan kåringen skal laves.
så kan du stadig bruge mit første eksempel ... men med 2 små modifikationer:
Dim arrRandomNumbers(20), intMaxValue Randomize timer for i = 1 to UBound( arrRandomNumbers ) arrRandomNumbers( i ) = Int( ( UBound( arrRandomNumbers ) + 1) * Rnd ) next
for i = UBound(arrRandomNumbers) - 1 To 0 Step -1 for j= 0 to i if arrRandomNumbers(j)<arrRandomNumbers(j+1) then temp=arrRandomNumbers(j+1) arrRandomNumbers(j+1)=arrRandomNumbers(j) arrRandomNumbers(j)=temp end if next next
for i = 1 to 3 if( arrRandomNumbers( i ) > 5 ) then Response.Write arrRandomNumbers( i ) & "<br>" end if next
IMens jeg venter, vil jeg lave den kode, der piller de tre største tal ud af en tabel. Hvis der er gengangere, kunne det måsek blive til 10, 10, 5 eller 10, 10, 10 eller 10, 5, 5
Jeg vil ikke bruge sortering. Det er selvfølgelig det simpleste, men ikke effektivt i denne situation.
Vi vil finde de 3 største værdier i tabellen tal. Hvis der er gengangere kan det være at nogle af disse bliver ens. Det antages, at der er mindst 3 tal i tabellen. Hvis tallene er 5,4,5,4,2,6 vil A,B,C være 6,5,5
sub ombyt(x,y) dim z z=x: x=y: y=z end sub
A=tal(0): B=tal(1): C=tal(2) if B>A then ombyt A,B if C>B then ombyt B,C if B>A then ombyt A,B 'Nu er A,B,C ordnet efter størrelse for i=3 to Ubound(tal) tmp=tal(i) if tmp>=A then C=B: B=A: A=tmp elseif tmp>=B then C=B: B=tmp elseif tmp>C then C=tmp end if next
Prøv at bruge min kode her : til at vise mig hvorn hulan jeg gør ? Det skal være sådan at (A,B,C)sv holder den værdi som hedder Sumsvar... dernæst (A,B,C)r holder den gældene RS("ID") værdi - alt dette når sorteringen er færdig... A,B,C skal være "coolness" værdien:
dim A,B,C,Ar,Br,Cr,Asv,Bsv,Csv
For each Folder in objFolder.SubFolders If Left(Folder.Name,1) <> "-" Then
Set objFSO = CreateObject("Scripting.FileSystemObject") Set objFolder = objFSO.GetFolder(strPhysicalPath & "\" & Folder.Name) Set objFolderContents = objFolder.Files For Each objFileItem in objFolderContents
Set Conn = Server.CreateObject("ADODB.Connection") Conn.open "DRIVER={Microsoft Access Driver (*.mdb)}; DBQ=" & Server.MapPath("..\..\db\CarPolls.mdb") Set RS = Server.CreateObject("ADODB.Recordset") SQL = "Select * FROM poll where Car =" & "'cars/" & Folder.Name & "/" & objFileItem.Name & "'" RS.Open SQL, Conn, 3, 3
Dim Sumsvar, Coolness Dim intRed, intGreen, intBlue, strColor Dim sv1, sv2, sv3, sv4, sv5, sv6
Jeg vil meget gerne hjælpe dig, men jeg er stadig ikke helt med. If sumsvar>5 then 'hvad er det der skal kigges på her? 'er det coolness eller sumsvar? 'er det rs("ID") der også sakl gemmes end if
Det jeg nu har forstået er, at du både får et tal der skal gemmes, hvis det er større end et af de indtil da fundne 3 største tal, men der skal vel også gemmes et navn, som kan identificere, hvem "vinderen" er. Hvis de tallene er 10, 10, 9, 6,7,8 så er vinderne vle 10, 10 og 9. har jeg ret?
Nu er jeg lidt mere med, men stadig ikke helt. A, B, C er det så de største coolness-værdier? Jeg skal nu til at se Goldfinger m.m., men jeg håber at gå på igen senere. Så regner jeg med at komme med en løsning.
Det er nødvendigt at starte med at indlæse 3 poster for at kunne komme i gang. Så har man A, B, C etc og kan putte de næste poster ind, hvis de har størrer coolness. Du skal lige FØR sætningen
Her er så et der skal være derinde: (det skal altså ind, der hvor der står 'herinde ovenfor)
if init then n=n+1 select case n case 1 A=Coolness: Asv=sumsvar: Ar=RD("ID") case 2 if Coolness>A then B=A: Bsv=Asv: Br=Ar A=Coolness: Asv=sumsvar: Ar=RD("ID") else B=Coolness: Bsv=sumsvar: Br=RD("ID") end if case 3 if coolness>=A then C=B: Csv=Bsv: Cr=Br B=A: Bsv=Asv: Br=Ar A=Coolness: Asv=sumsvar: Ar=RD("ID") elseif tmp>=B then C=B: Csv=Bsv: Cr=Br B=coolness: Bsv=sumsvar: Br=RD("ID") else C=Coolness: Csv=sumsvar: Cr=RD("ID") end if init=false end select else if coolness>=A then C=B: Csv=Bsv: Cr=Br B=A: Bsv=Asv: Br=Ar A=Coolness: Asv=sumsvar: Ar=RD("ID") elseif coolness>=B then C=B: Csv=Bsv: Cr=Br B=coolness: Bsv=sumsvar: Br=RD("ID") elseif coolness>C then C=Coolness: Csv=sumsvar: Cr=RD("ID") end if end if
Hvis der er et katalog uden filer eller et katalog, hvor coolness for alle filer er mindre end 5, bliver der ikke gjort opmærksom på denne situation. Der bliver kun udskrevet 0'er.
ikke for at skuffe dig alt for meget... men jeg startede en ny tråd, hvor jeg spurgte lidt anderledes... og det viste sig at der var en enkel løsning:
If sumsvar > 5 then if A < coolness then C = B B = A A = coolness Csv = Bsv Cr = Br Cn = objFSO.GetBasename(Server.Mappath(objFileItem.Name)) Cc = strColor Bsv = Asv Br = Ar Bn = objFSO.GetBasename(Server.Mappath(objFileItem.Name)) Bc = strColor Asv = sumsvar Ar = RS("Car") An = objFSO.GetBasename(Server.Mappath(objFileItem.Name)) Ac = strColor
elseif A = coolness then if B = coolness then C = coolness Csv = sumsvar Cr = RS("Car") Cn = objFSO.GetBasename(Server.Mappath(objFileItem.Name)) Cc = strColor else B = coolness Bsv = sumsvar Br = RS("Car") Bn = objFSO.GetBasename(Server.Mappath(objFileItem.Name)) Bc = strColor end if
elseif B < coolness then C = B Csv = Bsv Cr = RS("Car") Cn = objFSO.GetBasename(Server.Mappath(objFileItem.Name)) Cc = strColor B = coolness Bsv = sumsvar Br = RS("Car") Bn = objFSO.GetBasename(Server.Mappath(objFileItem.Name)) Bc = strColor elseif B = coolness then C = coolness Csv = sumsvar Cr = RS("Car") Cn = objFSO.GetBasename(Server.Mappath(objFileItem.Name)) Cc = strColor elseif C < coolness then C = coolness Csv = sumsvar Cr = RS("Car") Cn = objFSO.GetBasename(Server.Mappath(objFileItem.Name)) Cc = strColor end if end if
Desuden kan jeg ikke acceptere... da Eksperten.dk ikke virker - ihvertfald ikke som den plejer... accepter knappen "refresher" bare siden....
Jeg lavede min løsning, så den virkede også for negative tal. Hvi du på forhånd ved, at alle coolness-værdier er større eller lig 0, kunne kan det simplificeres. Såkan du nøjes med
if sumsvar>5 then if coolness>=A then C=B: Csv=Bsv: Cr=Br B=A: Bsv=Asv: Br=Ar A=Coolness: Asv=sumsvar: Ar=RD("ID") elseif coolness>=B then C=B: Csv=Bsv: Cr=Br B=coolness: Bsv=sumsvar: Br=RD("ID") elseif coolness>C then C=Coolness: Csv=sumsvar: Cr=RD("ID") end if end if
mon ikke eksperten nu igen virker normalt?
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.