C++クイズ！

# C++クイズ！
これはC++の基本的な文法を勉強するためのクイズです。解答は乗せませんので、分からないものがあったら、実際にそのコードを動かして確認してみましょう。

## 超初級
### Q.1 入出力、その1
以下のプログラムを動かしました。何が起こるでしょうか？
```cpp
#include <iostream>
int main(void) {
  int a = 2;
  double pi = 3.14;
  std::cout << "Hello World!\n";
  std::cout << a << "\n";
  std::cout << pi << "\n";
  return 0;
}
```

### Q.2 入出力、その2
以下のプログラムを動かして、10と入力しました。何が出力されますか？
```cpp
#include <iostream>
int main(void) {
  int a;
  std::cin >> a;
  a *= 2;
  std::cout << a << "\n";
  return 0;
}
```

### Q.3 入出力、その3
以下のプログラムを動かして、10と入力し、続いて20と入力しました。何が出力されますか？
```cpp
#include <iostream>
int main(void) {
  int a, b, c;
  std::cin >> a >> b;
  c = a + b * 2;
  std::cout << "a=" << a << ";b=" << b << "\n";
  std::cout << c << "\n";
  return 0;
}
```

## 初級
### Q.4 関数
以下のプログラムを動かしました。何が出力されますか？
```cpp
#include <iostream>

int func(int x, int y) {
  return x * y;
}

int main(void) {
  int a = 2, b = 5;
  int c = func(a, b);
  std::cout << c << "\n";
  return 0;
}
```

### Q.5 構造体
以下のプログラムを動かしました。何が出力されますか？
```cpp
#include <iostream>

struct Point {
  int x;
  int y;
};

int main(void) {
  Point point = {2, 3};
  std::cout << point.x << "," << point.y << "\n";

  point.x = 4;
  std::cout << point.x << "," << point.y << "\n";

  point = {10, 20};
  std::cout << point.x << "," << point.y << "\n";
  return 0;
}
```

### Q.6 クラス、その1
以下のプログラムを動かしました。何が出力されますか？
```cpp
#include <iostream>

class Data {
 public:
  Data(int a, int b) {
    a_ = a;
    b_ = b;
  }
  int sum() { return a_ + b_; }
  int mul() { return a_ * b_; }
 private:
  int a_;
  int b_;
};

int main(void) {
  Data data(2, 3);
  std::cout << "sum=" << data.sum() << "\n";
  std::cout << "mul=" << data.mul() << "\n";
  return 0;
}
```
### Q.7 クラス、その2
以下のプログラムを動かしました。何が出力されますか？　また、`SetA`関数と`SetB`関数は別の書き方をしていますが、それぞれのメリット/デメリットは何でしょうか？
```cpp
#include <iostream>

class Data {
 public:
  Data(int a, int b) {
    a_ = a;
    b_ = b;
  }
  void SetA(int a){a_ = a;}
  void SetB(int);
  int sum() { return a_ + b_; }
  int mul() { return a_ * b_; }
 private:
  int a_;
  int b_;
};
void Data::SetB(int b){b_ = b;}

int main(void) {
  Data data(2, 3);
  std::cout << "sum=" << data.sum() << "\n";
  std::cout << "mul=" << data.mul() << "\n";
  
  std::cout << "\n";

  data.SetA(5);
  std::cout << "sum=" << data.sum() << "\n";
  std::cout << "mul=" << data.mul() << "\n";

  std::cout << "\n";

  data.SetB(8);
  std::cout << "sum=" << data.sum() << "\n";
  std::cout << "mul=" << data.mul() << "\n";
  return 0;
}
```



### Q.8 クラス、その3
以下のプログラムはエラーが起きます。どんなエラーメッセージが出力されますか？
```cpp
#include <iostream>

class Data {
 public:
  Data(int a, int b) {
    a_ = a;
    b_ = b;
  }
  int sum() { return a_ + b_; }
 private:
  int mul() { return a_ * b_; }
  int a_;
  int b_;
};

int main(void) {
  Data data(2, 3);
  std::cout << "sum=" << data.sum() << "\n";
  std::cout << "mul=" << data.mul() << "\n";
  return 0;
}
```

## 中級
### Q.9 参照、その1
以下のプログラムを動かしました。何が出力されますか？　また、この結果から推測して、変数`a`と変数`c`の関係性はどうなっていますか？　言い方を変えると、変数`b`と変数`c`の違いは何でしょうか？
```cpp
#include <iostream>

int main(void) {
  int a = 2;

  int b = a;
  std::cout << a << "," << b << "\n";
  b = 3;
  std::cout << a << "," << b << "\n";

  std::cout << "\n";

  int& c = a;
  std::cout << a << "," << c << "\n";
  c = 4;
  std::cout << a << "," << c << "\n";
  return 0;
}
```

### Q10 参照、その2
以下のプログラムを動かしました。何が出力されますか？ Q.9とやっている事は同じなので、予想がつくかもしれませんが、自信が無ければ確認しておきましょう。
```cpp
#include <iostream>

struct Point {
  int x;
  int y;
};

int main(void) {
  Point a = {2, 3};

  Point b = a;
  std::cout << "a=" << a.x << "," << a.y << "\n";
  std::cout << "b=" << b.x << "," << b.y << "\n";
  b.x = 10;
  std::cout << "a=" << a.x << "," << a.y << "\n";
  std::cout << "b=" << b.x << "," << b.y << "\n";

  std::cout << "\n";

  Point& c = a;
  std::cout << "a=" << a.x << "," << a.y << "\n";
  std::cout << "c=" << c.x << "," << c.y << "\n";
  c.x = 100;
  std::cout << "a=" << a.x << "," << a.y << "\n";
  std::cout << "c=" << c.x << "," << c.y << "\n";

  return 0;
}
```

### Q.11 参照渡し、その1
以下のプログラムを動かしました。何が出力されますか？　また、そこから推測される`func1`と`func2`の違いは何でしょうか？
```cpp
#include <iostream>

void func1(int x, int y) {
  x = 0;
  y = 0;
}

void func2(int& x, int& y) {
  x = 0;
  y = 0;
}

int main(void) {
  int a = 2, b = 5;

  func1(a, b);
  std::cout << a << "," << b << "\n";

  std::cout << "\n";

  func2(a, b);
  std::cout << a << "," << b << "\n";
  return 0;
}
```


### Q.12 参照渡し、その2
以下のプログラムを動かしました。何が出力されますか？　 Q.11とやっている事は同じなので、予想がつくかもしれませんが、自信が無ければ確認しておきましょう。
```cpp
#include <iostream>

struct Point {
  int x;
  int y;
};

void func1(Point p) {
  p.x = 0;
  p.y = 0;
}

void func2(Point& p) {
  p.x = 0;
  p.y = 0;
}

int main(void) {
  Point a = {2, 3};

  std::cout << a.x << "," << a.y << "\n";
  func1(a);
  std::cout << a.x << "," << a.y << "\n";

  std::cout << "\n";

  std::cout << a.x << "," << a.y << "\n";
  func2(a);
  std::cout << a.x << "," << a.y << "\n";

  return 0;
}
```

## 上級
以下のプログラムを動かしました。何が出力されますか？　特に最後のoutputに着目して、変数`y`と変数`z`の違いを理解しましょう。
```cpp
#include <iostream>

class Data {
 public:
  Data(int a, int b) {
    a_ = a;
    b_ = b;
  }
  int a();
  int& b();
  void output();

 private:
  int a_;
  int b_;
};
int Data::a() { return a_; }
int& Data::b() { return b_; }
void Data::output() {
  std::cout << "a=" << a_ << "\n";
  std::cout << "b=" << b_ << "\n\n";
}

int main(void) {
  Data data(2, 3);

  data.output();
  
  int x = data.a();
  x = 5;

  data.output();

  int& y = data.b();
  y = 10;

  data.output();

  int z = data.b();
  z = 15;

  data.output();

  return 0;
}
```