29.01.2015 Views

Opgave 4. CPR-nummer.

Opgave 4. CPR-nummer.

Opgave 4. CPR-nummer.

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

Øvelse <strong>4.</strong> <strong>CPR</strong>-<strong>nummer</strong>. Kontrol af input.<br />

Teori: sætninger, udtryk, sandhedsværdier, kontrolstrukturer, funktioner, kommentarer<br />

<strong>Opgave</strong>: kontrolstrukturer og funktioner. Stepwise refinement.<br />

klient<br />

Forespørgsel/<br />

Nye data<br />

Webside<br />

Python program<br />

Database<br />

kommando svar<br />

Database<br />

I denne opgave skal I checke om et indtastet cpr-<strong>nummer</strong> udgør et korrekt cpr<strong>nummer</strong>.<br />

Opbygningen af et <strong>CPR</strong>-<strong>nummer</strong><br />

Et <strong>CPR</strong>-<strong>nummer</strong> består af i alt ti cifre, som regel skrevet med en bindestreg mellem<br />

de første seks og de sidste fire cifre. De første seks cifre er sat sammen af:<br />

• De første to cifre der angiver hvilken dato i måneden, <strong>nummer</strong>ets »ejer« er<br />

født på.<br />

• De næste to cifre angiver den måned man er født i.<br />

• Ciffer nr. 5 og 6 skal læses som et tocifret årstal<br />

• De første tre cifre efter datoen og en evt. bindestreg, er et løbe<strong>nummer</strong><br />

• Det sidste ciffer angiver dels kønnet på den person <strong>nummer</strong>et tilhører, dels<br />

virker det som kontrolciffer. Er cifferet lige, er der tale om en kvinde (eller<br />

pige) - er det ulige, tilhører <strong>nummer</strong>et en mand (eller dreng).<br />

da.wikipedia.org/wiki/Person<strong>nummer</strong><br />

Kontrol af person<strong>nummer</strong><br />

Når det skal kontrolleres, om et opgivet <strong>CPR</strong>-<strong>nummer</strong> er korrekt, udføres følgende<br />

beregning:<br />

Ciffer nr: 1 2 3 4 5 6 7 8 9 10<br />

Ganges med: 4 3 2 7 6 5 4 3 2 1<br />

De 10 produkter lægges sammen og divideres med 11. Hvis divisionen giver resten<br />

0 (=divisionen går op), er person<strong>nummer</strong>et korrekt.<br />

Sikkerheden i metoden er ca. 97-99%. Når den ikke er 100% skyldes det, at vægtene<br />

2,3 og 4 genbruges i systemet, således at der ved ombytning af tal med samme<br />

vægt vil blive beregnet samme produktsum. Derfor kan en kontrolberegning i sjældne<br />

tilfælde godkende et forkert person<strong>nummer</strong>.<br />

da.wikipedia.org/wiki/Person<strong>nummer</strong>


2<br />

Forsøg med faktiske personnumre har vist at denne beskrivelse sikkert ikke er helt<br />

korrekt. I skal imidlertid blot implementere den beskrivelse der gives i Wikipedia.<br />

Dette er faktisk en lidt kompliceret opgave og I skal derfor benytte jer af del-oghersk<br />

problemløsningsstrategien (Divide et Impera efter den romerske militærtaktik.<br />

Et andet navn er stepwise refinement). Den går ud på at inddele et problem i enklere<br />

delproblemer der igen inddeles i enklere delproblemer indtil man når frem til delproblemer<br />

man relativt let kan takle. Hvert delproblem implementeres som en separat<br />

funktion.<br />

Hvis vi vil afgøre om et cpr-<strong>nummer</strong> er korrekt, kan vi søge at løse følgende delproblemer:<br />

1. Er længden lig med 10 (når vi har fjernet ’-’). Brug funktionen len()<br />

2. Er alle karaktererne cifre Brug funktionen isdigit()<br />

3. Er alle månedsangivelser mellem 01 og 12 Lav månedsdelen om til et heltal<br />

ved hjælp af int() og check om den ligger mellem 0 og 12.<br />

<strong>4.</strong> Er alle årsangivelserne mellem 00 og 99<br />

5. Passer den angivne dag med måneden (dvs. at 310269 er forbudt) Hint: lav<br />

lister over måneder med 31, 30 og 28 dage; find den liste hvori cpr’s måned<br />

ligger, læg månedens højeste dato i en variabel (hvis måneden er 10 er en højeste<br />

dato 31), og check at cpr-datoen ikke er større end denne højeste dato. I<br />

kan også bruge en dictionary: {01 : 31, 02 : 28, 03 : 31,…}.<br />

6. Giver ovenstående Kontrol af person<strong>nummer</strong> det rigtige resultat Undersøg<br />

om den pågældende checksum giver resten 0 når man dividerer med 11, dvs.<br />

at checksum % 11 == 0<br />

Nedenstående figur viser hvordan man kan dekomponere en kompleks handling som<br />

’check cpr’ i mindre handlinger som er nemme at gå til. Hver handling implementeres<br />

som en separat funktion.<br />

Man skal kunne taste flere cpr-numre ind. Hvis cpr-<strong>nummer</strong>et er korrekt skal programmet<br />

skrive ’true’ ellers ’false’. Kommandoen ’end’ skal slutte programmet.<br />

type cpr or "end":3112450091<br />

True<br />

type cpr or "end":end<br />

>>><br />

Aflevering: der afleveres et korrekt pyton program.

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!