測驗

問題集 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;
}


測驗答案

請試著回答上述所有問題,不要查看答案。直接請人幫忙,效果最好,而不是直接跳到答案表尋求協助。

您可以在這裡查看上述問題的答案。