Przejdź do treści
INF.04 · część pisemna

Języki programowania

Przed Tobą 10 pytań w formule egzaminu CKE.

Pytanie 1 / 10Algorytmika i Logika
Co wypisze fragment programu w C++: int a = 7, b = 2; double w = a / b; cout << w << endl;
Wszystkie 10 pytań z wyjaśnieniamiRozwiń, jeśli wolisz przejrzeć zestaw bez rozwiązywania testu.

Typy i ich zakresy, rzutowanie, dzielenie całkowite, przekazywanie parametrów, kompilacja kontra interpretacja, wyjątki i pliki.

1.Co wypisze fragment programu w C++: int a = 7, b = 2; double w = a / b; cout << w << endl;

  • A.3— poprawna
  • B.3.5
  • C.4
  • D.1
Dlaczego: O typie działania decydują typy argumentów, a nie typ zmiennej docelowej. Oba operandy są całkowite, więc procesor wykonuje dzielenie całkowite i odrzuca resztę, a dopiero gotowa trójka jest zamieniana na liczbę rzeczywistą. Kusi wynik 3.5, bo w deklaracji widać słowo double — ale konwersja przychodzi za późno, reszta jest już stracona.

2.Jaką wartość będzie miała zmienna x po wykonaniu instrukcji: int x = static_cast<int>(-3.99);

  • A.-4
  • B.-3— poprawna
  • C.-3.99
  • D.0
Dlaczego: Rzutowanie liczby rzeczywistej na typ całkowity to obcięcie części ułamkowej w stronę zera, a nie zaokrąglanie do najbliższej liczby. Dlatego znikają wszystkie cyfry po przecinku i zostaje sama część całkowita. Odpowiedź -4 kusi, bo tak zachowuje się zaokrąglanie matematyczne, ale do zaokrąglania służy dopiero funkcja round.

3.Program w C++ zawiera: void f(int x) { x = x * 2; } void g(int& x) { x = x * 2; } int main() { int a = 5, b = 5; f(a); g(b); cout << a << " " << b; } Co wypisze?

  • A.10 10
  • B.10 5
  • C.5 5
  • D.5 10— poprawna
Dlaczego: Pierwsza funkcja dostaje kopię argumentu leżącą w osobnym miejscu pamięci, więc jej modyfikacja ginie razem z kopią po powrocie z funkcji. Druga ma w nagłówku ampersand przy typie, czyli pracuje na aliasie oryginału. Kusi odpowiedź, w której obie liczby są podwojone, bo w obu funkcjach widać identyczne mnożenie przez dwa.

4.Które zestawienie poprawnie opisuje sposób wykonania programów napisanych w C++, Javie i Pythonie?

  • A.C++ i Java dają kod maszynowy, Python daje bajtkod uruchamiany przez maszynę wirtualną
  • B.C++ daje bajtkod dla maszyny wirtualnej, Java i Python są interpretowane wiersz po wierszu
  • C.C++ daje kod maszynowy, Java daje bajtkod wykonywany przez JVM, Python jest interpretowany— poprawna
  • D.C++ jest interpretowany, Java daje kod maszynowy, Python daje kod pośredni dla JVM
Dlaczego: Każdy z trzech modeli tłumaczy kod w innym momencie: raz przed uruchomieniem na rozkazy konkretnego procesora, raz na format pośredni dla środowiska uruchomieniowego, albo na bieżąco przy każdym starcie. Kusi wrzucenie Javy do jednego worka z C++, bo w obu istnieje osobny etap kompilacji, ale wynik javac nie jest kodem żadnego procesora.

5.Podczas budowania programu w C++ pojawia się komunikat: undefined reference to 'suma(int)'. Na którym etapie powstał ten błąd?

  • A.Preprocesora
  • B.Konsolidacji— poprawna
  • C.Kompilacji
  • D.Wykonania
Dlaczego: Komunikat mówi o braku adresu funkcji, a adresy z innych plików obiektowych uzupełnia dopiero linker, gdy scala je z bibliotekami w plik wykonywalny. Skoro deklaracja istniała, analiza składniowa przeszła bez zastrzeżeń, więc odpowiedź wskazująca etap kompilacji kusi, ale funkcja nie ma po prostu nigdzie definicji.

6.Które stwierdzenie o typowaniu w językach programowania jest prawdziwe?

  • A.Python jest typowany dynamicznie i słabo, więc dodanie liczby do napisu daje wynik bez błędu
  • B.C++ jest typowany dynamicznie, bo typ zmiennej może się zmienić w trakcie działania programu
  • C.Java jest typowana dynamicznie, ponieważ typ sprawdza dopiero maszyna wirtualna przy starcie
  • D.Python jest typowany dynamicznie, ale silnie, więc dodanie liczby do napisu daje błąd TypeError— poprawna
Dlaczego: To dwie niezależne osie: pierwsza mówi, kiedy sprawdzany jest typ (przy kompilacji czy w czasie działania), druga czy język sam wykonuje ciche konwersje niezgodnych typów. Najczęstsza pomyłka to sklejenie ich w jedno i uznanie, że brak deklaracji typu oznacza automatyczne przekształcanie napisu na liczbę, jak w PHP czy JavaScripcie.

7.Program w Javie wykonuje: try { print("A"); int x = 10 / 0; print("B"); } catch (ArithmeticException e) { print("C"); } finally { print("D"); } print("E"); Co zostanie wypisane?

  • A.ACDE— poprawna
  • B.ABCDE
  • C.ACD
  • D.ADE
Dlaczego: Rzucenie wyjątku natychmiast przerywa blok chroniony, więc instrukcje stojące za miejscem awarii są pomijane, a sterowanie skacze do pasującego bloku przechwytującego. Blok sprzątający wykonuje się zawsze, po nim program biegnie dalej. Kusi wersja z literą B, bo wygląda na to, że po obsłużeniu błędu kod wraca do przerwanego miejsca.

8.Zmienna typu int ze znakiem zajmuje 4 bajty. Jaki zakres wartości może przechowywać?

  • A.od 0 do 4 294 967 295
  • B.od −32 768 do 32 767
  • C.od −2 147 483 648 do 2 147 483 647— poprawna
  • D.od −2 147 483 647 do 2 147 483 648
Dlaczego: Cztery bajty to 32 bity, z czego jeden koduje znak, więc zakres wynosi od minus dwa do potęgi trzydziestej pierwszej do dwa do potęgi trzydziestej pierwszej minus jeden. Asymetria bierze się stąd, że zero mieści się po stronie dodatniej. Zakres zaczynający się od zera dotyczy odmiany bez znaku, a mniejszy dwubajtowego typu short.

9.Program ma dopisać nowy wiersz na końcu istniejącego pliku raport.txt bez kasowania jego dotychczasowej treści. Który zapis otwarcia strumienia jest poprawny?

  • A.ofstream plik("raport.txt");
  • B.ofstream plik("raport.txt", ios::app);— poprawna
  • C.ofstream plik("raport.txt", ios::out);
  • D.ifstream plik("raport.txt", ios::app);
Dlaczego: Strumień wyjściowy otwarty domyślnie ustawia wskaźnik zapisu na początku i czyści zawartość pliku, więc stare dane przepadają jeszcze przed pierwszą operacją zapisu. Tryb dopisywania przesuwa wskaźnik na koniec. Zapis ze strumieniem wejściowym kusi nazwą, ale ten służy wyłącznie do odczytu i nic do pliku nie dopisze.

10.Który z wymienionych problemów ujawni się dopiero na etapie wykonania programu, a nie wcześniej?

  • A.Brak średnika na końcu instrukcji w pliku źródłowym
  • B.Próba przypisania nowej wartości zmiennej zadeklarowanej jako const
  • C.Odczyt elementu spoza zakresu wektora metodą at, kończący się wyjątkiem out_of_range— poprawna
  • D.Wywołanie funkcji zadeklarowanej w nagłówku, lecz nigdzie niezdefiniowanej
Dlaczego: Analizator składni i kontrola typów działają na samym tekście programu, więc wychwytują wszystko, co da się ocenić bez uruchamiania. Brakujące definicje wykrywa scalanie plików obiektowych. Zależny od danych indeks znany jest dopiero w trakcie działania, dlatego zgłasza go biblioteka standardowa w postaci wyjątku, a nie kompilator.

To nie koniec powtórki

Przećwicz kolejny zestaw i utrwal materiał przed egzaminem.

Dalej: Inżynieria oprogramowania i projektowanie