Quiz

Zestaw zadań 1

Zapoznaj się z poniższym programem, a następnie odpowiedz na poniższe pytania. Odpowiedz na te pytania, analizując jedynie kod źródłowy, tzn. nie kopiuj go do pliku, nie skompiluj i odpowiedz na pytania na podstawie tego kodu. To sprawi, że nie będzie się nudzić!

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) Nie zwraca żadnych wyników – występują błędy w składni.

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

A) Nieskończona pętla – pętla działania podczas wykonywania operacji generuje serię 1
B) Wynik programu nie ulegnie zmianie.
C) Wyjścia pętli działania są 2 i 4.
D) Pętla działania podczas wykonywania operacji nie generuje żadnych wyników
E) Wyjścia pętli działania są 3 i 9.

Pytanie 3: Biorąc pod uwagę oryginalny program u góry strony, załóżmy, że mamy usunięto wiersz, który inicjuje zmienną licznika przed pętlą podczas wczytywania. Co by to się stało, gdybyśmy także usunęli wiersz licznik++ w pętli podczas następujące?

A) Zapętlanie ciągu „Podczas” nie zwraca niczego.
B) pętla podczas gdy zwraca wartości 1 i 1; pętla działania podczas wykonywania działań nie zwraca żadnych wyników.
C) Wyniki pętli będą takie same jak w przypadku obu dołączono.
D) System będzie generować losowe liczby do czasu wyłączenia komputera wyłączone.
E) Zapętlanie podczas trwania to nieskończona pętla

Pytanie 4: Co by się stało, biorąc pod uwagę oryginalny program u góry strony? czy pętla podczas oczekiwania wygląda tak?

counter = first;
while (counter <= last) {
  cout << "\n" << counter;
  if (first % 2 == 0)
    next = counter * counter;
  cout << "  " << next;
  counter++;
}
A) Wyniki pętli będą takie same jak w pierwotnym programie.
B) pętla „Podczas” nie generuje żadnych wyników.
C) Wynikiem pętli podczas jest 1 1 i 1 4.
D) Wynikiem pętli będzie 1, 2 i 2,4.
E) Wynikiem pętli będzie 1, 4 i 2,4.
F) Wyniki pętli pętli podczas to 2, 4 i 2 4.

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

A) Zapętla pętla „man” zwraca coś, ale nic innego nie wysyła.
B) Zapętlanie działania powodującego pętlę zareaguje na coś, ale nic innego nie zwróci.
C) Nie pojawią się żadne dane wyjściowe.
D) Program wykryje błąd lub awarię
E) Zapętla for może coś zwrócić, ale nic innego – nie.

Pytanie 6. Jakie będą wyniki programu po zainicjowaniu pierwszej zmiennej być taka sama jak ostatnia zmienna?

A) Zapętlanie działania powodującego pętlę zareaguje na coś, ale nic innego nie zwróci.
B) Zapętla pętla „man” zwraca coś, ale nic innego nie wysyła.
C) Każda pętla generuje 1 wiersz.
D) Zapętlanie „podczas robienia” generuje 2 wiersze, a druga pętla – jeden.
E) Nic nie wyświetli
F) Zapętla for może coś zwrócić, ale nic innego – nie.


Zestaw zadań 2

Tak jak w poprzednim zestawie zadań, możesz skorzystać z programu do rozważenia. Odpowiedz na poniższe pytania, patrząc tylko na 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. Jakie są dane wyjściowe zmiennej Chłopcy po oznaczeniu linii?

A) 1: 6
2: 3
3: 11
Nr 4: 11
B) 1: 6
2: 3
3: 11
4: 3
C) 1: 6
2: 6
3: 11
Nr 4: 11
D) Nie zwraca żadnej wartości, ponieważ nie jest kompilowana ani uruchamiana.

Pytanie 2. Wybierz wszystkie pasujące opcje dotyczące następujących linii programu:

void F1(int males, int females);
void F2(int &m, int &f);
A) Według reguł C++ możemy usunąć te dwa wiersze, o ile metody są zdefiniowane przed użyciem.
B) Według reguł C++ nazwy argumentów muszą być takie same czyli deklaracji i definicji.
C) Jeśli usuniemy te 2 wiersze, ten program ulegnie awarii.
D) Częściej deklaracje są podane na globalnym zakresu.
E) Są to tak zwane deklaracje przekazywania.

Pytanie 3: Jeśli usuniemy następujący wiersz z głównej() i umieścimy go w globalnym co się stanie?

int Boys = 3, Girls = 5;
A) Dane wyjściowe będą takie same.
B) Chłopcy = 3, a dziewczęta = 5 w całości
C) W wyniku funkcji main() dla chłopców będzie to 3, a dziewczęta = 5.

Pytanie 4. A co, jeśli początek programu zmienimy 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 kompiluje się, ale ulega awarii podczas próby uruchomienia.
B) Nie spowoduje to żadnych zmian w danych wyjściowych
C) W całym programie uzyskany wynik to Chłopcy = 3 dziewczęta = 5.
D) Dane wyjściowe to Chłopcy = 3 dziewczęta = 5 tylko w wyniku funkcji main().
E) Program prawdopodobnie się nie skompiluje (w zależności od kompilatora).

Pytanie 5. Dane są przekazywane według wartości we F2.

A) Prawda
B) Fałsz


Zestaw zadań 3

Tak jak w poprzednim zestawie zadań, możesz skorzystać z programu do rozważenia. Proszę na kolejne pytania zapoznaj się tylko z kodem źródłowym.To jest jest ciekawszy niż poprzednie 2 – uważnie 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 generuje ten program, podając 3 dla wierszy i 4 dla: kolumny?

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) Nic się nie wyświetla – logika jest błędna.
I) Nic się nie wyświetla – występują błędy składni.
J) Nie zwraca żadnych wyników – nie powinno tak być.
tys.) Wyświetla pierwsze 12 cyfr, które przychodzą na myśl podczas oczekiwania na uruchomienie programu.

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

MAX_SIZE = 10;
A) Nie jest to dozwolone w C++.
B) Jest to dozwolone. program działał z wartością 20 w trybie MAX_SIZE
C) Jest to dozwolone. program działałby z wartością 10 w ustawieniu MAX_SIZE.

Pytanie 3: Zwróć uwagę na 4 wiersze powyższego programu:

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 w definicji typu można użyć elementu Const?
2) Czy jest możliwe użycie typedef w deklaracji przed zadeklarowaniem zmiennej tego typu?

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 użyć tych danych:

#define MAX_SIZE 20
zamiast:
const int MAX_SIZE = 20;
A) Tak, będzie działać i można używać #define dla stałych w argumencie Plik C++
B) Tak, to zadziała, ale zwykle nie używamy ciągu #define dla stałych. w C++
C) Funkcja #define nie jest dostępna w języku C++
D) Nie można wykonać żadnej z tych czynności w C

Pytanie 5: typedef służy do utworzenia aliasu dla nazwy typu.

A) Prawda
B) Fałsz

Pytanie 6. Co by się stało, gdyby nie zainicjowaliśmy tablicy jako 0 w Fill()?

A) Będzie on działać, ale dane wyjściowe będą obejmować
B) Będzie działać prawidłowo i generować takie same dane wyjściowe, jak gdyby tablica została zainicjowano na 0
C) Program nie będzie działać lub ulegnie awarii
D) Będzie on działać, ale dane wyjściowe będą zawierać same wartości 0.
E) Uruchomi się, ale może nie wygenerować żadnych danych wyjściowych

Pytanie 7. Zaznacz wszystkie pasujące odpowiedzi. Dlaczego w tym programie stosujemy w tym programie stałą dla MAX_SIZE? Czy nie jest łatwiej po prostu wpisać „20”? zamiast MAX_SIZE w dowolnym miejscu jest potrzebna?

A) MAX_SIZE to wbudowana wartość w języku C++, z której może korzystać każdy. Właśnie ustawiony i używać ich.
B) W przeciwieństwie do zmiennych globalnych należy unikać konstów globalnych.
C) Użycie stałe ułatwia zrozumienie naszego programu.
D) Magiczne liczby w programie są zwykle uznawane za sprawdzone metody.
E) Jeśli chcemy zmienić MAX_SIZE, musimy zrobić to tylko za jednym razem miejsce

Pytanie 8: Instrukcja Switch w funkcji Fill() powinna mieć wartość domyślną ponieważ jej dodanie uważa się za dobry styl.

A) Prawda
B) Fałsz

Pytanie 9: Zwróć uwagę, że w funkcji Fill() deklarujemy zmienne między instrukcjami. Na przykład wartości cNum i cRow są deklarowane i zainicjowane po uruchomieniu pętli for. Czy będzie to działać w języku C++, czy też wszystkie zmienne muszą być zadeklarowane na początku do funkcji?

A) Jest to w porządku.
B) Wszystkie zmienne muszą być zadeklarowane na początku funkcji.
C) Działanie w obu kierunkach nie jest prawidłowe – w języku C++ nie można umieszczać zmiennych programu.
D) Wszystkie zmienne muszą być zadeklarowane w zakresie globalnym.

Zestaw zadań 4

Oto zestaw plików, które definiują i testują proste zajęcia. Jak zwykle odpowiedz na kolejne pytania, odwołując się tylko do kodu źródłowego.

Oto plik nagłówka (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 klientów 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. Co generuje ten program?

A) Betsy mówi „MU”.
betsy waży 400, wynosi 0 i mówi „MU”.
B) Betsy mówi „MU”.
Betsy waży 400, jest czarna i mówi „MU”.
C) Betsy mówi „MU”.
betsy waży 400,

Pytanie 2. Nigdy nie należy umieszczać kodu metod akcesora ani mutatora w pliku nagłówka. (Uwaga: akcesor to metoda, która zwraca wartość, a mutator to metoda, która modyfikuje wartość).

A) Prawda
B) Fałsz

Pytanie 3: Czy potrzebujemy hasła „Krowa::” przed każdą definicją funkcji w cow.cc?

A) Nie, bo obejmuje kod cow.h
B) Tak

Pytanie 4. Jaka rola:

#ifndef COW_H
#define COW_H
...
#endif

odtworzyć w pliku nagłówka?

Wybierz wszystkie pasujące odpowiedzi:

A) Nie służą do żadnego celu, bo nazwa pliku to cow.h a nie COW_H.
B) Jeśli tego nie zrobisz, wyświetli się błąd czasu działania.
C) Jeśli tego nie zrobiliśmy, możemy uwzględnić plik więcej niż raz
D) Nie robią nic, ponieważ co najmniej jedno słowo kluczowe ma literówkę.
E) Nie robią nic, ponieważ klasa Cow ma tylko 1 plik nagłówka.

Pytanie 5. Co się stanie, gdy dodamy ten wiersz do pliku cowmain.cc?

cow1.weight_ = 24;
A) Program będzie działać, a zmienna wagi zostanie zmodyfikowana tę linijkę.
B) Program kompilowałby i uruchamiał się, ale po tym wierszu ulegał awarii.
C) C++ nie pozwala na to.
D) Program skompiluje i będzie działać, ale zmienna wagi nie zmienione przez ten wiersz.

Pytanie 6. Po wykonaniu poniższego wiersza wywoływany jest konstruktor z 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 udostępnimy konstruktora w danych klasach, nie skompiluj
C) Konstruktor w klasie Cow jest nietypowy, ponieważ nie inicjuje się i zmiennymi prywatnymi.
D) Zajęcia mają zawsze taką samą nazwę jak klasa.
E) W klasie może być kilka konstruktorów, o ile argumenty różnią się
F) Konstruktor jest wywoływany po zainicjowaniu klasy.

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 poprzedzony znakiem „~”
C) Coś jest nie tak w destruktorze w cow.cc, nic nie robi.
D) Jeśli nie utworzymy destruktora dla naszych zajęć, kompilować

Pytanie 8. Biorąc pod uwagę sposób, w jaki program klienta wykorzystuje zajęcia, rozważ :

Podział członków grupy na publiczny i prywatny w klasie Cow jest niestosowny. To znaczy, że coś, co jest prywatne, powinno być publiczne, a coś, co jest publiczne, powinno być prywatne.

A) Prawda
B) Fałsz

Pytanie 9: Co by było, gdyby oprócz tego dodaliśmy inny konstruktor? cow.cc. Nowy konstruktor wygląda tak

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

Do main() dodajemy te wiersze:

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

Czy możemy to zrobić?

Wybierz wszystkie pasujące odpowiedzi

A) Wiersz w funkcji main(), w którym inicjujemy krowkę cow2, ulega awarii.
B) Możemy mieć tylko jeden konstruktor.
C) Jest to typowe dla C++
D) Tak, ale nie jest to typowe użycie języka C++
E) Ten kod zadziała, ale nie zwróci żadnych wyników, ponieważ prywatne dane nie są inicjowane.
F) Nie można wywołać funkcji setName(), setColor() ani setWeight() z poziomu metody tej samej klasy.


Pytania dodatkowe

Pytanie 1) Jakie są wyniki 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 stwierdzenia poniżej, które są prawdziwe:

A) Apple* granny_smith = NULL; if (granny_smith == NULL)... To NIE jest poprawne – NULL nie jest wartością, którą można sprawdzić w ten sposób.
B) Apple* granny_smith, fuji; Deklaruje to 2 wskaźniki do obiektów Apple
C) Zmienna granny_smith zawiera wartości zmiennych instancji powiązane z obiektem Apple
D) Apple* granny_smith = NULL; Nie szkodzi,
E) Zmienna granny_smith zawiera adres obiektu Apple
F) string gs_color = *(granny_smith.get_color()); 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) Miejsce na dane nowego obiektu Apple jest przydzielane w stosie środowiska wykonawczego
I) int* a = &b; Powoduje to umieszczenie adresu b w miejscu a.


Pytanie 3) Jakie są efekty działania poniższego 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 w quizach

Postaraj się odpowiedzieć na wszystkie powyższe pytania bez sprawdzania odpowiedzi. Lepiej poprosić kogoś o pomoc niż od razu przejść do arkusza odpowiedzi.

Odpowiedzi na powyższe problemy znajdziesz tutaj.