Misja pierwsza: Numerey PESEL
Zadanie 1. Numery PESEL
Zadanie zostało stworzone przez Centralną Komisję Egzaminacyjną i pojawiło się na egzaminie maturalnym z informatyki (poziom podstawowy, część II) w roku. Cały arkusz można znaleźć na stronie internetowej CKE.
W pliku dane.txt zapisano 1000 numerów PESEL osób urodzonych w latach , po jednym numerze w wierszu.
Fragment pliku dane.txt (10 pierwszych wierszy pliku):
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.
Plik przyklad.txt
Zadanie 1.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.
Napisz program, który obliczy, ile numerów PESEL w pliku dane.txt należy do kobiet, a ile do mężczyzn, i zapisze odpowiedź w pliku wyniki6_1.txt w osobnych liniach.
Do oceny oddajesz:
plik
wyniki6_1.txtz odpowiedzią (dwie liczby naturalne; liczba numerów PESEL należąca do kobiet i liczba numerów PESEL należących do mężczyzn)plik(i) zawierający(e) kody źródłowe.
Kompletne dane do zadania znajdują się w załączonym poniżej pliku dane.txt
Rozwiąż zadanie dla danych wejściowych znajdujących się w załączonym pliku. Wykorzystaj w tym celu jeden z języków programowania: C++, Java lub Python. Odpowiedź do zadania znajdziesz w osobnym pliku tekstowym umieszczonym po omówieniu przykładowego rozwiązania.
Rozwiązanie
Na egzaminie maturalnym mamy możliwość wybrania dowolnego z dostępnych języków programowania, jednak tutaj nie będziemy dokonywać implementacji rozwiązania tego zadania w konkretnym języku. Zamiast tego przedstawimy rozwiązanie zapisane za pomocą pseudokodu. Twoim zadaniem będzie przełożenie go na język, w którym programujesz.
Pierwszym krokiem, jaki musimy wykonać, tworząc nasz program, jest wczytanie danych z pliku. Dane te zapiszemy w tablicy o rozmiarze równym liczbie numerów PESEL w pliku. Ponieważ mamy obliczyć liczbę numerów PESEL należących do kobiet i liczbę numerów PESEL należących do mężczyzn, stworzymy również zmienne do przechowywania tych wartości. Zmienne te inicjujemy wartością 0.
Na płeć osoby, do której należy numer PESEL, wskazuje parzystość jego przedostatniej cyfry. Dane w plikach przechowywane są w postaci tekstowej. Aby korzystać z nich jak z liczb, trzeba je przekonwertowaćprzekonwertować do typu liczbowego. Na potrzeby tego zadania wystarczy znać zatem wartość wyłącznie przedostatniej cyfry numeru PESEL, zatem stworzymy funkcję pomocniczą, która pozwoli nam na odczytanie wartości danej cyfry zapisanej jako znak. Będzie ona zwracała kod ASCII znaku pomniejszony o 48 (wartość dziesiętna kodu znaku '0').
W językach programowania C++, Java oraz Python istnieją funkcje wbudowane (będące odpowiednikiem zaprezentowanej funkcji liczba_ze_znaku(), które pozwalają na konwersję znaku na liczbę.
C++
Java
Python
Po zapewnieniu możliwości traktowania pojedynczych cyfr numerów PESEL jak liczb możemy przystąpić do rozwiązania właściwego zadania. W tym celu będziemy potrzebować pętli, która pozwoli na przejście po całej tablicy z numerami PESEL.
Następnie dla każdego numeru PESEL w tablicy sprawdzamy parzystość jego przedostatniej cyfry. Jeżeli jest ona parzysta, oznacza to, że PESEL należy do kobiety i musimy zwiększyć o 1 wartość zmiennej liczba_kobiet. Jeśli zaś liczba ta nie jest parzysta, rozważany numer PESEL należy do mężczyzny i musimy zwiększyć o 1 wartość zmiennej liczba_mezczyzn.
Gdy już policzymy, ile numerów PESEL należy do kobiet, a ile do mężczyzn, pozostaje nam zapisać te wyniki do pliku.
Na końcu zamykamy pliki.
Oto kompletny kod rozwiązujący to zadanie:
Schemat oceniania
3 pkt – za podanie poprawnej odpowiedzi.
2 pkt – za podanie tylko poprawnej liczby mężczyzn lub kobiet.
0 pkt – za błędną odpowiedź albo za brak odpowiedzi.
Uwaga: Nie przyznaje się 1 pkt.
Odpowiedź
Odpowiedź do zadania została zawarta w pliku tekstowym dostępnym w załączniku.
Zadanie 1.2
Cyfry trzecia i czwarta numeru PESEL oznaczają miesiąc urodzenia, przy czym osoby urodzone przed rokiem mają numer miesiąca podany w sposób naturalny, czyli od 01 do 12, a osoby urodzone w roku 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.
Napisz program, który obliczy, ile numerów PESEL w pliku dane.txt należy osób, które urodziły się w listopadzie, i zapisze odpowiedź w pliku wyniki6_2.txt.
Do oceny oddajesz:
plik
wyniki6_2.txtz odpowiedzią (liczba naturalna; liczba numerów PESEL w plikudane.txtnależących osób, które urodziły się w listopadzie)plik(i) zawierający(e) kody źródłowe
Kompletne dane do zadania znajdują się w załączonym pliku dane.txt
Rozwiąż zadanie dla danych wejściowych znajdujących się w załączonym pliku. Wykorzystaj w tym celu jeden z języków programowania: C++, Java lub Python. Odpowiedź do zadania znajdziesz w osobnym pliku tekstowym umieszczonym po omówieniu przykładowego rozwiązania.
Rozwiązanie
Podobnie jak w zadaniu 1.1, tutaj również zaczynamy od wczytania danych z pliku i stworzenia zmiennej do przechowywania wyniku:
Do rozwiązania tego zadania potrzebne nam będą dwie funkcje pomocnicze. Jedna z nich została przedstawiona w poprzednim zadaniu. Jest to funkcja odczytująca wartość cyfry zapisanej jako znak:
Drugą funkcją pomocniczą będzie funkcja, która z podanego w argumencie numeru PESEL będzie wyodrębniała liczbę oznaczającą miesiąc urodzenia jego właściciela. Funkcja będzie zwracała miesiąc wyznaczony z trzeciej i czwartej cyfry numeru PESEL, do czego wykorzystamy przedstawioną wyżej funkcję liczba_ze_znaku. Miesiąc urodzenia właściciela numeru PESEL będzie obliczany jako suma czwartej cyfry numeru PESEL i jego trzeciej cyfry pomnożonej przez 10.
Następnie, skoro mamy już przygotowane funkcje pomocnicze, możemy przystąpić do rozwiązania właściwego zadania. W tym celu potrzebna nam będzie pętla, która przejdzie po wszystkich odczytanych z pliku numerach PESEL.
Kiedy mamy już gotową pętlę, następnym krokiem będzie zliczenie wystąpień miesiąca listopad w przetwarzanych numerach PESEL. W tym celu dla każdego numeru PESEL musimy odczytać liczbę symbolizującą ten miesiąc i przyrównać ją do oczekiwanych wartości, czyli 11 i 31. W przypadku ich dopasowania zwiększamy przygotowany na początku rozwiązywania licznik przechowujący wynik.
Skoro mamy już ustaloną liczbę osób urodzonych w listopadzie, pozostaje zapisać wynik do pliku wyniki6_2.txt.
Na końcu zamykamy pliki.
Oto pełen kod służący do rozwiązania zadania:
Schemat oceniania
3 pkt – za podanie poprawnej odpowiedzi.
2 pkt – za podanie liczby urodzonych w listopadzie tylko w XX lub tylko w XXI wieku.
2 pkt – jeśli zdający pomyli numery cyfr i zamiast 3 i 4 sprawdzi 4 i 5 (otrzyma wynik 80) lub pomyli cyfry 3 z 4 (wynik 79).
1 pkt – za sprawdzenie przez zdającego tylko jednej cyfry.
0 pkt – za błędną odpowiedź albo za brak odpowiedzi.
Odpowiedź
Odpowiedź do zadania została zawarta w pliku tekstowym dostępnym w załączniku.
Rozwiązanie zadania możesz zapisać, wykorzystując jeden program.
Propozycja rozwiązania:
Słownik
specjalna konstrukcja programistyczna umożliwiająca zmianę typu pewnej danej na inny typ danych; jej przykładem jest zamiana liczby całkowitej na napis reprezentujący tę liczbę lub odwrotnie; określana również jako rzutowanie typu, przekształcenie typu