Trädvy Permalänk
Medlem
Plats
Norrköping
Registrerad
Dec 2004

Personnummer LISP

Hej ! Jag skulle behöva lite hjälp med att skriva ett program som kontrollerar om sista siffran är rätt i ett personnummer.

Beräkningen ska gå till så att man multiplicerar alla siffror utan sista med omväxlande 2 och 1. Sedan summerar man de enskilda siffrorna i produkterna. Kontrollsiffran är tillslut skillnaden mellan nästa högre(eller samma) tiotal och summan av siffrorna.

Hur ska jag gå tillväga ? Belöning utlovas till den som kan hjälpa mig.

Corsair 600W Gaming Edition | Intel Core i5 4670K | 8GB DDR3 RAM | Corsair Carbide 330R | Sapphire Radeon R9 290 | Arctic Accelero Xtreme 3

Trädvy Permalänk
Medlem
Plats
Linköping
Registrerad
Mar 2007

Börja med att skapa flera delfunktioner som ska lösa de deluppgifter som finns:
;Du behöver ju ta reda på siffersumman, enligt formeln som står i labhandledningen, i det inmatade personnumret.

;Med hjälp av det kan du ju få fram det högre tiotalet om siffersumman inte är ett tiotal redan.

;Med de två ovan skulle du kunna räkna ut kontrollsiffran i det inmatade personnumret

;Slutligen så ska du jämföra det inmatade personnumrets "riktiga kontrollsiffra" mot den man angett vid inmatningen. Stämmer det så är personnumret äkta.

Det där ser du ut att ha förstått att du ska göra, men det viktiga är att du skapar flera delfunktioner då det hjälper dig en hel del. En funktion för varje uppgift och sen en funktion som utnyttjar de andra för att få önskat resultat.

Att summera flera tal i en lista (produkterna) har du nog redan gjort en funktion för, om du gjort övningsuppgifterna. Så börja med att skapa en funktion som tar en lista(personnumret, utan kontrollsiffran!) och gör den omväxlande multipliceringen, returnera en lista med resultaten. Addera sedan ihop resultaten till din siffersumma. Allt kan göras i en funktion också om man så vill, men det är nog svårare. Tänkt dock på att om multipliceringen ger ett tal som är större än 10 ska siffrorna läggas ihop (12 = 1 + 2 = 3[Bör du också ha en funktion för]).

De andra funktionerna är inte lika svåra och lite testande bör hjälpa dig mycket. Nästa tiotal är ju bara att avrunda uppåt. Kontrollsiffran är ju sista siffran i en lista[Tror du har en funktion för det]. Att jämföra kan ju göras med ett villkor i en if-funktion eller liknande.

Du kan nog få en hel del tips, inte direkt användbara men som förklarar principerna om du kollar i papprena från lisp-föreläsningarna. Finns även här: http://www.ida.liu.se/~TDDC66/lisp/fo/index.shtml om du inte har dem.

Lycka till med lisplösandet, nu är det lunch.

This time, like all times, is a very good one, if we know what to do with it.
If you don't go after what you want, you'll never have it. If you don't ask, the answer is always no. If you don't step forward, you're always in the same place

Trädvy Permalänk
Medlem
Plats
Norrköping
Registrerad
Dec 2004
Citat:

Ursprungligen inskrivet av matte232
Börja med att skapa flera delfunktioner som ska lösa de deluppgifter som finns:
;Du behöver ju ta reda på siffersumman, enligt formeln som står i labhandledningen, i det inmatade personnumret.

;Med hjälp av det kan du ju få fram det högre tiotalet om siffersumman inte är ett tiotal redan.

;Med de två ovan skulle du kunna räkna ut kontrollsiffran i det inmatade personnumret

;Slutligen så ska du jämföra det inmatade personnumrets "riktiga kontrollsiffra" mot den man angett vid inmatningen. Stämmer det så är personnumret äkta.

Det där ser du ut att ha förstått att du ska göra, men det viktiga är att du skapar flera delfunktioner då det hjälper dig en hel del. En funktion för varje uppgift och sen en funktion som utnyttjar de andra för att få önskat resultat.

Att summera flera tal i en lista (produkterna) har du nog redan gjort en funktion för, om du gjort övningsuppgifterna. Så börja med att skapa en funktion som tar en lista(personnumret, utan kontrollsiffran!) och gör den omväxlande multipliceringen, returnera en lista med resultaten. Addera sedan ihop resultaten till din siffersumma. Allt kan göras i en funktion också om man så vill, men det är nog svårare. Tänkt dock på att om multipliceringen ger ett tal som är större än 10 ska siffrorna läggas ihop (12 = 1 + 2 = 3[Bör du också ha en funktion för]).

De andra funktionerna är inte lika svåra och lite testande bör hjälpa dig mycket. Nästa tiotal är ju bara att avrunda uppåt. Kontrollsiffran är ju sista siffran i en lista[Tror du har en funktion för det]. Att jämföra kan ju göras med ett villkor i en if-funktion eller liknande.

Du kan nog få en hel del tips, inte direkt användbara men som förklarar principerna om du kollar i papprena från lisp-föreläsningarna. Finns även här: http://www.ida.liu.se/~TDDC66/lisp/fo/index.shtml om du inte har dem.

Lycka till med lisplösandet, nu är det lunch.

Hej! Först och främst vill jag tacka dig ditt inlägg. Jag har förstått att jag ska göra flera mindre funktioner. Det enda problemet jag egentligen har är hur jag ska göra den omväxlande multipliceringen. Jag vet hur man gör en vanlig multiplicering men ej en omväxlande.

Corsair 600W Gaming Edition | Intel Core i5 4670K | 8GB DDR3 RAM | Corsair Carbide 330R | Sapphire Radeon R9 290 | Arctic Accelero Xtreme 3

Trädvy Permalänk
Medlem
Plats
Linköping
Registrerad
Mar 2007
Citat:

Ursprungligen inskrivet av mrjasmin
Hej! Först och främst vill jag tacka dig ditt inlägg. Jag har förstått att jag ska göra flera mindre funktioner. Det enda problemet jag egentligen har är hur jag ska göra den omväxlande multipliceringen. Jag vet hur man gör en vanlig multiplicering men ej en omväxlande.

På rak arm kan jag komma på 2 sätt:

(1) Håll koll på vilken multiplikation du gjort och anropa funktionen med det andra. Då får du ju varannan multiplikation med 1 och 2.

(2) Multiplicera med 2 och 1 i samma anrop och sen hoppa vidare 2 steg i stället för ett som i vanlig rekursion.

Kan rekommendera att gå till labbsalarna nu i eftermiddag då det pågår lisplabbar mellan 13-1700 och jag kan se flera labbassistenter där och tror jag även såg Haraldsson nyss. Antar att du går på Lith då labbarna du bett är de som finns i kurskompendiet.

This time, like all times, is a very good one, if we know what to do with it.
If you don't go after what you want, you'll never have it. If you don't ask, the answer is always no. If you don't step forward, you're always in the same place

Trädvy Permalänk
Medlem
Plats
Norrköping
Registrerad
Dec 2004

Skulle nog behöva mer hjälp, kan inte riktigt komma igång med uppgiften.

Corsair 600W Gaming Edition | Intel Core i5 4670K | 8GB DDR3 RAM | Corsair Carbide 330R | Sapphire Radeon R9 290 | Arctic Accelero Xtreme 3

Trädvy Permalänk
Medlem
Plats
Singapore
Registrerad
Okt 2003

Att folk har såna problem med dessa labbar i år. Minns inte att det var så här många trådar om dem tidigare år.

Trädvy Permalänk
Avstängd
Plats
Sthlm
Registrerad
Nov 2008
Citat:

Ursprungligen inskrivet av mrjasmin
Skulle nog behöva mer hjälp, kan inte riktigt komma igång med uppgiften.

Börja gör lite småprogram i lisp. Små övningar från boken. När du suttit några timmar så kanske det börjar lossna. Det är mycket svårt att slänga ihop ett program utan att ha något på fötterna.

Trädvy Permalänk
Medlem
Plats
Norrköping
Registrerad
Dec 2004
Citat:

Ursprungligen inskrivet av saddam
Börja gör lite småprogram i lisp. Små övningar från boken. När du suttit några timmar så kanske det börjar lossna. Det är mycket svårt att slänga ihop ett program utan att ha något på fötterna.

Hej ! Har gjort rätt så många övningar och uppgifter. Har inte haft några större problem tidigare, men just detta har jag lite problem med. Jag vet hur jag ska gå tillväga, men vet inte hur jag ska skriva allt.

Corsair 600W Gaming Edition | Intel Core i5 4670K | 8GB DDR3 RAM | Corsair Carbide 330R | Sapphire Radeon R9 290 | Arctic Accelero Xtreme 3

Trädvy Permalänk
Medlem
Plats
Sthlm
Registrerad
Okt 2001

Eftersom vi varken får eller vill ge dig en hel lösning är det nog enklast o bäst om du kan klistra in koden som du fått ihop hittills (använd [code] [/code ] runt om), så kan du få tips på precis den biten du inte få ihop.

Ett ganska lätt sätt o fixa 1/2 multipliceringen vore o bygga en lista typ [1,2,1,2,1,2.. ], och sedan plocka en siffra från den och multiplcera med motsvarande siffra i personnummret.

AK47s for everyone! - Angry mob
Since NaN /= NaN, I think, we should decipher 'NaN' as 'Not a NaN' - Miguel Mitrofanov
(Varför är människan så benägen att tro på Gud?) Antagligen har det lönat sig och evolutionen har drivit fram sådana hjärnor. - Anon

Trädvy Permalänk
Hedersmedlem
Plats
Linköping
Registrerad
Okt 2006

vb: tror du har rätt där. Har för mig det var så jag gjorde också.

Kom ihåg att funktionen ska vara rekursiv bara. Jag gjorde den först väldigt dum då jag satt med uppgiften nån dag innan inlämning och hade fortfarande kommentarer och sånt att göra. Så det blev en slarvig funktion så jag fick komplettera.

Trädvy Permalänk
Medlem
Plats
Norrköping
Registrerad
Dec 2004

Jag har kommit en bit nu. Men jag undrar hur jag kan få fram nästa tiotal ?

Corsair 600W Gaming Edition | Intel Core i5 4670K | 8GB DDR3 RAM | Corsair Carbide 330R | Sapphire Radeon R9 290 | Arctic Accelero Xtreme 3

Trädvy Permalänk
Medlem
Plats
Norrköping
Registrerad
Dec 2004

Jag har klurat ut hur jag ska göra för att få nästa högre tiotal minus summan. Fast jag vet inte hur jag ska göra när min summa är text 20 eller 30. Då vill jag ju få tillbaks 20 respektive 30.

(- (* 10 (+ 1 (truncate (/ summma 10 )))) summa )

Corsair 600W Gaming Edition | Intel Core i5 4670K | 8GB DDR3 RAM | Corsair Carbide 330R | Sapphire Radeon R9 290 | Arctic Accelero Xtreme 3

Trädvy Permalänk
Medlem
Plats
Norrköping
Registrerad
Dec 2004

Har lyckats få ihop detta :

;; kontrollerar om ett enskild nummer är större än 10. (defun nr>10? (nr) (if (>= nr 10) (+ 1 (mod nr 10 )) nr)) ;; räknar ut närmaste tiotal minus summan (defun tiotal (x) (if (= 0 (mod x 10 )) x (- (* 10 (+ 1 (truncate (/ x 10 )))) x ))) ;; kontrollerar den sista siffran (defun kontroller-pnr (pnr) (if (= (car (last pnr)) (tiotal (summa-pnr pnr))) T NIL ))

Nu återstår endast en funktion som ska räkna ihop siffersumman.

Corsair 600W Gaming Edition | Intel Core i5 4670K | 8GB DDR3 RAM | Corsair Carbide 330R | Sapphire Radeon R9 290 | Arctic Accelero Xtreme 3

Trädvy Permalänk
Hedersmedlem
Plats
Linköping
Registrerad
Okt 2006

Hur har det gått?

att räkna ihop siffersumman är inte så svårt. En rekursiv funktion som tar varje tal i listan och plussar. Är det tvåsiffrigt så delar man bara upp det med sista-siffran.

Trädvy Permalänk
Medlem
Plats
Norrköping
Registrerad
Dec 2004
Citat:

Ursprungligen inskrivet av Shimonu
Hur har det gått?

att räkna ihop siffersumman är inte så svårt. En rekursiv funktion som tar varje tal i listan och plussar. Är det tvåsiffrigt så delar man bara upp det med sista-siffran.

Har lyckats lösa uppgiften.

;; kontrollerar om ett nummer är lika med eller större än 10. (defun nr>10? (nr) (if (>= nr 10) (+ 1 (mod nr 10 )) nr)) ;; Används för att kunna multiplicera omväxlande med 1 och 2 (defun omväxla (x) (if (= x 1 ) 2 1 )) ;; räknar ut närmaste tiotal minus summan. (defun tiotal (x) (if (= 0 (mod x 10 )) x (- (* 10 (+ 1 (truncate (/ x 10 )))) x )))) ;; kontrollerar att den sista siffran i det inmatade personnummret är giltig.Använder car för att bli av med paranteserna (defun kontrollera-pnr (pnr) (if (= (car (last pnr)) (tiotal (summa-pnr pnr 2 ))) T NIL )) ;; summerar ihop sifforna i personnummert efter det att dem multiplicerats omväxlande. Denna funktion är rekursiv. Multi är faktorn. (defun summa-pnr (pnr multi) (if (endp (rest pnr)) 0 (+ (nr>10? (* (first pnr) multi )) (summa-pnr (rest pnr) (omväxla multi)))))

Corsair 600W Gaming Edition | Intel Core i5 4670K | 8GB DDR3 RAM | Corsair Carbide 330R | Sapphire Radeon R9 290 | Arctic Accelero Xtreme 3