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.