Avatar billede fjaeger Nybegynder
18. oktober 2004 - 15:47 Der er 6 kommentarer og
1 løsning

C++ funktion som kontrolerer CPR-nummer

Hey håber i kan hjælpe mig med følgende;

Jeg skal, som overskriften siger, bruge en c++ funktion som tester cpr-nummer af formen ddmmyy-xxxx.

På forhånd tak 8)
Avatar billede jakobdo Ekspert
18. oktober 2004 - 18:10 #1
En klasse har jeg ikke til dig, men skulle du mangle lidt mere CPR-kontrol, så kig evt på siden: http://tom.paamand.dk/cpr.htm
Avatar billede tigertool Nybegynder
18. oktober 2004 - 19:14 #2
Du skal bruge modulus 11 til det, så vidt jeg husker.

Jeg har en klasse liggende som jeg selv har skrevet i Java, kan du bruge det til noget?
Avatar billede tigertool Nybegynder
18. oktober 2004 - 19:15 #3
.. eller er det bare nok med at forklare dig hvad du gør - og så koder du det selv?
Avatar billede bertelbrander Praktikant
18. oktober 2004 - 19:17 #4
Du kunne starte med noget i stil med nedenstående og så teste for rigtig antal dage i måneden og checket fra jakobdo's link.

#include <iostream>
#include <sstream>
#include <string>

bool ToUInt(unsigned int &aNr, const std::string &aStr)
{
  std::stringstream ss(aStr);
  return ss >> aNr;
}

bool IsCpr(std::string &aCpr)
{
  unsigned int T;
  if(aCpr.size() == 11  &&
      ToUInt(T, aCpr.substr(0, 2)) &&
      T <= 31 &&
      ToUInt(T, aCpr.substr(2, 2)) &&
      T <= 12 &&
      ToUInt(T, aCpr.substr(4, 2)) &&
      aCpr[6] == '-' &&
      ToUInt(T, aCpr.substr(7)))
  {
      return true;
  }
  return false;
}

int main()
{
  std::string CPR;
  std::cout << "Indtast CPR nummer: ";
  std::cout.flush();
  std::getline(std::cin, CPR);

  std::cout << (IsCpr(CPR) ? "Ok" : "Fejl") << std::endl;
}
Avatar billede arne_v Ekspert
18. oktober 2004 - 19:29 #5
Mit bud:

#include <stdio.h>
#include <string.h>
#include <ctype.h>

static int ix[] = { 0, 1, 2, 3, 4, 5, 7, 8, 9, 10 };
static int c[] = { 4, 3, 2, 7, 6, 5, 4, 3, 2, 1 };

int isvalid(char *number)
{
    int i,d,m,y,temp;
    char buf[3];
    if (strlen(number) != 11)
    {
        return 0;
    }
    if (number[6] != '-')
    {
        return 0;
    }
    for (i = 0; i < 10; i++)
    {
        if (!isdigit(number[ix[i]]))
        {
            return 0;
        }
    }
    strncpy(buf,number,2);
    buf[2]='\0';
    d=atoi(buf);
    strncpy(buf,number+2,2);
    buf[2]='\0';
    m=atoi(buf);
    strncpy(buf,number+4,2);
    buf[2]='\0';
    y=atoi(buf);
    if (d > 31)
    {
        return 0;
    }
    if (m > 12)
    {
        return 0;
    }
    temp=0;
    for (i = 0; i < 10; i++) {
        temp = temp + c[i] * (number[ix[i]] - '0');
    }
    return ((temp % 11) == 0);
}

void test(char *s)
{
    printf("%s -> %d\n",s,isvalid(s));
}

int main()
{
    test("123456-1234");
    test("111111-1118");
    return 0;
}
Avatar billede fjaeger Nybegynder
18. oktober 2004 - 22:09 #6
takker for alle de gode svar, specielt arne_v's som fik mig igang. skriv et svar :)
Avatar billede arne_v Ekspert
18. oktober 2004 - 22:12 #7
svar
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