Przejdź do treści
INF.04Kategorie
A3

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.

R.1.5

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.

R.2.6

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.

Zapis, w którym typy nie pasują do danych
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.
Ten sam program, typy dobrane do danych
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 kryteriumGdzie się łamieGdzie jest spełniony
numer PESEL jest przechowywany w zmiennej tekstowej albo tablicy elementów liczbowych lub znakowychlong long pesel w liniach 1 i 15, czyli żaden z dwóch typów wymienionych w kryteriumstring 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 resztalinia 3 z pesel[9] - '0', czyli przykładem podanym w treści kryterium
Zastosowano typy pasujące do problemuliczba tam, gdzie dane są identyfikatorem, więc obietnica typu i dane rozjeżdżają się od pierwszej liniinapis 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++
int ma 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 bierz long long. Napisy wymagają #include <string>, a cin >> napis kończy czytanie na spacji.
C#
int to zawsze 32 bity, long zawsze 64, więc szerokość jest przewidywalna. Console.ReadLine zwraca napis, więc liczba wymaga int.Parse albo Convert.ToInt32. Znak zamieniasz na cyfrę przez znak - '0' tak samo jak w C++.
Java
Szerokości jak w C#: int 32 bity, long 64. Przy wczytywaniu nextInt konwertuje sam, ale nextLine już nie, więc mieszanie obu w jednym programie jest najczęstszym źródłem złego typu. Integer.parseInt jest 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. 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. 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. 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. 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. 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. 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 seryjnyTyp napisowy albo tablica znaków
Wartość może przekroczyć 2 147 483 647Typ 64-bitowy: long long w C++, long w C# i w Javie
Wartość przychodzi z klawiatury albo z plikuJawna konwersja przy wczytaniu: int(input()), int.Parse, Integer.parseInt
Liczysz średnią, procent albo dowolny ilorazTyp 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.

  1. 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) z return (double)suma / ilu;. Pozostałe dwa pola są w porządku: imie to napis, a liczbaZamowien naprawdę jest liczbą, bo się ją zwiększa i sumuje.

  2. 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. short ma 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ą jest int, a pewniej long 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.

  3. 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.

Mieści się w typie, a i tak wypisuje co innego, niż wpisano
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. 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. 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 long w C++ oraz long w C# i w Javie.

  3. 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. 4

    Masz int suma i int ilu, a średnią zadeklarowałeś jako double. 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. 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