Advertisement
dykow

PESEL

Dec 7th, 2018
286
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.60 KB | None | 0 0
  1. #include <iostream>
  2. #include <string>
  3. #include <fstream>
  4.  
  5. using namespace std;
  6.  
  7. short PESEL[11];
  8. int valid = 0;
  9. int valid_count = 0, notvalid_count = 0;
  10.  
  11.  
  12. int getBirthYear();     // zwraca rok urodzenia z numeru PESEL
  13. int getBirthMonth();    // zwraca miesiąc urodzenia z numeru PESEL
  14. int getBirthDay();      // zwraca dzień urodzenia z numeru PESEL
  15. string getSex();        // zwraca płeć
  16. int checkSum();         // sprawdza sumę kontrolną
  17.  
  18. void PeselValidator(string PESELNumber); //funkcja sprawdzajaca czy pesel jest poprawny
  19.  
  20. int main(void)
  21. {
  22.     string PESEL;
  23.     PESEL = "44100249422";
  24.  
  25.  
  26.     PeselValidator(PESEL);
  27.     if (valid == 1) {
  28.         cout << "Numer PESEL " << PESEL << " jest prawidlowy\n" << endl;;
  29.         cout << "Rok urodzenia: \t\t" << getBirthYear() << endl;
  30.         cout << "Miesiac urodzenia: \t" << getBirthMonth() << endl;
  31.         cout << "Dzien urodzenia: \t" << getBirthDay() << endl;
  32.         cout << "Plec : \t\t\t" << getSex() << endl;
  33.         cout << "=========================================" << endl << endl;
  34.     }
  35.     else {
  36.         cout << "Numer PESEL " << PESEL << " jest nieprawidlowy" << endl;
  37.         cout << "=========================================" << endl << endl;
  38.     }
  39.  
  40.  
  41.  
  42.  
  43.  
  44.  
  45.     ifstream plik_wejsciowy; //utworzenie obiektu klasy ifstream
  46.     plik_wejsciowy.open("NumeryPESEL.txt"); //skojarzenie obiektu plik_wejsciowy z plikiem
  47.  
  48.  
  49.  
  50.  
  51.     if (!plik_wejsciowy.is_open())        //sprawdzenie czy plik został otwarty
  52.         return 0;
  53.  
  54.     string linia;
  55.     while (!plik_wejsciowy.eof())
  56.     {
  57.         getline(plik_wejsciowy, linia);
  58.         PeselValidator(linia);
  59.     if (valid == 1)
  60.       valid_count ++;
  61.     else
  62.       notvalid_count++;
  63.     }
  64.  
  65.   cout << "Poprawne: " << valid_count << "\n";
  66.   cout << "Niepoprawne: " << notvalid_count << "\n";
  67.    
  68.     plik_wejsciowy.close();
  69.     system("sleep 0");
  70.     return 0;
  71. }
  72.  
  73.  
  74.  
  75.  
  76.  
  77.  
  78.  
  79. int getBirthYear() {
  80.     //funkcja ma zwrócić rok urodzenia wynikający z numeru PESEL
  81.     //dwie pierwsze cyfry to rok urodzenia%100
  82.     //do miesiąca urodzenia została dodana liczba w zależności od roku urodzenia:
  83.     //  dla lat 1800 - 1899 - 80
  84.     //  dla lat 1900 - 1999 - 0
  85.     //  dla lat 2000 - 2099 - 20
  86.     //  dla lat 2100 - 2199 - 40
  87.     //  dla lat 2200 - 2299 - 60
  88.     // należy pobrać rok urodzenia (jego wartość dziesiętną i jedności) i następnie na podstawie warrości liczby oznaczających miesiące ustalić które to stulecie.
  89.  
  90.   int year;
  91.   year = 10*PESEL[0] + PESEL[1];
  92.  
  93.   int month = 10*PESEL[2] + PESEL[3];
  94.  
  95.     if (month >= 1 && month <= 12) year += 1900;
  96.     else if (month >= 81 && month <= 92) year += 1800;
  97.     else if (month >= 21 && month <= 32) year += 2000;
  98.     else if (month >= 41 && month <= 52) year += 2100;
  99.     else if (month >= 61 && month <= 72) year += 2200;
  100.  
  101.  
  102.   return year;
  103. }
  104.  
  105. int getBirthMonth() {
  106.     // funkcja ma zwrócić numer miesiąca urodzenia wynikający z numeru PESEL
  107.     //w zależności od przedziału, w którym jest liczba, należy od niej odjąć odpowiednią wartość
  108.  
  109.   int month = 10*PESEL[2] + PESEL[3];
  110.  
  111.   if (month >= 1 && month <= 12) month -= 0;
  112.   else if (month >= 81 && month <= 92) month -= 80;
  113.   else if (month >= 21 && month <= 32) month -= 20;
  114.   else if (month >= 41 && month <= 52) month -= 40;
  115.   else if (month >= 61 && month <= 72) month -= 60;
  116.  
  117.     return month;
  118.  
  119. }
  120.  
  121. int getBirthDay() {
  122.     // funkcja ma zwrócić numer dnia urodzenia wynikający z numeru PESEL
  123.     //należy pobrać odpowiednie wartości z numeru pesel i potraktować je jako dziesiatki i jedności
  124.  
  125.   int day = PESEL[4]*10 + PESEL[5];
  126.  
  127.   return day;
  128.  
  129. }
  130.  
  131. string getSex() {
  132.     // 1 oznacza mężczyznę, 0 oznacza kobietę
  133.  
  134.   if (PESEL[9] % 2 == 0)
  135.     return "Kobieta";
  136.   else
  137.     return "Mężczyzna";
  138. }
  139.  
  140. int checkSum() {
  141.     //dodajemy do siebie kolejne pozycje nr pesel pomnożone przez wagi
  142.     // 1 3 7 9 1 3 7 9 1 3
  143.     // następnie uzyskujemy resztę z dzielenia przez 10
  144.     // następnie tę resztę odejmujemy od 10
  145.     // z uzyskanej różnicy liczymy resztę z dzielenia przez 10
  146.     // jeżeli uzyskana liczba jest równa 11 cyfrze numeru pesel, weryfikacja przebiegła
  147.     // pomyślnie to funkcja zwraca 1,          w przeciwnym wypadku 0
  148.  
  149.   int sum =
  150.       PESEL[0]*1
  151.     + PESEL[1]*3
  152.     + PESEL[2]*7
  153.     + PESEL[3]*9
  154.     + PESEL[4]*1
  155.     + PESEL[5]*3
  156.     + PESEL[6]*7
  157.     + PESEL[7]*9
  158.     + PESEL[8]*1
  159.     + PESEL[9]*3;
  160.    
  161.   if (sum == PESEL[10])
  162.     return 1;
  163.   else
  164.     return 0;
  165. }
  166.  
  167.  
  168.  
  169.  
  170.  
  171. void PeselValidator(string PESELNumber) {
  172.     int i;
  173.  
  174.     if (int(PESELNumber.length()) != int(11)) {
  175.         valid = 0;
  176.     }
  177.     else {
  178.         for (i = 0; i < 11; i++) {
  179.             PESEL[i] = PESELNumber[i] - 48;
  180.         }
  181.         if (checkSum()) {
  182.             valid = 1;
  183.         }
  184.         else {
  185.             valid = 0;
  186.         }
  187.     }
  188. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement