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 20zamiast:
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.