Sprawdzanie poprawnosci nr PESEL

Sprawdzanie poprawnosci nr PESEL

Wątek zablokowany 2015-12-16 13:45 przez Rev.

R0
  • Rejestracja:około 11 lat
  • Ostatnio:ponad 8 lat
  • Postów:37
0

Witam posiadam program, rozumiem cały kod i jego działanie z wyjątkiem jednej rzeczy, a mianowicie dlaczego odejmowane jest 48 od cyfry numeru PESEL? Czy byłby ktoś w stanie mi pomóc w tej kwestii?

Podpowiedź do mojego zadania:

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:
• zakodowanej daty urodzenia
• liczby porządkowej
• zakodowanej płci
• cyfry kontrolnej
Data urodzenia
Numeryczny zapis daty urodzenia przedstawiony jest w następującym porządku: dwie ostatnie cyfry roku, miesiąc i dzień. Dla odróżnienia poszczególnych stuleci przyjęto następującą metodę kodowania:
• 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:
o dla lat 1800-1899 - 80
o dla lat 2000-2099 - 20
o dla lat 2100-2199 - 40
o dla lat 2200-2299 - 60
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
Przykładowo osoba urodzona 14 lipca 2002 roku ma następujący zapis w numerze ewidencyjnym:
0 2 2 7 1 4
Płeć
Informacja o płci osoby, której zestaw informacji jest identyfikowany, zawarta jest na 10. (przedostatniej) pozycji numeru PESEL.
• cyfry 0, 2, 4, 6, 8 – oznaczają płeć żeńską
• cyfry 1, 3, 5, 7, 9 – oznaczają płeć męską
Po zmianie płci przydzielany jest nowy numer PESEL.
Cyfra kontrolna i sprawdzanie poprawności numeru
Jedenasta cyfra jest cyfrą kontrolną, służącą do wychwytywania przekłamań numeru. Jest ona generowana na podstawie pierwszych dziesięciu cyfr. Aby sprawdzić czy dany numer PESEL jest prawidłowy należy, zakładając, że litery a-j to kolejne cyfry numeru od lewej, obliczyć wyrażenie
1a + 3b + 7c + 9d + 1e + 3f + 7g + 9h + 1i + 3j
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.
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 precyzyjnego opisu na stronie MSW ten aspekt jest często pomijany i prowadzi do błędów w implementacji sprawdzania poprawności numeru PESEL.
Przykład dla numeru PESEL 44051401358:
14 + 34 + 70 + 95 + 11 + 34 + 70 + 91 + 13 + 35 = 101
Wyznaczamy resztę z dzielenia sumy przez 10:
101:10 = 10 reszta = 1
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 9.
10 - 1 = 9
Wynik 9 nie jest równy ostatniej cyfrze numeru PESEL, czyli 8, więc numer jest błędny.

Program:

Kopiuj
#include <stdio.h>

char czypoprawny(char pes[]){
	int tab[11]={1,3,7,9,1,3,7,9,1,3};
	int a,suma=0;
	for(a=0;a<10;a++){
		suma=suma+(tab[a]* (pes[a]-48));
	}	
	suma=suma%10;
	suma=10-suma;
	suma+=48;
	if (suma!=pes[10]) return 0;	
	
}

char jakaplec(char pes[]){
	if (pes[9]%2==0) return 'k';
	else return 'm';
}

int main()
{
 char pesel[12];
 int poprawny;
 char plec;
 printf("Podaj pesel:");
 gets(pesel);
 poprawny=czypoprawny(pesel);
 if (poprawny==0)
 {
 printf ("Podany pesel jest niepoprawny!!!\n");
 return 1;
 }
 plec=jakaplec(pesel);
 if (plec=='k') printf("Kobieta\n"); else printf("Mezczyzna\n");   
 return 0;   
}
edytowany 1x, ostatnio: radi0071
R0
Na szczęście to nie forum polonistyczne, ale godna uwaga, Nasz język trzeba szanować. Pozdro;)
Asmal
  • Rejestracja:ponad 10 lat
  • Ostatnio:ponad 10 lat
  • Lokalizacja:Olsztyn
1

Dodaje się aby przekonwertować zmienną char na int.

KA
Chyba odwrotnie, przecież suma to int a pes to tablica char więc trzeba konwertować na char
Asmal
No tak, masz racje. Mój błąd.
R0
  • Rejestracja:około 11 lat
  • Ostatnio:ponad 8 lat
  • Postów:37
0

Tak na chłopski rozum, do dlaczego akurat 48 i czy nie lepiej od razu stworzyć pesel jako zmienna int?? Nie bawić się tu w żadne "chary" Ma to jakieś ważne znaczenie?

edytowany 1x, ostatnio: radi0071
Azarien
  • Rejestracja:ponad 21 lat
  • Ostatnio:około 16 godzin
0

Bo to powinno być nie 48 tylko '0'. Liczbowa wartość znaku '0' wynosi w kodowaniu ASCII właśnie 48.

Kopiuj
suma=suma+(tab[a]* (pes[a]-'0'));

i czy nie lepiej od razu stworzyć pesel jako zmienna int?
A zmieścisz PESEL w zwykłym int? ;-)
Przyjęło się takie urzędowe identyfikatory przechowywać jako stringi a nie liczby - zwłaszcza że niektóre (akurat nie PESEL, ale np. NIP) mogą zawierać spacje albo kreski i to o więcej niż jednej istniejącej konwencji.

edytowany 2x, ostatnio: Azarien
R0
Hehe w "int" może i nie zmieszczę. Właśnie o tym pomyślałem, że PESEL nie posiada innych znaków, ale jak wszystko tak przyjmują, to niech tak już zostanie;)
MarekR22
Moderator C/C++
  • Rejestracja:około 17 lat
  • Ostatnio:3 minuty
0
Kopiuj
const int PeselDlugosc = 11;

int sprawdzPesel(const char pes[]) {
    static const int tab[PeselDlugosc]={
            1, 3, 7, 9, 1,
            3, 7, 9, 1, 3,
            1 
    };

    int a,suma=0;
    for(a=0;a<PeselDlugosc;a++){
        suma=suma+(tab[a]* (pes[a]-'0'));
    }    
    return (suma%10)==0;
}

Jeśli chcesz pomocy, NIE pisz na priva, ale zadaj dobre pytanie na forum.
edytowany 4x, ostatnio: MarekR22
0

pesel zmiescisz w long long int

Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)