Avatar billede mansk Nybegynder
17. april 2002 - 15:23 Der er 18 kommentarer og
1 løsning

HJÆLP...

Jeg er ved at lave en opgave på Teknisk Skole.

Jeg skal lave en lix-beregner med tilhørende highscoreliste. Lixberegneren er lavet - men ikke highscorelisten.

Det fungerer på den måde at jeg skal hive en txt dokument ind i et array - hvordan gør jeg det???

Der efter skal jeg overskrive txt dokumentet med det nye array - hvordan gør jeg det???
Jeg kan godt få kontakt med tekstfilen og udskrive den -men jeg kan ikke få den lagt i et array...

Håber én eller anden kan hjælpe.
Avatar billede kimiwan Nybegynder
17. april 2002 - 15:26 #1
hvad er der i text dokumentet?
Avatar billede seraphiel Nybegynder
17. april 2002 - 15:27 #2
Gi' dem et stykke papir, hvor formlen til at regne lix ud er på.. :-S .. Sig det er et TXT-dokument..

<--- Er lidt plat.. :)
Avatar billede lenn Nybegynder
17. april 2002 - 15:29 #3
Text dokumentet indeholder flg.:

49, c:\inetpub\wwwroot\oblig_opg\testtekst.txt
47, c:\inetpub\wwwroot\oblig_opg\testtekst.txt
46, c:\inetpub\wwwroot\oblig_opg\testtekst.txt
43, c:\inetpub\wwwroot\oblig_opg\testtekst.txt
41, c:\inetpub\wwwroot\oblig_opg\testtekst.txt
41, c:\inetpub\wwwroot\oblig_opg\testtekst.txt
36, c:\inetpub\wwwroot\oblig_opg\testtekst.txt

som er de dokumenter med højeste lix-tal
Avatar billede lenn Nybegynder
17. april 2002 - 15:31 #4
Jeg er jo nød til at splitte dokumentet ved linieskift - eller hvad???
Avatar billede coltau Juniormester
17. april 2002 - 15:41 #5
Hvis du kan få kontakt med tekstfilen og udskrive den - så mangler du jo kun at skrive en ny tekstfil.

Hvis det kan hjælpe så er her koden for at skrive til en fil.

<%
  dim fso, f, filespec
  set fso = CreateObject("Scripting.FileSystemObject")
  filespec = Server.MapPath("\") & "\test\logfil.txt"
  Set f = fso.OpenTextFile(filespec,2) ' Åbn fil for skrivning
  f.WriteLine "Indhold af linie 1"
  f.WriteLine "Indhold af linie 2"
  f.Close
%>
Avatar billede kimiwan Nybegynder
17. april 2002 - 15:42 #6
i = 0 'arrays er nul-indekseret

'indlæs din text fil ind linje for linje vha. fso
'..for hver linje gør du sådan her:

arrLinje = split(denindlæstelinje,",")

'så kan du sætte:
arrFinalArray(0,i) = arrLinje(0)
arrFinalArray(1,i) = arrLinje(1)
i = i+1

'gå videre til næste linje indtil der ikke er flere linjer tilbage


forstår du, hvad jeg mener?

så vil du til sidst ha' et array der ser sådan her ud:

arrFinalArray(0,0) = "49"
arrFinalArray(1,0) = "c:\inetpub\wwwroot\oblig_opg\testtekst.txt"
arrFinalArray(0,1) = "47"
arrFinalArray(1,1) = "c:\inetpub\wwwroot\oblig_opg\testtekst.txt"
Avatar billede lenn Nybegynder
17. april 2002 - 15:47 #7
Problemet er at jeg ud fra et nyåbnet tekstdokument skal beregne lix tallet - det er klaret. Derefter skal jeg åbne en eksisterende highscore.txt. Så skal jeg tjecke om det nyfundne lix-tal er højt nok til at komme i highscore filen, som indeholder "top 10". Såfremt det er det - skal den nye lixtal lægges ind hvor den mindste lixtal lå. Derefter sorteres arrayet med top10 og ligges i et tekstdokument... Lidt af en opgave for en newbie
Avatar billede wittnezz Nybegynder
17. april 2002 - 15:51 #8
Var det ikke en ide at lægge hver linie i highscore.txt ind i en db-tabel. Derefter også den nye tekst-fil, men tilhørende lix-tal. Derefter trækkes de 10 (eller hvor mange der nu er på listen) tekstfiler med højeste lix-tal ud, og lægges over i en ny highscore.txt (der overskriver den gamle)

Ved godt det måske ikke er god programmerings-skik men på denne måde spares arbejdet på en sorterings-algoritme. (Den er jo indbygget i db'en)
Avatar billede mansk Nybegynder
17. april 2002 - 16:31 #9
wittnezz

Det er helt sikkert en god idé - men desværre ikke en del af opgaven :-(
Avatar billede kimiwan Nybegynder
17. april 2002 - 17:34 #10
mansk, tre spm:

- hvilken tekstfil er det, der skal hentes ind i et array??
- vil du ha' løsningen, eller vil du bare ha' koden?
- hvad betyder tallene 49, 47, 46, 43 etc.?
Avatar billede mansk Nybegynder
17. april 2002 - 18:30 #11
hvilken tekstfil er det, der skal hentes ind i et array??
- det er highscorelisten.
vil du ha' løsningen, eller vil du bare ha' koden?
- Koden ville være optimalt, men løsningen er ok...
hvad betyder tallene 49, 47, 46, 43 etc.?
- det er lixtallene for foregående beregninger - jo højere tal des højere placering skal de have. Hvis der fx kommer en beregning der giver 60 skal den sættes ind og den med det mindste tal smides ud...
Avatar billede mansk Nybegynder
17. april 2002 - 19:31 #12
Nu udskriver den 1. linie men melder derefter flg. fejl:

Der opstod en Microsoft VBScript-kørselsfejl fejl '800a000d'
Typerne stemmer ikke overens: 'ArrFinal'
/opg/lix.asp, linje 93
Avatar billede coltau Juniormester
17. april 2002 - 21:34 #13
Jeg kunne ikke lade være - denne kode åbner filen og indlæser hver linie i et array - derefter genneløbes arrayet og linierne gemmes i samme fil og når det er passende så puttes den nye linie ind i mellem.

En indlæsning - sortering under udlæsning.

<%
  ' Funktion til udtræk at første tal i en linie
  function GetNum(L)
    GetNum = CInt(Left(L, inStr(L, ",") - 1)) ' Returner som Integer
  end function

  ' Ny linie som skal puttes ind i mellem
  NyLix = "42, c:\inetpub\wwwroot\oblig_opg\testtekst.txt"
  NyLixNum = GetNum(NyLix) ' Find værdien af nye linie

  dim fso, f, filespec
  dim arrLix

  ' *** Indlæs filen i arrLix
  set fso = CreateObject("Scripting.FileSystemObject")
  filespec = Server.MapPath("lix.max")
  Set f = fso.OpenTextFile(filespec, 1) ' Åbn inputfil for læsning
  arrLix = Split(f.ReadAll, vbCrLf) ' Læs hele filen og split den op linie for linie i arrLix
  f.Close ' Luk inputfilen igen

  ' Herefter udlæses linierne igen - og den nye linie puttes ind hvor NyLixNum passer i listen
  Set f = fso.OpenTextFile(filespec, 2) ' Åbn outputfil for skrivning
  Used = False ' Den nye linie er ikke læst ud i filen
  for each Line in arrLix ' Gennemløb alle linier i arrLix
    if Line <> "" then
      if not Used and (NyLixNum > GetNum(Line)) then
        f.WriteLine NyLix ' gem nye linie i fil
        Used = True ' Den nye linie er nu læst ud i filen
      end if
      f.WriteLine Line ' gem gamle linie i fil
    end if
  next
  f.Close ' Luk outputfilen igen
%>

Håber du kan få lidt ud af det.
Avatar billede mansk Nybegynder
18. april 2002 - 09:10 #14
Det virker!!! Tak...

Nu mangler jeg bare noget der kan fjerne den laveste placering og genoprette filen...
Avatar billede coltau Juniormester
18. april 2002 - 10:04 #15
Den var værre man kan ikke bare skrive "for each Line in arrLix - 1"

Men det kan løses ved at "stacke" linierne i stedet for at skrive dem til filen direkte - således at det altid er den forrige linie der skrives til filen. (Eller kald det skrivning til fil med en linies forsinkelse og "glem" at skrive den sidste linie.)
her er koden. Jeg har skrevet TILFØJET efter de ændringer det har medført

<%
  ' Funktion til udtræk at første tal i en linie
  function GetNum(L)
    GetNum = CInt(Left(L, inStr(L, ",") - 1)) ' Returner som Integer
  end function

  ' Ny linie som skal puttes ind i mellem
  NyLix = "42, c:\inetpub\wwwroot\oblig_opg\testtekst.txt"
  NyLixNum = GetNum(NyLix) ' Find værdien af nye linie

  dim fso, f, filespec
  dim arrLix, StackLine ' TILFØJET StackLine

  sub StackL(Line) ' TILFØJET Funktion til skrivning til fil med 1 linies forsinkelse
    if StackLine <> "" then
      f.WriteLine StackLine ' Gem linie i fil
    end if
    if Line <> "" then
      StackLine = Line
    end if
  end sub

  ' *** Indlæs filen i arrLix
  set fso = CreateObject("Scripting.FileSystemObject")
  filespec = Server.MapPath("lix.max")
  Set f = fso.OpenTextFile(filespec, 1) ' Åbn inputfil for læsning
  arrLix = Split(f.ReadAll, vbCrLf) ' Læs hele filen og split den op linie for linie i arrLix
  f.Close ' Luk inputfilen igen

  ' Herefter udlæses linierne igen - og den nye linie puttes ind hvor NyLixNum passer i listen
  Set f = fso.OpenTextFile(filespec, 2) ' Åbn outputfil for skrivning
  Used = False ' Den nye linie er ikke læst ud i filen
  for each Line in arrLix ' Gennemløb alle linier i arrLix
    if Line <> "" then
      if not Used and (NyLixNum > GetNum(Line)) then
        Call StackL(NyLix) ' gem nye linie i fil TILFØJET Call StackL
        Used = True ' Den nye linie er nu læst ud i filen
      end if
      Call StackL(Line) ' gem gamle linie i fil TILFØJET Call StackL
    end if
  next
  f.Close ' Luk outputfilen igen
%>
Avatar billede mansk Nybegynder
18. april 2002 - 10:33 #16
Jeg prøver lige...
Avatar billede mansk Nybegynder
18. april 2002 - 10:46 #17
Det virker - takker 1000 gange... du får lige en bunke point, for en stor hjælp
Avatar billede coltau Juniormester
18. april 2002 - 11:19 #18
Tak - tak :-)
Avatar billede lenn Nybegynder
18. april 2002 - 14:12 #19
eller - det vil sige at det ikke virker helt efter hensigten. Det var meningen at, hvis det nye lixtal ikke var større end nogle af de eksisterende, skulle der ikke ske noget som helst... men det gør der...
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