「演習:分岐とループ」
ここ数回のレッスンでは、分岐とループについて学びました。それでは、これらを組み合わせて、本格的なプログラムを作成してみましょう。プログラミングを学ぶ最良の方法は、実際に何か役に立つことを行うプログラムを書くことです。
▶ サンプル:1:数字当てゲーム(難易度 ⭐⭐)
CPP
#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 << "I'm thinking of a number between 1 and 100." << std::endl;
do {
std::cout << "Your guess: ";
std::cin >> guess;
attempts++;
if (guess > secret) {
std::cout << "Too high!" << std::endl;
} else if (guess < secret) {
std::cout << "Too low!" << std::endl;
} else {
std::cout << "Correct! You got it in " << attempts << " tries!" << 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=== Contact Book ===" << std::endl;
std::cout << "1. Add contact" << std::endl;
std::cout << "2. Search contact" << std::endl;
std::cout << "3. Show all" << std::endl;
std::cout << "4. Exit" << std::endl;
std::cout << "Choice: ";
std::cin >> choice;
std::cin.ignore();
if (choice == 1 && count < MAX) {
std::cout << "Name: ";
std::getline(std::cin, names[count]);
std::cout << "Phone: ";
std::getline(std::cin, phones[count]);
count++;
std::cout << "Contact added!" << std::endl;
} else if (choice == 2) {
std::string keyword;
std::cout << "Search name: ";
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 << "Not found." << 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 << "Goodbye!" << std::endl;
return 0;
}
▶ サンプル:3:履歴機能付き高度な電卓(難易度 ⭐⭐)
CPP
#include iostream
using namespace std;
int main() {
double a, b, result;
char op;
bool running = true;
while (running) {
cout << "\nEnter (num op num): ";
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 << "Error: division by zero!" << endl; continue; }
break;
default:
cout << "Invalid operator!" << 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=== Simple ATM ===" << endl;
cout << "1. Check balance" << endl;
cout << "2. Deposit" << endl;
cout << "3. Withdraw" << endl;
cout << "4. Exit" << endl;
cout << "Choice: ";
cin >> choice;
switch (choice) {
case 1:
cout << "Balance: $" << balance << endl;
break;
case 2:
cout << "Deposit amount: $";
cin >> amount;
if (amount > 0) {
balance += amount;
cout << "Deposited! New balance: $" << balance << endl;
}
break;
case 3:
cout << "Withdraw amount: $";
cin >> amount;
if (amount > 0 && amount <= balance) {
balance -= amount;
cout << "Withdrawn! New balance: $" << balance << endl;
} else {
cout << "Insufficient funds!" << endl;
}
break;
}
} while (choice != 4);
cout << "Thank you!" << endl;
return 0;
}
▶ サンプル 1: practice branch loopデモ (難易度 ⭐)
CPP
#include <iostream>
int main() {
// practice branch loopの
std::cout << "practice branch loopをびましょう!" << std::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件の取引を確認できるようにする。



