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