algorytm.org

Implementacja w C/C++

Baza Wiedzy
wersja offline serwisu przeznaczona na urządzenia z systemem Android
Darowizny
darowiznaWspomóż rozwój serwisu
Nagłówki RSS
Artykuły
Implementacje
Komentarze
Forum
Bookmarki






Sonda
Implementacji w jakim języku programowania poszukujesz?

PESEL - Implementacja w C/C++
Ocena użytkownikóww: *****  / 12
SłabyŚwietny
Nadesłany przez Tomasz Lubiński, 06 października 2005 01:00
Kod przedstawiony poniżej przedstawia główną część rozwiązania problemu.
Pobierz pełne rozwiązanie.

Jeżeli nie odpowiada Ci sposób formatowania kodu przez autora skorzystaj z pretty printer'a i dostosuj go automatycznie do siebie.

pesel_c.c:
/**
 * @author Tomasz Lubinski
 * www.algorym.org
 * (c) 2005
 *
 * PESEL
 */

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

short PESEL[11];
int valid = 0;

int getBirthYear() {
        int year;
	int month;
	year = 10 * PESEL[0];
	year += PESEL[1];
	month = 10 * PESEL[2];
	month += PESEL[3];
	if (month > 80 && month < 93) {
		year += 1800;
	}
	else if (month > 0 && month < 13) {
		year += 1900;
	}
	else if (month > 20 && month < 33) {
		year += 2000;
	}
	else if (month > 40 && month < 53) {
		year += 2100;
	}
	else if (month > 60 && month < 73) {
		year += 2200;
	}
	return year;
}

int getBirthMonth() {
	int month;
	month = 10 * PESEL[2];
	month += PESEL[3];
	if (month > 80 && month < 93) {
        	month -= 80;
	}
	else if (month > 20 && month < 33) {
		month -= 20;
	}
	else if (month > 40 && month < 53) {
		month -= 40;
	}
	else if (month > 60 && month < 73) {
		month -= 60;
	}
	return month;
}

int getBirthDay() {
	int day;
	day = 10 * PESEL[4];
	day += PESEL[5];
	return day;
}

char* getSex() {
	if (valid) {
		if (PESEL[9] % 2 == 1) {
			return "Mezczyzna";
		}
		else {
			return "Kobieta";
		}
	}
	else {
		return "---";
	}
}

int checkSum() {
	int sum = 1 * PESEL[0] +
	          3 * PESEL[1] +
		  7 * PESEL[2] +
		  9 * PESEL[3] +
		  1 * PESEL[4] +
		  3 * PESEL[5] +
		  7 * PESEL[6] +
		  9 * PESEL[7] +
		  1 * PESEL[8] +
		  3 * PESEL[9];
	sum %= 10;
	sum = 10 - sum;
	sum %= 10;

	if (sum == PESEL[10]) {
		return 1;
	}
	else {
		return 0;
	}
}

int checkMonth() {
	int month = getBirthMonth();
	if (month > 0 && month < 13) {
		return 1;
	}
	else {
		return 0;
	}
}

int checkDay() {
	int year = getBirthYear();
	int month = getBirthMonth();
	int day = getBirthDay();
	if ((day >0 && day < 32) &&
	    (month == 1 || month == 3 || month == 5 ||
	     month == 7 || month == 8 || month == 10 ||
	     month == 12)) {
		return 1;
	}
	else if ((day >0 && day < 31) &&
		(month == 4 || month == 6 || month == 9 ||
		 month == 11)) {
		return 1;
	}
	else if ((day >0 && day < 30 && leapYear(year)) ||
                 (day >0 && day < 29 && !leapYear(year))) {
		return 1;
	}
	else {
		return 0;
	}
}

int leapYear(int year) {
	if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0)
        	return 1;
	else
                return 0;
}

void PeselValidator(char *PESELNumber) {
        int i;

        if (strlen(PESELNumber) != 11){
		valid = 0;
	}
	else {
		for (i = 0; i < 11; i++){
			PESEL[i] = PESELNumber[i] - 48;
		}
		if (checkSum() && checkMonth() && checkDay()) {
			valid = 1;
		}
		else {
			valid = 0;
		}
	}
}

void main(void)
{
        char PESEL[200];

        printf("Podaj numer PESEL\n");
        scanf("%s", PESEL);

        PeselValidator(PESEL);
        
        if (valid == 1) {
        	printf("Numer PESEL jest prawidlowy\n");
        	printf("Rok urodzenia: %d\n", getBirthYear());
        	printf("Miesiac urodzenia: %d\n", getBirthMonth());
        	printf("Dzien urodzenia: %d\n", getBirthDay());
        	printf("Plec: %s\n", getSex());
        }
        else {
        	printf("Numer PESEL jest nieprawidlowy\n");
        }
	return;
}
Dodaj komentarz