Avatar billede wampiro-uha Nybegynder
06. december 2003 - 13:05 Der er 28 kommentarer og
1 løsning

String-liste til Int-liste.

Hvis jeg denne liste i SML:
["7,1,5", "8,-2,1", "0,3,4", "0,5,-1", "10,5,3", "7,-8,1", "-5,8,0", "4,5,6"]
hvordan får jeg så lavet den om til en liste som indeholder helttal (int) så jeg kan arbejde med tallene.
Skal nok gøres så det bliver en liste af lister, måske!
Avatar billede wampiro-uha Nybegynder
06. december 2003 - 13:32 #1
Sætter pointene lidt op.
Avatar billede wampiro-uha Nybegynder
06. december 2003 - 14:26 #2
Det skal vel bare komme til at se således ud:
[[7,1,5],[8,-2,1]osv...]
Avatar billede busschou Praktikant
06. december 2003 - 15:28 #3
følgende skal bruges
funktion til at explode en string
funktion til at rense kommaer ud af den explodede string og samtidig gøre hvert char til sin egen string
funktion til at lave string om til int option for derefter at finde option
funktion til at køre ovenstående..

Kan prøve at komme med et udkast?
Avatar billede busschou Praktikant
06. december 2003 - 15:40 #4
load "Int";

val stringListe = ["7,1,5", "8,~2,1", "0,3,4", "0,5,~1", "10,5,3", "7,~8,1", "~5,8,0", "4,5,6"]

(* Danner en Char liste fra en String *)
fun StringToCharListe x = explode x

(* Fjerner kommaer samt sætter minuset sammet med Char´en for tallet *)
fun OnlyInt x = let fun RemoveComma []      = []
                      | RemoveComma (y::ys) = if y = #"," then RemoveComma ys
                                                  else y::RemoveComma ys
                    fun PasteMinus []      = []
                      | PasteMinus (z::zs) = if z = #"~" then (implode[z,hd zs])::PasteMinus (tl zs)
                                                else (implode [z])::PasteMinus zs
                in PasteMinus(RemoveComma x)
                end

(* Danner en int liste af en string indeholdende tre int sepereret med to kommaer *)                         
fun ExtractIntFromString x = [valOf(Int.fromString(List.nth(x,0))),valOf(Int.fromString(List.nth(x,1))),valOf(Int.fromString(List.nth(x,2)))]

(* Danner en int liste fra en liste af strings som beskrevet ovenfor *)
fun IntListeFromStringListe x = let fun GetInt []      = []
                                      | GetInt (y::ys) = (ExtractIntFromString(OnlyInt(StringToCharListe y)))::GetInt ys
                                in GetInt x
                                end

val IntListe = IntListeFromStringListe stringListe ;
Avatar billede busschou Praktikant
06. december 2003 - 15:42 #5
kan se at sammenhængen ikke er så god her
så skriv en email adresse hvis det er ... så finder vi ud af det :o)
Avatar billede wampiro-uha Nybegynder
06. december 2003 - 15:46 #6
Jeg har lavet en lille fejl. Uddata er:
"[0.0,5.0,5.0][0.0,-5.0,5.0][0.0,-5.0,-5.0][0.0,5.0,-5.0][10.0,5.0,5.0][10.0,-5.0,5.0][10.0,-5.0,-5.0][10.0,5.0,-5.0]" : string

Så det endelige data skal nok være en liste af lister med tal af typen Real i.
Hjælper det eller skal vi stadig snakke over mail?
Avatar billede busschou Praktikant
06. december 2003 - 15:49 #7
Det gør jo ikke så meget - så skal der bare rettes til Real.fromString i stedet for Int.fromString
Avatar billede wampiro-uha Nybegynder
06. december 2003 - 15:52 #8
jeg får fejlen:

! Type clash: expression of type
!  string
! cannot have type
!  string list
Avatar billede busschou Praktikant
06. december 2003 - 15:52 #9
ahh jo så er det jo en forskel - men jeg må desværre springe fra her, da det mistænkelig meget minder om noget jeg har eksamens opgave i nu! og vil ikke risikere at få at vide jeg har lavet eksamens snyd :o( .... sorry men held og lykke
Avatar billede wampiro-uha Nybegynder
06. december 2003 - 15:53 #10
Ser således ud, bare for du kan tjekke ;-)

(* Danner en Char liste fra en String *)
fun StringToCharListe x = explode x

(* Fjerner kommaer samt sætter minuset sammet med Char´en for tallet *)
fun OnlyInt x = let fun RemoveComma []      = []
                      | RemoveComma (y::ys) = if y = #"," then RemoveComma ys
                                                  else y::RemoveComma ys
                    fun PasteMinus []      = []
                      | PasteMinus (z::zs) = if z = #"~" then (implode[z,hd zs])::PasteMinus (tl zs)
                                                else (implode [z])::PasteMinus zs
                in PasteMinus(RemoveComma x)
                end

(* Danner en int liste af en string indeholdende tre int sepereret med to kommaer *)                         
fun ExtractIntFromString x = [valOf(Real.fromString(List.nth(x,0))),valOf(Real.fromString(List.nth(x,1))),valOf(Real.fromString(List.nth(x,2)))]

(* Danner en int liste fra en liste af strings som beskrevet ovenfor *)
fun IntListeFromStringListe x = let fun GetInt []      = []
                                      | GetInt (y::ys) = (ExtractIntFromString(OnlyInt(StringToCharListe y)))::GetInt ys
                                in GetInt x
                                end
Avatar billede wampiro-uha Nybegynder
06. december 2003 - 15:54 #11
Øh... ok! Det er jeg da ked af at høre :-(
Avatar billede wampiro-uha Nybegynder
06. december 2003 - 15:54 #12
Andre?
Avatar billede busschou Praktikant
06. december 2003 - 15:56 #13
Ja sorry - men vil ikke risikere noget
Der står jo højt at man ikke må udveksle program dele men kun må diskutere...
Sååå ved ikke rigtig. Vil helt være på den sikre side
Avatar billede wampiro-uha Nybegynder
06. december 2003 - 16:07 #14
Nådada. har så ogsaa et lille problem til.
tror ikke det er kodeudveksling eller noget som kan risikerer noget.

men hvordan laver jeg "[lars,19,dreng][pia,21,pige][torben,19,dreng]" om til
["lars,19,dreng","pia,21,pige","torben,19,dreng"]?
Avatar billede busschou Praktikant
06. december 2003 - 16:15 #15
Det er samme koncept som det øverste:
Hvis du har en streng så explode den
Kør derefter rekursivt på elementerne (som er chars)
Rekursionen går ud på at du starter fra venstre og drøner mød højre imens du undersøger dine Chars (enten som if then else - eller som case)
Fra du når et #"[" til du når et #"]" skal alt imellem implodes og sættes foran et nyt kald til halen
Således får streng om til en liste af strenge
Avatar billede wampiro-uha Nybegynder
06. december 2003 - 16:21 #16
hvis der kommer et lille kodeeksempel fra din side er pointene dine =)
Avatar billede wampiro-uha Nybegynder
06. december 2003 - 16:36 #17
please!!!!! =D
Avatar billede wampiro-uha Nybegynder
06. december 2003 - 16:36 #18
så lukker jeg spoergsmaalet =)
Avatar billede busschou Praktikant
06. december 2003 - 16:36 #19
noget a la det her grove eksempel :

fun listeFraStreng x =let val y = explode x
                          fun fjernklamme []=[]
                            | fjernklamme (z::zs)=if z=#"[" then fjernklamme zs
                                                  else z::fjerklamme zs
                          fun danliste []=[]
                            | danliste (q::qs)=if q<>#"]" then q::danliste qs
                                              else danliste qs
                          fun rettil [] =[]
                            | rettil (w::ws)= (implode w)::rettil ws
                      in rettil(danliste(fjernklamme x)
                      end
Avatar billede busschou Praktikant
06. december 2003 - 16:40 #20
det er muligt den ikke gør det helt korrekt
Men ideen er vel at hvis [ og ] er overflødige - så først fjerne den ene
Dernæst danne en liste som skilles af den anden klamme
og så huske at implode det rigtige sted i programmet
så der ikke kommer en liste med kun et stort element
Avatar billede busschou Praktikant
06. december 2003 - 16:43 #21
og hvis ellers det er - så smid en mail adresse, så må vi jo mødes på skolen, eller spørg en instruktor
Avatar billede wampiro-uha Nybegynder
06. december 2003 - 16:45 #22
eikhorsholm@ofir.dk
Avatar billede wampiro-uha Nybegynder
06. december 2003 - 17:00 #23
Hvordan kan der være syntaktsfejl her:

fun listeFraStreng x = let val y = explode x
                          fun fjernklamme [] = []
                            | fjernklamme(z :: zs) = if z = #"[" then fjernklamme zs else z :: fjerklamme zs
                          fun danliste [] = []
                            | danliste(q :: qs) = if q <> #"]" then q :: danliste qs else danliste qs
                          fun rettil [] = []
                            | rettil(w :: ws) = (implode w) :: rettil ws
                      in rettil(danliste(fjernklamme y)
                      end;
Avatar billede wampiro-uha Nybegynder
06. december 2003 - 17:03 #24
Ok ,lige meget. det er mig som sejler!
tak skal du have busschou =)
Avatar billede busschou Praktikant
06. december 2003 - 17:04 #25
der mangler en parantes neders :
rettil(danliste(fjernklamme y))
Avatar billede wampiro-uha Nybegynder
06. december 2003 - 17:05 #26
nu for jeg godt nok fejl:

! Type clash: expression of type
!  char list
! cannot have type
!  char list list
Avatar billede busschou Praktikant
06. december 2003 - 17:07 #27
det er fordi den forventer en char list list - men du kun giver den en char list
så der hvor den giver dig fejlen må du rette til
Avatar billede wampiro-uha Nybegynder
06. december 2003 - 17:10 #28
ok. tak igen ;)
Avatar billede busschou Praktikant
06. december 2003 - 17:13 #29
jeg må desværre smutte... men pøj pøj med det
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