Uppgift: Algoritm för att beräkna kontrollsiffran i ett personnummer givet de 9 första siffrorna. Torrsimning av algoritm för personnummer

Relevanta dokument
Föreläsning 3-4 Innehåll

Föreläsning 3-4 Innehåll. Diskutera. Metod. Programexempel med metod

Tentamen FYTA11 Javaprogrammering

Föreläsning 8: Exempel och problemlösning

Kompilering och exekvering. Föreläsning 1 Objektorienterad programmering DD1332. En kompilerbar och körbar java-kod. Kompilering och exekvering

OOP Objekt-orienterad programmering

Att skriva till och läsa från terminalfönstret

PROGRAMMERING-Java TENTAMINA

Lite om felhantering och Exceptions Mer om variabler och parametrar Fält (eng array) och klassen ArrayList.

Objektorienterad Programmering (TDDC77)

"if"-satsen. Inledande programmering med C# (1DV402)

Lite mer om Javas stöd för fält. Programmering. Exempel: vad är det största talet? hh.se/db2004. Fält samt Input/Output

Instuderingsfrågor, del D

Grundkurs i programmering, 6 hp (725G61) Dugga 2 tillfälle 2

Dagens text. Programmeringsteknik. Mer om Scanner-klassen. Dialogrutor (klassen JOptionPane) Bubbelsortering. Omslagsklasser.

Lite om reella tal. Programmering. I java. Om operatorers associativitet och prioritet

Föreläsning 6: Metoder och fält (arrays)

TENTAMEN I PROGRAMMERING. På tentamen ges graderade betyg:. 3:a 24 poäng, 4:a 36 poäng och 5:a 48 poäng

Programstruktur och terminologi. Programmet producerar följande utskrift i terminalfönstret: Ett Javaprogram består av en eller flera klasser

Lösningsförslag till tentamen FYTA11 Javaprogrammering

Programmering med Java. Grunderna. Programspråket Java. Programmering med Java. Källkodsexempel. Java API-exempel In- och utmatning.

Dagens föreläsning. Sett i datorsalarna. Mer om arrayer. Matriser. Formatering av utskrifter. Inläsning med hjälp av Scanner-klassen

Det är principer och idéer som är viktiga. Skriv så att du övertygar examinatorn om att du har förstått dessa även om detaljer kan vara felaktiga.

1 Uppgift 1. a) Skapar ett Company-objekt med hjälp av den överlagrade konstruktorn. Du kan själv välja värden på instansvariablerna.

Del A (obligatorisk för alla)

Lösningsförslag till tentamen

2D1342 Programkonstruktion för F1, ht 2006

Föreläsning 11: Rekursion

Föreläsning 4: for, while, do-while

Föreläsning 2, vecka 8: Repetition

Dagens text. Programmeringsteknik. Mer om Scanner-klassen. Dialogrutor (klassen JOptionPane) Bubbelsortering. Omslagsklasser.

JAVAUTVECKLING LEKTION 8

F4. programmeringsteknik och Matlab

Den som bara har en hammare tror att alla problem är spikar

Det finns en referensbok (Java) hos vakten som du får gå fram och läsa men inte ta tillbaka till bänken.

OOP Objekt-orienterad programmering

Exempel på listor (klassen ArrayList). Ett exempel med fält. Avbildning är en speciell typ av lista HashMap.

Tänk på följande: Det finns en referensbok (Java) hos tentavakten som du får gå fram och läsa men inte ta tillbaka till bänken.

732G Linköpings universitet 732G11. Johan Jernlås. Översikt. Repetition. Felsökning. Datatyper. Referenstyper. Metoder / funktioner

Skillnader mellan Python och Java

Typkonvertering. Java versus C

TENTAMEN OOP

Dagens föreläsning. Sett i datorsalarna. Mer om arrayer. Matriser. Formatering av utskrifter. Inläsning med hjälp av Scanner-klassen

Tentamen FYTA11 Javaprogrammering

Föreläsning 8 SLUMPTAL, SIMULERING + INTRODUKTION TILL VEKTORER

Grundläggande programmering, STS 1, VT Sven Sandberg. Föreläsning 12

Tentamen , Introduktion till Java, dtaa98, dtea53

Anmälningskod: Lägg uppgifterna i ordning. Skriv uppgiftsnummer (gäller B-delen) och din kod överst i högra hörnet på alla papper

725G61 - Laboration 2 Loopar och arrayer. Johan Falkenjack

Föreläsning 1 & 2 INTRODUKTION

Introduktion till Datalogi DD1339. Föreläsning 3 29 sept 2014

Föreläsning 3. Iteration. while-satsen for-satsen do-satsen

Föreläsning 3. Iteration while-satsen

OOP Objekt-orienterad programmering

Föreläsning 3: Booleans, if, switch

PROGRAMMERING-Java Omtentamina

TENTAMEN PROGRAMMERINGSMETODIK MOMENT 2 - JAVA, 4P

String [] argv. Dagens Agenda. Mer om arrayer. Mer om arrayer forts. String [] argv. argv är variabelnamnet. Arrayer och Strängar fortsättning

Anmälningskod: Lägg uppgifterna i ordning. Skriv uppgiftsnummer (gäller B-delen) och din kod överst i högra hörnet på alla papper

Att deklarera och att använda variabler. Föreläsning 10. Synlighetsregler (2) Synlighetsregler (1)

Objektorienterad programmering. Fält som funktionsresultat. Mer om fält: att uppdatera ett parameterfält. Kontrast: Parametrar av primitiv typ

Föreläsning 7. for-satsen Fält

Iteration while-satsen

Programexempel: tärningsspel. Programexempel: tärningsspel Kasta tärning tills etta. Klassen Die Specifikation. Slumptalsgenerator Klassen Random

Algoritmer. Två gränssnitt

D0010E. Hello world! Nedräkning. Sågtand. Övningsuppgifter i Eclipse. Skapa ett program som skriver ut "Hello world" på skärmen.

Bankkonto - övning. Övning 2 Skriv en metod, geträntan, som returnerar räntan.

Dugga i Grundläggande programmering STS, åk

//Använd main som ett "handtag" för att hålla ihop programmet. //Själva programmet finns i övriga klasser.

Del A (obligatorisk för alla)

Programmeringsteknik I

OOP Objekt-orienterad programmering

Anmälningskod: Lägg uppgifterna i ordning. Skriv uppgiftsnummer (gäller B-delen) och din kod överst i högra hörnet på alla papper

Föreläsning 2 Objektorienterad programmering DD1332. Typomvandling

Det finns en referensbok (Java) hos vakten som du får gå fram och läsa men inte ta tillbaka till bänken.

Tentamen. Lösningsförslag

Tentamen i Programmeringsteknik I

Föreläsning 5&6 LOGISKA VARIABLER; IMPLEMENTERA KLASSER; MER ALGORITMER

Skriftlig tentamen för kursen DV017A. Inledande programmering i Java A

Grundläggande programmering med C# 7,5 högskolepoäng

732G Linköpings universitet 732G11. Johan Jernlås. Översikt. Repetition. Muddy. Funktioner / metoder. Punktnotation. Evalueringsordning

Några inbyggda funktioner (med resultat!) Introduktion till programmering D0009E. Föreläsning 4: Villkor och rekursion. Modulus-operatorn.

Iteration. Föreläsning 3. TDA540 - Objektorienterad Programmering

Chapter 3: Using Classes and Objects

4 13 / %.; 8 </" '': " / //&' " " ' * TelefonKostnad +,-%&. #!" $% " &' . > / ' 5 /' * 13/ &' static Math 1+" &'/ % 12 "" static "' * 1 /") %& &

Tentamen, EDAA20/EDA501 Programmering

Tentamen i Programmering

Tentamen OOP

ITK:P1 Föreläsning 1. Programmering. Programmeringsspråket Java. Stark typning Explicit typning Strukturerat Hög säkerhet

Lösningsförslag tentamen FYTA11 Java

Objektorienterad Programmering (TDDC77)

TDDC77 Objektorienterad Programmering

Tentamen på kursen DA7351, Programmering , kl Malmö högskola Teknik och samhälle. DA7351, Programmering

Dagens program. Programmeringsteknik och Matlab. Objektorienterad programmering. Vad är vitsen med att ha både metoder och data i objekten?

System.out.println("Jaså du har "+ antalhusdjur+ " husdjur"); if ( antalhusdjur > 5 ) System.out.println("Oj det var många);

Command line argumenter. Objektorienterad Programmering (TDDC77) Vad blir resultatet? Nu då? Ahmed Rezine. Hösttermin 2016

Introduktion till programmering SMD180. Föreläsning 4: Villkor och rekursion

I ett program hantera man ofta samlingar av objekt av samma typ.

Föreläsning 1, vecka 7: Rekursion

Lösningsförslag, tentamen FYTA11 Javaprogrammering

Transkript:

F6 Observera att när man utvecklar program så är inte alla lösningar på vägen korrekta. Speciellt den här gången så finns många OH med program som inte fungerar eftersom det är just det vi skall se på här. På föreläsningen diskuteras just detta.! Från en färdig algoritm för problemet att bestämma kontrollsiffran i ett personnummer väljer vi datarepresentation och formulerar algoritmen i pseudokod. Slutligen kodar vi i Java! När vi går igenom exemplet ovan så går vi också igenom de flesta av Javas primitiver. Uppgift: Skriv ett program som beräknar kontrollsiffran till ett inmatat personnummer (9 siffror). På Skatteverkets hemsida finns personnummer noggrant beskrivna och där beskrivs algoritmen för att generera en kontrollsiffra. (2 sidor med kopia därifrån ej medtagna) Andra timmen så försöker vi kompilera och tolka felutskrifterna/rätta buggarna. Nästa gång: Att skriva egna klasser F6 1 F6 2 Algoritm för att beräkna kontrollsiffran i ett personnummer givet de 9 första siffrorna. 1. Siffrorna i födelseår, -mån, -dag och -nummer multipliceras växelvis med 2 och 1. (dvs multiplicera 1:a, 3:e, 5:e, 7:e och 9:e siffrorna med 2) 2. Lägg samman siffrorna i produkterna. OBS! 12 räknas som 1+2. (dvs addera siffrorna (inte talen) som erhölls i steg 1 samt 2:a, 4:e, 6:e och 8:e siffrorna) 3. Entalssiffran i siffersumman dras från talet 10. 4. Restsiffran blir kontrollsiffra. Är resten 10, blir kontrollsiffran 0. (alltså : 10 summa%10 om 10 ändra till 0 Pseudokod Torrsimning av algoritm för personnummer // multiplicera 1:a, 3:e, 5:e, 7:e och 9:e siffrorna med 2 // addera siffrorna (inte talen) som erhölls i steg 1 samt 2:a, 4:e, 6:e och 8:e siffrorna // Entalssiffran i siffersumman dras från talet 10. // Restsiffran blir kontrollsiffra. Är resten 10 blir kontrollsiffran 0. 760308-415x 7 6 0 3 0 8 4 1 5 2 1 2 1 2 1 2 1 2 14 6 0 3 0 8 8 1 10 1+4+6+0+3+0+8+8+1+1+0 = 32 10-summa%10 = 10-2 = 8 (% är javas mod operator dvs den ger resten vid division med ) F6 3 F6 4

Pseudokod int berkontsiffra(personnummer pnr) // multiplicera 1:a, 3:e, 5:e, // 7:e och9:e siffrorna med 2 for alla udda index i i pnr loop (1) pnr(i) = pnr(i)*2 // addera siffrorna (inte talen) som // erhölls i steg 1 samt 2:a, 4:e, // 6:e och 8:e siffrorna for alla index i i pnr loop (2) summa = summa + pnr(i)/10+ pnr(i)%10 // kontrollsiffra= Entalssiffran i // siffersumman dras från talet 10. // Är resten 10 blir kontr.siffran 0 tmp = (10 summa%10); (3) if (tmp == 10) { return 0; else { return tmp; end beräknakontsiffra Jobba med lösningen Lämpligt att slå ihop de två första looparna? fortfarande pseudokod for alla index i i pnr loop (1+2) if udda(i) then else tmp = 2*pnr(i) summa = summa + tmp/10 + tmp%10 summa = summa + pnr(i) end if Hur representera ett personnummer? Låt pnr vara ett fält. Tekniska detaljer: Fält indexeras alltid från 0 så udda(i) skall bytas mot!udda(i) eller också får man byta plats på if-alternativen. F6 5 F6 6 Förenkla det sista (pseudokod) Flera möjliga alternativ: 10 - entalssiffran i summa funkar nästan men inte när summa är delbar med 10 för då får vi 10-0 = 10 och det skall vara 0 tmp = (10 summa%10); (3) if (tmp == 10) { return 0; else { return tmp; Vi kan testa med if sats (enl. ovan) eller return (10 summa%10)%10 (3) sista mod satsen behövs när parentesen blir 10 och det blir den när summa%10 = 0 Ytterligare ett alternativ: for i in 0..9 loop (3) if (i+summa)%10 == 0 then return i end if end for det finns många lösningar även på enkla problem... F6 7 Java * Beräknar kontrollsiffran i ett * personnummer utgående från * de första 9 siffrorna ********* ********** ********** int berkontrollsiffra (int[] pnr) { int tmp = 0; for (int i = 0; i < 9; i=i+1) { if ( odd(i) ) { summa = summa + pnr[i]; else { tmp = 2*pnr[i]; summa = summa + tmp/10 + tmp%10; // end if // return ((10 - summa%10)%10); // end berkontrollsiffra Behövs felkontroll? tex att pnr är 9 st entalssiffror ( i en int kan man ju ha tex -3 eller 45 ) och inte fler/färre tex 7 tal? Observera att index går från 0 i fältet F6 8

Odd * Undersöker om parametern 'tal' * är udda. I så fall returneras true * annars returneras false ********** ********** ********** static boolean odd(int tal) { if (tal%2!= 0) { return true; else { return false; // end odd // ---------- ---------- ---------- När man förstått hur booleaner fungerar så byter man alltid ut if-satsen mot: return (tal%2!= 0); eller return!(tal%2 == 0); Nu behöver vi en struktur för hela programmet. import x.y.*; Programstruktur: allmänt // annat som behövs * Purpose : Vad gör programmet * Author : Vilka har gjort det, Namn * Group : Labgruppsnummer * Assignment : Labnummer och ev deluppg. * Last changed: Sista ändring ********** ********** ********** public class NamnXxxx { // deklaration av variabler // deklaration av metoder * En förklaring till vad metoden gör [public][static] typ namn([typ parameter,...]){ <...> // end namn public static void main(string[] args){ // deklarationer av lokala variabler // satser // end main // end NamnXxxx F6 9 F6 10 Programstruktur: vårt exempel /* javadoc kommentaren om programmet, se ovan. public class Pnrkontroll { * Odd undersöker om 'tal' är udda. public static boolean odd(int tal) { // end odd * berkontrollsiffra beräknar kontrollsiffran. public static int berkontrollsiffra (int[] pnr) { // end berkontrollsiffra // ========== ========== ========== public static void main(string[] args){ // end main // end Pnrkontroll F6 11 Huvudprogram (main) pseudokod // skapa ett fält // läs in 9 siffror // läs en siffra 9 gånger // anropa berkontrollsiffra // skriv ut resultatet Klassen java.util.scanner förser oss med inmatningsprimitiver så vi kan läsa tokens från tangentbordet: import java.util.*;... while(in.hasnext()) { System.out.println(in.next()); Metoder i Scanner: (ersätt X med Int, Double,..., eller inget) in.hasnextx() finns det ett X in.nextx() ger nästa X in.nextline() ger hela raden som en String F6 12

Huvudprogram (main) public static void main (String[] args) { // skapa ett fält // läs in 9 siffror System.out.print ("Ange de 9 första siffrorna: "); // läs en siffra 9 gånger // TODO finns det nåt att läsa? pnr1to9[i] = in.nextint(); // // anropa berkontrollsiffra och // skriv ut resultatet System.out.print("K-siffran är: "); System.out.println (berkontrollsiffra(pnr1to9)); // end main // end Pnrkontroll Ingen felkontroll ännu och inga garantier för att allt är rätt... main public static void main (String[] args){ System.out.print( "Ange de 9 forsta siffrorna: "); if (in.hasnext()) { pnr1to9[i] = in.nextint(); --> // utskrift av det inlästa System.out.println("i= " + i + " **= " + pnr1to9[i]); // System.out.print("K-siffran är: "); System.out.println( berkontrollsiffra(pnr1to9)); // end main OBS: Här finns fortfarande flera buggar som vi rättar nästa timme. F6 13 F6 14 import java.util.*; // fungerande program utan buggar //* Purpose: Kontrollerar sista siffran i ett personnummer //* Author: Erland Holmström //* Group: - //* Assignement: OH bilder //* Last changed: 09-10-25 public class Pnrkontroll { ********** * Undersöker om parametern 'tal' är udda. * Isåfall returneras true annars returneras false ********** ********** ********** ********** static boolean odd(int tal) { return (tal%2!= 0); // end odd /* ********** ********** ********** ********* * Beräknar kontrollsiffran i ett personnummer utgående * från de första 9 siffrorna i ett personnummer. ********** **r******** ********** ********** static int berkontrollsiffra(int[] pnr1to9) { int tmp = 0; for (int i = 0; i <= 8; i++) { if (odd(i)) { summa = summa + pnr1to9[i]; else { tmp = 2*pnr1to9[i]; summa = summa + tmp/10 + tmp%10; return ((10 - summa%10)%10); // end berkontrollsiffra /* ********** ********** ********** ********** ********* // Felhantering saknas public static void main(string[] args) { System.out.print("Ange de 9 forsta siffrorna: "); if (in.hasnext()) { String str = in.nextline(); if ( str.length() == 9 ) { pnr1to9[i] = Character.digit(str.charAt(i), 10); else { System.out.println ("main: to many or to few numbers"); else { System.out.println("no indata"); System.out.print("Kontrollsiffran är: "); System.out.println(berKontrollSiffra(pnr1to9)); // end main // end Pnrkontroll --------------------------------------- Nästa OH bild om slumptal i Java har inget med exemplet ovan att göra utan det råkade finnas plats här (ifall ni vill skapa slumptal för tex labben). Vi återkommer till slumptal senare. F6 15 F6 16

Math.random() I klassen java.lang.math finns metoden public static double random() Returns a double value with a positive sign, greater than or equal to 0.0 and less than 1.0. Returned values are chosen pseudorandomly with (approximately) uniform distribution from that range. double x = Math.random() ger alltså ett tal i intervallet 0.0 <= x < 1.0 Antag att vi vill ha tal mellan 1-4 inklusive double slump = 4*Math.random() Också vill vi ha ett heltal så vi typomvandlar (type cast) int slump = (int)(4*math.random()) Nu får vi 0<=slump<=3... = (int)(4*math.random()+1.0) Nu får vi 1<=slump<=4 (Jämför också med klassen java.util.random) F6 17