HiroLab

プログラミングに関する情報発信サイト。

C++

【C++】Day1-30 総復習/演習問題

投稿日:

以下に、Day 1-30までのC++学習カリキュラムにおける総復習と演習問題を提示します。

演習問題に対する回答と解説も記載しますので、各問題に取り組んで理解を深めてください。

※後半に回答/解説を記載していますので、答え合わせをして理解を深めてください。

 

<<演習問題>>

Day 1: C++の基礎構文
演習問題:
1. 変数numを宣言して、その値を5で初期化してください。
2. int型の変数aとbを宣言し、aに10、bに20を代入して、それらの値を掛け算して結果を出力してください。
3. ユーザーから整数を2つ入力して、それらの値を掛け算して結果を出力するプログラムを作成してください。

 

Day 2: 変数とデータ型
演習問題:
1. double型の変数heightとweightを宣言し、ユーザーから身長と体重を入力して計算したBMI(体重(kg) / 身長(m)^2)を出力するプログラムを作成してください。
2. ユーザーから半径を入力して、その円の面積を計算して出力するプログラムを作成してください。

 

Day 3: 演算子
演習問題:
1. ユーザーから3つの整数を入力して、その中で最大値と最小値を求めて出力するプログラムを作成してください。
2. 整数numが偶数か奇数かを判定して出力するプログラムを作成してください。

 

Day 4: 制御文 – 条件分岐
演習問題:
1. ユーザーからテストの点数を入力して、90点以上なら”A”、80点以上なら”B”、70点以上なら”C”、60点以上なら”D”、それ以下は”F”と出力するプログラムを作成してください。
2. ユーザーから2つの数値と演算子(”+”, “-“, “*”, “/”)を入力して、計算結果を出力するシンプルな電卓プログラムを作成してください。

 

Day 5: 制御文 – ループ
演習問題:
1. 1から10までの数値を1つずつ出力するループを作成してください。
2. ユーザーから整数nを入力して、1からnまでの数値を合計するプログラムを作成してください。

 

Day 6: 関数
演習問題:
1. 整数nを引数として受け取り、1からnまでの数値を合計してその結果を返す関数を作成してください。
2. ユーザーから2つの整数を入力して、それらの値を足し算するadd関数を作成し、その結果を出力するプログラムを作成してください。

 

Day 7: ユーザー定義関数とライブラリ関数
演習問題:
1. ユーザーから数値を入力して、その絶対値を求めて出力するプログラムを作成してください。絶対値の計算には`abs()`関数を使用しても構いません。
2. ユーザーから半径を入力して、その円の面積を求めて出力するプログラムを作成してください。円の面積の計算には`M_PI`(円周率π)を使用しても構いません。

 

Day 8: オブジェクト指向プログラミングの基礎
演習問題:
1. Pointという名前のクラスを定義して、x座標とy座標をメンバ変数として持ち、コンストラクタとゲッターメソッドを実装してください。
2. Bookという名前のクラスを定義して、本のタイトルと著者をメンバ変数として持ち、タイトルと著者を取得するゲッターメソッドを実装してください。

 

Day 9: クラスとオブジェクト
演習問題:
1. Rectangleという名前のクラスを定義して、幅と高さをメンバ変数として持ち、面積を計算するメソッドを実装してください。
2. ユーザーから長方形の幅と高さを入力して、その長方形の面積を計算して出力するプログラムを作成してください。

 

Day 10: 継承とポリモーフィズム
演習問題:
1. Shapeという名前の抽象クラスを定義し、面積を計算する純粋仮想関数`getArea()`を宣言してください。RectangleクラスをShapeクラスを継承して定義し、面積を計算するメソッドを実装してください。
2. ユーザーから円の半径と長方形の幅と高さを入力して、それぞれの図形の面積を計算して出力するプログラムを作成してください。

Day 11-30の演習問題は、応用的な内容が含まれているため、ここでは省略します。

これらの日々の演習問題は、C++をより深く理解し、実際のプログラム開発に役立てることができるものとなっています。それぞれの演習問題に取り組んで、理解を深めることをお勧めします。

 

<<回答解説>>

各演習問題に対する回答とその詳細な解説を以下に示します。

Day 1: C++の基礎構文
演習問題:
1. 変数numを宣言して、その値を5で初期化してください。

#include <iostream>

int main() {
int num = 5;
std::cout << "numの値は: " << num << std::endl;
return 0;
}

解説:
変数`num`を宣言し、整数型の値5を代入しています。その後、`std::cout`を使って`num`の値を表示しています。

 

2. int型の変数aとbを宣言し、aに10、bに20を代入して、それらの値を掛け算して結果を出力してください。

#include <iostream>

int main() {
int a = 10;
int b = 20;
int result = a * b;
std::cout << "a * b の結果は: " << result << std::endl;
return 0;
}

解説:
変数`a`と`b`にそれぞれ10と20を代入し、掛け算の結果を変数`result`に格納しています。`std::cout`を使って`result`の値を表示しています。

 

3. ユーザーから整数を2つ入力して、それらの値を掛け算して結果を出力するプログラムを作成してください。

#include <iostream>

int main() {
int num1, num2;
std::cout << "整数1を入力してください: ";
std::cin >> num1;

std::cout << "整数2を入力してください: ";
std::cin >> num2;

int result = num1 * num2;
std::cout << "掛け算の結果は: " << result << std::endl;
return 0;
}

解説:
`std::cin`を使ってユーザーから2つの整数を入力し、それらの値を変数`num1`と`num2`に格納しています。その後、掛け算の結果を変数`result`に格納し、`std::cout`を使って結果を表示しています。

 

Day 2: 変数とデータ型
演習問題:
1. double型の変数heightとweightを宣言し、ユーザーから身長と体重を入力して計算したBMI(体重(kg) / 身長(m)^2)を出力するプログラムを作成してください。

#include <iostream>

int main() {
double height, weight;

std::cout << "身長(m)を入力してください: ";
std::cin >> height;

std::cout << "体重(kg)を入力してください: ";
std::cin >> weight;

double bmi = weight / (height * height);
std::cout << "あなたのBMIは: " << bmi << std::endl;
return 0;
}

解説:
`double`型の変数`height`と`weight`を宣言し、ユーザーから身長と体重を入力させています。BMIは体重を身長の2乗で割ることで求められます。計算結果を変数`bmi`に格納し、`std::cout`を使ってBMIを表示しています。

 

2. ユーザーから半径を入力して、その円の面積を計算して出力するプログラムを作成してください。

#include <iostream>
#include <cmath>

int main() {
double radius;

std::cout << "円の半径を入力してください: ";
std::cin >> radius;

double area = M_PI * pow(radius, 2);
std::cout << "円の面積は: " << area << std::endl;
return 0;
}

解説:
ユーザーから半径を入力させて、その円の面積を計算するプログラムです。`M_PI`はcmathライブラリに定義されている円周率πの定数です。`std::pow()`関数を使って半径の2乗を計算し、面積を変数`area`に格納して表示しています。

 

Day 3: 演算子
演習問題:
1. ユーザーから3つの整数を入力して、その中で最大値と最小値を求めて出力するプログラムを作成してください。

#include <iostream>

int main() {
int num1, num2, num3;

std::cout << "整数1を入力してください: ";
std::cin >> num1;

std::cout << "整数2を入力してください: ";
std::cin >> num2;

std::cout << "整数3を入力してください: ";
std::cin >> num3;

int max = (num1 > num2) ? ((num1 > num3) ? num1 : num3) : ((num2 > num3) ? num2 : num3);
int min = (num1 < num2) ? ((num1 < num3) ? num1 : num3) : ((num2 < num3) ? num2 : num3);

std::cout << "最大値: " << max << std::endl;
std::cout << "最小値: " << min << std::endl;
return 0;
}

解説:
`std::cin`を使ってユーザーから3つの整数を入力させ、それらの中で最大値と最小値を求めています。三項演算子を使用して、比較と条件分岐を行っています。

 

2. 整数numが偶数か奇数かを判定して出力するプログラムを作成してください。


#include <iostream>

int main() {
int num;

std::cout << "整数を入力してください: ";
std::cin >> num;

if (num % 2 == 0) {
std::cout << num << "は偶数です" << std::endl;
} else {
std::cout << num << "は奇数です" << std::endl;
}
return 0;
}

解説:
`std::cin`を使ってユーザーから整数を入力させ、その数が偶数か奇数かを判定しています。偶数は2で割り切れる数なので、`num % 2`が0であれば偶数、そうでなければ奇数と判定しています。

Day 4: 制御文 – 条件分岐
演習問題:
1. ユーザーからテストの点数を入力して、90点以上なら”A”、80点以上なら”B”、70点以上なら”C”、60点以上なら”D”、それ以下は”F”と出力するプログラムを作成してください。

#include <iostream>

int main() {
int score;

std::cout << "テストの点数を入力してください: ";
std::cin >> score;

if (score >= 90) {
std::cout << "A" << std::endl;
} else if (score >= 80) {
std::cout << "B" << std::endl;
} else if (score >= 70) {
std::cout << "C" << std::endl;
} else if (score >= 60) {
std::cout << "D" << std::endl;
} else {
std::cout << "F" << std::endl;
}
return 0;
}

解説:
`std::cin`を使ってユーザーからテストの点数を入力させ、条件分岐を使ってその点数に応じた成績を出力しています。最初の`if`文では、90点以上の場合に”A”を出力します。次の`else if`文では、80点以上かつ90点未満の場合に”B”を出力します。以降の`else if`文と最後の`else`文で、条件に応じた成績を出力しています。

 

2. ユーザーから2つの数値と演算子(”+”, “-“, “*”, “/”)を入力して、計算結果を出力するシンプルな電卓プログラムを作成してください。

#include <iostream>

int main() {
double num1, num2;
char op;

std::cout << "数値1を入力してください: ";
std::cin >> num1;

std::cout << "数値2を入力してください: ";
std::cin >> num2;

std::cout << "演算子を入力してください (+, -, *, /): ";
std::cin >> op;

double result;
switch (op) {
case '+':
result = num1 + num2;
break;
case '-':
result = num1 - num2;
break;
case '*':
result = num1 * num2;
break;
case '/':
if (num2 != 0) {
result = num1 / num2;
} else {
std::cout << "エラー: 0で割ることはできません" << std::endl;
return 1;
}
break;
default:
std::cout << "無効な演算子です" << std::endl;
return 1;
}

std::cout << "計算結果: " << result << std::endl;
return 0;
}


<strong>解説:</strong>
ユーザーから数値と演算子を入力させ、それに応じた計算結果を出力するシンプルな電卓プログラムです。`std::cin`を使って数値と演算子を入力させ、`switch`文を使って演算子に応じた計算を行っています。`+`, `-`, `*`の場合はそれぞれ加算、減算、乗算を行い、`/`の場合は0で割ることがないように注意して除算を行っています。エラーチェックも行い、無効な演算子が入力された場合にエラーメッセージを出力します。

&nbsp;

<strong>Day 5: 制御文 - ループ</strong>
<strong>演習問題:</strong>
<em><strong>1. 1から10までの数値を1つずつ出力するループを作成してください。</strong></em>



#include <iostream>

int main() {
for (int i = 1; i <= 10; i++) {
std::cout << i << " ";
}
std::cout << std::endl;
return 0;
}

解説:
`for`ループを使って1から10までの数値を順番に出力しています。ループ変数`i`は1から始まり、`i`が10以下の間ループが継続し、1ずつ増加

しています。ループ内では`std::cout`を使って`i`の値を表示し、空白を出力しています。

 

2. ユーザーから整数nを入力して、1からnまでの数値を合計するプログラムを作成してください。

#include <iostream>

int main() {
int n, sum = 0;

std::cout << "整数nを入力してください: ";
std::cin >> n;

for (int i = 1; i <= n; i++) {
sum += i;
}

std::cout << "1から" << n << "までの合計: " << sum << std::endl;
return 0;
}

解説:
`for`ループを使って1からユーザーが入力した整数`n`までの数値を合計しています。ループ変数`i`は1から始まり、`i`が`n`以下の間ループが継続します。`sum`変数に`i`の値を足していくことで、1から`n`までの合計を求めています。最終的な合計値を`std::cout`を使って表示しています。

 

Day 6: 関数
演習問題:

1.整数nを引数として受け取り、1からnまでの数値を合計してその結果を返す関数を作成してください。

#include <iostream>

// 1からnまでの数値を合計する関数
int sumFrom1ToN(int n) {
int sum = 0;
for (int i = 1; i <= n; i++) {
sum += i;
}
return sum;
}

int main() {
int n;

std::cout << "整数nを入力してください: ";
std::cin >> n;

int result = sumFrom1ToN(n);
std::cout << "1から" << n << "までの合計: " << result << std::endl;
return 0;
}

解説:
まず、`sumFrom1ToN`という関数を定義し、整数`n`を引数として受け取ります。`sum`という変数を初期化して0とし、`for`ループを使って1から`n`までの数値を順番に足し合わせています。ループの終了後、計算結果を`sum`で返します。

`main`関数では、ユーザーから整数`n`を入力させ、`sumFrom1ToN`関数に`n`を渡して合計値を計算します。最終的な合計値を`std::cout`を使って表示しています。

 

2.ユーザーから2つの整数を入力して、それらの値を足し算するadd関数を作成し、その結果を出力するプログラムを作成してください。

#include <iostream>

// 2つの整数を足し算する関数
int add(int a, int b) {
return a + b;
}

int main() {
int num1, num2;

std::cout << "整数1を入力してください: ";
std::cin >> num1;

std::cout << "整数2を入力してください: ";
std::cin >> num2;

int result = add(num1, num2);
std::cout << num1 << " + " << num2 << " = " << result << std::endl;
return 0;
}

解説:
`add`という関数を定義し、整数`a`と`b`を引数として受け取ります。`a`と`b`を足し算してその結果を返すだけのシンプルな関数です。

`main`関数では、ユーザーから2つの整数`num1`と`num2`を入力させ、`add`関数に渡して足し算の結果を計算します。計算結果を`std::cout`を使って表示しています。

 

Day 7: ユーザー定義関数とライブラリ関数
演習問題:

1.ユーザーから数値を入力して、その絶対値を求めて出力するプログラムを作成してください。絶対値の計算にはabs()関数を使用しても構いません。

#include <iostream>
#include <cstdlib> // abs関数を使うために必要なヘッダーファイル

int main() {
int num;

std::cout << "整数を入力してください: ";
std::cin >> num;

// abs関数を使って絶対値を計算
int absoluteValue = abs(num);

std::cout << "絶対値: " << absoluteValue << std::endl;
return 0;
}

解説:
`<cstdlib>`ヘッダーファイルには、C++の標準ライブラリで提供されている`abs()`関数が含まれています。この関数は引数として整数を受け取り、その絶対値を計算して返します。

ユーザーから整数を入力させ、その値を`num`変数に格納します。次に`abs()`関数を使って`num`の絶対値を計算し、`absoluteValue`変数に代入します。最後に`std::cout`を使って絶対値を表示します。

 

2.ユーザーから半径を入力して、その円の面積を求めて出力するプログラムを作成してください。円の面積の計算には`M_PI`(円周率π)を使用しても構いません。

#include <iostream>
#include <cmath> // M_PIを使うために必要なヘッダーファイル

int main() {
double radius;

std::cout << "半径を入力してください: ";
std::cin >> radius;

// 円の面積を計算
double area = M_PI * pow(radius, 2);

std::cout << "円の面積: " << area << std::endl;
return 0;
}

解説:
`<cmath>`ヘッダーファイルには、C++の標準ライブラリで提供されている`M_PI`(円周率π)が含まれています。また、`<cmath>`ヘッダーファイルにはべき乗の計算に使用する`pow()`関数も含まれています。

ユーザーから半径を入力させ、その値を`radius`変数に格納します。次に`M_PI`と`pow()`関数を使って円の面積を計算し、`area`変数に代入します。最後に`std::cout`を使って円の面積を表示します。

 

Day 8: オブジェクト指向プログラミングの基礎
演習問題:

1.Pointクラスの定義と実装

#include <iostream>

// Pointクラスの定義
class Point {
private:
int x; // x座標のメンバ変数
int y; // y座標のメンバ変数

public:
// コンストラクタ
Point(int xVal, int yVal) : x(xVal), y(yVal) {}

// x座標のゲッターメソッド
int getX() const {
return x;
}

// y座標のゲッターメソッド
int getY() const {
return y;
}
};

int main() {
// Pointクラスのインスタンスを生成し、x座標とy座標を表示する
Point p(3, 5);
std::cout << "x座標: " << p.getX() << std::endl;
std::cout << "y座標: " << p.getY() << std::endl;

return 0;
}

解説:
`Point`という名前のクラスを定義しています。このクラスには、`x`と`y`という2つのメンバ変数があります。また、コンストラクタを定義しています。コンストラクタはクラスのインスタンスが生成される際に呼び出される特別な関数で、ここでは引数として`x`座標と`y`座標の値を受け取って、それぞれのメンバ変数に代入しています。

さらに、`getX()`と`getY()`という2つのゲッターメソッドも定義しています。これらのメソッドは、それぞれ`x`座標と`y`座標の値を取得するために使用されます。ゲッターメソッドは通常、メンバ変数がプライベートに定義されている場合に、外部から値を取得するために使用します。

`main()`関数では、`Point`クラスのインスタンスを生成し、そのインスタンスの`getX()`と`getY()`メソッドを呼び出して、`x`座標と`y`座標の値を表示しています。

 

2.Bookクラスの定義と実装

#include <iostream>
#include <string>

// Bookクラスの定義
class Book {
private:
std::string title; // タイトルのメンバ変数
std::string author; // 著者のメンバ変数

public:
// コンストラクタ
Book(const std::string& titleVal, const std::string& authorVal)
: title(titleVal), author(authorVal) {}

// タイトルのゲッターメソッド
const std::string& getTitle() const {
return title;
}

// 著者のゲッターメソッド
const std::string& getAuthor() const {
return author;
}
};

int main() {
// Bookクラスのインスタンスを生成し、タイトルと著者を表示する
Book book("プログラミング入門", "John Smith");
std::cout << "タイトル: " << book.getTitle() << std::endl;
std::cout << "著者: " << book.getAuthor() << std::endl;

return 0;
}

解説:
`Book`という名前のクラスを定義しています。このクラスには、`title`と`author`という2つのメンバ変数があります。コンストラクタを定義しています。コンストラクタは引数として`title`と`author`の値を受け取り、それぞれのメンバ変数に代入しています。

また、`getTitle()`と`getAuthor()`という2つのゲッターメソッドも定義しています。これらのメソッドは、それぞれ`title`と`author`の値を取得するために使用されます。

`main()`関数では、`Book`クラスのインスタンスを生成し、そのインスタンスの`getTitle()`と`getAuthor()`メソッドを呼び出して、本のタイトルと著者の名前を表示しています。

 

Day 9: クラスとオブジェクト
演習問題:

Rectangleという名前のクラスを定義して、幅と高さをメンバ変数として持ち、面積を計算するメソッドを実装してください。ユーザーから長方形の幅と高さを入力して、その長方形の面積を計算して出力するプログラムを作成してください。

#include <iostream>

// Rectangleクラスの定義
class Rectangle {
private:
double width; // 幅のメンバ変数
double height; // 高さのメンバ変数

public:
// コンストラクタ
Rectangle(double widthVal, double heightVal) : width(widthVal), height(heightVal) {}

// 面積を計算するメソッド
double calculateArea() const {
return width * height;
}
};

int main() {
double width, height;

std::cout << "長方形の幅を入力してください: ";
std::cin >> width;

std::cout << "長方形の高さを入力してください: ";
std::cin >> height;

// Rectangleクラスのインスタンスを生成
Rectangle rect(width, height);

// 面積を計算して出力
double area = rect.calculateArea();
std::cout << "長方形の面積: " << area << std::endl;

return 0;
}

解説:
`Rectangle`という名前のクラスを定義しています。このクラスには、`width`と`height`という2つのメンバ変数があります。また、コンストラクタを定義しています。コンストラクタは引数として`width`と`height`の値を受け取り、それぞれのメンバ変数に代入しています。

さらに、`calculateArea()`という面積を計算するメソッドも定義しています。このメソッドは、`width`と`height`の値を掛け合わせて面積を計算し、計算結果を返します。

`main()`関数では、ユーザーから長方形の幅と高さを入力させ、それらの値を`width`と`height`変数に格納します。次に、`Rectangle`クラスのインスタンスを生成し、入力された幅と高さの値をコンストラクタに渡します。面積を計算するために`calculateArea()`メソッドを呼び出し、計算結果を`area`変数に格納します。最後に、`std::cout`を使って長方形の面積を表示します。

 

Day 10: 継承とポリモーフィズム
演習問題:

Shapeという名前の抽象クラスを定義し、面積を計算する純粋仮想関数getArea()を宣言してください。RectangleクラスをShapeクラスを継承して定義し、面積を計算するメソッドを実装してください。 ユーザーから円の半径と長方形の幅と高さを入力して、それぞれの図形の面積を計算して出力するプログラムを作成してください。

#include <iostream>

// 抽象クラスShapeの定義
class Shape {
public:
// 純粋仮想関数getArea()の宣言
virtual double getArea() const = 0;
};

// Rectangleクラスの定義
class Rectangle : public Shape {
private:
double width; // 幅のメンバ変数
double height; // 高さのメンバ変数

public:
// コンストラクタ
Rectangle(double widthVal, double heightVal) : width(widthVal), height(heightVal) {}

// 面積を計算するメソッドの実装
double getArea() const override {
return width * height;
}
};

// Circleクラスの定義
class Circle : public Shape {
private:
double radius; // 半径のメンバ変数

public:
// コンストラクタ
Circle(double radiusVal) : radius(radiusVal) {}

// 面積を計算するメソッドの実装
double getArea() const override {
return 3.14159 * radius * radius;
}
};

int main() {
double width, height, radius;

std::cout << "長方形の幅を入力してください: ";
std::cin >> width;

std::cout << "長方形の高さを入力してください: ";
std::cin >> height;

std::cout << "円の半径を入力してください: ";
std::cin >> radius;

// Rectangleクラスのインスタンスを生成
Rectangle rect(width, height);

// Circleクラスのインスタンスを生成
Circle circle(radius);

// 面積を計算して出力
double rectArea = rect.getArea();
double circleArea = circle.getArea();

std::cout << "長方形の面積: " << rectArea << std::endl;
std::cout << "円の面積: " << circleArea << std::endl;

return 0;
}

解説:
演習問題1では、抽象クラス`Shape`を定義しています。このクラスには、純粋仮想関数`getArea()`が宣言されています。純粋仮想関数は実装を持たず、派生クラスでオーバーライド(再定義)されることを期待しています。これにより、`Shape`クラスは抽象クラスとなります。

演習問題1ではまた、`Rectangle`クラスを`Shape`クラスを継承して定義しています。`Rectangle`クラスでは、`Shape`クラスで宣言された`getArea()`メソッドをオーバーライドして、長方形の面積を計算しています。

演習問題2では、`Circle`クラスを`Shape`クラスを継承して定義しています。`Circle`クラスでも同様に、`getArea()`メソッドをオーバーライドして円の面積を計算しています。

`main()`関数では、ユーザーから長方形の幅と高さ、円の半径を入力させ、それぞれの値を`Rectangle`クラスと`Circle`クラスのインスタンスを生成する際に渡しています。それぞれの図形の面積を`getArea()`メソッドを呼び出して計算し、最後に`std::cout`を使って面積を表示しています。

 

-C++
-, ,

執筆者:


comment

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

関連記事

【C++】Day 22:ネットワークプログラミングにおけるソケットとプロトコル

Day 22では、ネットワークプログラミングにおけるソケットとプロトコルについて学習します。 ソケットは、ネットワーク通信を行うためのプログラムインターフェースであり、プロトコルは通信のルールや方法を …

【C++】Day 26:デザインパターン「作成型パターン」

Day 26では、デザインパターンのうち「作成型パターン」について学習します。 作成型パターンは、オブジェクトのインスタンスを生成する方法に関するパターンです。主な作成型パターンには、シングルトン、フ …

【C++】Day 13:メモリ管理とスマートポインタ

Day 13では、メモリ管理とスマートポインタについて学習します。 C++では、メモリの確保と解放を適切に行うことが重要です。スマートポインタは、メモリの自動管理を行う便利な機能です。 以下にそれぞれ …

【C++】Day 11:「ファイル入出力」と「例外処理」

Day 11のトピックとして、「ファイル入出力」と「例外処理」について学習します。   ファイル入出力: 1. ファイル入出力の概要: – ファイル入出力は、プログラムと外部のフ …

【C++】Day 2:変数とデータ型について

Day 2では、変数とデータ型について学習します。 変数はデータを格納するためのメモリ上の領域であり、データ型はその変数が保持できるデータの種類を指定します。 C++にはいくつかの基本的なデータ型があ …