Witam !
Jako człowieka o wszechstronnych zainteresowaniach intrygowało mnie w jaki sposób generowany jest numer PESEL. Ten projekt był idealną okazją żeby w końcu zgłębić tą "tajemnice". W poniższym blogg-u postaram się objaśnić państwu proces generowania oraz weryfikacji numeru PESEL.
PESEL – skrótowiec od nazwy "Powszechny Elektroniczny System Ewidencji Ludności". Jest on prowadzony w Polsce od 1979 roku. Do jego posiadania są PRZYMUSZENI wszyscy obywatele polscy oraz głównie obcokrajowcy będący w tym kraju na pobyt stały lub tymczasowy wynoszący powyżej 3-ech miesięcy.
Każdy obywatel jest określany unikatowym symbolem jednoznacznie identyfikującym osobę fizyczną.
Numer PESEL jest to 11-cyfrowy, stały symbol numeryczny, jednoznacznie identyfikujący określoną osobę fizyczną.
Zbudowany jest z następujących elementów:
- Daty urodzenia
- Liczby porządkowej
- Płci
- Cyfry kontrolnej
Do wygenerowania PESEL-u niezbędne są dane osobowe dotyczące :
- Daty narodzin
- Płci
Jeszcze jeden bardzo istotny szczegół : Przyjęta metoda kodowania miesiąca urodzenia pozwala na rozróżnienie 5 stuleci. Kolejne miesiące w poszczególnych stuleciach mają następujące numery:
Miesiąc | Stulecie | ||||
---|---|---|---|---|---|
1800 - 1899 | 1900 - 1999 | 2000 - 2099 | 2100 - 2199 | 2200 - 2299 | |
Styczeń | 81 | 01 | 21 | 41 | 61 |
Luty | 82 | 02 | 22 | 42 | 62 |
Marzec | 83 | 03 | 23 | 43 | 63 |
Kwiecień | 84 | 04 | 24 | 44 | 64 |
Maj | 85 | 05 | 25 | 45 | 65 |
Czerwiec | 86 | 06 | 26 | 46 | 66 |
Lipiec | 87 | 07 | 27 | 47 | 67 |
Sierpień | 88 | 08 | 28 | 48 | 68 |
Wrzesień | 89 | 09 | 29 | 49 | 69 |
Październik | 90 | 10 | 30 | 50 | 70 |
Listopad | 91 | 11 | 31 | 51 | 71 |
Grudzień | 92 | 12 | 32 | 52 | 72 |
dla osób urodzonych w latach 1900 do 1999 – miesiąc zapisywany jest w sposób naturalny
dla osób urodzonych w innych latach niż 1900 – 1999 dodawane są do numeru miesiąca następujące wielkości:
dla lat 1800-1899 - 80
dla lat 2000-2099 - 20
dla lat 2100-2199 - 40
dla lat 2200-2299 - 60
Przejdźmy do analizy przykładowego numeru PESEL :
951013 | 999 | 1 | 3 |
- cyfry [1-6] – data urodzenia : Kolejne pary cyfr oznaczają kolejno rok, miesiąc i dzień urodzenia.
- cyfry [7-9] – numer serii(możemy go traktować jako pojedyncze cyfry). Mogą być to dowolne cyfry. Mają one znaczenie tylko przy obliczaniu cyfry kontrolnej.
- cyfra [10] – płeć. Cyfry parzyste wraz z zerem oznaczają płeć żenską, natomiast wszystkie cyfry nieparzyste oznaczają płeć męską.
- cyfra [11] – cyfra kontrolna, służąca do weryfikacji numeru PESEL.
Po wyczerpującym wstępie teoretycznym przejdźmy do opisu algorytmu generowania i weryfikowania cyfry kontrolnej PESEL-u. Pragnę przy tym zaznaczyć że są one identyczne :
Przez zmienne od a do j oznaczmy kolejne cyfry numeru PESEL.
#include<iostream>
using namespace std;
main()
{
int a,b,c,d,e,f,g,h,i,j,w;
cout << "Podaj dziesiec pierwszych cyfr PESEL-u kolejno po spacji : \n";
cin >>a >>b>>c>>d>>e>>f>>g>>h>>i>>j;
w=1*a + 3*b + 7*c + 9*d + 1*e + 3*f + 7*g + 9*h + 1*i + 3*j;
cout << "suma kontrolna : "<< w << "\n";
w=w%10;
cout << "Rzeszta z dzielenia sumy kontrolnej przez 10 : "<< w << "\n";
w=10-w;
cout<<"Cyfra kontrolna : " << w << "\n";
return 0;
}
Następnym i ostatnim programem jaki wam tutaj pokaże będzie mój własny generator PESEL-i. Rozbudowana wersja programu podanego powyżej :
#include <cstdlib>
#include <ctime>
#include <iostream>
using namespace std;
int main()
{
srand((unsigned int)time(NULL)); //- generator liczb pseudo losowych.
unsigned int a,b,c,d,e,f,g,h,i,j,w;
char s;
cout << "Podaj dane Polaka w następujacej kolej nosci : rok miesiac i dzien urodzenia. Zgodnie z tabelka i innymi instrókcjami podanymi w powyzszym w Blogg-u. Dane podawaj pojedynczymi cyframi. : ";
cin >>a >>b>>c>>d>>e>>f;
cout << "Podaj plec Polaka. W przypadku plci zenskiej wypisz wielka litera M. W przypadku plci zenskiej wypisz jakikolwiek inny znak. : ";
cin >> s;
g = rand() % 10;
h = rand() % 10;
i = rand() % 10;
if(s=='M')
{
do
{
j = rand() % 10;
} while (j%2==0);
}
else
{
do
{
j = rand() % 10;
} while (j%2!=0);
}
w=1*a + 3*b + 7*c + 9*d + 1*e + 3*f + 7*g + 9*h + 1*i + 3*j;
cout << "suma kontrolna : "<< w << "\n";
w=w%10;
cout << "Rzeszta z dzielenia sumy kontrolnej przez 10 : "<< w << "\n";
w=10-w;
if(w==10)
w=0;
cout<<"Cyfra kontrolna : " << w << "\n";
cout << "Pelny numer PESEL : "<<a<<b<<c<<d<<e<<f<<g<<h<<i<<j<<w<< "\n";
return 0;
}
P S : Mam dzieję że w miarę dobrze objaśniłem wam algorytm generowania i weryfikowania numeru PESEL. Mam nadzieję że wam się podobało. Liczę na pozytywne komentarze z waszej strony ! ! !
JESZCZE RAZ SERDECZNIE WSZYSTKICH POZDRAWIAM ! ! !
Filip Machaj Klasa 1b V LO w Gdańsku imienia Stefana Żeromskiego
Przez zmienne od a do j oznaczmy kolejne cyfry numeru PESEL.
Następnie należy odjąć ostatnią cyfrę otrzymanego wyniku od 10. Jeśli otrzymany wynik nie jest równy cyfrze kontrolnej, to znaczy, że numer zawiera błąd[3]. Uwaga implementacyjna - jeśli ostatnią cyfrą otrzymanego wyniku jest 0, w wyniku odejmowania otrzymamy liczbę 10, podczas gdy suma kontrolna jest cyfrą. Oznacza to tyle, że cyfra kontrolna winna być równa 0 (stąd dobrze jest wykonać na wyniku odejmowania operację modulo 10). W wyniku niezbyt szczegółowej specyfikacji na stronie MSWiA ten aspekt jest często pomijany i prowadzi do błędów w implementacji sprawdzania poprawności numeru PESEL.
Przykład dla numeru PESEL 95101399913:
- 1*9 + 3*5 + 7*1+ 9*0 + 1*1 + 3*3 + 7*9 + 9*9 + 1*9 + 3*1 = 197
Wyznaczamy resztę z dzielenia sumy przez 10:
- 101:10 = 10 reszta = 7
Jeżeli reszta = 0, to cyfra kontrolna wynosi 0. Jeżeli reszta ≠ 0, to cyfra kontrolna będzie uzupełnieniem reszty do 10, czyli w podanym przykładzie jest to cyfra 3.
- 10 - 7 = 3
Pragnę zaznaczyć że istnieje kilka alternatyw dla tego algorytmu.
Oto mój własny program w języku c++ wykonujący ten algorytm :#include<iostream>
using namespace std;
main()
{
int a,b,c,d,e,f,g,h,i,j,w;
cout << "Podaj dziesiec pierwszych cyfr PESEL-u kolejno po spacji : \n";
cin >>a >>b>>c>>d>>e>>f>>g>>h>>i>>j;
w=1*a + 3*b + 7*c + 9*d + 1*e + 3*f + 7*g + 9*h + 1*i + 3*j;
cout << "suma kontrolna : "<< w << "\n";
w=w%10;
cout << "Rzeszta z dzielenia sumy kontrolnej przez 10 : "<< w << "\n";
w=10-w;
cout<<"Cyfra kontrolna : " << w << "\n";
return 0;
}
![]() |
Działanie programu. Dla PESEL-u z przykładu. |
Następnym i ostatnim programem jaki wam tutaj pokaże będzie mój własny generator PESEL-i. Rozbudowana wersja programu podanego powyżej :
#include <cstdlib>
#include <ctime>
#include <iostream>
using namespace std;
int main()
{
srand((unsigned int)time(NULL)); //- generator liczb pseudo losowych.
unsigned int a,b,c,d,e,f,g,h,i,j,w;
char s;
cout << "Podaj dane Polaka w następujacej kolej nosci : rok miesiac i dzien urodzenia. Zgodnie z tabelka i innymi instrókcjami podanymi w powyzszym w Blogg-u. Dane podawaj pojedynczymi cyframi. : ";
cin >>a >>b>>c>>d>>e>>f;
cout << "Podaj plec Polaka. W przypadku plci zenskiej wypisz wielka litera M. W przypadku plci zenskiej wypisz jakikolwiek inny znak. : ";
cin >> s;
g = rand() % 10;
h = rand() % 10;
i = rand() % 10;
if(s=='M')
{
do
{
j = rand() % 10;
} while (j%2==0);
}
else
{
do
{
j = rand() % 10;
} while (j%2!=0);
}
w=1*a + 3*b + 7*c + 9*d + 1*e + 3*f + 7*g + 9*h + 1*i + 3*j;
cout << "suma kontrolna : "<< w << "\n";
w=w%10;
cout << "Rzeszta z dzielenia sumy kontrolnej przez 10 : "<< w << "\n";
w=10-w;
if(w==10)
w=0;
cout<<"Cyfra kontrolna : " << w << "\n";
cout << "Pelny numer PESEL : "<<a<<b<<c<<d<<e<<f<<g<<h<<i<<j<<w<< "\n";
return 0;
}
![]() |
Działanie programu. Dla daty narodzin takiej samej jak w przykładowym PESEL-u. |
Zainteresowanych tematyką numerów PESEL proponuję zabawę internetowym generatoro-weryfikatorem tych że numerów.
Pod tym linkiem : http://pesel.cstudios.pl/
ZADANIE :
Moi drodzy wszem i wobec ogłaszam że waszą PRACĄ DOMOWĄ jest przesłanie mi na mój email : sopotfilip@onet.pl schematów blokowych programów zamieszczonych przeze mnie w tym Blogg-u. Serdecznie pozdrawiam i życzę miłej zabawy ! ! ! Najlepsze prace zostaną nagrodzone ogromnymi nagrodami niespodziankami ! ! !P S : Mam dzieję że w miarę dobrze objaśniłem wam algorytm generowania i weryfikowania numeru PESEL. Mam nadzieję że wam się podobało. Liczę na pozytywne komentarze z waszej strony ! ! !
JESZCZE RAZ SERDECZNIE WSZYSTKICH POZDRAWIAM ! ! !
Filip Machaj Klasa 1b V LO w Gdańsku imienia Stefana Żeromskiego
Bibliografia :
http://pl.wikipedia.org/wiki/PESEL
http://pesel.cstudios.pl/
+ Własna pomysłowość i inwencja twórcza ! ! !
http://pl.wikipedia.org/wiki/PESEL
http://pesel.cstudios.pl/
+ Własna pomysłowość i inwencja twórcza ! ! !
"cout << "suma kontrolna : "<< w << "\n";
OdpowiedzUsuńw=w%10;
cout << "Rzeszta z dzielenia sumy kontrolnej przez 10 : "<< w << "\n";
w=10-w;
cout<<"Cyfra kontrolna : " << w << "\n";
Jest błedny, gdyz jeżeli reszta z dzielenia sumy kontrolnej wyjdzie 0 to cyfra kontrolna w=10-w wyjdzie 10. Więc nie jest już cyfrą kontrolną tylko liczba kontrolną.
Poza tym przepisywanie z wikipedii nawet jeżeli się na te wikipedię powołujemy jest nadużyciem praw autorskich artykułu w wikipedii
Polecam do testowania:
OdpowiedzUsuńhttp://generatory.it/