Avatar billede renebmadsen Nybegynder
22. januar 2007 - 19:27 Der er 13 kommentarer og
1 løsning

Cpr nummer tjek

Nogen som kan se hvad der er galt her, jeg får en outofbounds

public boolean erOk()
        {

            if(cprNumer.length() != 11)
            {
                System.out.println("tast på formen xxxxxx-xxxx");
                return false;
            }

            for(int k = 0; k < 6; k++)
            {
                cprCiffer[k] = (byte)Integer.parseInt(cprStr.substring(k,k+1));
            }
            for(int k = 7; k < 11; k++)
            {
                cprCiffer[k-1] = (byte)Integer.parseInt(cprStr.substring(k,k+1));
            }

            int sum = 0;
            for(int i = 0; i < 10; i++)
            {
                Sum = sum+ (int)(kontrolCiffer[i]*cprCiffer[i]);
            }
Avatar billede fsconsult.dk Nybegynder
22. januar 2007 - 19:33 #1
Pkt 1:  det ville være lettere, hvis man kunne se hvor du definere cprCiffer og kontrolCiffer .

Pkt 2: formoder at du vil lave modulus kontrol på cprnummeret, men mig bekendt er moduluscheck droppet, for at give plads til flere mulige cprnumre uden at udvide antallet af ciffre..
Avatar billede schwarz84 Nybegynder
22. januar 2007 - 20:01 #2
Ja, det er korrekt at der er uddelt numre hvor modoluschecket er ugyldigt.

Hvis du skriver hele din kodestump (klip ud så det kan køre, der skal eksempelvis være din initialisering af cprCiffer og kontrolCiffer med...) og kommer med et relevant stacktrace så skal jeg nok fixe det...
Avatar billede renebmadsen Nybegynder
22. januar 2007 - 20:01 #3
hvad skal jeg gøre for ikke at skulle bruge byte men holde mig til int så jeg slipper for parseint??


public class CprKontrol
    {

        private String cprNumer = "";
        private byte[] kontrolCiffer = {4,3,2,7,6,5,4,3,2,1};
        private byte[] cprCiffer =  new byte[10];
        private String cprStr = "";
        private int Sum = 0;
       


        public CprKontrol(String etN)
        {
            cprNumer = etN;
        }


        public boolean erOk()
        {

            if(cprNumer.length() != 11)
            {
                System.out.println("tast på formen xxxxxx-xxxx");
                return false;
            }

            for(int k = 0; k < 6; k++)
            {
                cprCiffer[k] = (byte)Integer.parseInt(cprNumer.substring(k,k+1));
            }
            for(int k = 7; k < 11; k++)
            {
                cprCiffer[k-1] = (byte)Integer.parseInt(cprNumer.substring(k,k+1));
            }

            int sum = 0;
            for(int i = 0; i < 10; i++)
            {
                Sum += (int)(kontrolCiffer[i]*cprCiffer[i]);
            }
            return true;
        }
Avatar billede schwarz84 Nybegynder
22. januar 2007 - 20:09 #4
Hvilket input får du outofbounds for? Jeg kan ikke umiddelbart genskabe problemet...
Avatar billede arne_v Ekspert
22. januar 2007 - 20:10 #5
med hensyn til ikke brug af kontrol ciffer er de saa vidt jeg ved ikke startet endnu
men har kun annonceret det
Avatar billede renebmadsen Nybegynder
23. januar 2007 - 07:20 #6
outofbounds er løst men vil gerne holde mig til int og ikke byte og samtidig undgå
(byte)Integer.parseInt
hvordan gør jeg det
Avatar billede fsconsult.dk Nybegynder
23. januar 2007 - 08:24 #7
hvilket problem har du med at bruge int arrays istedet ??

jeg forstår iøvrigt ikke hvad du bruger "sum" til, da du tæller værdien op i Sum (som du iøvrigt ikke nulstiller)
Avatar billede renebmadsen Nybegynder
23. januar 2007 - 10:00 #8
sum bruges her

if((Sum % 11) != 0)
        {
            return false;
        }

den var bare ikke sendt med
Avatar billede fsconsult.dk Nybegynder
23. januar 2007 - 10:06 #9
int sum = 0;  // den her "sum" bliver aldrig brugt
            for(int i = 0; i < 10; i++)
            {
                Sum += (int)(kontrolCiffer[i]*cprCiffer[i]); // den her "Sum" bliver aldrig nulstillet (anden gang du kalder erOk giver Sum dobbelt resultat osv.)
            }


hvad sker der hvis du ændrer dine arrays til int`?
Avatar billede renebmadsen Nybegynder
23. januar 2007 - 17:53 #10
Her er hele min kode har nu ændret til int, og min sum bliver brugt og det virker fint


package CprKontrol;

    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;

    public class CprKontrol
    {
        private String cprNumer = "";
        private int[] kontrolCiffer = {4,3,2,7,6,5,4,3,2,1};
        private int[] cprCiffer =  new int[10];
        private int Sum = 0;
       
        public CprKontrol(String etN)
        {
            cprNumer = etN;
        }

        public boolean erOk()
        {
            if(cprNumer.length() != 11)
            {
                return false;
            }

            for(int k = 0; k < 6; k++)
            {
                cprCiffer[k] = Integer.parseInt(cprNumer.substring(k,k+1));
            }
            for(int k = 7; k < 11; k++)
            {
                cprCiffer[k-1] = Integer.parseInt(cprNumer.substring(k,k+1));
            }

            int sum = 0;
            for(int i = 0; i < 10; i++)
            {
                Sum += (int)(kontrolCiffer[i]*cprCiffer[i]);
            }
           
            if((Sum % 11) != 0)
            {
                return false;
            }
            return true;
        }
       
        public static void main(String[] args) throws IOException
        {
            System.out.println("Indtast Cpr på formen xxxxxx-xxxx: ");
            BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
            String cprNumber = br.readLine();
            CprKontrol cprKontrol = new CprKontrol(cprNumber);
       
            if (cprKontrol.erOk())
            {
                System.out.println("Det var et gyldigt cpr numer");
            }
            else
            {
                System.out.println("Hmm, - Husk at taste et gyldigt cpr numer");
            }
        }
}
Avatar billede fsconsult.dk Nybegynder
23. januar 2007 - 18:28 #11
som det er nu, vil du aldrig køre erOk uden at genstarte jvm'en, så det er korrekt at der vil du ikke få problemer.

jeg ville dog stadig ændre "int sum = 0;" til "Sum = 0;" ..  eller ihvertfald slette den linie.
Avatar billede renebmadsen Nybegynder
24. januar 2007 - 07:19 #12
hvad skal der til for at køre jvm`en igen uden at genstarte ?
Avatar billede fsconsult.dk Nybegynder
24. januar 2007 - 08:18 #13
public static void main(String[] args) throws IOException
        {
            System.out.println("Indtast Cpr på formen xxxxxx-xxxx: ");
            BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
            String cprNumber = br.readLine();
            CprKontrol cprKontrol = new CprKontrol(cprNumber);
       
            if (cprKontrol.erOk())
            {
                System.out.println("Det var et gyldigt cpr numer");
            }
            else
            {
                System.out.println("Hmm, - Husk at taste et gyldigt cpr numer");
            }

            if (cprKontrol.erOk())
            {
                System.out.println("Andet forsøg gik godt");
            }
            else
            {
                System.out.println("Andet forsøg fejlede");
            }

        }
Avatar billede renebmadsen Nybegynder
15. november 2007 - 22:28 #14
slut
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