演習:ループ処理の総合問題
目次
このレッスンで学ぶこと
- モジュール5で学んだループ処理の総合復習
- for文、while文、range()の使い分け
- break、continueの実践的な使い方
- ネストしたループの応用
なぜ演習が必要なのか?
ループ処理はプログラミングの中核をなす技術です。実際に手を動かして様々なパターンを実装することで、理解が深まります。
このレッスンでは、以下のトピックを総合的に復習します:
- for文とwhile文
- range()関数
- break文とcontinue文
- ネストしたループ
- 実践的なループパターン
💡 豆知識: プログラミングの上達には「反復練習」が重要です。ループ処理は最も頻繁に使う構文なので、様々なパターンを身につけることが大切です。
基礎演習
演習1: リストの合計 ⭐☆☆
リスト [10, 20, 30, 40, 50] の合計を計算してください。
💡 ヒント
for文で各要素を足していきます。
✅ 解答例
Pythonnumbers = [10, 20, 30, 40, 50] total = 0 for number in numbers: total += number print(f"合計: {total}")
実行結果:
合計: 150
演習2: カウントダウン ⭐☆☆
10から1までカウントダウンして、最後に「発射!」と表示してください。
💡 ヒント
range()で逆順にします。
✅ 解答例
Pythonfor i in range(10, 0, -1): print(i) print("発射!")
実行結果:
10
9
8
7
6
5
4
3
2
1
発射!
演習3: 偶数のフィルタ ⭐☆☆
リスト [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] から偶数だけを表示してください。
💡 ヒント
continueまたはif文を使います。
✅ 解答例
Pythonnumbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] print("偶数:") for number in numbers: if number % 2 == 0: print(number)
実行結果:
偶数:
2
4
6
8
10
中級演習
演習4: 最大値の検索 ⭐⭐☆
リスト [34, 78, 23, 91, 45, 67] から最大値を見つけてください。
💡 ヒント
最大値を保持する変数を用意して、各要素と比較します。
✅ 解答例
Pythonnumbers = [34, 78, 23, 91, 45, 67] max_value = numbers[0] for number in numbers: if number > max_value: max_value = number print(f"最大値: {max_value}")
実行結果:
最大値: 91
演習5: FizzBuzz ⭐⭐☆
1から30までの数について、以下のルールで表示してください:
- 3の倍数: "Fizz"
- 5の倍数: "Buzz"
- 3と5の両方の倍数: "FizzBuzz"
- それ以外: 数値そのまま
💡 ヒント
15の倍数(3と5の両方)を先にチェックします。
✅ 解答例
Pythonfor i in range(1, 31): if i % 15 == 0: print("FizzBuzz") elif i % 3 == 0: print("Fizz") elif i % 5 == 0: print("Buzz") else: print(i)
実行結果:
1
2
Fizz
4
Buzz
Fizz
7
8
Fizz
Buzz
11
Fizz
13
14
FizzBuzz
...
演習6: 文字列の反転 ⭐⭐☆
文字列 "Python" を逆順で表示してください。
💡 ヒント
range()で逆順にインデックスを指定します。
✅ 解答例
Pythontext = "Python" reversed_text = "" for i in range(len(text) - 1, -1, -1): reversed_text += text[i] print(reversed_text) # またはシンプルに for char in reversed(text): print(char, end="") print()
実行結果:
nohtyP
nohtyP
応用演習
演習7: 素数判定 ⭐⭐⭐
数値が素数かどうかを判定してください。2から50までの素数をすべて表示してください。
💡 ヒント
2からその数-1までで割り切れるかチェックします。for-elseを使います。
✅ 解答例
Pythonprint("2から50までの素数:") for number in range(2, 51): is_prime = True for i in range(2, number): if number % i == 0: is_prime = False break if is_prime: print(number, end=" ") print()
実行結果:
2から50までの素数:
2 3 5 7 11 13 17 19 23 29 31 37 41 43 47
演習8: パスワード検証 ⭐⭐⭐
パスワードが以下の条件を満たすかチェックしてください:
- 8文字以上
- 数字を含む
- 大文字を含む
- 小文字を含む
💡 ヒント
各条件をフラグ変数で管理します。
✅ 解答例
Pythonpassword = "MyPass123" # 条件チェック has_digit = False has_upper = False has_lower = False for char in password: if char.isdigit(): has_digit = True if char.isupper(): has_upper = True if char.islower(): has_lower = True # 結果表示 print(f"パスワード: {password}") print(f"文字数: {len(password)}文字") print(f"数字を含む: {has_digit}") print(f"大文字を含む: {has_upper}") print(f"小文字を含む: {has_lower}") if len(password) >= 8 and has_digit and has_upper and has_lower: print("✓ 強いパスワードです") else: print("✗ パスワードを強化してください") if len(password) < 8: print(" - 8文字以上にしてください") if not has_digit: print(" - 数字を含めてください") if not has_upper: print(" - 大文字を含めてください") if not has_lower: print(" - 小文字を含めてください")
実行結果:
パスワード: MyPass123
文字数: 9文字
数字を含む: True
大文字を含む: True
小文字を含む: True
✓ 強いパスワードです
演習9: 九九の表 ⭐⭐⭐
九九の表(1×1から9×9まで)を綺麗に整形して表示してください。
💡 ヒント
ネストしたループを使います。フォーマット指定で桁を揃えます。
✅ 解答例
Pythonprint("=== 九九の表 ===") # ヘッダー print(" ", end="") for i in range(1, 10): print(f"{i:3}", end="") print() print("-" * 31) # 本体 for i in range(1, 10): print(f"{i} |", end="") for j in range(1, 10): result = i * j print(f"{result:3}", end="") print()
実行結果:
=== 九九の表 ===
1 2 3 4 5 6 7 8 9
-------------------------------
1 | 1 2 3 4 5 6 7 8 9
2 | 2 4 6 8 10 12 14 16 18
3 | 3 6 9 12 15 18 21 24 27
4 | 4 8 12 16 20 24 28 32 36
5 | 5 10 15 20 25 30 35 40 45
6 | 6 12 18 24 30 36 42 48 54
7 | 7 14 21 28 35 42 49 56 63
8 | 8 16 24 32 40 48 56 64 72
9 | 9 18 27 36 45 54 63 72 81
演習10: ダイヤモンドパターン ⭐⭐⭐
以下のようなダイヤモンド型のパターンを表示してください(サイズ5):
*
***
*****
*******
*********
*******
*****
***
*
💡 ヒント
上半分と下半分に分けて考えます。
✅ 解答例
Pythonsize = 5 # 上半分(拡大) for i in range(size): spaces = size - i - 1 stars = 2 * i + 1 print(" " * spaces + "*" * stars) # 下半分(縮小) for i in range(size - 2, -1, -1): spaces = size - i - 1 stars = 2 * i + 1 print(" " * spaces + "*" * stars)
実行結果:
*
***
*****
*******
*********
*******
*****
***
*
演習11: 重複の削除 ⭐⭐⭐
リスト [1, 2, 2, 3, 4, 4, 4, 5, 1, 3] から重複を削除してください(順序は維持)。
💡 ヒント
すでに追加した値を別のリストで管理します。
✅ 解答例
Pythonnumbers = [1, 2, 2, 3, 4, 4, 4, 5, 1, 3] unique = [] for number in numbers: if number not in unique: unique.append(number) print(f"元のリスト: {numbers}") print(f"重複削除後: {unique}")
実行結果:
元のリスト: [1, 2, 2, 3, 4, 4, 4, 5, 1, 3]
重複削除後: [1, 2, 3, 4, 5]
演習12: 数当てゲーム ⭐⭐⭐
1から100までのランダムな数を当てるゲームを作成してください。大きい/小さいのヒントを出し、10回以内に当てる必要があります。
💡 ヒント
while文またはfor文でループし、breakで抜けます。
✅ 解答例
Pythonimport random answer = random.randint(1, 100) max_attempts = 10 print("=== 数当てゲーム ===") print("1〜100の数を当ててください") print(f"チャンスは{max_attempts}回です") for attempt in range(1, max_attempts + 1): guess = int(input(f"\n{attempt}回目の予想: ")) if guess == answer: print(f"正解! {attempt}回で当たりました") break elif guess < answer: print("もっと大きい数です") else: print("もっと小さい数です") if attempt == max_attempts: print(f"\n残念!正解は{answer}でした") else: print(f"\n残念!正解は{answer}でした")
実行例:
=== 数当てゲーム ===
1〜100の数を当ててください
チャンスは10回です
1回目の予想: 50
もっと大きい数です
2回目の予想: 75
もっと小さい数です
3回目の予想: 63
もっと大きい数です
4回目の予想: 69
正解! 4回で当たりました
演習13: 2次元リストの転置 ⭐⭐⭐
以下の2次元リストを転置(行と列を入れ替え)してください:
Pythonmatrix = [ [1, 2, 3], [4, 5, 6], [7, 8, 9] ]
💡 ヒント
ネストしたループで列と行を入れ替えます。
✅ 解答例
Pythonmatrix = [ [1, 2, 3], [4, 5, 6], [7, 8, 9] ] # 転置行列を作成 rows = len(matrix) cols = len(matrix[0]) transposed = [] for j in range(cols): new_row = [] for i in range(rows): new_row.append(matrix[i][j]) transposed.append(new_row) # 結果表示 print("元の行列:") for row in matrix: print(row) print("\n転置行列:") for row in transposed: print(row)
実行結果:
元の行列:
[1, 2, 3]
[4, 5, 6]
[7, 8, 9]
転置行列:
[1, 4, 7]
[2, 5, 8]
[3, 6, 9]
演習14: 単語の出現回数 ⭐⭐⭐
文章中の各単語の出現回数を数えてください。
💡 ヒント
辞書を使って各単語の出現回数を記録します。
✅ 解答例
Pythontext = "Python is great Python is fun Python is powerful" words = text.split() word_count = {} for word in words: if word in word_count: word_count[word] += 1 else: word_count[word] = 1 print("=== 単語の出現回数 ===") for word, count in word_count.items(): print(f"{word}: {count}回")
実行結果:
=== 単語の出現回数 ===
Python: 3回
is: 3回
great: 1回
fun: 1回
powerful: 1回
演習15: フィボナッチ数列 ⭐⭐⭐
フィボナッチ数列の最初の15項を表示してください。
💡 ヒント
前の2つの数を足して次の数を作ります。
✅ 解答例
Pythonn = 15 a, b = 0, 1 print("フィボナッチ数列の最初の15項:") for i in range(n): print(a, end=" ") a, b = b, a + b print()
実行結果:
フィボナッチ数列の最初の15項:
0 1 1 2 3 5 8 13 21 34 55 89 144 233 377
まとめ
このレッスンでは、ループ処理を演習で統合して確認しました。
- for、while、range、break、continue、ネストを組み合わせて実装できました。
- 反復条件と終了条件を明確にして、意図した結果を得る力を確認しました。
- 集計・探索・スキップなど実務に近い処理パターンを練習できました。
- 中間出力でループの状態を確認し、デバッグする手順を実践しました。
- 問題を小さく分けて実装することで、複雑な処理にも対応できるようになりました。
演習:ループ処理の総合問題
目次
このレッスンで学ぶこと
- モジュール5で学んだループ処理の総合復習
- for文、while文、range()の使い分け
- break、continueの実践的な使い方
- ネストしたループの応用
なぜ演習が必要なのか?
ループ処理はプログラミングの中核をなす技術です。実際に手を動かして様々なパターンを実装することで、理解が深まります。
このレッスンでは、以下のトピックを総合的に復習します:
- for文とwhile文
- range()関数
- break文とcontinue文
- ネストしたループ
- 実践的なループパターン
💡 豆知識: プログラミングの上達には「反復練習」が重要です。ループ処理は最も頻繁に使う構文なので、様々なパターンを身につけることが大切です。
基礎演習
演習1: リストの合計 ⭐☆☆
リスト [10, 20, 30, 40, 50] の合計を計算してください。
💡 ヒント
for文で各要素を足していきます。
✅ 解答例
Pythonnumbers = [10, 20, 30, 40, 50] total = 0 for number in numbers: total += number print(f"合計: {total}")
実行結果:
合計: 150
演習2: カウントダウン ⭐☆☆
10から1までカウントダウンして、最後に「発射!」と表示してください。
💡 ヒント
range()で逆順にします。
✅ 解答例
Pythonfor i in range(10, 0, -1): print(i) print("発射!")
実行結果:
10
9
8
7
6
5
4
3
2
1
発射!
演習3: 偶数のフィルタ ⭐☆☆
リスト [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] から偶数だけを表示してください。
💡 ヒント
continueまたはif文を使います。
✅ 解答例
Pythonnumbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] print("偶数:") for number in numbers: if number % 2 == 0: print(number)
実行結果:
偶数:
2
4
6
8
10
中級演習
演習4: 最大値の検索 ⭐⭐☆
リスト [34, 78, 23, 91, 45, 67] から最大値を見つけてください。
💡 ヒント
最大値を保持する変数を用意して、各要素と比較します。
✅ 解答例
Pythonnumbers = [34, 78, 23, 91, 45, 67] max_value = numbers[0] for number in numbers: if number > max_value: max_value = number print(f"最大値: {max_value}")
実行結果:
最大値: 91
演習5: FizzBuzz ⭐⭐☆
1から30までの数について、以下のルールで表示してください:
- 3の倍数: "Fizz"
- 5の倍数: "Buzz"
- 3と5の両方の倍数: "FizzBuzz"
- それ以外: 数値そのまま
💡 ヒント
15の倍数(3と5の両方)を先にチェックします。
✅ 解答例
Pythonfor i in range(1, 31): if i % 15 == 0: print("FizzBuzz") elif i % 3 == 0: print("Fizz") elif i % 5 == 0: print("Buzz") else: print(i)
実行結果:
1
2
Fizz
4
Buzz
Fizz
7
8
Fizz
Buzz
11
Fizz
13
14
FizzBuzz
...
演習6: 文字列の反転 ⭐⭐☆
文字列 "Python" を逆順で表示してください。
💡 ヒント
range()で逆順にインデックスを指定します。
✅ 解答例
Pythontext = "Python" reversed_text = "" for i in range(len(text) - 1, -1, -1): reversed_text += text[i] print(reversed_text) # またはシンプルに for char in reversed(text): print(char, end="") print()
実行結果:
nohtyP
nohtyP
応用演習
演習7: 素数判定 ⭐⭐⭐
数値が素数かどうかを判定してください。2から50までの素数をすべて表示してください。
💡 ヒント
2からその数-1までで割り切れるかチェックします。for-elseを使います。
✅ 解答例
Pythonprint("2から50までの素数:") for number in range(2, 51): is_prime = True for i in range(2, number): if number % i == 0: is_prime = False break if is_prime: print(number, end=" ") print()
実行結果:
2から50までの素数:
2 3 5 7 11 13 17 19 23 29 31 37 41 43 47
演習8: パスワード検証 ⭐⭐⭐
パスワードが以下の条件を満たすかチェックしてください:
- 8文字以上
- 数字を含む
- 大文字を含む
- 小文字を含む
💡 ヒント
各条件をフラグ変数で管理します。
✅ 解答例
Pythonpassword = "MyPass123" # 条件チェック has_digit = False has_upper = False has_lower = False for char in password: if char.isdigit(): has_digit = True if char.isupper(): has_upper = True if char.islower(): has_lower = True # 結果表示 print(f"パスワード: {password}") print(f"文字数: {len(password)}文字") print(f"数字を含む: {has_digit}") print(f"大文字を含む: {has_upper}") print(f"小文字を含む: {has_lower}") if len(password) >= 8 and has_digit and has_upper and has_lower: print("✓ 強いパスワードです") else: print("✗ パスワードを強化してください") if len(password) < 8: print(" - 8文字以上にしてください") if not has_digit: print(" - 数字を含めてください") if not has_upper: print(" - 大文字を含めてください") if not has_lower: print(" - 小文字を含めてください")
実行結果:
パスワード: MyPass123
文字数: 9文字
数字を含む: True
大文字を含む: True
小文字を含む: True
✓ 強いパスワードです
演習9: 九九の表 ⭐⭐⭐
九九の表(1×1から9×9まで)を綺麗に整形して表示してください。
💡 ヒント
ネストしたループを使います。フォーマット指定で桁を揃えます。
✅ 解答例
Pythonprint("=== 九九の表 ===") # ヘッダー print(" ", end="") for i in range(1, 10): print(f"{i:3}", end="") print() print("-" * 31) # 本体 for i in range(1, 10): print(f"{i} |", end="") for j in range(1, 10): result = i * j print(f"{result:3}", end="") print()
実行結果:
=== 九九の表 ===
1 2 3 4 5 6 7 8 9
-------------------------------
1 | 1 2 3 4 5 6 7 8 9
2 | 2 4 6 8 10 12 14 16 18
3 | 3 6 9 12 15 18 21 24 27
4 | 4 8 12 16 20 24 28 32 36
5 | 5 10 15 20 25 30 35 40 45
6 | 6 12 18 24 30 36 42 48 54
7 | 7 14 21 28 35 42 49 56 63
8 | 8 16 24 32 40 48 56 64 72
9 | 9 18 27 36 45 54 63 72 81
演習10: ダイヤモンドパターン ⭐⭐⭐
以下のようなダイヤモンド型のパターンを表示してください(サイズ5):
*
***
*****
*******
*********
*******
*****
***
*
💡 ヒント
上半分と下半分に分けて考えます。
✅ 解答例
Pythonsize = 5 # 上半分(拡大) for i in range(size): spaces = size - i - 1 stars = 2 * i + 1 print(" " * spaces + "*" * stars) # 下半分(縮小) for i in range(size - 2, -1, -1): spaces = size - i - 1 stars = 2 * i + 1 print(" " * spaces + "*" * stars)
実行結果:
*
***
*****
*******
*********
*******
*****
***
*
演習11: 重複の削除 ⭐⭐⭐
リスト [1, 2, 2, 3, 4, 4, 4, 5, 1, 3] から重複を削除してください(順序は維持)。
💡 ヒント
すでに追加した値を別のリストで管理します。
✅ 解答例
Pythonnumbers = [1, 2, 2, 3, 4, 4, 4, 5, 1, 3] unique = [] for number in numbers: if number not in unique: unique.append(number) print(f"元のリスト: {numbers}") print(f"重複削除後: {unique}")
実行結果:
元のリスト: [1, 2, 2, 3, 4, 4, 4, 5, 1, 3]
重複削除後: [1, 2, 3, 4, 5]
演習12: 数当てゲーム ⭐⭐⭐
1から100までのランダムな数を当てるゲームを作成してください。大きい/小さいのヒントを出し、10回以内に当てる必要があります。
💡 ヒント
while文またはfor文でループし、breakで抜けます。
✅ 解答例
Pythonimport random answer = random.randint(1, 100) max_attempts = 10 print("=== 数当てゲーム ===") print("1〜100の数を当ててください") print(f"チャンスは{max_attempts}回です") for attempt in range(1, max_attempts + 1): guess = int(input(f"\n{attempt}回目の予想: ")) if guess == answer: print(f"正解! {attempt}回で当たりました") break elif guess < answer: print("もっと大きい数です") else: print("もっと小さい数です") if attempt == max_attempts: print(f"\n残念!正解は{answer}でした") else: print(f"\n残念!正解は{answer}でした")
実行例:
=== 数当てゲーム ===
1〜100の数を当ててください
チャンスは10回です
1回目の予想: 50
もっと大きい数です
2回目の予想: 75
もっと小さい数です
3回目の予想: 63
もっと大きい数です
4回目の予想: 69
正解! 4回で当たりました
演習13: 2次元リストの転置 ⭐⭐⭐
以下の2次元リストを転置(行と列を入れ替え)してください:
Pythonmatrix = [ [1, 2, 3], [4, 5, 6], [7, 8, 9] ]
💡 ヒント
ネストしたループで列と行を入れ替えます。
✅ 解答例
Pythonmatrix = [ [1, 2, 3], [4, 5, 6], [7, 8, 9] ] # 転置行列を作成 rows = len(matrix) cols = len(matrix[0]) transposed = [] for j in range(cols): new_row = [] for i in range(rows): new_row.append(matrix[i][j]) transposed.append(new_row) # 結果表示 print("元の行列:") for row in matrix: print(row) print("\n転置行列:") for row in transposed: print(row)
実行結果:
元の行列:
[1, 2, 3]
[4, 5, 6]
[7, 8, 9]
転置行列:
[1, 4, 7]
[2, 5, 8]
[3, 6, 9]
演習14: 単語の出現回数 ⭐⭐⭐
文章中の各単語の出現回数を数えてください。
💡 ヒント
辞書を使って各単語の出現回数を記録します。
✅ 解答例
Pythontext = "Python is great Python is fun Python is powerful" words = text.split() word_count = {} for word in words: if word in word_count: word_count[word] += 1 else: word_count[word] = 1 print("=== 単語の出現回数 ===") for word, count in word_count.items(): print(f"{word}: {count}回")
実行結果:
=== 単語の出現回数 ===
Python: 3回
is: 3回
great: 1回
fun: 1回
powerful: 1回
演習15: フィボナッチ数列 ⭐⭐⭐
フィボナッチ数列の最初の15項を表示してください。
💡 ヒント
前の2つの数を足して次の数を作ります。
✅ 解答例
Pythonn = 15 a, b = 0, 1 print("フィボナッチ数列の最初の15項:") for i in range(n): print(a, end=" ") a, b = b, a + b print()
実行結果:
フィボナッチ数列の最初の15項:
0 1 1 2 3 5 8 13 21 34 55 89 144 233 377
まとめ
このレッスンでは、ループ処理を演習で統合して確認しました。
- for、while、range、break、continue、ネストを組み合わせて実装できました。
- 反復条件と終了条件を明確にして、意図した結果を得る力を確認しました。
- 集計・探索・スキップなど実務に近い処理パターンを練習できました。
- 中間出力でループの状態を確認し、デバッグする手順を実践しました。
- 問題を小さく分けて実装することで、複雑な処理にも対応できるようになりました。