問題集 1
研究下列計畫,然後回答以下問題。我們希望您只查看原始碼來回答問題,也就是說,請勿將檔案複製到檔案中、編譯檔案,並根據執行檔案來回答問題。這樣就太可惜了!
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); }
問題 1:這項計畫的輸出結果為何?
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) | 系統不會輸出任何內容 - 語法有誤。 |
問題 2:如果在測試週期開始前移除「計數器」的初始化作業,會發生什麼情況?
A) | 無限迴圈:定時迴圈會輸出 1 的一系列 |
B) | 程式的輸出內容不會變更 |
C) | 同一時間迴圈會輸出 2 和 4。 |
D) | 同一時間迴圈不會輸出任何內容 |
E) | 同一時間迴圈會輸出 3 和 9。 |
問題 3:根據本頁頂端的原始程式,假設我們移除了在迴圈期間初始化計數器變數的那行程式碼。如果我們一併移除暫時性迴圈內的計數器 ++ 行,會怎麼樣?
A) | 而迴圈則不會輸出任何內容。 |
B) | 當迴圈會輸出 1 和 1;而定時迴圈不會輸出任何內容。 |
C) | 而迴圈的輸出內容會與同時包含兩行時一樣。 |
D) | 系統會輸出隨機號碼,直到電腦關閉為止。 |
E) | The 時迴圈是無限迴圈 |
問題 4:正如本頁上方的原始程式,如果迴圈看起來像這樣,會發生什麼情況?
counter = first; while (counter <= last) { cout << "\n" << counter; if (first % 2 == 0) next = counter * counter; cout << " " << next; counter++; }
A) | 提醒您,迴圈的輸出內容與原始程式的輸出內容相同。 |
B) | 迴圈不會輸出任何內容 |
C) | 迴圈的輸出內容為 1 1 和 1 4。 |
D) | 迴圈的輸出內容為 1 2 和 2 4。 |
E) | 迴圈的輸出內容為 1 4 和 2 4。 |
F) | 而迴圈的輸出內容為 2 4 和 2 4。 |
問題 5:如果第一個變數大於最後一個變數,會發生什麼情況?
A) | 線圈會輸出一些內容,但其他都只會輸出。 |
B) | 時空迴圈會輸出某些東西,但其他動作則不會。 |
C) | 將不會產生任何輸出內容。 |
D) | 該程式會偵測錯誤或當機情形 |
E) | for-迴圈會輸出一些內容,但不會輸出任何內容。 |
問題 6:如果我們初始化第一個變數,使其與最後一個變數相同,程式會輸出什麼內容?
A) | 時空迴圈會輸出某些東西,但其他動作則不會。 |
B) | 線圈會輸出一些內容,但其他都只會輸出。 |
C) | 每個迴圈都會輸出一行。 |
D) | 重複迴圈會輸出 2 行,另一個則會循環執行一行。 |
E) | 系統不會輸出任何內容 |
F) | for-迴圈會輸出一些內容,但不會輸出任何內容。 |
問題集 2
如先前的問題所述,建議您考慮透過以下計畫進行考量。請只查看原始碼來回答後續的問題。
#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; }
問題 1:標記線條上的男孩變數會輸出什麼?
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) | 這裡不會輸出任何內容,因為並未編譯或執行。 |
問題 2:選擇與下列計畫這幾行相關的所有敘述:
void F1(int males, int females); void F2(int &m, int &f);
A) | C++ 規則狀態,可以移除兩行,前提是該方法必須在使用前定義。 |
B) | C++ 規則表示宣告和定義之間的引數名稱必須相同。 |
C) | 如果移除這兩行,程式就會當機。 |
D) | 在全域範圍中宣告宣告較為常見。 |
E) | 這就是所謂的前向宣告。 |
問題 3:如果我們從 main() 移動以下這行,並將其放入全域範圍內,會發生什麼事?
int Boys = 3, Girls = 5;
A) | 輸出內容相同。 |
B) | 男孩在輸出中是 3 分,女孩 = 5 |
C) | 男孩在 main() 的輸出內容中只會 3 分,女孩 = 5 |
問題 4:如果我們更改計畫的開場白,會怎麼樣:
// We have moved moved these to global scope const int Boys = 3; const int Girls = 5; void main() { //int Boys = 3, Girls = 5;
A) | 程式會編譯,但嘗試執行時就會異常終止。 |
B) | 輸出內容沒有任何異動。 |
C) | 輸出的結果會是 Boys = 3 Girls = 5 in the Program, |
D) | 輸出會是 Boys = 3 Girls = 5,僅在 main() 的輸出中 |
E) | 程式可能無法編譯 (取決於編譯器)。 |
問題 5:資料會透過 F2 中的值傳遞。
A) | 正確。 |
B) | 不正確。 |
問題集 3
如先前的問題所述,建議您考慮透過以下計畫進行考量。請只查看原始碼來回答後續的問題。這比前兩份更有趣,請謹慎追蹤程式碼。
#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; } }
問題 1:這個程式會輸出什麼內容,資料列的輸入值為 3,資料欄輸入 4?
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) | 系統不會輸出任何內容,因為邏輯錯誤。 |
I) | 系統不會輸出任何內容 - 發生語法錯誤。 |
J) | 這不應該輸出任何值, |
K) | 這會輸出您在等待程式執行時產生的前 12 個數字。 |
問題 2:如果我們在 main() 函式中加入這行程式碼,該怎麼辦?
MAX_SIZE = 10;
A) | 這在 C++ 中不允許。 |
B) | 這是允許的情況;程式會在 MAX_SIZE 設為 20 的情況下執行 |
C) | 這是允許的情況;該程式會在 MAX_SIZE 設為 10 的情況下執行。 |
問題 3:考慮上述程式中的以下四行內容:
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) 是否可以在 typedef 中使用常數?
2) 是否可以在宣告該類型的變數之前,在宣告中使用 typedef?
A) | 1) 是 2) 是 |
B) | 1) 否 2) 否 |
C) | 1) 否 2) 是 |
D) | 1) 是 2) 否 |
問題 4:我們能否採用下列選項:
#define MAX_SIZE 20而不是:
const int MAX_SIZE = 20;
A) | 可以,您可以在 C++ 中使用 #define 常數 |
B) | 可以,但我們通常不會針對 C++ 中的常數使用 #define 定義 |
C) | #define 不適用於 C++ |
D) | 您無法在 C 中執行上述任一操作 |
問題 5:typedef 是用來為類型名稱建立別名。
A) | 正確。 |
B) | 不正確。 |
問題 6:如果我們沒有在 Fill() 函式中將陣列初始化為 0,會發生什麼事?
A) | 系統仍會執行,但輸出內容會是 12 的 |
B) | 它會順利執行,並產生與陣列初始化為 0 時相同的輸出 |
C) | 程式不會執行或停止運作 |
D) | 系統仍會執行,但輸出內容會是 0 的 |
E) | 這會執行,但可能無法產生任何輸出內容 |
問題 7:請勾選所有符合的選項。為什麼在這個程式中要將 MAX_SIZE 使用 Const? 比起 MAX_SIZE,只在需要時輸入「20」,不是更簡單的方式?
A) | MAX_SIZE 是內建 C++ 值,任何人皆可使用。只要設定並使用它即可。 |
B) | 應避免使用全域常數,就像全域變數一樣 |
C) | 使用常數可讓程式更容易理解 |
D) | 程式中的魔術數字通常是不錯的做法。 |
E) | 如果要變更 MAX_SIZE,我們只需在同個位置進行變更 |
問題 8:Fill() 函式中的 Switch 陳述式應具有預設情況,因為加入這類陳述式是不錯的選擇。
A) | 正確。 |
B) | 不正確。 |
問題 9:請注意,在 Fill() 函式中,我們會在陳述式之間宣告變數。 舉例來說,在 for loop 執行後,系統會宣告 cNum 和 cRow 進行初始化。這在 C++ 中適用,還是所有變數都必須在函式頂端宣告?
A) | 並不會遭到撤銷。 |
B) | 所有變數都必須在函式頂端宣告。 |
C) | 這兩種方式都不正確 - C++ 不允許程式中的任何位置的變數。 |
D) | 所有變數都必須在全域範圍內宣告。 |
問題集 4
以下提供定義和測試簡單類別的檔案組合。如往常一樣,只要參照原始碼即可回答後續的問題。
以下是標頭檔案 (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
以下是相關的 .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; }
以下是本課程的用戶端程式 (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(); }
問題 1:這個程式會輸出什麼內容?
A) | 線上的 MOO 魚。 betsy 重重 400,結果為 0,並說 MOO。 |
B) | 線上的 MOO 魚。 重 400 噸是黑色,說是 MOO。 |
C) | 線上的 MOO 魚。 重量 400 重,是 |
問題 2:我們不應在標頭檔案中放置存取子和變異器方法的程式碼。(請注意,存取子是傳回值的方法,而異動器則是修改值的方法)。
A) | 正確。 |
B) | 不正確。 |
問題 3:在 cow.cc 中的每個函式定義前方,是否需要「Cow::」?
A) | 否 - 由於包含 cow.h |
B) | 是 |
問題 4:角色的作用:
#ifndef COW_H #define COW_H ... #endif
要在標頭檔案中播放嗎?
可複選:
A) | 由於檔案名稱為 cow.h,而非 COW_H,因此兩者並沒有用途。 |
B) | 如果我們不做刪除,將會收到執行階段錯誤。 |
C) | 否則,我們可能會重複加入檔案 |
D) | 因為一或多個關鍵字有錯字,所以系統不會執行任何動作。 |
E) | 由於 Cow 類別只有一個標頭檔案,所以不會執行任何動作。 |
問題 5:如果在 cowmain.cc 中新增下列這行程式碼,會發生什麼事?
cow1.weight_ = 24;
A) | 程式會執行,且線條會修改權重變數。 |
B) | 程式會編譯並執行,但會在該行當機。 |
C) | C++ 不允許這麼做。 |
D) | 程式會編譯並執行,但這行程式碼不會變更權重變數。 |
問題 6:執行以下行時,系統會呼叫 Cow 類別中的建構函式:
Cow cow1;
建構函式有哪些重要特性?
(可複選)
A) | 通常不會傳回任何值 |
B) | 如果我們未在類別中提供建構函式,該類別就不會編譯 |
C) | Cow 類別中的建構函式則不相同,因為其不會初始化私人變數。 |
D) | 它們一律與類別的名稱相同 |
E) | 只要引數不同,就能在類別中擁有多個建構函式 |
F) | 建立類別關聯時,系統會叫用建構函式。 |
問題 7:解構函式有哪些重要特徵?
A) | 當物件超出範圍時,系統會呼叫解構函式。 |
B) | 解構函式和類別的名稱相同,但在後面加上「~」 |
C) | cow.cc 中的解構函式出現錯誤, 這沒有任何作用。 |
D) | 如果我們沒有為類別建立解構工具,該類別就不會編譯 |
問題 8:由於用戶端程式使用類別的方式,請考慮以下幾點:
不適合在 Cow 類別中區分為公開和私人的成員。也就是不能公開的內容,或是應公開的內容。
A) | 正確。 |
B) | 不正確。 |
問題 9:除了原本必須使用 cow.cc 的建構函式外,我們還加入了其他建構函式。新的建構函式如下所示
Cow::Cow(string inName, double inWeight, Color inColor) { set_name(inName); set_weight(inWeight); set_color(inColor); }
然後將以下幾行新增至 main():
Cow cow2("milly", 350.2, brown); cow2.Moo(); cow2.Properties();
可以嗎?
(可複選)
A) | 在 main() 中初始化 cow2 的行會當機。 |
B) | 您只能有一個建構函式。 |
C) | 在 C++ 中很常見。 |
D) | 可以,但這並非一般的 C++ 用法 |
E) | 這可以執行,但由於不公開環境未初始化,因此不會輸出任何內容。 |
F) | 我們無法從相同類別的方法中呼叫 setName()、setColor() 和 setWeight()。 |
加分題
問題 1) 以下顯示的輸出內容為何?
#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; }
問題 2) 假設有 Apple 類別,且已經初始化。Apple 類別包含 color_ 執行個體變數:
Apple* granny_smith = new Apple;
請在下方選出所有正確的敘述:
A) | Apple* granny_smith = NULL;如果 (granny_smith == NULL)... 這兩種情況並不正確,因為 NULL 不是可以以此方式檢查的值。 |
B) | Apple* granny_smith, fuji;這會宣告指向 Apple 物件的兩個指標 |
C) | granny_smith 變數包含與 Apple 物件相關聯的例項變數值 |
D) | Apple* granny_smith = NULL;沒關係 |
E) | granny_smith 變數包含 Apple 物件的地址 |
五) | string gs_color = *(granny_smith.get_color()); 這個陳述式會傳回 granny_smith 物件的顏色 (假設已經初始化)。 |
G) | 系統會在堆積中分配新 Apple 物件的儲存空間 |
H) | 系統會在執行階段堆疊上分配新 Apple 物件的儲存空間 |
I) | int* a = &b; 這會將 b 的地址加入 a。 |
問題 3) 以下程式的輸出內容為何?
#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; }
測驗答案
請試著回答上述所有問題,不要查看答案。直接請人幫忙,效果最好,而不是直接跳到答案表尋求協助。
您可以在這裡查看上述問題的答案。