niedziela, 10 czerwca 2012

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. 
O TO ON :


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ącStulecie
1800 - 18991900 - 19992000 - 20992100 - 21992200 - 2299
Styczeń8101214161
Luty8202224262
Marzec8303234363
Kwiecień8404244464
Maj8505254565
Czerwiec8606264666
Lipiec8707274767
Sierpień8808284868
Wrzesień8909294969
Październik9010305070
Listopad9111315171
Grudzień9212325272
 Jak można zauważyć : 
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 : 

95101399913
  • 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.



1*a + 3*b + 7*c + 9*d + 1*e + 3*f + 7*g + 9*h + 1*i + 3*j
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
Wynik  jest równy ostatniej cyfrze numeru PESEL, czyli 3 , więc numer jest poprawny.
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 ! ! !