퀴즈

문제 세트 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
4일) 1 1
2 4
1 1
1 1
2 4
다운로드) 아무것도 출력되지 않습니다. 구문에 오류가 있습니다.

질문 2: do-when 루프 전에 '카운터'의 초기화를 삭제하면 어떻게 될까요?

A) 무한 루프 - do-when 루프는 일련의 1을 출력합니다.
B) 프로그램의 출력은 변경되지 않습니다.
C) do-round 루프는 2와 4를 출력합니다.
4일) do-round 루프는
다운로드) do-round 루프는 3과 9를 출력합니다.

질문 3: 이 페이지 상단에 있는 원래 프로그램의 경우 while 루프 전에 카운터 변수를 초기화하는 줄을 삭제했다고 가정해 보겠습니다. 다음과 같이 while 루프 내에서 counter++ 라인도 삭제하면 어떻게 되나요?

A) while 루프는 아무것도 출력하지 않습니다.
B) while 루프는 1과 1을 출력하지만 do-when 루프는 아무것도 출력하지 않습니다.
C) while 루프의 출력은 두 줄이 모두 포함된 경우와 동일합니다.
4일) 시스템은 컴퓨터를 끌 때까지 랜덤 숫자를 출력합니다.
다운로드) 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입니다.
4일) while 루프의 출력은 1 2 및 2 4입니다.
다운로드) while 루프의 출력은 1 4 및 2 4입니다.
F) while 루프의 출력은 2 4 및 2 4입니다.

질문 5: 첫 번째 변수가 마지막 변수보다 크면 어떻게 될까요?

A) while 루프는 무언가를 출력하지만 다른 것은 출력되지 않습니다.
B) do when-loop는 무언가를 출력하지만 다른 것은 없습니다.
C) 아무것도 출력되지 않습니다.
4일) 이 프로그램은 오류 또는 비정상 종료를
다운로드) for 루프는 무언가를 출력하지만, 다른 것은 아무것도 출력하지 않습니다.

질문 6: 첫 번째 변수를 마지막 변수와 동일하게 초기화하면 프로그램은 어떻게 출력되나요?

A) do when-loop는 무언가를 출력하지만 다른 것은 없습니다.
B) while 루프는 무언가를 출력하지만 다른 것은 출력되지 않습니다.
C) 각 루프는 한 줄을 출력합니다.
4일) do while-loop는 두 줄을 출력하고 다른 한 줄은 한 줄을 루프합니다.
다운로드) 아무 것도 출력되지 않으며
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
4일) 컴파일하거나 실행되지 않으므로 아무것도 출력되지 않습니다.

질문 2: 프로그램의 다음 항목과 관련된 항목을 모두 선택하세요.

void F1(int males, int females);
void F2(int &m, int &f);
A) C++ 규칙에서는 메서드를 사용하기 전에 메서드가 정의되어 있다면 이 두 줄을 삭제할 수 있다고 명시합니다.
B) C++ 규칙은 선언과 정의 간에 인수 이름이 동일해야 한다고 명시합니다.
C) 이 두 줄을 삭제하면 이 프로그램이 다운됩니다.
4일) 선언은 전역 범위에 명시되는 것이 더 일반적입니다.
다운로드) 이를 전방 선언이라고 합니다.

질문 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) 프로그램 전체에서 남자 아이 = 3 여학생 = 5가 출력됩니다.
4일) main()의 출력에서만 Boys = 3 Girls = 5가 출력됩니다.
다운로드) 컴파일러에 따라 프로그램이 컴파일되지 않을 수 있습니다.

질문 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
4일) 1 3 2 4
8 6 7 5
9 11 10 12
다운로드) 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) 아무것도 출력되지 않습니다. 로직에 결함이 있습니다.
1) 아무것도 출력되지 않습니다. 구문 오류가 있습니다.
로열) 아무것도 출력하지 않습니다. 그러면 안 됩니다.
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에서 const를 사용할 수 있나요?
2) 변수가 선언되기 전에 선언에서 typedef를 사용할 수 있나요?

A) 1) 예 2) 예
B) 1) 아니요 2) 아니요
C) 1) 아니요 2) 예
4일) 1) 예 2) 아니요

질문 4: 다음을 사용할 수 있나요?

#define MAX_SIZE 20
다음 대신:
const int MAX_SIZE = 20;
A) 예, 작동하며 C++의 상수에 #define을 사용해도 됩니다.
B) 예, 작동하지만 일반적으로 C++에서는 상수에 #define을 사용하지 않습니다.
C) C++에서는 #define을 사용할 수 없습니다.
4일) C에서는 이 두 가지 중 어느 것도 할 수 없습니다.

질문 5: typedef는 유형 이름의 별칭을 만드는 데 사용됩니다.

A) 참입니다.
B) 거짓입니다.

질문 6: Fill() 함수에서 배열을 0으로 초기화하지 않으면 어떻게 되나요?

A) 실행되지만 모두 12가 출력됩니다.
B) 제대로 실행되고 배열이 0으로 초기화된 것과 동일한 출력이 생성됩니다.
C) 프로그램이 실행되지 않거나 다운됩니다.
4일) 실행되지만 출력은 모두 0이 됩니다.
다운로드) 실행되지만 출력을 생성하지 않을 수 있습니다.

질문 7: 해당되는 것을 모두 선택하세요. 이 프로그램에서 MAX_SIZE에 const를 사용하는 이유는 무엇인가요? 필요한 곳에 MAX_SIZE를 입력하는 대신 '20'을 입력하는 게 더 쉽지 않을까요?

A) MAX_SIZE는 누구나 사용할 수 있는 기본 제공 C++ 값입니다. 설정하여 사용하기만 하면 됩니다.
B) 전역 변수처럼 전역 상수를 사용하지 않아야 함
C) const를 사용하면 프로그램을 더 쉽게 이해할 수 있습니다.
4일) 프로그램에서 매직 숫자는 일반적으로 좋은 사례로 간주됩니다.
다운로드) MAX_SIZE를 변경하려면 한 곳에서만 변경하면 됩니다.

질문 8: Fill() 함수의 switch 문에는 기본 사례가 있어야 합니다. 기본 사례를 포함하는 것이 좋은 스타일로 간주되기 때문입니다.

A) 참입니다.
B) 거짓입니다.

질문 9: Fill() 함수에서 문 사이에 변수를 선언합니다. 예를 들어 cNum 및 cRow는 for 루프가 실행된 후에 선언되고 초기화됩니다. C++에서 작동하나요? 아니면 모든 변수를 함수 상단에 선언해야 하나요?

A) 이렇게 해도 괜찮습니다.
B) 모든 변수는 함수의 맨 위에서 선언해야 합니다.
C) 두 가지 방법 모두 잘못되었습니다. C++는 프로그램의 어디에도 변수를 허용하지 않습니다.
4일) 모든 변수는 전역 범위에서 선언해야 합니다.

문제 세트 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"라고 말합니다.
벳시의 몸무게는 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) 이렇게 하지 않으면 파일을 두 번 이상 포함할 수 있습니다.
4일) 하나 이상의 키워드에 철자 오류가 있기 때문에 아무 작업도 하지 않습니다.
다운로드) Cow 클래스에는 헤더 파일이 하나만 있으므로 아무것도 하지 않습니다.

질문 5: cowmain.cc에 다음 행을 추가하면 어떻게 될까요?

cow1.weight_ = 24;
A) 프로그램이 실행되고 가중치 변수가 이 줄로 수정됩니다.
B) 프로그램은 컴파일되고 실행되지만 해당 줄에서 비정상 종료됩니다.
C) C++에서는 이를 허용하지 않습니다.
4일) 프로그램은 컴파일되고 실행되지만 가중치 변수는 이 행으로 인해 변경되지 않습니다.

질문 6: 다음 줄이 실행되면 Cow 클래스의 생성자가 호출됩니다.

Cow cow1;

생성자의 중요한 특성은 무엇인가요?

해당되는 항목을 모두 선택해 주세요.

A) 일반적으로 어떤 값도 반환하지 않습니다.
B) 클래스에 생성자를 제공하지 않으면 클래스가 컴파일되지 않습니다.
C) Cow 클래스의 생성자는 비공개 변수를 초기화하지 않으므로 비일반적입니다.
4일) 항상 클래스와 동일한 이름을 갖습니다.
다운로드) 인수가 다르면 한 클래스에 여러 생성자가 있을 수 있습니다.
F) 클래스가 시작되면 생성자가 호출됩니다.

질문 7: 소멸자의 중요한 특징은 무엇인가요?

A) 객체가 범위를 벗어나면 소멸자가 호출됩니다.
B) 소멸자는 클래스와 이름이 같지만 앞에 '~'가 옵니다.
C) cow.cc의 소멸자에 아무 작업도 하지 않는다는 점에서 문제가 있습니다.
4일) 클래스의 소멸자를 만들지 않으면 클래스가 컴파일되지 않습니다.

질문 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++에서 일반적입니다.
4일) 예, 하지만 이는 일반적인 C++ 사용과는 다릅니다.
다운로드) 정상적으로 실행되지만 privates가 초기화되지 않았으므로 아무것도 출력되지 않습니다.
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 객체와 연결된 인스턴스 변수 값이 포함됩니다.
4일) Apple* granny_smith = NULL; 괜찮습니다.
다운로드) granny_smith 변수에는 Apple 객체의 주소가 포함됩니다.
F) string gs_color = *(granny_smith.get_color()); 이 문은 granny_smith 객체의 색상이 초기화되었다고 가정하고 색상을 반환합니다.
G) 새 Apple 객체의 저장소가 힙에 할당됨
H) 새 Apple 객체의 스토리지가 런타임 스택에 할당됨
1) 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;
}


퀴즈 답변

답을 보지 않고 위의 모든 질문에 답하려고 노력해야 합니다. 답변 시트로 바로 이동해 도움을 요청하는 것보다 도움을 요청하는 것이 더 낫습니다.

여기에서 위 문제에 대한 답변을 확인할 수 있습니다.