Dobór typów i jawna konwersja
Warunek zaliczenia
Umiem, gdy identyfikator idzie w napisie, liczba powyżej dwóch miliardów w typie 64-bitowym, a konwersje są jawne.
Warto wiedzieć
Kryterium R.1.5. W Pythonie konwersja musi być jawna tam, gdzie jest wymagana.
Co dokładnie sprawdza egzaminator
Cytaty dosłowne z zasad oceniania. Brzmienie sprawdzone w zasadach do 20 arkuszy z sesji 2021 do 2026, czyli w całym inwentarzu na dysku.
Zastosowano typy pasujące do problemu oraz numer PESEL jest przechowywany w zmiennej tekstowej albo tablicy elementów liczbowych lub znakowych. W przypadku porównywania znaku z liczbą stosowano odpowiednią konwersję (np. znak - '0'). W przypadku Python zastosowano jawną konwersję do odpowiednich typów
zasady oceniania INF.04-01-24.01-SG, rezultat 1Zdanie pierwsze jest stałe, przykłady w nawiasie bierze się z zadania tej sesji, więc zmieniają się za każdym razem: INF.04-01-23.06-SG mówi „(np. typ tablicowy jednowymiarowy, typ całkowity dla iteratora pętli)”, INF.04-01-25.01-SG „np. tablica przechowuje liczby całkowite, rozmiar i wartość szukana są liczbami całkowitymi, średnia jest liczbą”, INF.04-01-26.06-SG „np. hasło jest typu napisowego”. Ważniejsza jest zmiana w zdaniu o Pythonie: do sesji Lato 2024 brzmi ono „zastosowano jawną konwersję do odpowiednich typów”, a od Zimy 2025 „typ wynika z przypisanych danych”. To NIE znaczy, że w Pythonie konwersja przestała być potrzebna, tylko że kryterium przestało ją nazywać po imieniu; patrz sekcja o granicach.
Największa liczba pobrań o wartości 1506404300 została prawidłowo wyświetlona (nie jest obcięta ani ujemna) lub, gdy program nie uruchamia się, zastosowano co najmniej 32-bitową konwersję i co najmniej 32-bitowy typ
zasady oceniania INF.04-02-24.06-SG, rezultat 2To jest kryterium z innego rezultatu i stoi tu z jednego powodu: pokazuje, że za źle dobrany typ traci się punkty także poza R.1.5. Ta sama pomyłka kosztuje wtedy dwa pola karty oceny zamiast jednego.
2 uwagi ogólne, które zmieniają czytanie kryteriów
- Tolerancja
- Wystarczy, że sprawdzaną cechę zastosowano dla większości (90%) przypadków w kodzie
- Zakres
- Uwaga: kryteria należy odnieść do aplikacji konsolowej, jeżeli ta nie istnieje, kryteria zastosować do aplikacji mobilnej. Kryteria dotyczą wyłącznie samodzielnie napisanego kodu.
Po co to jest
To jest kryterium obecne w dwudziestu arkuszach na dwadzieścia, tak samo jak formatowanie z działu A1 i nazwy z działu A2. Razem te trzy działy dają pięć pól karty oceny, które rozstrzyga się patrzeniem na kod, a nie jego uruchamianiem.
R.1.5 różni się od tamtych dwóch jedną rzeczą: przecieka. Formatowanie i nazwy kosztują dokładnie tyle, ile ważą, bo egzaminator ocenia sam zapis. Typ dobrany źle psuje przy okazji wynik programu, a wynik jest oceniany osobno. Arkusz INF.04-02-24.06-SG pokazuje to wprost: liczba pobrań o wartości 1 506 404 300 ma osobne kryterium w rezultacie drugim, więc typ za wąski zabiera i R.1.5, i R.2.6.
W katalogu strat punktowych ten błąd stoi jako E.6 i ma cztery typowe postacie: PESEL trzymany jako liczba całkowita, liczba pobrań w typie 16-bitowym, brak int(input()) w Pythonie i średnia policzona w typie całkowitym. Wszystkie cztery to jedna decyzja podjęta w chwili deklarowania zmiennej i wszystkie cztery kosztują więcej niż jedno pole.
Pojęcie
Typ nie jest etykietką na zmiennej ani sposobem oszczędzania pamięci. Typ jest obietnicą: mówi, jakie wartości mogą w zmiennej wylądować i jakie działania mają na nich sens. Kryterium pyta dokładnie o to, czy ta obietnica zgadza się z danymi, które program naprawdę przetwarza, a nie o to, czy program się kompiluje.
Stąd bierze się jedyne pytanie, które trzeba sobie zadać przed każdą deklaracją: co ja z tą wartością robię? Odpowiedź rozstrzyga typ w trzech krokach i żaden nie wymaga wiedzy o kompilatorze.
Pierwszy krok: czy na tej wartości kiedykolwiek liczę? Numer PESEL, numer telefonu, kod pocztowy i numer seryjny składają się z cyfr, ale nikt ich nie dodaje i nie mnoży. To są identyfikatory, czyli napisy zbudowane z cyfr. Typ liczbowy obiecuje przy nich arytmetykę, której program nigdy nie wykonuje, i przy okazji niszczy dwie rzeczy, na których identyfikatorowi zależy: wiodące zero i stałą długość. PESEL osoby urodzonej w roku 2003 zaczyna się od zera, więc po wczytaniu do zmiennej liczbowej ma dziesięć cyfr zamiast jedenastu. Kryterium nie zostawia tu miejsca na dyskusję i wymienia dopuszczone typy z nazwy: zmienna tekstowa albo tablica elementów liczbowych lub znakowych.
Drugi krok: jak duża może być największa wartość, jaka tu wpadnie? Typ całkowity ze znakiem o szerokości 32 bitów sięga 2 147 483 647. Powyżej tej granicy potrzebny jest typ 64-bitowy (long long w C++, long w C# i w Javie). Przekroczenie zakresu jest zdradliwe, bo nie zgłasza się żadnym błędem: liczba po prostu wychodzi obcięta albo ujemna, a program działa dalej. Kryterium R.2.6 nazywa oba te objawy wprost.
Trzeci krok: czy wynik działania mieści się w typie argumentów? Dzielenie dwóch liczb całkowitych daje w większości języków liczbę całkowitą, więc średnia z ocen 5 i 4 wychodzi jako 4, a nie 4,5. Zmiana typu zmiennej po lewej stronie nic tu nie naprawia, bo obcięcie dzieje się wcześniej, w samym działaniu. Naprawia to dopiero rzutowanie licznika.
Osobno stoi moment wczytania, bo to on rozstrzyga typ naprawdę. Z klawiatury i z pliku wszystko przychodzi jako tekst. Deklaracja mówi, co ma być w zmiennej, ale to konwersja przy wczytaniu decyduje, co w niej wyląduje. Dlatego kryterium mówi o konwersji osobno i podaje przykład dla porównania znaku z liczbą: znak - '0'. Znak '7' sam z siebie nie jest liczbą siedem, tylko kodem znaku, i porównany z siódemką nie zgodzi się nigdy.
Zobacz to dwa razy
Ten sam program, ta sama funkcja, to samo formatowanie i te same nazwy. Różnią się wyłącznie typy. To zadanie z arkusza INF.04-01-24.01-SG, czyli z tego, z którego pochodzi cytowane wyżej kryterium: program wczytuje numer PESEL i rozstrzyga płeć z dziesiątej cyfry.
char sprawdzPlec(long long pesel){ int cyfra = (pesel / 10) % 10; if (cyfra % 2 == 0) { return 'K'; } return 'M';} int main(){ long long pesel; cout << "Podaj numer PESEL: "; cin >> pesel; cout << "Plec: " << sprawdzPlec(pesel) << endl; return 0;}- ! linia 1Identyfikator przyjęty jako liczba. Kryterium wymienia zmienną tekstową i tablicę jako jedyne dopuszczone, więc werdykt jest N jeszcze przed uruchomieniem programu.
- ! linia 3Cyfrę wyciąga arytmetyka, a ona liczy pozycje od końca liczby, nie od początku numeru. Dopóki numer ma jedenaście cyfr, wynik jest prawidłowy, i właśnie dlatego ten błąd przechodzi przez pierwsze uruchomienie.
- ! linia 15Tu ginie wiodące zero. `cin` do zmiennej liczbowej wczytuje numer zaczynający się od zera jako liczbę dziesięciocyfrową i od tego miejsca program czyta cyfrę z innej pozycji, nie zgłaszając żadnego błędu.
char sprawdzPlec(string pesel){ int cyfra = pesel[9] - '0'; if (cyfra % 2 == 0) { return 'K'; } return 'M';} int main(){ string pesel; cout << "Podaj numer PESEL: "; cin >> pesel; cout << "Plec: " << sprawdzPlec(pesel) << endl; return 0;}- + linia 1Typ napisowy stoi w treści kryterium jako pierwszy dopuszczony. Numer zostaje dokładnie taki, jaki wpisano, razem z wiodącym zerem i ze stałą długością.
- + linia 3`pesel[9]` to dziesiąty znak liczony od jedynki, więc pozycja nie zależy już od tego, ile cyfr ma numer. Odjęcie `'0'` zamienia znak na liczbę i jest to dokładnie ta konwersja, którą kryterium podaje jako przykład.
- + linia 15Ta sama zmiana w programie głównym i ona jest tu ważniejsza. Gdyby typ poprawić wyłącznie w nagłówku funkcji, `cin` dalej wczytywałby liczbę, a zero ginęłoby jeszcze przed wywołaniem.
Mostek: zdanie kryterium wobec linii kodu
| Fragment kryterium | Gdzie się łamie | Gdzie jest spełniony |
|---|---|---|
| numer PESEL jest przechowywany w zmiennej tekstowej albo tablicy elementów liczbowych lub znakowych | long long pesel w liniach 1 i 15, czyli żaden z dwóch typów wymienionych w kryterium | string pesel w tych samych dwóch liniach |
| W przypadku porównywania znaku z liczbą stosowano odpowiednią konwersję (np. znak - '0') | linia 3 nie ma żadnej konwersji, bo nie ma tam znaku: jest dzielenie i reszta | linia 3 z pesel[9] - '0', czyli przykładem podanym w treści kryterium |
| Zastosowano typy pasujące do problemu | liczba tam, gdzie dane są identyfikatorem, więc obietnica typu i dane rozjeżdżają się od pierwszej linii | napis tam, gdzie dane są napisem, i liczba tam, gdzie naprawdę się liczy, czyli w zmiennej cyfra |
Granice
Kod, którego nie napisałeś, się nie liczy. Uwaga ogólna ogranicza kryteria do samodzielnie napisanego kodu, więc typy w szkielecie projektu i w bibliotekach nie są oceniane.
To nie jest kryterium o wydajności ani o oszczędzaniu pamięci. long long tam, gdzie wystarczyłby int, nie łamie niczego: typ za szeroki mieści wszystkie wartości, więc obietnica jest spełniona. Ryzyko jest wyłącznie po stronie typu za wąskiego. Egzamin nie jest miejscem na dobieranie typu co do bitu.
To nie jest kryterium o nazwach ani o formatowaniu. Nazwy to R.1.3 i R.1.4, czyli dział A2, a zapis kodu to R.1.1 i R.1.2, czyli A1. Zmienna x typu string psuje tamto kryterium i spełnia to.
W Pythonie kryterium zmieniło brzmienie i to jest pułapka czytania samego kryterium. Do sesji Lato 2024 stało w nim „zastosowano jawną konwersję do odpowiednich typów”, od Zimy 2025 stoi „typ wynika z przypisanych danych”. Nowsze zdanie brzmi łagodniej, ale niczego nie znosi: input() zwraca napis zawsze, więc typ, który „wynika z przypisanych danych”, jest wtedy napisem. Żeby w zmiennej wylądowała liczba, trzeba ją przypisać, czyli napisać int(input()). Kryterium przestało nazywać konwersję po imieniu, a nie przestało jej wymagać.
Nie każda liczba w cudzysłowie to poprawka. Nie-przykład, który wygląda na ten sam problem: liczba pobrań 1 506 404 300 z arkusza INF.04-02-24.06-SG. Ona też nie mieści się w typie, którego użył zdający, ale lekarstwem NIE jest przeniesienie jej do napisu, bo to jest liczba i program ma ją porównywać. Tu poszerza się typ, a nie zmienia jego rodzaj. Odwrotny ruch, czyli identyfikator wciśnięty w liczbę, i ten ruch, czyli liczba wciśnięta w napis, są dwoma błędami, nie jednym.
W czterech językach
Arkusz dopuszcza C++, C#, Javę i Pythona. Kryterium jest jedno, ale w każdym z nich wygląda trochę inaczej.
- C++
intma gwarantowane co najmniej 16 bitów, a nie 32, i to jest źródło kryterium R.2.6 o typie co najmniej 32-bitowym. Przy wartościach powyżej 2 147 483 647 bierzlong long. Napisy wymagają#include <string>, acin >> napiskończy czytanie na spacji.- C#
intto zawsze 32 bity,longzawsze 64, więc szerokość jest przewidywalna.Console.ReadLinezwraca napis, więc liczba wymagaint.ParsealboConvert.ToInt32. Znak zamieniasz na cyfrę przezznak - '0'tak samo jak w C++.- Java
- Szerokości jak w C#:
int32 bity,long64. Przy wczytywaniunextIntkonwertuje sam, alenextLinejuż nie, więc mieszanie obu w jednym programie jest najczęstszym źródłem złego typu.Integer.parseIntjest jawne i dlatego bezpieczniejsze. - Python
- Nie ma tu deklaracji, więc typ powstaje w chwili przypisania i całe kryterium sprowadza się do konwersji przy wczytaniu.
input()zwraca napis zawsze. Osobno:/daje liczbę zmiennoprzecinkową, a//obcina do całkowitej, więc średnia liczona przez//łamie kryterium mimo braku deklaracji.
Procedura
Typ wybiera się w chwili deklarowania zmiennej, bo później zmiana pociąga za sobą wszystkie miejsca, w których ta zmienna występuje. Ostatni krok jest przeglądem kontrolnym i robi się go na gotowym kodzie.
- 1
Przed deklaracją zapytaj, czy na tej wartości kiedykolwiek liczysz.
wolno tak, bo typ jest obietnicą o dopuszczalnych działaniach, więc wartość, na której nigdy nie ma arytmetyki, nie jest liczbą, choćby składała się z samych cyfr.
- 2
Identyfikator, czyli PESEL, telefon, kod pocztowy albo numer seryjny, trzymaj w napisie.
wolno tak, bo kryterium wymienia zmienną tekstową wprost, a typ liczbowy gubi wiodące zero i stałą długość bez żadnego ostrzeżenia.
- 3
Dane z klawiatury i z pliku konwertuj jawnie w chwili wczytania.
wolno tak, bo z wejścia wszystko przychodzi jako tekst, więc o zawartości zmiennej rozstrzyga konwersja, a nie deklaracja.
- 4
Sprawdź największą wartość, jaka może wpaść do zmiennej, i do niej dobierz szerokość typu.
wolno tak, bo przekroczenie zakresu nie zgłasza błędu, tylko cicho podaje wynik obcięty albo ujemny, a kryterium R.2.6 nazywa oba objawy wprost.
- 5
Średnią, procent i każdy inny iloraz licz w typie zmiennoprzecinkowym, rzutując licznik.
wolno tak, bo dzielenie dwóch liczb całkowitych obcina resztę w samym działaniu, więc typ zmiennej po lewej stronie już tego nie odwróci.
- 6
Na gotowym kodzie przejdź po deklaracjach i przy każdej powiedz, co w niej wyląduje.
wolno tak, bo to jedyny przegląd, który łapie typ dobrany odruchowo, a trwa krócej niż jedno uruchomienie programu.
Co widzę, więc co robię
| Widzę | Robię |
|---|---|
| Wartość jest identyfikatorem: PESEL, telefon, kod pocztowy, numer seryjny | Typ napisowy albo tablica znaków |
| Wartość może przekroczyć 2 147 483 647 | Typ 64-bitowy: long long w C++, long w C# i w Javie |
| Wartość przychodzi z klawiatury albo z pliku | Jawna konwersja przy wczytaniu: int(input()), int.Parse, Integer.parseInt |
| Liczysz średnią, procent albo dowolny iloraz | Typ zmiennoprzecinkowy plus rzutowanie licznika |
| Wartość to odpowiedź tak albo nie, zgoda, dostępność | Typ logiczny, nie liczba 0 i 1 |
| Porównujesz znak napisu z cyfrą | Odejmij znak zera: znak - '0' |
Drugi wiersz ma granicę, nie regułę kciuka: 2 147 483 647 to największa wartość typu całkowitego ze znakiem o szerokości 32 bitów.
Ćwiczenia
Trzy stopnie, w każdym mniej pomocy niż w poprzednim. Odpowiedź jest schowana celowo: zajrzyj do niej po własnej próbie, nie przed.
1Przykład z omówieniem
Przeczytaj fragment i wskaż każde pole oraz każdą zmienną, przy której typ nie pasuje do danych. Uwaga: nie wszystkie są złe.
Fragment programu obsługującego klientów sklepu struct Klient{ string imie; int kodPocztowy; int liczbaZamowien;}; int sredniaZamowien(int suma, int ilu){ return suma / ilu;}Pokaż odpowiedź
Dwa miejsca są złe. Linia 4: kod pocztowy jest identyfikatorem, nikt go nie dodaje, a zapis 05-800 traci w typie całkowitym i myślnik, i wiodące zero. Linia 8 wraz z 10: średnia zadeklarowana jako typ całkowity obcina resztę, więc przy sumie 7 i dwóch klientach wychodzi 3 zamiast 3,5. Poprawnie:
double sredniaZamowien(int suma, int ilu)zreturn (double)suma / ilu;. Pozostałe dwa pola są w porządku:imieto napis, aliczbaZamowiennaprawdę jest liczbą, bo się ją zwiększa i sumuje.2Znajdź resztę sam
Ta struktura pochodzi z arkusza INF.04-02-24.06-SG i ma pięć pól. Cztery mają typ pasujący do danych, jedno nie. Wskaż je, podaj numer linii i powiedz, dlaczego przeniesienie go do napisu byłoby złą poprawką.
Rekord z pliku: artysta, album, liczba piosenek, rok, liczba pobrań struct Album{ string artysta; string tytul; int liczbaPiosenek; int rok; short liczbaPobran;};Wskazówka: Cztery pola przechowują to, na co wyglądają. Piąte ma typ, który mieści mniej, niż wynosi wartość z zadania.
Pokaż odpowiedź
Linia 7.
shortma 16 bitów, czyli sięga 32 767, a największa liczba pobrań w tym arkuszu wynosi 1 506 404 300. Zasady oceniania mówią wprost: „zastosowano co najmniej 32-bitową konwersję i co najmniej 32-bitowy typ”, więc poprawką jestint, a pewniejlong long. Napis byłby złą poprawką z dwóch powodów: liczba pobrań jest porównywana, żeby znaleźć największą, a zasady oceniania tego arkusza wymagają w tej strukturze dwóch typów napisowych i trzech całkowitych. Zamiana zabrałaby punkt w innym kryterium.3Zadanie
Program wczytuje numer telefonu, liczbę rozmów i łączny czas, a potem wypisuje numer oraz średni czas rozmowy. Zmień wyłącznie typy i konwersje, ani jednej instrukcji więcej. Potem porównaj z rozwiązaniem i postaw sobie T albo N przy R.1.5.
Dwa typy do zmiany i jedno działanie, które trzeba naprawić przy okazji int main(){ long long numerTelefonu; int liczbaRozmow; int lacznyCzas; int sredniCzas; cout << "Podaj numer telefonu: "; cin >> numerTelefonu; cout << "Podaj liczbe rozmow: "; cin >> liczbaRozmow; cout << "Podaj laczny czas w minutach: "; cin >> lacznyCzas; sredniCzas = lacznyCzas / liczbaRozmow; cout << "Numer: " << numerTelefonu << endl; cout << "Sredni czas: " << sredniCzas << endl; return 0;}Pokaż odpowiedź
Do zmiany są dwie deklaracje i jedno działanie. Numer telefonu jest identyfikatorem, więc idzie do napisu: bez tego numer zaczynający się od zera traci pierwszą cyfrę. Średni czas jest ilorazem, więc idzie do typu zmiennoprzecinkowego, ale sama zmiana deklaracji nie wystarcza: dopóki po prawej stronie stoją dwie liczby całkowite, reszta ginie przed przypisaniem. Liczba rozmów i łączny czas zostają całkowite i to jest poprawne.
Pokaż rozwiązanie w kodzie
Rozwiązanie: dwie deklaracje i jedno rzutowanie int main(){ string numerTelefonu; int liczbaRozmow; int lacznyCzas; double sredniCzas; cout << "Podaj numer telefonu: "; cin >> numerTelefonu; cout << "Podaj liczbe rozmow: "; cin >> liczbaRozmow; cout << "Podaj laczny czas w minutach: "; cin >> lacznyCzas; sredniCzas = (double)lacznyCzas / liczbaRozmow; cout << "Numer: " << numerTelefonu << endl; cout << "Sredni czas: " << sredniCzas << endl; return 0;}- + linia 3Numer telefonu jako napis. Nic się na nim nie liczy, a wiodące zero przechodzi przez wczytanie bez zmiany. Uwaga na dalszy ciąg: `cin` kończy czytanie napisu na pierwszej spacji, więc numer zapisywany z odstępami wczytuje się przez `getline`.
- + linia 15Rzutowanie licznika, nie samo `double` po lewej stronie. Bez tego dzielenie dwóch liczb całkowitych obcina resztę zanim wynik trafi do zmiennej, a zmiana typu zmiennej tego nie odwraca.
Pułapka
„Numer telefonu i kod pocztowy to liczby, więc trzymam je w typie liczbowym. Sprawdziłem, że się mieszczą, więc problemu nie ma.”
Mieszczą się i kryterium mimo to przepada, a program przy okazji wypisuje bzdurę.
Poniższy program wczytuje kod pocztowy 05-800 wpisany bez myślnika, czyli 05800. Liczba mieści się w typie z ogromnym zapasem, a program wypisuje 5800, bo liczba nie ma czegoś takiego jak wiodące zero. Ta sama rzecz dzieje się z numerem PESEL osoby urodzonej po roku 2000 i tam kosztuje dodatkowo błędne rozpoznanie płci, bo cyfry przesuwają się o jedno miejsce.
int main(){ int kodPocztowy; cout << "Podaj kod pocztowy bez myslnika: "; cin >> kodPocztowy; cout << "Kod: " << kodPocztowy << endl; return 0;}Reguła poprawna
O typie rozstrzyga to, co robisz z wartością, a nie to, z jakich znaków się składa. Wartość, na której nigdy nie liczysz, jest identyfikatorem i idzie do napisu, choćby były w niej same cyfry. Pytanie „czy się mieści” jest drugim pytaniem w kolejności i zadaje się je dopiero wtedy, gdy pierwsze odpowiedziało, że to naprawdę jest liczba.
Sprawdź się
Odpowiadaj na głos albo na kartce, zanim odsłonisz. Odtworzenie z pamięci jest tym, co buduje trwałość, a przeczytanie odpowiedzi tylko przypomina, że się ją widziało.
- 1
Jakie dwa sposoby przechowania numeru PESEL kryterium dopuszcza wprost?
z pamięci
Pokaż odpowiedź
Zmienną tekstową albo tablicę elementów liczbowych lub znakowych. Typ liczbowy nie jest wymieniony i nie jest dopuszczony.
- 2
Do jakiej wartości sięga typ całkowity ze znakiem o szerokości 32 bitów?
z pamięci
Pokaż odpowiedź
Do 2 147 483 647. Powyżej tej granicy potrzebny jest typ 64-bitowy, czyli
long longw C++ orazlongw C# i w Javie. - 3
Piszesz w Pythonie, a kryterium z sesji Zima 2026 mówi, że typ wynika z przypisanych danych. Czy
int(input())jest jeszcze potrzebne?wykonanie i uzasadnienie
Pokaż odpowiedź
Tak.
input()zwraca napis, więc typ wynikający z przypisanych danych jest wtedy napisem, a nie liczbą. Nowsze brzmienie przestało nazywać konwersję po imieniu, a nie przestało jej wymagać: bez niej dane wczytane jako liczba po prostu nie są liczbą. - 4
Masz
int sumaiint ilu, a średnią zadeklarowałeś jakodouble. Wynik i tak wychodzi bez części ułamkowej. Dlaczego?wykonanie i uzasadnienie
Pokaż odpowiedź
Bo obcięcie dzieje się w samym dzieleniu, zanim wynik trafi do zmiennej. Dwie liczby całkowite dają w tym języku iloraz całkowity. Naprawia to rzutowanie licznika:
(double)suma / ilu. - 5
PESEL trzymasz w napisie i chcesz sprawdzić, czy dziesiąta cyfra jest parzysta. Co zapisujesz?
wykonanie i uzasadnienie
Pokaż odpowiedź
pesel[9] - '0', a potem sprawdzasz resztę z dzielenia przez dwa. Indeks 9 to dziesiąty znak liczony od jedynki, a odjęcie znaku zera zamienia znak na liczbę. Bez tego odejmowania porównujesz kod znaku, który jest o 48 większy od cyfry.
Kiedy umiem
Warunki obserwowalne. Dopóki któryś nie jest spełniony, dział zostaje w toku, nawet jeżeli materiał wydaje się oczywisty.
- Przy każdej deklaracji w programie pisanym na czas potrafię powiedzieć jednym zdaniem, jaka największa wartość może w tej zmiennej wylądować.
- W cudzym kodzie wskazuję każdą wartość, która jest identyfikatorem, i uzasadniam to tym, że program nigdy na niej nie liczy.
- Wczytuję liczbę z klawiatury w każdym z czterech języków i za każdym razem konwersja stoi w kodzie jawnie, bez zaglądania do tej lekcji.
- Po co najmniej siedmiu dniach od tej lekcji, przy zamkniętym materiale, dobieram typy do pięciu pól rekordu z arkusza i przy każdym podaję powód.
- Po próbie arkusza stawiam sobie T albo N przy R.1.5, wskazując konkretną deklarację, która ten werdykt uzasadnia.
Źródła
- Zasady oceniania CKE do arkuszy INF.04, sesje 2021 do 2026, 20 arkuszy; kryterium R.1.5 obecne w każdym z nich
- Dosłowny cytat R.1.5: zasady oceniania INF.04-01-24.01-SG, rezultat 1
- Dosłowny cytat R.2.6 i wartość 1 506 404 300: zasady oceniania INF.04-02-24.06-SG, rezultat 2
- Warianty brzmienia R.1.5: INF.04-01-22.06-SG i INF.04-02-22.06-SG oraz INF.04-01-23.01-SG, INF.04-01-23.06-SG, INF.04-02-23.06-SG i INF.04-03-23.06-SG (arkusze kalkulacyjne CKE), a dalej INF.04-01-24.06-SG, INF.04-01-25.01-SG, INF.04-01-25.06-SG, INF.04-01-26.01-SG i INF.04-01-26.06-SG
- Zmiana zdania o Pythonie: „jawna konwersja do odpowiednich typów” do INF.04-01-24.06-SG, „typ wynika z przypisanych danych” od INF.04-01-25.01-SG
- Uwagi ogólne do rezultatu 1: tolerancja 90 procent oraz zakres samodzielnie napisanego kodu, INF.04-01-26.01-SG
- Katalog strat punktowych E.6 z pliku wiedzy 01, sekcja 10
- Ścieżka nauki programowania, plik wiedzy 07, dział A3: kryterium obecne w 20 arkuszach z 20