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)
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?
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;
}
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;
}