Numer PESEL składa się z 11 cyfr. W jego skład wchodzi data urodzenia, liczbą porządkowa, kod płci oraz cyfr kontrolna. Każdej osobie fizycznym jest przypisany dokładnie jeden numer PESEL. Ze względu na informacje w nim zawarte, jest on traktowany jako część danych osobowych. Oto jak tworzy się numer PESEL:
R | R | M | M | D | D | - | - | - | - | - |
---|
Data urodzenia jest zapisana na pierwszych 6 cyfrach numeru PESEL. Pierwsze dwie cyfry to dwie ostatnie cyfry roku. Dwie kolejne to miesiąc, a dwie kolejne to dzień. We wszystkich przypadkach jeśli istnieje potrzeba to dopisujemy zero, aby długość danego fragmentu zawsze wynosiła dwa.
Jednak takie rozwiązanie powodowało problem: obcięcie dwóch pierwszych cyfr roku nie pozwalało na rozróżnienie osób urodzonych w różnych stuleciach tego samego dnia i miesiąca. Przyjętym rozwiązaniem została modyfikacja numeru miesiąca. W zależności od stulecia do numeru miesiąca jest dodawana odpowiednia wartość zgodnie z poniższą tabelką:
Lata | Dodawana wartość |
---|---|
1800 - 1899 | 80 |
1900 - 1999 | 0 |
2000 - 2099 | 20 |
2100 - 2199 | 40 |
2200 - 2299 | 60 |
Dzięki takiemu zabiegowi jesteśmy w stanie rozpoznać czy dana osoba została urodzona 1 stycznia 1900 r. czy 1 stycznia 2000 r. W pierwszym przypadku kod miesiąca to będzie 01, a w drugim 21.
Zakładamy, że numer PESEL wczytamy od użytkownika jako tablice znaków. Wtedy odczytywanie danych będzie wygodniejsze niż w przypadku wczytania PESELU jako liczby. W celu wygodnego zamiany znaku cyfry na liczbę napiszemy funkcję digitChar():
Funkcja birthDay() pozwala na wyłuskanie z numeru PESEL daty urodzenia. Dane sformatujemy w taki sposób, aby były czytelniejsze dla przeciętnej osoby.
(1.) Wynik wypiszemy na konsolę - nie będziemy go zwracać. Jako argument funkcja przyjmuje pesel - pesel przekazany jako słowo. (2.) Obliczamy rok urodzenia. Ostatnie dwie cyfry są proste do obliczenia. Problemem może być tu wyliczenie stulecia. Istnieje możliwość wyliczenia go na podstawie pierwszej cyfry miesiąca. W tym celu cyfrę dzielimy na dwa i obcinamy część ułamkową. Wtedy dla 18** uzyskamy 5, a dla 19** 0. Dodając następnie 1 i wyciągajac modulo 5 uzyskamy dla 18** 0, a dla 19** 1. Taką liczbę już możemy pomnożyć razy 100. Do całości dodajemy 1800. (3.) Wyliczamy numer miesiąca. Należy tu pamiętać, że pierwszy cyfra jest zmodyfikowana przez określenie stulecia. (4.) Wyliczenie dnia nie powinno stanowić problemu. (5.) Wypisujemy wynik w postaci DD.MM.RRRR.
- | - | - | - | - | - | S | S | S | P | - |
---|
Kolejne cztery cyfry (od 7 do 10) oznaczają numer serii PESELU. Znacząca jest tu cyfra 10. Oznacza ona płeć. Dla kobiet zarezerwowane są liczby parzyste (0, 2, 4, 6, 8), a dla mężczyzn nieparzyste (1, 3, 5, 7, 9).
Sprawdzenie płci nie powinno stanowić problemu:
- | - | - | - | - | - | - | - | - | - | K |
---|
Jedenasta cyfra pozwala na wykrycie błędów w numerze PESEL. Cyfrę kontrolną oblicza się sumując wszystkie cyfry (prócz ostatniej), gdzie każda cyfra jest mnożona przez odpowiedni mnożnik. Następnie pobieramy resztę z dzielenia obliczonej sumy przez 10. Potem odejmuje od dziesięciu resztę. Jeśli wyliczona cyfra kontrolna nie zgadza się z 11 cyfrą to w PESELU jest błąd. W tabeli przedstawione są mnożniki dla każdej cyfry:
Nr. Cyfry | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
---|---|---|---|---|---|---|---|---|---|---|
Mnożnik | 1 | 3 | 7 | 9 | 1 | 3 | 7 | 9 | 1 | 3 |
Wszystkie mnożniki liczby można przechowywać w oddzielnej tablicy. Niemniej lepszym wyjściem będzie wyliczenie mnożnika na podstawie podanej pozycji:
(2.) Zerujemy sumę cyfr. (3.) Dla każdej cyfry od pierwszej do 10: (4.) pobieramy i-tą cyfrę i mnożymy przez odpowiedni mnożnik. (5.) Na koniec zwracamy porównanie ostatniej cyfry podanego numeru pesel z wyliczoną cyfrą kontrolną. Wynik 10 - reszta dzielimy znów przez 10 i wyciągamy resztę, ponieważ jeśli reszta sumy wyniosła 0 to 10 - 0 = 10. To mogłoby spowodować błędne rozpoznawanie numeru pesel.
Przykładowy program, który sprawdzić poprawność PESELu i wypisze dane w nim zawarte w przypadku poprawności danych:
Napisz program, który dla podanej daty w formacie DD.MM.RRRR oraz płci podanej jako pojedynczy znak K (kobieta) lub M (mężczyzna) poda przykładowy numer PESEL. Zakładamy, że numer serii losujemy.
Przykładowo dla podania wartości daty 01.01.2016 i znaku M zostanie przykładowo wypisane na ekran: