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_;
};
#endifOto 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.