alla i samma

#include<stdio.h>
#include<conio.h>
#include<string.h>
#include<stdlib.h>

#define thisYear 2009
#define thisMonth 03
#define thisDay 20




// ****** UPG 1, funktion som ska räkna ut hur gammal man är. ******//


int getageinyear(int year[], int month[], int day[]){
    int a,b,c;
    
    a=year[0]*10*10*10+year[1]*10*10+year[2]*10+year[3]; //=1987
    b=month[0]*10+month[1];                              //=01
    c=day[0]*10+day[1];                                  //=28
    
    a=thisYear-a;
    b=thisMonth-b;
    c=thisDay-c;
    
    if (b<0) a=a-1;
    if (b==0)
       if(c<=0) a--;
              
      return a;  
    }



//****** UPG 2, kollar kontrollsiffrorna i personnumret ******//


int GetInfo(int number[], char str[]){
    int a;

    a=number[0]*10+number[1];

    if (a<=13) {
        strcpy(str,"stockholms stad/län");
        } else if (a<=15){ strcpy(str, "Uppsala län");
        } else if (a<=18){ strcpy(str, "Södermanlands län");
        } else if (a<=23){ strcpy(str, "Östergötlands län");
        } else if (a<=26){ strcpy(str, "Jönköpings län");
        } else if (a<=28){ strcpy(str, "Kronobergs län");
        } else if (a<=31){ strcpy(str, "Kalmar län");
        } else if (a==32){ strcpy(str, "Gotlands län");
        } else if (a<=34){ strcpy(str, "Blekinge län");
        } else if (a<=38){ strcpy(str, "Kristianstads län");
        } else if (a<=45){ strcpy(str, "Malmöhus län");
        } else if (a<=47){ strcpy(str, "Hallands län");
        } else if (a<=54){ strcpy(str, "Bohus-/Göteborgs län");
        } else if (a<=58){ strcpy(str, "Älvsborgs län");
        } else if (a<=61){ strcpy(str, "Skaraborgs län");
        } else if (a<=64){ strcpy(str, "Värmlands län");
        } else if (a<=68){ strcpy(str, "Örebro län");
        } else if (a<=70){ strcpy(str, "Västmanlands län");
        } else if (a<=73){ strcpy(str, "Kopparbergs län");
        } else if (a==74){ strcpy(str, "Adopterade/utl.födda m.fl.");
        } else if (a<=77){ strcpy(str, "Gävleborgs län");
        } else if (a<=81){ strcpy(str, "Västernorrlands län");
        } else if (a<=84){ strcpy(str, "Jämtlands län");
        } else if (a<=88){ strcpy(str, "Västerbottens län");
        } else if (a<=92){ strcpy(str, "Norrbottens län");
        } else if (a<=99){ strcpy(str, "Reservsiffror + invandrare");
        }

        if (number[2]%2==0)
               return 1;
           else return -1;
}



/* delar upp personnr från FUNKTION 1*/


int uppdelning(int year[], int month[], int day[], int number[], char str[]){
    int len= 0;
    len = strlen(str);
    
    
    if(len==10){                            //ååmmddxxxx
          year[0] = 1;
          year[1] = 9;
          year[2] = str[0] - 48;
          year[3] = str[1] - 48;      
          
          month[0]=str[2] -48;                
          month[1]=str[3] -48;
          
          day[0]=str[4] -48;
          day[1]=str[5] -48;      
          
          number[0]=str[6] -48;
          number[1]=str[7] -48;
          number[2]=str[8] -48;
          number[3]=str[9] -48;
                }
                
    else if (len==12){                        //ååååmmddxxxx
          year[0] = str[0] - 48;
          year[1] = str[1] - 48;
          year[2] = str[2] - 48;
          year[3] = str[3] - 48;      
          
          month[0]=str[4] -48;                
          month[1]=str[5] -48;
          
          day[0]=str[6] -48;
          day[1]=str[7] -48;      
          
          number[0]=str[8] -48;
          number[1]=str[9] -48;
          number[2]=str[10] -48;
          number[3]=str[11] -48;
          }
          
          
          
     else if (len==11){                       //ååmmdd-xxxx eller ååmmdd+xxxx
          if (str[6]=='-'){                   //om tecken [6] är ett minus '-'
             if ((str[0]-48)==0){              // och [0] är 0
                         year[0] = 2;         // är man född på 2000-talet
                         year[1] = 0;
                         }
             else {
                  year[0] = 1;                //om [0] är 1 eller högre är man född på 1900-talet
                  year[1] = 9;
                  }
             }
             
          else {                              //om tecken [6] är ett plus '+'
               if ((str[0]-48) == 0){       
                  year[0] = 1;
                  year[1] = 9;
                  }
                  
                  else {
                  year[0] = 1;
                  year[1] = 8;
                  }
                           
             }                            
          
          year[2] = str[0] - 48;
          year[3] = str[1] - 48;      
          
          month[0]=str[2] -48;                
          month[1]=str[3] -48;
          
          day[0]=str[4] -48;
          day[1]=str[5] -48;      
          
          number[0]=str[7] -48;
          number[1]=str[8] -48;
          number[2]=str[9] -48;
          number[3]=str[10] -48;
         }
    
    else if (len==13){                        //ååååmmdd-xxxx
          year[0] = str[0] - 48;
          year[1] = str[1] - 48;
          year[2] = str[2] - 48;
          year[3] = str[3] - 48;      
          
          month[0]=str[4] -48;                
          month[1]=str[5] -48;
          
          day[0]=str[6] -48;
          day[1]=str[7] -48;      
          
          number[0]=str[9] -48;
          number[1]=str[10] -48;
          number[2]=str[11] -48;
          number[3]=str[12] -48;
          }   
}



          //******* FUNKTION 1 ******//

int checkValid1(char nr[], int len) {         //funktion som kollar om personnr stämmer överrens med
    int i;                                    // exemplena ååmmddxxxx eller ååååmmddxxxx
    char temp[2];                       
    temp[1]='\0';
    
    if (len==10 || len==12)                   //om nr-längden är 10 lr 12 loopar vi:
    {
       for (i = 0; i < len; i++) {
           temp[0]=nr[i];
           int tal = atoi(temp);
           if (tal > 9)                       // "ASCII to integrate", kollar om det är siffror.
               return 0;                      // bokstaven A skulle t.ex. får värdet 65 och funktionen skulle
                }                             // returnera värdet 0 (falskt). Men 5 --> 5
          
        }else
        return 0;   
    
    
    return 1;
}



           //******* FUNKTION 2 ******//

int checkValid2(char nr[], int len) {         //funktion som kollar om personnr stämmer överrens med
    int i;                                    // exemplena ååmmdd-xxxx eller ååmmdd+xxxx
    char temp[2];                       
    temp[1]='\0';


    if (len==11)                   //om nr-längden är 11 loopar vi:
    {
       if (!(nr[6]=='+' || nr[6]=='-')) return 0;
                                   
                                   
       for (i = 0; i <6 ; i++) {
           temp[0]=nr[i];
           if (atoi(temp) > 9)              // "ASCII to integrate", kollar om det är siffror.
               return 0;                      // bokstaven A skulle t.ex. få värdet 65 och funktionen skulle
           }                                  // returnera värdet 0 (falskt). Men 5 --> 5
       for (i = 7; i <=10 ; i++) {
           temp[0]=nr[i];
           if (atoi(temp) > 9)  
               return 0;    
               }  
                   
       return 1;  
        
       
    } else
        return 0;   
    }
    



           //******* FUNKTION 3 ******//

int checkValid3(char nr[], int len) {         //funktion som kollar om personnr stämmer överrens med
    int i;                                    // exemplet ååååmmdd-xxxx
    char temp[2];                       
    temp[1]='\0';
    
    if (len==13 && nr[8]=='-')               //om nr-längden är 13 och tecken 9='-' loopar vi:
    {
       for (i = 0; i <= 7; i++) {
           temp[0]=nr[i];
           if (atoi(temp) > 9)             // "ASCII to integrate", är tecken 1-8 siffror?
               return 0;                      
           }    
       for (i = 9; i <= 12; i++) {  
           temp[0]=nr[i];
           if (atoi(temp) > 9)   
             return 0;
           }
       return 1;  
   }  else
        return 0;      
}




/**** funktion som kontrollerar månad och dagar ****/

int CheckPersonnummer(int year[], int month[], int day[], int number[]){
int yearnr, monthnr, daynr, kontroll=1;    
    
yearnr  =year[0]*1000+year[1]*100+year[2]*10+year[3];    //tusental  
monthnr =month[0]*10+month[1];                           //tiotal
daynr   =day[0]*10+day[1];                               //tiotal

if(monthnr<13){

    if((monthnr==1||monthnr==3||monthnr==5||monthnr==7||monthnr==8||monthnr==10||monthnr==12)&& (daynr>31))
    kontroll=0;

    if (monthnr==2 && daynr>28)            // Kontroll = 0 visar att nåt är fel                                                           
           {kontroll=0;}
    if (daynr>30)
           {kontroll=0;}
         
    
     else if (yearnr>2009) kontroll=0;           // är man född efter 2009 är nåt fel.
     
 
   printf("\n\nPersonnumret är ");
 
  if (kontroll==0) printf("inte ");          // har något blivit fel någonstans skrivs "inte" ut.

   printf("korrekt!!!!1\n\n");

  if (kontroll=1) return 1;                 // returnera 1 om personnumret var okej
     
     }
   else printf("\nFEL, DIN SOPA!\n\n");  
     
  return 0;                                  //returnera 0 om personnumret inte var okej
}





int readpersonnummer(int year[], int month[], int day[], int number[], char str[]) {
    char nr[20];
    int i = 0;
    int valid = 1;
    int len;
    int kontroll;                    //kontroll = kontrollsiffra. om kontroll=1 är personnumret okej.

    
    do{ printf("%s\n", "skriv in ett giltigt personnummer");          //skriv in ett giltigt personnummer
        scanf("%s",nr);               // läses in som 'nr'
        i++;                          // variabeln 'i' räknar upp (till 10)
      
      len = strlen(nr);               //strlen tar reda på längden på det vi läst in (nr)...
        
      
      kontroll=checkValid1(nr, len);               //skickar nr till funktion 1 för att jämföras med personnummersmodeller
         if (kontroll==0) {                        // om '0' returneras  
              kontroll=checkValid2(nr, len);       // kollar vi vidare i funktion 2
                                 
              if (kontroll==0){                    //  om '0' returneras             
               kontroll=checkValid3(nr, len);      // kollar vi vidare i funktion 3
                   
              }
         }
          if (kontroll==1){
                       
                uppdelning(year, month, day, number, nr);
                }
                
         kontroll= CheckPersonnummer(year,month,day,number);
         
    } while (kontroll==0 && i<10);  
    
    return kontroll;
}




void printIntArray(int a[], int len)
{
     int i;
     for (i = 0; i < len; i++)
     {
       printf("%d ", a[i]);
     }
     printf("\n");     
}




/**** Här delar vi upp personnumret i [åååå] [mm] [dd] [xxxx] ****/

void uppdelning2(int year[], int month[], int day[], int number[], char str[]){
    
          year[0] = str[0] - 48;
          year[1] = str[1] - 48;      
          year[2] = str[2] - 48;
          year[3] = str[3] - 48;  
          
          fprintf(stderr, "year: %d, %d, %d, %d\n", year[0], year[1], year[2], year[3]);    
          
          month[0]=str[4] -48;                
          month[1]=str[5] -48;
          
          day[0]=str[6] -48;
          day[1]=str[7] -48;      
          
          number[0]=str[8] -48;
          number[1]=str[9] -48;
          number[2]=str[10] -48;
          number[3]=str[11] -48;
          
          
}




/*** Scanna in ****/
int readpersonnummer2(int year[], int month[], int day[], int number[], char str[]) {
   
    printf("%s\n", "skriv in ett giltigt personnummer");            //skriv in ett giltigt personnummer
    scanf("%s", str);  
   
    uppdelning2(year, month, day, number, str);      //anropar funktionen "uppdelning"
   
    printf("%d", CheckPersonnummer( year, month, day, number));
}



int kontrollnr(int year[], int month[], int day[], int number[]) {
  int kontroll=0;  
  int siffror[10];
  int sum=0;
  int n; //Räknare
 
  siffror[0]=year[2]*2;               // läste på wikipedia hur luhm-algoritmen funkar...
  siffror[1]=year[3];                 
  siffror[2]=month[0]*2;              
  siffror[3]=month[1];                
  siffror[4]=day[0]*2;
  siffror[5]=day[1];
  siffror[6]=number[0]*2;
  siffror[7]=number[1];  
  siffror[8]=number[2]*2;  
  siffror[9]=number[3];

  for(n=0;n<10;n++){                   //Om ett tal är större än 9 subtraherar vi med 9. tex 10 1+0 = 1 dvs 10-9.
    if(siffror[n]>9) siffror[n]-=9;    
    sum+=siffror[n];
  }
 
  if(sum%10==0)                       //om kontrollsiffrorna är jämt delbara med 10 är kontrollsiffrorna korrekta  
      kontroll=1;
    
  return kontroll;
}




int main(void){
   int year[4];
   int month [2];
   int day [2];
   int number[4];
   char pnr[10];
   char str[20];

      readpersonnummer(year,month,day,number,str);
      printIntArray(year, 4);
      printIntArray(month, 2);
      printIntArray(day, 2);
      printIntArray(number, 4);
      
      printf("\nålder: %d\n\n\n", getageinyear(year, month, day));
      printf("kvinna = [1]\nman   =  [-1] \nDu blev...    [%d] \n", GetInfo(number, str));
      printf("\n%s\n\n\n",str);
     
     printf("Kontrollnummer rätt (1), fel (0) : %d", kontrollnr(year, month, day, number));
     
    
    getch();
    return 0;
    }

Kommentarer

Kommentera inlägget här:

Namn:
Kom ihåg mig?

E-postadress: (publiceras ej)

URL/Bloggadress:

Kommentar:

Trackback
RSS 2.0