測驗

問題組合 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:這個計畫的輸出內容是什麼?

答: 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:移除「counter」的初始化時會有什麼後果會發生什麼情況?

答: 無限迴圈 - Do-while 迴圈會輸出一系列
B) 程式的輸出內容不會改變
C) Do-while 迴圈會輸出 2 和 4。
D) 暫時迴圈不會輸出任何內容
E) Do-while 迴圈會輸出 3 和 9。

第 3 題:以本頁上方的原始計畫假設 已移除在 while 迴圈前初始化計數器變數的那一行。內容 如果我們也會移除 when 迴圈中的計數器++ 行,就像在 下列項目?

答: when 迴圈不會輸出任何內容,
B) when 迴圈會輸出 1 和 1;do-while 迴圈不會輸出任何內容。
C) when 迴圈的輸出內容會與這兩行 包含。
D) 系統將輸出隨機號碼,直到電腦轉動為止 關閉。
E) when 迴圈是無限迴圈

問題 4:如果使用這個頁面頂端的原始程式,會發生什麼情況? 會這樣?

counter = first;
while (counter <= last) {
  cout << "\n" << counter;
  if (first % 2 == 0)
    next = counter * counter;
  cout << "  " << next;
  counter++;
}
答: when 迴圈的輸出內容與原始程式相同。
B) when 迴圈不會輸出任何內容
C) when 迴圈的輸出結果為 1 1 和 1 4。
D) when 迴圈的輸出結果為 1 2 和 2 4。
E) when 迴圈的輸出結果為 1 4 和 2 4。
女) when 迴圈的輸出結果是 2 4 和 2 4。

問題 5:如果第一個變數大於最後一個變數,會發生什麼情況?

答: 時迴圈會輸出任何內容,但不會輸出其他內容。
B) 這個「迴圈」指令會輸出部分內容,其他則不會。
C) 因此不會有任何輸出內容。
D) 程式會隔離錯誤或異常終止
E) for 迴圈會輸出部分內容,其他則不會。

問題 6:如果初始化第一個變數,程式會輸出什麼內容 會與最後一個變數相同?

答: 這個「迴圈」指令會輸出部分內容,其他則不會。
B) 時迴圈會輸出任何內容,但不會輸出其他內容。
C) 每個迴圈輸出一行。
D) 模擬迴圈會輸出 2 行,另一個迴圈會呈現一條線。
E) 這個指令不會輸出任何內容
女) 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:標記行上的 Boys 變數輸出是什麼?

答: #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);
答: C++ 規則狀態表明我們可以移除這兩行,只要 方法是在使用前定義
B) C++ 規則指出, 宣告和定義
C) 如果移除這兩行,這個程式就會異常終止。
D) 更常在全球聲明 範圍。
E) 這些稱為正向宣告。

問題 3:如果我們從 main() 移動下列這一行並放到全域 範圍,會發生什麼事?

int Boys = 3, Girls = 5;
答: 輸出內容會相同。
B) 男孩會 = 3,女孩們在所有輸出結果中 = 5
C) 男孩會 = 3,而女孩在 main() 的輸出內容中只會 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;
答: 程式會編譯,但在嘗試執行時就會異常終止。
B) 輸出內容不會有任何變更
C) 模型中的輸出內容將是「Boys = 3 Girls = 5」
D) 輸出值會是 Boys = 3 Girls = 5 only in the output from main()
E) 程式可能無法編譯 (視編譯器而定)。

問題 5:資料是透過 F2 中的值傳送。

答: 正確。
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 的輸入值下輸出什麼? 欄位?

答: 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
登機門) 9 8 7 6
10 11 12 5
1 2 3 4
H) 而且不會輸出任何內容,因為邏輯錯誤。
我) 因為有語法錯誤,所以不會輸出任何內容。
J) 因此不會輸出任何值。
K 鍵) 輸出的前 12 個數字會在您等待程式執行時出現。

問題 2:如果我們在 main() 函式中加入這一行,該怎麼辦?

MAX_SIZE = 10;
答: 不允許在 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 中使用 const?
2) 在宣告該類型的變數之前,是否可以在宣告中使用 typedef?

答: 1) 是 2) 是
B) 1) 否 2) 否
C) 1) 否 2) 是
D) 1) 是 2) 否

第 4 題:我們可以使用下列哪項產品:

#define MAX_SIZE 20
敬上 而不是:
const int MAX_SIZE = 20;
答: 可以,但您也可以在 C++
B) 可以,但我們通常不使用 #define 做為常數 C++ 中
C) #define 不適用於 C++
D) 您無法透過 C 方法執行其中一項操作

問題 5:typedef 是用來建立類型名稱的別名。

答: 正確。
B) 不正確。

問題 6:如果沒有將陣列初始化為 0,會發生什麼情況? Fill() 函式嗎?

答: 系統會執行 12 秒的輸出內容
B) 其執行正常,並產生與陣列相同的輸出內容 初始化為 0
C) 程式無法執行或當機
D) 這項指令會執行,但輸出內容將會是 0 的
E) 這項指令可以執行,但可能不會產生任何輸出內容

問題 7:勾選所有適用選項。為什麼在計畫中採用 MAX_SIZE 常數? 如果只輸入「20」是不夠的而非 MAX_SIZE ?

答: MAX_SIZE 是任何人都能使用的內建 C++ 值。剛設定完畢 並讓他們使用
B) 應避免使用全域常數
C) 使用常數可讓程式更容易理解
D) 計劃中的魔術數字通常被視為好方法。
E) 如果我們想要變更 MAX_SIZE,就只需要在一個容器中變更設定 地點

問題 8:Fill() 函式中的切換陳述式應有預設值 因為是包含文字的組合才會是不錯的風格。

答: 正確。
B) 不正確。

問題 9:請注意,在 Fill() 函式中,我們在陳述式之間宣告變數。 舉例來說,cNum 和 cRow 會在 for 迴圈執行後宣告並初始化。 這在 C++ 中運作嗎?或者必須在頂端宣告所有變數 函式?

答: 但您也可以這麼做。
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:這個程式輸出的內容為何?

答: 表現得非常好
小心,體重 400,是 0,並說 MOO。
B) 表現得非常好
甜心的體重為 400,黑色為 MOO。
C) 表現得非常好
體重 400,是

問題 2:絕對不應該放置存取子和變動器方法的程式碼 都會儲存在標頭檔案中(請注意,存取子是傳回值的方法,以及會變動器 是一種修改值的方法)。

答: 正確。
B) 不正確。

問題 3:我們需要有「草修訂」:在每個函式定義之前 電子郵件地址?

答: 否 - 因為已包含 cow.h
B)

問題 4:角色用途:

#ifndef COW_H
#define COW_H
...
#endif

會在標頭檔案中播放?

可複選:

答: 因為檔案名稱為 cow.h,因此不具備用途。 而不是 COW_H。
B) 如果不這樣做,就會發生執行階段錯誤
C) 如果不是,可能會重複加入這個檔案
D) 不會採取任何行動,因為一或多個關鍵字的拼寫錯誤。
E) 由於 Cow 類別只有一個標頭檔案,因此不會執行任何動作。

問題 5:如果在 cowmain.cc 中加入這一行,會發生什麼情況?

cow1.weight_ = 24;
答: 程式會執行,權重變數會隨之修改 。
B) 程式會編譯並執行,但會在該行異常終止。
C) C++ 不允許這種情況。
D) 程式會編譯並執行,但權重變數不會 已由這一行變更。

問題 6:執行下列行時,系統會呼叫 Cow 類別中的建構函式:

Cow cow1;

建構函式有哪些重要特性?

(可複選)

答: 通常不會傳回任何值
B) 如果沒有在類別中提供建構函式,該類別就會 不編譯
C) Cow 類別中的建構函式未初始化,因此十分異常 私人變數
D) 其名稱一律與類別相同
E) 只要 引數 不同
女) 如果指定類別,就會叫用建構函式。

問題 7:解構函式有哪些重要特性?

答: 當物件超出範圍時,系統就會呼叫解構函式
B) 解構函式與類別相同,但前面加上「~」
C) Cow.cc 中的解構函式有東西 也不會有任何作用。
D) 如果沒有為類別建立解構函式,類別就不會 編譯

問題 8:鑒於用戶端程式使用類別的方式,請考慮使用 包括:

將廣告從 Cow 課程中設定為公開和不公開的時候,是不適用的。換句話說,不公開的項目必須設為公開,否則便不得公開。

答: 正確。
B) 不正確。

問題 9:如果除了原本的建構函式之外 我們必須取得版本新建構函式外觀如下:

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();

可以嗎?

(可複選)

答: 我們初始化 cow2 中的 main() 行會異常終止。
B) 我們只能有一個建構函式。
C) 這在 C++ 中很常見
D) 是,但這並不是一般的 C++ 使用情況
E) 這樣可以執行,但不會輸出任何值,因為 就不會進行初始化
女) 我們無法從以下位置呼叫 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; 

請選擇下列所有正確的敘述:

答: Apple* granny_smith = NULL;if (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 物件的顏色 (假設物件已初始化)。
登機門) 新 Apple 物件的儲存空間已分配到堆積中
H) 新 Apple 物件的儲存空間會於執行階段堆疊上分配
我) 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;
}


測驗答案

您應該試著在不查看答案的情況下,完成上述所有問題。建議你請人協助,而不要直接跳到答案表尋求協助。

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