C++: 練習:分岐とループ
最終更新:2026-08-31
ここまでのレッスンで分岐とループを学んだ。今度はそれらを組み合わせて実際のプログラムを作る。プログラミングを学ぶ最良の方法は実際に何か役立つプログラムを書くこと。
▶ サンプル 1:完全な数当てゲーム(難易度 ⭐⭐)
TEXT
📖 参照専用
#include <iostream>
#include <cstdlib>
#include <ctime>
int main() {
std::srand(std::time(0));
int secret = std::rand() % 100 + 1;
int guess;
int attempts = 0;
std::cout << "1から100までの数を考えています。" << std::endl;
do {
std::cout << "あなたの推測: ";
std::cin >> guess;
attempts++;
if (guess > secret) {
std::cout << "高すぎる!" << std::endl;
} else if (guess < secret) {
std::cout << "低すぎる!" << std::endl;
} else {
std::cout << "正解!" << attempts << "回で当たりました!" << std::endl;
}
} while (guess != secret);
return 0;
}
💡 ヒント:
std::srand(std::time(0))は現在時刻で乱数ジェネレータをシードし、毎回異なる数が生成される。
▶ サンプル 2:簡単な連絡先管理(難易度 ⭐⭐⭐)
このプログラムは連絡先をメモリに保存し、名前で検索できる。
CPP
📖 参照専用
#include <iostream>
#include <string>
int main() {
const int MAX = 100;
std::string names[MAX], phones[MAX];
int count = 0;
int choice;
do {
std::cout << "\n=== 連絡先管理 ===" << std::endl;
std::cout << "1. 連絡先を追加" << std::endl;
std::cout << "2. 連絡先を検索" << std::endl;
std::cout << "3. 全件表示" << std::endl;
std::cout << "4. 終了" << std::endl;
std::cout << "選択: ";
std::cin >> choice;
std::cin.ignore();
if (choice == 1 && count < MAX) {
std::cout << "名前: ";
std::getline(std::cin, names[count]);
std::cout << "電話番号: ";
std::getline(std::cin, phones[count]);
count++;
std::cout << "連絡先を追加しました!" << std::endl;
} else if (choice == 2) {
std::string keyword;
std::cout << "名前を検索: ";
std::getline(std::cin, keyword);
bool found = false;
for (int i = 0; i < count; i++) {
if (names[i].find(keyword) != std::string::npos) {
std::cout << names[i] << ": " << phones[i] << std::endl;
found = true;
}
}
if (!found) std::cout << "見つかりませんでした。" << std::endl;
} else if (choice == 3) {
for (int i = 0; i < count; i++) {
std::cout << i + 1 << ". " << names[i] << ": " << phones[i] << std::endl;
}
}
} while (choice != 4);
std::cout << "さようなら!" << std::endl;
return 0;
}
▶ サンプル 3:履歴付き拡張電卓(難易度 ⭐⭐)
TEXT
📖 参照専用
#include <iostream>
using namespace std;
int main() {
double a, b, result;
char op;
bool running = true;
while (running) {
cout << "\n入力 (数値 演算子 数値): ";
cin >> a >> op >> b;
switch (op) {
case '+': result = a + b; break;
case '-': result = a - b; break;
case '*': result = a * b; break;
case '/':
if (b != 0) result = a / b;
else { cout << "エラー: ゼロ除算!" << endl; continue; }
break;
default:
cout << "無効な演算子!" << endl;
continue;
}
cout << "= " << result << endl;
}
return 0;
}
▶ サンプル 4:簡単なATMシミュレータ(難易度 ⭐⭐⭐)
CPP
#include <iostream>
using namespace std;
int main() {
double balance = 1000.0;
int choice;
double amount;
do {
cout << "\n=== 簡易ATM ===" << endl;
cout << "1. 残高照会" << endl;
cout << "2. 入金" << endl;
cout << "3. 引出" << endl;
cout << "4. 終了" << endl;
cout << "選択: ";
cin >> choice;
switch (choice) {
case 1:
cout << "残高: ¥" << balance << endl;
break;
case 2:
cout << "入金額: ¥";
cin >> amount;
if (amount > 0) {
balance += amount;
cout << "入金完了!新しい残高: ¥" << balance << endl;
}
break;
case 3:
cout << "引出額: ¥";
cin >> amount;
if (amount > 0 && amount <= balance) {
balance -= amount;
cout << "引出完了!新しい残高: ¥" << balance << endl;
} else {
cout << "残高不足!" << endl;
}
break;
}
} while (choice != 4);
cout << "ありがとうございました!" << endl;
return 0;
}
❓ よくある質問
Q いつforを使い、いつwhileを使う?
A 回数がわかるときはfor(例:「100回出力」)。条件がわかるときはwhile(例:「正解するまで推測」)。少なくとも1回は実行が必要なときはdo-while(例:「メニューを少なくとも1回表示」)。
Q ループ内でbreakとcontinueはどう連携する?
A
breakはループ全体を終了。continueは現在の反復だけスキップ。一緒に使えるが、ロジックに注意——breakは最終、continueは1反復スキップするだけ。Q なぜループ内で文字列入力がおかしくなる?
A おそらく
cin >>とgetlineを混在させている。cin >>の後にcin.ignore()を追加して、残った改行文字を捨てる必要がある。📖 まとめ
- 実際のプログラムは分岐とループを組み合わせる
do-whileはメニューや入力検証に最適switch-caseはメニューオプション処理に完璧- ループ内で
cout文を追加して変数値を追跡しデバッグ - 無限ループを避けるため、常にループ変数を更新
📝 練習問題
-
初級(難易度 ⭐): 数当てゲームを修正し、近さに基づいて「近づいてきた」とプレイヤーに伝える。
-
中級(難易度 ⭐⭐): 連絡先管理に「連絡先削除」オプションを追加。名前で検索し、リストから連絡先を削除できるようにする。
-
上級(難易度 ⭐⭐⭐): ATMに取引履歴機能を追加:各取引(種類、金額、新しい残高)を保存し、ユーザーが最後の5件の取引を確認できるようにする。