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;
}
#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
Trackback