Avatar billede martin_durst Nybegynder
26. november 2000 - 14:13 Der er 3 kommentarer og
1 løsning

CPR nr. hjælp

Hvem kan hjælpe mig med denne opgave...

CPR-nummeret
CPR-nummeret blev indført i Danmark i 1968. Danmark er i øvrigt (i lighed med Norge og Sverige) et af de få lande, hvor man har sat numre på borgerne. I de fleste andre lande betragtes nummereringen som et indgreb i den personlige integritet.

Anatomien af et CPR-nummer
Et CPR-nummer består af 3 elementer: fødselsdatoen, et løbenummer og et kontrolciffer.

·        Fødseldato: De første 6 cifre angiver fødselsdatoen på formen ddmmåå.

·        Løbenummer: De næste 3 cifre er et løbenummer, der i princippet er fremkommet ved, at man har tildelt  personer, der er født samme dag et entydigt nummer. Tidligere blev \"indfødte\" danskere tildelt små løbenumre, dvs. numre mindre end 150, medens adopterede og indvandrere fik løbenumre, der var større. Personer, der er født i det 20. århundrede har tillige løbenumre mindre end 500, medens personer født i det 19. og 21. århundrede har løbenumre større end 500.

·        Kontrolciffer: Det 10. og sidste ciffer er et kontrolciffer, som er fremkommet ud fra en beregning, hvori de 9 første cifre indgår, og kan derfor anvendes som en kontrol for CPR-nummerets ægthed. Cifret angiver tillige kønnet; Mænd har et ulige kontrolciffer og kvinder et lige.

Gyldige CPR-numre
Til fabrikation af et tilfældigt og gyldigt CPR-nummer skal man vælge en passende dato og et trecifret løbenummer, der ikke bør være for stort. Kontrolcifret beregnes herefter vha. følgende formel:



1. ciffer ganges med 4

2. ciffer ganges med 3

3. ciffer ganges med 2

4. ciffer ganges med 7

5. ciffer ganges med 6

6. ciffer ganges med 5

7. ciffer ganges med 4

8. ciffer ganges med 3 og

9. ciffer ganges med 2



Resultaterne lægges sammen og restdivideres med 11. Den herved fremkomne rest trækkes fra 11, og resultatet er et kontrolciffer. Hvis dette kontrolciffer er 10, så kan løbenummeret ikke anvendes, og man må vælge et nyt. Det skal man naturligvis også, hvis kontrolcifferet ikke stemmer overens med kønnet – lige for kvinder og ulige for mænd.

Opgaven
Opgaven løses ved at besvare følgende tre spørgsmål. De første 2 med ord og det sidste med en udskrift af programkoden:



Hvordan realiseres en read-only attribut?
·        Begrund hvorfor man anvender konstruktører!

·        Du skal lave en klasse PersonNummer , der opfylder følgende:



Klassen skal opbevare et CPR-nummer, og skal implementeres således, at den kan testes vha. nedenstående testprogram, som udskriver gyldige CPR-numre ud fra en given dato:



        class CprTester

        {

            public static void main(String[] args)

            {

              PersonNummer cpr = new PersonNummer(18, 2, 95);

              for (int løbenr = 1; løbenr < 1000; løbenr++)

              {

                  if (cpr.getCheckDigit(løbenr) != PersonNummer.NOT_VALID)

                  {

                      cpr.setSerialno(løbenr);

                      System.out.println(cpr); 

                  }

              }

            }

        }



Bemærk, at for at kunne udskrive et CPR-nummer vha. System.out.println(), så skal følgende metode implementeres på PersonNummer-klassen:



        class PersonNummer

        {

            ...

            public String toString()

            {

              // Her omformes klassens attributter til en streng på formen \"ddmmåå-xxxk\"

            }

        }



Tips: Du kan fx anvende klasse-metoden String.valueOf(<heltal>) til at konvertere et heltal til en streng eller klasse-metoden Integer.parseInt(<streng>) til at konvertere den modsatte vej fra en streng til et heltal



Brug test-klassen CprTester til at identificere konstruktør, konstanter, metoder mv. Du må selv vælge, hvorledes PersonNummer-klassens attributter skal implementeres.
Avatar billede blazer Nybegynder
26. november 2000 - 14:18 #1
Hader i ikke bare folk der opretter en ny bruger herinde og for folk til at lave sine lektier for dem?
Avatar billede hope Nybegynder
26. november 2000 - 14:19 #2
Det var en sjov opgave....fedt at det kan lade sig gør at udregne gyldige cprnummre....bare too bad at jeg ikke er nørd nok til at hjælpe.....;-)
Avatar billede lbhansen Nybegynder
26. november 2000 - 20:30 #3
Jeg læste engang om en konkurrence om hvem der kunne implementere ovenstående algoritme i c, med færrest antal linjer. Det blev ret kryptisk.

Hvis du vil have hjælp til dine lektier, bliver du nødt til at gøre en indsats selv, og så vende tilbage når du virkelig sidder fast.
Avatar billede javabean Nybegynder
26. november 2000 - 22:05 #4
Hej Martin....altså jeg vil da godt hjælpe dig så jeg har lige hurtigt skrevet PersonNummer klassen til dig. Meeeeeeen jeg har med vilje ikke kommenteret i koden så hvis du nu gransker det lidt så kan du jo altid vende tilbage hvis du har spørgsmål.......;-)

Men den er testet og virker......

public class PersonNummer {


public static final int NOT_VALID = 0;
public static final int VALID = 1;
private int[] datoCifferTabel = new int[6];
private int[] loebnrCifferTabel;
private int kontrolciffer;

public PersonNummer(int dag, int maaned,int aar ){
            datoCifferTabel = konverterDato(dag,maaned,aar);
}

public int getCheckDigit( int loebenr ){
    if ( calculate(konverterLoebeNummer(loebenr)) < 10 ){
        return VALID;
    }
    else
        return NOT_VALID;        
}

private int calculate( int[] loebenrTabel ) {

    int checkSum = 0;
   
    checkSum += datoCifferTabel[0] * 4;
    checkSum += datoCifferTabel[1] * 3;
    checkSum += datoCifferTabel[2] * 2;
    checkSum += datoCifferTabel[3] * 7;
    checkSum += datoCifferTabel[4] * 6;
    checkSum += datoCifferTabel[5] * 5;
   
    checkSum += loebenrTabel[0] * 4;
    checkSum += loebenrTabel[1] * 3;
    checkSum += loebenrTabel[2] * 2;
   
    return Math.abs( 11 - ( checkSum/11 ) );
}

private int[] konverterLoebeNummer( int loebenr ){
    int[] loebenrCifferTabel = new int[3];

    loebenrCifferTabel[0] = (loebenr - ( loebenr % 100))/100;
    loebenrCifferTabel[1] = (( loebenr % 10)/10);
    loebenrCifferTabel[2] = loebenr % 10;

    return loebenrCifferTabel;
}


private int[] konverterDato( int dag, int maaned,int aar ){

    int[] datoCifferTabel = new int[6];

    datoCifferTabel[0] = (dag - ( dag % 10))/10;
    datoCifferTabel[1] = dag % 10;
    datoCifferTabel[2] = (maaned - ( maaned % 10))/10;
    datoCifferTabel[3] = maaned % 10;
    datoCifferTabel[4] = (aar - ( aar % 10))/10;
    datoCifferTabel[5] = aar % 10;

    return datoCifferTabel;
}


public void setSerialno( int loebenr ){

    loebnrCifferTabel = konverterLoebeNummer( loebenr);
    kontrolciffer = calculate( loebnrCifferTabel);
   
}

                     

public String toString() {

    String cprStreng = new String();
   
    for ( int x = 0;x < datoCifferTabel.length;x++)
        cprStreng += datoCifferTabel[x];
   
    cprStreng += \"-\";

    for ( int x = 0;x < loebnrCifferTabel.length;x++)
        cprStreng += loebnrCifferTabel[x];

    cprStreng += kontrolciffer;


    return cprStreng;
}

       
public static void main ( String args[]){
   

PersonNummer cpr = new PersonNummer(31, 12, 99);

              for (int løbenr = 1; løbenr < 1000; løbenr++)

              {

                  if (cpr.getCheckDigit(løbenr) != PersonNummer.NOT_VALID)

                  {

                      cpr.setSerialno(løbenr);

                      System.out.println(cpr); 

                  }

              }


}
   
   

}
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