测验

第 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:如果我们在 do-while 循环之前移除“counter”的初始化,会发生什么情况?

A) 无限循环 - do-while 循环将输出一系列 1
B) 程序的输出不会发生变化
C) do-while 循环输出 2 和 4。
D) do-while 循环不会输出任何内容
E) do-while 循环输出 3 和 9。

问题 3:根据本页顶部的原始程序,假设我们在 while 循环之前移除了用于初始化计数器变量的代码行。如果我们同时移除 while 循环中的 counter++ 行,会发生什么情况,如下所示?

A) when 循环不会输出任何内容。
B) when 循环会输出 1 和 1,而 do-while 循环不会输出任何内容。
C) when 循环的输出与包含两行时的输出相同。
D) 系统会输出随机数字,直到我们关闭计算机。
E) when 循环是一种无限循环

问题 4:根据本页顶部的原始程序,如果 while 循环如下所示,会发生什么情况?

counter = first;
while (counter <= last) {
  cout << "\n" << counter;
  if (first % 2 == 0)
    next = counter * counter;
  cout << "  " << next;
  counter++;
}
A) when 循环的输出与原始程序中的输出相同。
B) when 循环不会输出任何内容
C) when 循环的输出为 1 1 和 1 4。
D) when 循环的输出分别是 1 2 和 2 4。
E) when 循环的输出为 1 4 和 2 4。
F) when 循环的输出为 2 4 和 2 4。

问题 5:如果第一个变量大于最后一个变量,会出现什么情况?

A) 而 while 循环将输出某些内容,但其他不会输出。
B) 执行 when 循环会输出一些内容,但不会输出任何内容。
C) 不会有任何输出。
D) 程序将细分故障或崩溃
E) for 循环会输出某些内容,但不会输出任何内容。

问题 6:如果我们将第一个变量初始化为与最后一个变量相同,程序会输出什么?

A) 执行 when 循环会输出一些内容,但不会输出任何内容。
B) 而 while 循环将输出某些内容,但其他不会输出。
C) 每个循环将输出一行。
D) 执行 when 循环将输出 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:标记的代码行中 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++ 规则声明,只要在使用之前定义了方法,我们就可以移除这两行代码。
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”
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? 在需要的位置只输入“20”而不是 MAX_SIZE 会不会更容易?

A) MAX_SIZE 是任何人都可以使用的内置 C++ 值。您只需设置并使用它即可。
B) 应该像避免使用全局变量一样,避免使用全局常量
C) 使用 const 可以使我们的程序更易于理解
D) 程序中的魔数通常被视为良好的做法。
E) 如果要更改 MAX_SIZE,只需在一个位置进行更改即可

问题 8:Fill() 函数中的 switch 语句应具有默认 case,因为包含该 case 语句被视为一种很好的样式。

A) 正确。
B) 错误。

问题 9:请注意,在 Fill() 函数中,我们在语句之间声明了变量。 例如,在 for 循环运行后,声明并初始化 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) Betsy 说:MOO。
betsy 的体重为 400,为 0,表示 MOO。
B) Betsy 说:MOO。
Betsy 体重为 400,黑人,说 MOO。
C) Betsy 说: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) 因为一个或多个关键字拼写有误,所以关键字不会执行任何操作。
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) 用于初始化 cow2 的 main() 行会崩溃。
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; if (granny_smith == NULL)... 这是不行的 - NULL 不是可以以此方式检查的值。
B) Apple* granny_smith、fuji;这声明了两个指向 Apple 对象的指针
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;
}


测验答案

您应该尝试在不看答案的情况下完成上述所有问题。向他人寻求帮助比直接跳到答案表寻求帮助要好。

您可以点击此处查看上述问题的解答。