Znalazłem na necie taki algorytm:
Jak wiemy, PESEL to numer identyfikacyjny każdego z nas, który widnieje w dowodzie osobistym. Większość z nas wie o tym, co z niego można wyciągnąć. Wiemy na pewno (większość z nas), że pierwsze cyfry to data urodzenia właściciela numeru identyfikacyjnego (PESEL), która wygląda tak, że pierwsze dwie cyfry to rok, dwie następne to miesiąc, zaś dwie kolejne to dzień. Np. 771001 będzie znaczyło, że osoba urodziła się 1977 roku, 1 października.
Teraz przejdźmy do czegoś ciekawszego. Z numeru identyfikacyjnego możemy dowiedzieć się o płci osoby, jaką reprezentuje PESEL. Wystarczy spojrzeć na przedostatnią cyfrę, jeśli jest parzysta - kobieta; nieparzysta - mężczyzna.
I tak dla przykładu zbadajmy taki PESEL: 49040501580. Przedostatnia cyfra (parzysta) oznacza, że jest to kobieta urodzona 5 kwietnia, 1949 roku (pięćdziesiątka na karku). I to by mogło być na tyle, ale jak sprawdzić czy w ogóle dany PESEL jest oryginalny? Wystarczy znać pewien algorytm, który poprzez odpowiednie kalkulowanie cyfr numeru identyfikacyjnego musi odpowiadać cyfrze kontrolnej, jaką jest ostatni znak PESELA (na przykładzie to 0). Dokładnie polega to na tym, że każdą cyfrę numeru identyfikacyjnego od pierwszej do przedostatniej (ostatnia to wspomniana suma kontrolna) musi być przemnożona przez odpowiednią cyfrę, która wchodzi w skład odpowiedniej tablicy dziesięciocyfrowej, której cyfry nazywamy wagi. Po pomnożeniu następuje sumowanie tych cyfr i wynik należy podzielić modulo przez 10, z kolei rezultat trzeba zróżnicować z 10 a wynik musi zgadzać się z ostatnią cyfrą.
Przykład:
Naszym numerem identyfikacyjnym niech będzie już wspomniany ciąg: 49040501580.
Wspomniane wagi to cyfry reprezentujące tablicę, które wyglądają tak: 1, 3, 7, 9, 1, 3, 7, 9, 1, 3
1. Teraz każdą cyfrę PESELA (prócz ostatniej) mnożymy zgodnie z cyfrą wagi:
PESEL: 4 9 0 4 0 5 0 1 5 8 0 <== suma kontrolna, którą na tym etapie nie bierzemy pod uwagę;
WAGI: 1 3 7 9 1 3 7 9 1 3
---------------------------------------
WYNIK: 4x1=4 ;9x3=27 ;0x7=0 ;4x9=36 ;0x1=0 ;5x3=15 ;0x7=0 ;1x9=9 ;5x1=5 ;8x3=24
2. Teraz wyniki sumujemy: 4 + 27 + 0 + 36 + 0 + 15 + 0 + 9 + 5 + 24 = 120;
3. Następnie dzielimy module przez 10: 120 mod 10 = 0
4. 10 odejmujemy od wyniku: 10 - 0 = 0;
5. Wynik porównujemy z sumą kontrolną: 0 = 0.
Dawno nic nie pisałem, a wydało mi się ze potrafię coś takiego już napisać, więc zabrałem sie do pracy. Zacząłem od chyba najtrudniejszego, bo od sprawdzania czy podany PESEL jest prawdziwy. Oto kod programu którego zdążyłem dotąd napisać:
#include
using namespace std;
int * Mnozenie (int *TabPesel, int *TabWaga, int *TabMnozenie);
int Suma (int * TabMnozenie);
const int IloscWaga = 10; //Ilosc liczb wagi
const int IloscLiczb = 11; //Ilosc Liczb w PEŚLE
// ***************************************************************
int main()
{
cout << "Podaj Twoj PESEL. ";
cout << "Po kazdej z liczb wcisnij ENTER! " << endl;
int Pesel[IloscLiczb]; //Tablica na liczby z pesla
for (int i = 0; i < IloscLiczb; i++)
{
cin >> Pesel[i];
}
int Waga[IloscWaga]= { 1, 3, 7, 9, 1, 3, 7, 9, 1, 3 };
int WynikMnozenia[IloscWaga];
int *WskDoMnozenia = Mnozenie(Pesel, Waga, WynikMnozenia);
cout << Suma(WskDoMnozenia); //Po uruchomieniu nie zostaje wypisana suma :(
return 0;
}
// *****************************************************************
int * Mnozenie (int *TabPesel, int *TabWaga, int *TabMnozenie)
{
// mnozenie elemetow TabPesel * TabWaga
// zwraca jako rezultat tablice wynikuw
// mnozeniakolejnych elemetow tablic
// np. pierwszy elemet tablicy TabPesel * pierwszy elemet TabWaga
// zostanie zapisany w pierwszym elemecie tablicy WynikMnozenia
for (int i = 0; i < IloscWaga; TabPesel++, TabWaga++, TabMnozenie++)
{
TabMnozenie[i] = ( (TabWaga[i]) * (TabPesel[i]) );
}
return TabMnozenie;
}
// ******************************************************************
int Suma (int *TabMnozenie)
{
static int suma = 0;
for (int i = 0; i < IloscWaga; i++)
{
suma = ( suma + ( TabMnozenie[i] ) );
}
return suma;
}[/code]
Niestety program po uruchomieniu nie wypisuje sumy na ekranie. Proszę tych, którzy znają C++, żeby naprowadzili mnie na błąd (błędy), które popełniłem. Z góry WIELKIE DZIĘKI :>
ps. Mój kompilator to Visual C++ 6.0