• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

question-closed Zadanie 6. Numery PESEL

VPS Starter Arubacloud
–1 głos
1,537 wizyt
pytanie zadane 18 lutego 2021 w C i C++ przez Nowicjusz13 Użytkownik (570 p.)
zamknięte 20 lutego 2021 przez Nowicjusz13

Zadanie 6. Numery PESEL

W pliku dane.txt zapisano 1000 numerów PESEL osób urodzonych w latach 1945–2003, po jednym numerze w wierszu.

Fragment pliku dane.txt (10 pierwszych wierszy pliku):

87062374513

70042949368

57070843873

68100217281

80071113568

58121156393

55042672243

73091424567

89100324122

60062195366

Plik przyklad.txt zawiera 15 przykładowych numerów PESEL.

Napisz program(y), za pomocą którego(ych) uzyskasz odpowiedzi do poniższych zadań. Odpowiedzi zapisz w pliku wyniki6.txt, a odpowiedź do każdego zadania poprzedź numerem oznaczającym to zadanie.

Zadanie 6.1.  Przedostatnia, dziesiąta cyfra numeru PESEL określa płeć jego właściciela. W numerach PESEL kobiet cyfra ta jest parzysta, u mężczyzn – nieparzysta. Podaj liczbę numerów PESEL kobiet i liczbę numerów PESEL mężczyzn z pliku dane.txt

. Przykład: Dla numerów PESEL zawartych w pliku przyklad.txt odpowiedzią jest 8 numerów dla kobiet i 7 dla mężczyzn.

Zadanie 6.2. Cyfry trzecia i czwarta numeru PESEL oznaczają miesiąc urodzenia, przy czym osoby urodzone przed rokiem 2000 mają numer miesiąca podany w sposób naturalny, czyli od 01 do 12, a osoby urodzone w roku 2000 i później mają do numeru miesiąca dodaną liczbę 20, czyli od 21 do 32. Dla danych z pliku dane.txt podaj, ile osób łącznie urodziło się w listopadzie.

Przykład: Dla numerów PESEL zawartych w pliku przyklad.txt odpowiedzią jest liczba 2.

Zadanie 6.3.  Poprawność numeru PESEL można obliczyć według podanego poniżej algorytmu:

1⋅ a1 + 3⋅ a2 + 7⋅ a3 + 9⋅ a4 + 1⋅ a5 + 3⋅ a6 + 7⋅ a7 + 9⋅ a8 + 1⋅ a9 + 3⋅ a10 + a11, gdzie ai – kolejne cyfry numeru PESEL

Jeżeli powyższy wynik jest liczbą podzielną przez 10, to numer PESEL jest poprawny, w przeciwnym razie jest błędny. Podaj wszystkie błędne numery PESEL w pliku dane.txt.

Przykład: Wśród numerów PESEL zawartych w pliku przyklad.txt błędny jest numer 97092746487.

Niestety nie jestem w stanie podesłać na forum tych plików albowiem każdy z nich posiada w środku dużą ilość losowych peselów. Strikte chodzi mo o to jak się zabrac za te zadania bo szczerze mówiąc nie mam pojęcia jak to zrobić.

 

komentarz zamknięcia: Dostałem satysfakcjonującą odpowiedź
1
komentarz 18 lutego 2021 przez Arkadiusz Waluk Ekspert (287,550 p.)
Jaki jest Twój problem? Jakiś kod? Coś nie działa? Czego dokładnie nie wiesz?
komentarz 19 lutego 2021 przez VBService Ekspert (251,170 p.)
edycja 19 lutego 2021 przez VBService

@Nowicjusz13, W zadaniu 6.3 opis walidacji numeru pesel jest niedokładny, Moim zdaniem, ten jest bardziej poprawny:

Pesel składa się z ciągu 11 cyfr i nie są to cyfry przypadkowe, każda cyfra ma swoje odpowiednie miejsce. Ostatnia cyfra numeru to cyfra kontrolna, dzięki której będziemy mogli sprawdzać czy numer pesel faktycznie jest prawidłowy. Każda kolejna cyfra ma swoją wagę i są to kolejno wagi: 1, 3, 7, 9, 1, 3, 7, 9, 1, 3, czyli 10 cyfr plus ostatnia 11 czyli cyfra kontrolna. Czyli każdą kolejną cyfrę mnożymy przez jej wagę czyli 1 cyfrę mnożymy przez 1, 2 cyfrę mnożymy przez 3, 3 cyfrę mnożymy 7 itd. aż do 10 cyfry. Z otrzymanego wyniki interesuje nas ostatnia cyfra, która jest odejmowana od 10 i jeśli ta cyfra jest zgodna z 11 cyfrą numeru pesel, wtedy pesel jest prawidłowy.

 

Przykład dla numer pesel - 64042999928.
6*1 + 4*3 + 0*7 + 4*9 + 2*1 + 9*3 + 9*7 + 9*9 + 9*1 + 2*3 = 242.
10 - 2 (ostatnia cyfra dziesiąta) = 8.
8 = 8 (cyfra kontrolna)
Zatem powyższy pesel jest prawidłowy.

 

Przykład w javascript (można wykonać translację do c, c++)

 

function isValidPesel(pesel) {
    if (typeof pesel !== 'string') return false;

    const weight = [1, 3, 7, 9, 1, 3, 7, 9, 1, 3];   
    const controlNumber = parseInt(pesel.substring(10, 11));
    let sum = 0;

    for (let i=0; i<weight.length; i++) {
        sum += parseInt(pesel.substring(i, i + 1) * weight[i]);
    }

    sum = sum % 10;
    return (10 - sum) % 10 === controlNumber;
}

wink Codepen

1 odpowiedź

+2 głosów
odpowiedź 18 lutego 2021 przez Whiskey_Taster Pasjonat (15,610 p.)
wybrane 18 lutego 2021 przez Nowicjusz13
 
Najlepsza
Odpowiedź jest banalna: zacznij pisać i kombinuj. Podpunkt pierwszy jest banalny - wystarczy wczytać nr PESEL, wziąć sobie przedostatni znak, zamienić na int'a i sprawdzić parzystość.

Analogicznie rzecz ma się z podpunktem drugim - wystarczy wziąć te dwa znaki, sprawdzić ich wielkość i gotowe.

Trzeci podpunkt to nic innego, jak wzięcie napisu, przekonwertowanie każdego znaku na int'a, pomnożenie wszystkiego przez odpowiednie wartości, zsumowanie i sprawdzenie, czy liczba ta jest podzielna przez 10.
3
komentarz 18 lutego 2021 przez Viktus Nowicjusz (100 p.)
W pierwszym podpunkcie nie trzeba nawet zamieniać na inta, w C i C++ parzyste cyfry mają parzysty numer :)

Podobne pytania

0 głosów
1 odpowiedź 1,326 wizyt
0 głosów
0 odpowiedzi 393 wizyt
pytanie zadane 3 października 2019 w SPOJ przez Bartek K. Nowicjusz (230 p.)
0 głosów
2 odpowiedzi 5,302 wizyt
pytanie zadane 28 kwietnia 2016 w C i C++ przez drive879 Nowicjusz (160 p.)

92,452 zapytań

141,261 odpowiedzi

319,074 komentarzy

61,854 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...