メインコンテンツへスキップ
Lesson7 / 7

演習:ループ処理の総合問題

目次

このレッスンで学ぶこと

  • モジュール5で学んだループ処理の総合復習
  • for文、while文、range()の使い分け
  • break、continueの実践的な使い方
  • ネストしたループの応用

なぜ演習が必要なのか?

ループ処理はプログラミングの中核をなす技術です。実際に手を動かして様々なパターンを実装することで、理解が深まります。

このレッスンでは、以下のトピックを総合的に復習します:

  • for文とwhile文
  • range()関数
  • break文とcontinue文
  • ネストしたループ
  • 実践的なループパターン

💡 豆知識: プログラミングの上達には「反復練習」が重要です。ループ処理は最も頻繁に使う構文なので、様々なパターンを身につけることが大切です。


基礎演習

演習1: リストの合計 ⭐☆☆

リスト [10, 20, 30, 40, 50] の合計を計算してください。

💡 ヒント

for文で各要素を足していきます。

✅ 解答例
Python
numbers = [10, 20, 30, 40, 50]
total = 0

for number in numbers:
    total += number

print(f"合計: {total}")

実行結果:

合計: 150

演習2: カウントダウン ⭐☆☆

10から1までカウントダウンして、最後に「発射!」と表示してください。

💡 ヒント

range()で逆順にします。

✅ 解答例
Python
for 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文を使います。

✅ 解答例
Python
numbers = [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] から最大値を見つけてください。

💡 ヒント

最大値を保持する変数を用意して、各要素と比較します。

✅ 解答例
Python
numbers = [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の両方)を先にチェックします。

✅ 解答例
Python
for 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()で逆順にインデックスを指定します。

✅ 解答例
Python
text = "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を使います。

✅ 解答例
Python
print("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文字以上
  • 数字を含む
  • 大文字を含む
  • 小文字を含む
💡 ヒント

各条件をフラグ変数で管理します。

✅ 解答例
Python
password = "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まで)を綺麗に整形して表示してください。

💡 ヒント

ネストしたループを使います。フォーマット指定で桁を揃えます。

✅ 解答例
Python
print("=== 九九の表 ===")

# ヘッダー
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):

    *
   ***
  *****
 *******
*********
 *******
  *****
   ***
    *
💡 ヒント

上半分と下半分に分けて考えます。

✅ 解答例
Python
size = 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] から重複を削除してください(順序は維持)。

💡 ヒント

すでに追加した値を別のリストで管理します。

✅ 解答例
Python
numbers = [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で抜けます。

✅ 解答例
Python
import 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次元リストを転置(行と列を入れ替え)してください:

Python
matrix = [
    [1, 2, 3],
    [4, 5, 6],
    [7, 8, 9]
]
💡 ヒント

ネストしたループで列と行を入れ替えます。

✅ 解答例
Python
matrix = [
    [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: 単語の出現回数 ⭐⭐⭐

文章中の各単語の出現回数を数えてください。

💡 ヒント

辞書を使って各単語の出現回数を記録します。

✅ 解答例
Python
text = "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つの数を足して次の数を作ります。

✅ 解答例
Python
n = 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、ネストを組み合わせて実装できました。
  • 反復条件と終了条件を明確にして、意図した結果を得る力を確認しました。
  • 集計・探索・スキップなど実務に近い処理パターンを練習できました。
  • 中間出力でループの状態を確認し、デバッグする手順を実践しました。
  • 問題を小さく分けて実装することで、複雑な処理にも対応できるようになりました。