Quiz

Zestaw zadań 1

Zapoznaj się z poniższym programem, a następnie odpowiedz na poniższe pytania. Prosimy o odpowiedź na pytania, analizując wyłącznie kod źródłowy, tj. nie kopiuj go do pliku, skompilowaj go i odpowiedz na pytania na podstawie jego uruchomienia. To cała przyjemność z oglądania!

int main() {
  int counter, first, last, next;
  first = 1; last = 2;

  for (counter = first; counter <= last; counter++) {
    cout << "\n " << counter;
    next = counter * counter;
    cout << " " << next;
  }

  counter = first;
  while (counter <= last) {
    cout << "\n " << counter;
    next = counter * counter;
    cout << " " << next;
    counter++;
  }

  counter = first;
  do {
    cout << "\n " << counter;
    next = counter * counter;
    cout << " " << next;
    counter++;
  } while (counter < last);
}

Pytanie 1. Jaki jest efekt tego programu?

A) 1 2
2 4
1 2
2 4
1 2
2 4
B) 1 1
2 4
1 1
2 4
1 1
2 4
C) 1 1
2 4
1 1
2 4
1 1
D) 1 1
2 4
1 1
1 1
2 4
E) Nic nie wyświetla – występują błędy w składni.

Pytanie 2. Co się stanie, jeśli usuniemy inicjowanie „licznika” przed pętlą do-when?

A) pętla nieskończona — pętla do-when zwraca serię 1.
B) Dane wyjściowe programu się nie zmienią
C) Pętla do-when zwraca wartości 2 i 4.
D) Pętla „do-Podczas” nie zwraca żadnych wyników
E) Pętla do-when zwraca wartości 3 i 9.

Pytanie 3. Biorąc pod uwagę oryginalny program u góry strony, załóżmy, że usunęliśmy wiersz, który inicjuje zmienną licznika przed pętlą podczas trwania. Co się stanie, jeśli usuniemy też licznik + wiersz w pętli Podczas, jak w przykładzie poniżej?

A) Pętla podczas odtwarzania nic nie zwraca.
B) pętla podczas wykonywania daje wynik 1 i 1, a pętla do-pending nie generuje żadnych wyników.
C) Dane wyjściowe pętli podczas wykonywania są takie same jak w przypadku uwzględnienia obu wierszy.
D) System będzie generował losowe liczby, dopóki komputer nie zostanie wyłączony.
E) Pętla „Podczas” to pętla nieskończona

Pytanie 4. Co się stanie, jeśli weźmiemy pod uwagę pierwotny program na górze tej strony, jeśli pętla „if” będzie wyglądać tak?

counter = first;
while (counter <= last) {
  cout << "\n" << counter;
  if (first % 2 == 0)
    next = counter * counter;
  cout << "  " << next;
  counter++;
}
A) Dane wyjściowe pętli podczas wykonywania są takie same jak w pierwotnym programie.
B) Pętla „Podczas” nie zwraca żadnych danych
C) Wynikiem pętli „gdy” jest 1 1 i 1 4.
D) Wynikiem pętli „gdy” jest 1, 2 i 2 4.
E) Wynikiem pętli „gdy” jest 1, 4 i 2 4.
F) Wynikiem pętli „gdy” jest 2, 4 i 2 4.

Pytanie 5. Co się stanie, jeśli pierwsza zmienna będzie większa od ostatniej?

A) Pętla podczas odtwarzania wygeneruje coś, ale nic innego nie zwróci.
B) Zapętlanie czynności do wykonania spowoduje wygenerowanie jakiegoś działania, ale nic innego nie zwróci.
C) W ogóle nie będzie danych wyjściowych.
D) Program będzie sygnalizował błąd lub awarię
E) Pętla for daje coś, ale nic innego nie zwraca.

Pytanie 6. Jakie będą dane wyjściowe programu, jeśli zainicjujemy pierwszą zmienną tak, aby była taka sama jak ostatnia zmienna?

A) Zapętlanie czynności do wykonania spowoduje wygenerowanie jakiegoś działania, ale nic innego nie zwróci.
B) Pętla podczas odtwarzania wygeneruje coś, ale nic innego nie zwróci.
C) Każda pętla generuje jeden wiersz.
D) Zapętlenie wykonywania operacji do czasu, w którym są wyświetlane 2 wiersze, a drugi – jeden.
E) Nie zwróci niczego
F) Pętla for daje coś, ale nic innego nie zwraca.


Zestaw zadań 2

Podobnie jak w przypadku poprzedniego zestawu zadań, poniżej znajdziesz program do rozważenia. Odpowiedz na poniższe pytania, przeglądając tylko kod źródłowy.

#include <iostream>
using namespace std;

int main() {
  int Boys = 3, Girls = 5;
  void F1(int males, int females);
  void F2(int &m, int &f);

  F1(Boys, Girls);
  cout << "\nAfter calling F1, within main()";
  cout << "\n\tBoys = " << Boys; // #2
  cout << "\n\tGirls = " << Girls;

  F2(Boys, Girls);
  cout << "\nAfter calling F2, within main()";
  cout << "\n\tBoys = " << Boys; // #4
  cout << "\n\tGirls = " << Girls;
}

void F1(int b, int g) {
  b += 3, g += 4;
  cout << "\nF1";
  cout << "\n\tBoys = " << b; // #1
  cout << "\n\tGirls = " << g;
}

void F2(int &b, int &g) {
  b = b + 8, g = g + 5;
  cout << "\nF2";
  cout << "\n\tBoys = " << b; // #3
  cout << "\n\tGirls = " << g;
}

Pytanie 1. Jaki jest wynik zmiennej Boys w zaznaczonych wierszach?

A) #1: 6
#2: 3
#3: 11
#4: 11
B) #1: 6
#2: 3
#3: 11
#4: 3
C) #1: 6
#2: 6
#3: 11
#4: 11
D) Nie zwraca żadnych danych, ponieważ nie kompiluje się ani nie uruchamia.

Pytanie 2. Wybierz wszystkie pasujące odpowiedzi związane z następującymi zagadnieniami dotyczącymi programu:

void F1(int males, int females);
void F2(int &m, int &f);
A) Reguły C++ określają, że możemy usunąć te 2 wiersze, jeśli tylko zostaną one zdefiniowane przed użyciem.
B) Reguły C++ określają, że nazwy argumentów w deklaracji i definicji muszą być takie same.
C) Ten program ulegnie awarii, jeśli zostaną usunięte te dwie linie.
D) Częściej występuje deklaracje w zakresie globalnym.
E) Są to tzw. deklaracje przekazywania.

Pytanie 3. Co się stanie, gdy przeniesiemy następujący wiersz z main() do zakresu globalnego?

int Boys = 3, Girls = 5;
A) Dane wyjściowe będą takie same.
B) chłopcy będą = 3, a dziewczynki = 5 w całości
C) Chłopcy będą = 3, a dziewczynki = 5 tylko w wyniku działania main()

Pytanie 4. A co, jeśli zmienimy początek programu na taki:

// We have moved moved these to global scope
const int Boys = 3;
const int Girls = 5;

void main() {
  //int Boys = 3, Girls = 5;
A) Program jest kompilowany, ale ulega awarii przy próbie jego uruchomienia.
B) Dane wyjściowe nie zmienią się.
C) W rezultacie wynik to 3 dziewczyny = 5 chłopców.
D) W wyniku funkcji main() wynik będzie miał postać Boys = 3 Girls = 5.
E) Program prawdopodobnie się nie skompilowa (w zależności od kompilatora).

Pytanie 5. Dane są przekazywane przez wartość w F2.

A) Prawda
B) Fałsz


Zestaw zadań 3

Podobnie jak w przypadku poprzedniego zestawu zadań, poniżej znajdziesz program do rozważenia. Odpowiedz na poniższe pytania, analizując tylko kod źródłowy.Ta funkcja jest ciekawsza niż poprzednie 2 – dokładnie prześledź kod.

#include <iostream>
using namespace std;

const int MAX_SIZE = 20;
typedef int ARR2D[MAX_SIZE][MAX_SIZE];

void Print(ARR2D in_array, int rows, int cols);
void Fill(ARR2D in_array, int rows, int cols);

int main() {
  ARR2D matrix;
  int row, col;
  do {
    cout << "Please enter the size of the matrix to generate (rows and cols) :" << endl;
    cin >> row >> col;
  } while (row <= 0 || row > MAX_SIZE || col <= 0 || col > MAX_SIZE);
  Fill(matrix, row, col);
  Print(matrix, row, col);
  return(0);
}

void Print(ARR2D in_array, int rows, int cols) {
  for (int i = 0; i < rows; i++) {
    for (int j = 0; j < cols; j++)
      cout << '\t' << in_array[i][j];
    cout << endl;
  }
}

void Fill(ARR2D in_array, int rows, int cols) {
  for(int i = 0; i < rows; i++)
    for (int j = 0; j < cols; j++)
      in_array[i][j] = 0;

  const int limit = rows * cols;
  int cNum = 1;
  int cRow = 0;
  int cCol = 0;
  int cDir = 0;  // 0-north, 1-east, 2-south, 3-west

  while(true) {
    // Place the number.
    in_array[cRow][cCol] = cNum;
    cNum++;
    if (cNum > limit) break;

    int fRow = cRow;
    int fCol = cCol;
    while (true) {
      fRow = cRow;
      fCol = cCol;
      switch(cDir) {
        case 0: fRow--; break;
        case 1: fCol++; break;
        case 2: fRow++; break;
        case 3: fCol--; break;
      }

      if ( fRow >= 0 && fRow < rows && fCol >= 0 && fCol < cols && in_array[fRow][fCol] == 0)
        break;
      cDir = (cDir + 1) % 4;
    }
    cRow = fRow;
    cCol = fCol;
  }
}

Pytanie 1. Jakie dane wyjściowe generuje ten program, gdy wpisano 3 dla wierszy i 4 dla kolumn?

A) 1 2 3
4 5 6
7 8 9
10 11 12
B) 1 2 3 4
5 6 7 8
9 10 11 12
C) 12 11 10 9
8 7 6 5
4 3 2 1
D) 1 3 2 4
8 6 7 5
9 11 10 12
E) 1 2 3 4
10 11 12 5
9 8 7 6
G) 9 8 7 6
10 11 12 5
1 2 3 4
H) Nie generuje żadnych działań – logika jest błędna.
I) Nic nie wyświetla – występują błędy składni.
J) Nic nie wyświetla – nie powinno.
K) Przekazuje na nie pierwsze 12 cyfr, które przyjdą Ci na myśl podczas oczekiwania na uruchomienie programu.

Pytanie 2. A co, jeśli do funkcji main() dodamy następujący wiersz?

MAX_SIZE = 10;
A) Nie jest to dozwolone w C++.
B) Jest to dozwolone; program będzie działać z wartością MAX_SIZE ustawioną na 20
C) Jest to dozwolone. Program będzie działać z wartością MAX_SIZE ustawioną na 10.

Pytanie 3. Rozważmy cztery następujące kwestie:

const int MAX_SIZE = 20;
typedef int ARR2D [MAX_SIZE][MAX_SIZE];

void Print  (ARR2D A, int rows, int cols);
void Fill   (ARR2D A, int rows, int cols);

1) Czy można używać stałej w typie typedef?
2) Czy można użyć elementu typedef w deklaracji, zanim zmienna tego typu zostanie zadeklarowana?

A) 1) Tak 2) Tak
B) 1) Nie 2) Nie
C) 1) Nie 2) Tak
D) 1) Tak 2) Nie

Pytanie 4. Czy możemy wykorzystać:

#define MAX_SIZE 20
zamiast:
const int MAX_SIZE = 20;
A) Tak, to działa i można używać #define dla stałych w C++
B) Tak, będzie to działać, ale zwykle nie używamy #define dla stałych w C++
C) Parametr #define nie jest dostępny w C++
D) Nie możesz wykonać żadnej z tych czynności w C

Pytanie 5. Parametr typedef służy do tworzenia aliasu dla nazwy typu.

A) Prawda
B) Fałsz

Pytanie 6. Co się stanie, jeśli nie zainicjujemy tablicy do wartości 0 w funkcji Fill()?

A) Zostanie uruchomiony, ale w wynikach będzie wszystkie 12 wartości
B) Będzie działać prawidłowo i wygeneruje te same dane wyjściowe jak w przypadku zainicjowania tablicy 0
C) Program nie będzie działać lub ulegnie awarii
D) Zostanie uruchomiony, ale w wynikach wyjściowych będą występować same 0
E) Działanie zostanie uruchomione, ale może nie wygenerować żadnych danych wyjściowych.

Pytanie 7. Zaznacz wszystkie pasujące odpowiedzi. Dlaczego w tym programie używamy stałej wartości MAX_SIZE? Czy nie łatwiej jest po prostu wpisać „20” zamiast MAX_SIZE wszędzie tam, gdzie jest to potrzebne?

A) MAX_SIZE to wbudowana wartość C++, z której każdy może korzystać. Po prostu ją skonfiguruj i zacznij z niej korzystać.
B) Należy unikać zmiennych globalnych tak samo jak zmiennych globalnych
C) Użycie kontrastu ułatwia zrozumienie naszego programu.
D) Magiczne liczby w programie są zwykle uznawane za dobrą praktykę.
E) Jeśli chcesz zmienić MAX_SIZE, wystarczy, że zrobisz to tylko w jednym miejscu

Pytanie 8. Instrukcja Switch w funkcji Fill() powinna mieć wartość domyślną, ponieważ użycie takiego stylu jest uznawane za dobry styl.

A) Prawda
B) Fałsz

Pytanie 9. W funkcji Fill() deklarujemy zmienne między instrukcjami. Na przykład cNum i cRow są deklarowane i inicjowane po uruchomieniu pętli for. Czy będzie to działać w języku C++ czy czy wszystkie zmienne trzeba zadeklarować u góry funkcji?

A) Nie ma w tym nic złego.
B) Wszystkie zmienne muszą być zadeklarowane na górze funkcji.
C) Oba sposoby są błędne – C++ nie zezwala na stosowanie zmiennych w żadnym miejscu programu.
D) Wszystkie zmienne muszą być zadeklarowane w zakresie globalnym.

Zestaw zadań 4

Poniżej znajduje się zestaw plików definiujących i testujących prostą klasę. Aby odpowiedzieć na poniższe pytania, należy się odwoływać do kodu źródłowego.

Oto plik nagłówkowy (cow.h):

#ifndef COW_H
#define COW_H

using namespace std;

typedef enum Color {black, brown, beige, blackandwhite, nocolor};

class Cow {
 public:
  Cow();
  ~Cow();

  // accessors
  double weight() { return weight_; };
  string name() { return name_; };
  Color color() { return color_; };

  // mutators
  void set_name(string inName) { name_ = inName; };
  void set_color(Color inColor) { color_ = inColor; };
  void set_weight(double inWeight) {weight_ = inWeight; };

  void Moo();
  void Properties();

 private:
  Color color_;
  double weight_;
  string name_;
};

#endif

Oto powiązany plik .cc (cow.cc):

#include <iostream>
#include "cow.h"

using namespace std;

Cow::Cow() {}

Cow::~Cow() {}

void Cow::Moo() {
  cout << name() << " says MOO." << endl;
}

void Cow::Properties() {
  cout << name() << " weighs " << weight() << ", is "
       << color() << " and says MOO." << endl;
}

Oto program dla klienta na te zajęcia (cowmain.cc):

#include <iostream>
#include "cow.h"

using namespace std;

int main() {
  Cow cow1;
  cow1.set_name("betsy");
  cow1.set_weight(400.0);
  cow1.set_color(black);

  cow1.Moo();
  cow1.Properties();
}

Pytanie 1. Jakie efekty daje ten program?

A) Betsy mówi „MOO”.
Betsy waży 400, czyli 0 i mówi MOO.
B) Betsy mówi „MOO”.
Bawka waży 400 lat, jest czarna i mówi „MOO”.
C) Betsy mówi „MOO”.
Betsy waży 400,

Pytanie 2. Kodu metod akcesora i mutatora nie powinno się nigdy umieszczać w pliku nagłówkowym. (uwaga: akcesor to metoda, która zwraca wartość, a mutator to metoda modyfikująca wartość).

A) Prawda
B) Fałsz

Pytanie 3. Czy trzeba dodać ciąg „Cow::” przed każdą definicją funkcji w katalogu cow.cc?

A) Nie – ponieważ obejmuje słowo kluczowe cow.h
B) Tak

Pytanie 4. Jakie role pełnią:

#ifndef COW_H
#define COW_H
...
#endif

odtworzyć w pliku nagłówka?

Wybierz wszystkie pasujące odpowiedzi:

A) Nie służą one do żadnego celu, ponieważ nazwa pliku to cow.h, a nie COW_H.
B) W przeciwnym razie pojawi się błąd środowiska wykonawczego.
C) Jeśli tego nie zrobimy, możemy uwzględnić plik więcej niż raz
D) Nic nie działają, ponieważ w co najmniej jednym słowie kluczowym jest literówka.
E) Nic nie działają, ponieważ klasa Cow ma tylko 1 plik nagłówka.

Pytanie 5. Co się stanie, gdy do domeny cowmain.cc dodamy poniższy wiersz?

cow1.weight_ = 24;
A) Program działałby, a zmienna wagi zostałaby zmodyfikowana przez ten wiersz.
B) Program był kompilowany i uruchamiany, ale ulegał awarii w tym wierszu.
C) C++ na to nie pozwala.
D) Program będzie kompilowany i uruchamiany, ale ten wiersz nie zmienia zmiennej wagi.

Pytanie 6. Po wykonaniu poniższego wiersza wywoływany jest konstruktor klasy Cow:

Cow cow1;

Jakie są ważne cechy konstruktorów?

Wybierz wszystkie pasujące odpowiedzi

A) Zazwyczaj nie zwracają żadnych wartości
B) Jeśli nie podamy konstruktora w naszej klasie, klasa nie będzie się kompilować.
C) Konstruktor z klasy Cow jest nietypowy, ponieważ nie inicjuje zmiennych prywatnych.
D) Mają zawsze taką samą nazwę jak zajęcia.
E) Klasa może mieć kilka konstruktorów, dopóki argumenty będą różne
F) Podczas inicjowania klasy jest wywoływany konstruktor.

Pytanie 7. Jakie są ważne cechy niszczyciela?

A) Destruktor jest wywoływany, gdy obiekt wykracza poza zakres
B) Destruktor ma taką samą nazwę jak klasa, ale jest poprzedzony znakiem „~”
C) W destruktorze cow.cc jest coś nie tak, ponieważ to nic nie robi.
D) Jeśli nie utworzysz destruktora dla klasy, klasa nie będzie kompilowana.

Pytanie 8. Biorąc pod uwagę sposób, w jaki program dla klienta korzysta z zajęć, weź pod uwagę te kwestie:

Podział członków na publiczny i prywatny w ramach klasy Krowa nie jest odpowiedni. Oznacza to, że coś, co jest prywatne, powinno być publiczne, a coś, co publiczne, powinno być prywatne.

A) Prawda
B) Fałsz

Pytanie 9: A co, jeśli oprócz tego, który musimy dodać cow.cc, dodamy kolejny konstruktor? Nowy konstruktor wygląda tak

Cow::Cow(string inName, double inWeight, Color inColor) {
  set_name(inName);
  set_weight(inWeight);
  set_color(inColor);
}

Do metody main() dodajemy następujące wiersze:

Cow cow2("milly", 350.2, brown);
cow2.Moo();
cow2.Properties();

Czy możemy to zrobić?

Wybierz wszystkie pasujące odpowiedzi

A) Wiersz w main(), w którym zainicjujemy kod cow2, ulegnie awarii.
B) Możemy mieć tylko 1 konstruktor.
C) Jest to często spotykane w C++
D) Tak, ale nie jest to typowe użycie C++
E) Będzie to działać prawidłowo, ale nie wyświetli niczego, ponieważ prywatne dane nie zostały zainicjowane.
F) Nie można wywoływać funkcji setName(), setColor() i setWeight() z metody tej samej klasy.


Pytania dodatkowe

Pytanie 1. Jaki jest efekt poniższych działań?

#include <iostream>
using namespace std;

void HelpMe(int *p, int *num, int *q);
void WhereAmI(int *p, int *q, int a);

void HelpMe(int *p, int *num, int *q) {
  int a;

  a = 2;
  q = &a;
  *p = *q + *num;
  num = p;
}


void WhereAmI(int *p, int *q, int a) {
  a = 6;
  *p = a + *p;
  *q = a + 3;
  HelpMe(q, &a, p);
}


int main() {
  int *p;
  int q;
  int *num;
  int a;

  a = 3;
  q = 5;
  p = &a;
  num = &q;

  HelpMe(&a, p, num);
  WhereAmI(&q, p, *num);

  cout << "*p = " << *p << " q = " << q << " *num = " << *num << endl;
}
 

Pytanie 2. Rozważ poniższe stwierdzenie przy założeniu, że klasa Apple istnieje i została zainicjowana. Klasa Apple ma zmienną instancji color_:

Apple* granny_smith = new Apple; 

Zaznacz wszystkie poniższe stwierdzenia, które są prawdziwe:

A) Apple* granny_smith = NULL; if (granny_smith == NULL)... To NIE jest prawidłowe – wartość NULL nie można sprawdzić w ten sposób.
B) Apple* granny_smith, fuji; to deklaruje dwa wskaźniki do obiektów Apple
C) Zmienna granny_smith zawiera wartości zmiennych instancji powiązanych z obiektem Apple
D) Apple* granny_smith = NULL; W porządku,
E) Zmienna granny_smith zawiera adres obiektu Apple
F) string gs_color = *(granny_smith.get_color( przydatne) Ta instrukcja zwraca kolor obiektu granny_smith przy założeniu, że został zainicjowany.
G) Miejsce na dane nowego obiektu Apple jest przydzielane na stercie
H) Pamięć dla nowego obiektu Apple jest przydzielana w stosie środowiska wykonawczego
I) int* a = &b; Spowoduje to umieszczenie adresu b w punkcie a.


Pytanie 3. Jaki jest efekt działania tego programu?

#include <iostream>
using namespace std;

const int kNumVeggies = 4;

void Grill(int squash, int *mushroom);
int Saute(int onions[], int celery);


void Grill(int squash, int *mushroom) {
  *mushroom = squash/4;
  cout << *mushroom + squash << endl;
}

int Saute(int onions[], int celery) {
  celery *= 2;
  onions[celery]++;
  Grill(onions[0], &onions[3]);
  cout << celery << " " << onions[3] << endl;
  return celery;
}

int main() {
  int broccoli, peppers[kNumVeggies], *zucchini;

  for (broccoli = 0; broccoli < kNumVeggies; broccoli++)
    peppers[broccoli] = kNumVeggies - broccoli;
  zucchini = &peppers[Saute(peppers,1)];
  Grill(*zucchini, zucchini);
  zucchini--;
  cout << peppers[3] + *zucchini + *(zucchini + 1) << endl;
}


Odpowiedzi na pytania

Spróbuj odpowiedzieć na wszystkie powyższe pytania bez sprawdzania odpowiedzi. Lepiej poprosić kogoś o pomoc niż poprosić o pomoc od razu w arkuszu z odpowiedziami.

Odpowiedzi na powyższe problemy znajdziesz tutaj.