クイズ

問題セット 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);
}

Question 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: do-while ループの前に「カウンタ」の初期化を削除するとどうなるでしょうか。

A) 無限ループ - do-while ループは一連の 1 を出力します。
B) プログラムの出力は変わりません。
C) do-while ループは 2 と 4 を出力します。
D) do-while ループは何も出力しません。
E) do-while ループは 3 と 9 を出力します。

質問 3: このページの上部に記載されている元のプログラムでは、while ループの前でカウンタ変数を初期化する行が削除されているものとします。次に示すように、while ループ内の counter++ 行も削除するとどうなるでしょうか。

A) while ループは何も出力しません。
B) while ループは 1 と 1 を出力し、do-while ループは何も出力しません。
C) while ループの出力は、2 つの行を含めた場合と同じです。
D) パソコンの電源がオフになるまで、システムによって乱数が出力されます。
E) while ループは無限ループであり、

質問 4: このページの上部にある元のプログラムについて、while ループがこのようになっているとしたらどうなるでしょうか。

counter = first;
while (counter <= last) {
  cout << "\n" << counter;
  if (first % 2 == 0)
    next = counter * counter;
  cout << "  " << next;
  counter++;
}
A) while ループの出力は、元のプログラムと同じです。
B) while ループは何も出力しません。
C) while ループの出力は 1 1 と 1 4 です。
D) while ループの出力は 1 2 と 2 4 です。
E) while ループの出力は 1 4 と 2 4 です。
F) while ループの出力は 2 4 と 2 4 です。

質問 5:最初の変数が最後の変数より大きい場合、どうなるでしょうか。

A) while ループでは、何かが出力されますが、他は何も出力されません。
B) 一方、実行ループでは何かが出力されますが、他は何も出力されません。
C) 何も出力されません。
D) プログラムでエラーやクラッシュが分類されます。
E) for ループによって何かが出力されますが、他は何も出力されません。

質問 6: 最初の変数を最後の変数と同じに初期化した場合、プログラムは何を出力しますか。

A) 一方、実行ループでは何かが出力されますが、他は何も出力されません。
B) while ループでは、何かが出力されますが、他は何も出力されません。
C) ループごとに 1 行が出力されます。
D) 一方のループは 2 行を出力し、他は 1 行をループします。
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: マークされた行の Boys 変数の出力は何ですか。

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++ ルールでは、メソッドが使用前に定義されている限り、この 2 行を削除できると規定されています。
B) C++ のルールでは、宣言と定義で引数名を同一にする必要があると規定されています。
C) この 2 行を削除すると、このプログラムはクラッシュします。
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 になります。
D) main() の出力では、Boys = 3 Girls = 5 のみという出力になります。
E) プログラムがコンパイルされない可能性があります(コンパイラによって異なります)。

質問 5: データは F2 で値によって渡されます。

A) 正しい
B) 誤り


問題セット 3

前の問題セットで、ここに検討のためのプログラムがあります。ソースコードのみを確認して、以下の質問に答えてください。この方法は前の 2 つよりも興味深いため、コードを慎重にトレースしてください。

#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: 上記のプログラムの次の 4 行について考えてみましょう。

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: Fit() 関数で配列を 0 に初期化しなかった場合はどうなりますか。

A) 実行されますが、出力は 12 個です。
B) 正常に実行され、配列が 0 に初期化された場合と同じ出力が生成されます
C) プログラムが実行されないか、クラッシュする
D) 実行されますが、出力はすべて 0 になります。
E) 実行されますが、出力が生成されない場合があります

質問 7: 該当するものをすべて選択してください。このプログラムでは MAX_SIZE に定数を使用するのはなぜですか?必要な場所に MAX_SIZE ではなく「20」と入力する方が簡単なのではありませんか?

A) MAX_SIZE は、誰でも使用できる組み込みの C++ 値です。設定するだけで使用できます。
B) グローバル変数の場合と同様に、グローバル定数も使用しないでください。
C) const を使用することでプログラムを理解しやすくする
D) 通常、プログラムのマジック ナンバーはおすすめの方法と考えられています。
E) MAX_SIZE を変更する場合は、1 か所で変更するだけで済みます。

質問 8: Fill() 関数の switch 文には、デフォルト case を含めるべきです。デフォルトの case を含めるべきです。

A) 正しい
B) 誤り

質問 9: Fill() 関数では、ステートメント間で変数を宣言している点に注意してください。たとえば、cNum と cRow は、for ループの実行後に宣言され、初期化されます。これは 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();
}

Question 1: このプログラムの出力内容は何ですか。

A) 「MOO」は、
betsy の体重は 400 で、0 で「MOO」です。
B) 「MOO」は、
betsy は体重が 400 で、黒で「MOO」と書いています。
C) 「MOO」は、
betsy の体重は 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) 1 つ以上のキーワードにスペルミスがあるため、何もしない。
E) Cow クラスにはヘッダー ファイルが 1 つしかないため、何も実行しません。

質問 5: cowmain.cc に次の行を追加するとどうなるでしょうか。

cow1.weight_ = 24;
A) プログラムが実行され、この行によって重み変数が変更されます。
B) プログラムはコンパイルされて実行されますが、その行でクラッシュします。
C) C++ ではこれは許可されません。
D) プログラムはコンパイルされて実行されますが、この行によって重み変数は変更されません。

質問 6: 次の行が実行されると、Caw クラスのコンストラクタが呼び出されます。

Cow cow1;

コンストラクタの重要な特徴は何ですか。

(該当するものをすべて選択してください)。

A) 通常、これらは何も返しません。
B) クラスでコンストラクタを指定しないと、クラスはコンパイルされません。
C) Cow クラスのコンストラクタは、プライベート変数を初期化しないため、一般的ではありません。
D) これらは常にクラスと同じ名前になります。
E) 引数が異なる場合は、1 つのクラスに複数のコンストラクタを含めることができる
F) コンストラクタは、クラスがインスタンス化されたときに呼び出されます。

Question 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) コンストラクタは 1 つだけ使用できます。
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_instance 変数があります。

Apple* granny_smith = new Apple; 

下記の説明のうち、正しいものをすべて選択してください。

A) Apple* granny_smith = NULL; if (granny_smith == NULL)... これは問題です。NULL はこの方法で確認できない値です。
B) Apple* granny_smith、fuji; Apple オブジェクトへの 2 つのポインタを宣言します
C) granny_smith 変数には、Apple オブジェクトに関連付けられたインスタンス変数の値が含まれる
D) Apple* granny_smith = NULL; 問題ありません。
E) granny_smith 変数には Apple オブジェクトの住所が含まれる
F) 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;
}


理解度チェックの回答

回答を見ることなく、上記の質問のすべてに取り組む必要があります。回答シートに直接移動するのではなく、誰かに助けを求めることをおすすめします。

上記の問題の回答はこちらで確認できます。