Avatar billede fjaeger Nybegynder
24. oktober 2004 - 22:40 Der er 10 kommentarer og
1 løsning

hjælp til skudår i c++ cpr tjek

Hej.
Jeg har denne string i c++ til at tjekke gyldigheden af Cpr-numre. Jeg har fået den til at tjekke ved skudår vha. %4. Mit problem ligger i at et cpr nummer med cinfrene (ex) 290200-xxxx kan være 2 forskellige datoer;
29.02.1900 eller 29.02.2000
Men 29.02.1900 er ugyldig da 1900 ikke var skudår, men 29.02.2000 derimod er et skudår. Nogen der kan hjælpe? Det haster 8)

Her er min string:

#include <vcl>
#include <stdio>
#include <string>
#include <iostream>
#include <ctype>
#pragma hdrstop
using namespace std;

//---------------------------------------------------------------------------

#pragma argsused
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;
    }
    if ((m == 4, 9, 6, 11) && (d > 30))
    {
        return 0;
    }
    if (y == 0)
    {
        if (( m == 02) && (d >= 29))
        {
                return 0;
        }
    }
    if (y % 4 == 0)
    {
      if ((m == 02) && (d > 29))
      {
                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));
}

main()


{
    test("123456-1234");
    test("111111-1118"); //korrekt cpr
    test("test12-2545");
    test("989889-647");
    test("99-345");
    test("");
        cin >> c;
}
Avatar billede arne_v Ekspert
24. oktober 2004 - 22:44 #1
Den kode ser lidt bekendt ud !

:-)

Check for skudår er:

if((y % 400) == 0 || ((y % 100) != 0 && (y % 4) == 0)) {
  // skudår
}
Avatar billede michael_stim Ekspert
24. oktober 2004 - 22:48 #2
Er der ikke også et eller andet specielt med millenumskiftet, Arne? Er det det samme som med modulus 100 så klarer den det jo, men mener der er andre regler der. Skal pröve at checke det.
//Michael
Avatar billede michael_stim Ekspert
24. oktober 2004 - 22:49 #3
Det kan vel for helvede väre ligemeget, kommer jeg lige i tanke om. Hvem lever der ;o)
Avatar billede arne_v Ekspert
24. oktober 2004 - 22:51 #4
Ovenstående formel skulle gælde for alle år i den gregorianske kalender
(år er skudår hvis 4 går op i året medmindre 100 går op så skal 400 gå op i det
for at det er et skudår).
Avatar billede fjaeger Nybegynder
24. oktober 2004 - 22:51 #5
Igen er arne v min redningsmand.. 1000 tak, smid et svar 8) - du kan dit kram
Avatar billede arne_v Ekspert
24. oktober 2004 - 22:52 #6
svar
Avatar billede michael_stim Ekspert
24. oktober 2004 - 22:54 #7
Medmindre det er et millenieskifte, eller? Var 2000 ikke et skudår?
Avatar billede michael_stim Ekspert
24. oktober 2004 - 22:56 #8
Det er mig der er yr "medmindre 100 går op så skal 400 gå op i det
for at det er et skudår".
Sorry for spam.
Avatar billede arne_v Ekspert
24. oktober 2004 - 22:56 #9
Jo

Jeg formoder også stærkt at 2000 % 400 vil returnere 0
Avatar billede fjaeger Nybegynder
24. oktober 2004 - 23:14 #10
jeg tænkte faktisk selv lidt over det og kom til en anden løsning (sorry for spam):
if ((y == 0) && (control < 4000))
    {
        if (( m == 02) && (d >= 29))
        {
                return 0;
        }
    }
    if (y % 4 == 0)
    {
      if ((m == 02) && (d > 29))
      {
          return 0;
      }
    }
Avatar billede arne_v Ekspert
24. oktober 2004 - 23:21 #11
OK.

Fordi dit problem er at du har 00 og ikke 1900 eller 2000 og du bruger de 4
sidste cifre til at bestemme det.

Men skal det så ikke være:

if((y % 4) == 0 && (y > 0 || control >= 4000)) {
  // skudår
}
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