メインコンテンツへスキップ
Lesson9 / 9

演習:変数とデータ型の総合問題

目次

このレッスンで学ぶこと

  • モジュール2で学んだ内容の復習
  • 変数とデータ型を組み合わせた実践問題
  • よくあるエラーのデバッグ
  • 実務で使えるコーディングパターン

なぜ演習が必要なのか?

これまで学んだ内容を、実際に手を動かして使ってみることで、知識が定着します。

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

  • 変数の基本
  • 数値型(int, float)
  • 文字列型(str)
  • ブール型(bool)
  • リスト型(list)
  • 辞書型(dict)
  • タプルと集合
  • データ型の変換

💡 豆知識: プログラミング学習では「写経(しゃきょう)」という言葉があります。他人のコードを手で打ち込みながら学ぶ方法です。コピペではなく、実際にタイプすることで理解が深まります。


基礎演習

演習1: 変数の基本操作 ⭐☆☆

以下の仕様を満たすプログラムを作成してください:

仕様:

  1. 名前(文字列)、年齢(整数)、身長(小数)を変数に保存
  2. 全ての変数を使って自己紹介文を表示
  3. 型を確認して表示
💡 ヒント
  • f-stringで変数を埋め込む
  • type() で型を確認
✅ 解答例
Python
# 変数の定義
name = "山田太郎"
age = 25
height = 175.5

# 自己紹介
print(f"私の名前は{name}です。")
print(f"{age}歳で、身長は{height}cmです。")

# 型の確認
print(f"\n型の確認:")
print(f"name: {type(name)}")
print(f"age: {type(age)}")
print(f"height: {type(height)}")

実行結果:

私の名前は山田太郎です。
25歳で、身長は175.5cmです。

型の確認:
name: <class 'str'>
age: <class 'int'>
height: <class 'float'>

演習2: 数値計算 ⭐☆☆

税込価格を計算するプログラムを作成してください。

仕様:

  1. 商品価格を変数に保存(例: 1000円)
  2. 消費税率を変数に保存(例: 0.1 = 10%)
  3. 税込価格を計算して表示(小数点以下を四捨五入)
💡 ヒント
  • round() で四捨五入
  • 税込価格 = 価格 × (1 + 税率)
✅ 解答例
Python
# 価格と税率
price = 1000
tax_rate = 0.1

# 税額を計算
tax = price * tax_rate
total = price + tax

# 四捨五入
total_rounded = round(total)

print(f"商品価格: {price}円")
print(f"消費税率: {tax_rate * 100}%")
print(f"消費税額: {tax}円")
print(f"税込価格: {total_rounded}円")

実行結果:

商品価格: 1000円
消費税率: 10.0%
消費税額: 100.0円
税込価格: 1100円

演習3: 文字列操作 ⭐⭐☆

メールアドレスから情報を抽出するプログラムを作成してください。

仕様:

  1. メールアドレス "taro.yamada@example.co.jp" から:
    • ユーザー名(@の前)を抽出
    • ドメイン(@の後)を抽出
    • ユーザー名の姓と名を分割(.で分割)
  2. 結果を表示
💡 ヒント
  • split("@") で@を基準に分割
  • split(".") で.を基準に分割
✅ 解答例
Python
email = "taro.yamada@example.co.jp"

# @で分割
parts = email.split("@")
username = parts[0]
domain = parts[1]

# ユーザー名を.で分割
name_parts = username.split(".")
first_name = name_parts[0]
last_name = name_parts[1]

print(f"メールアドレス: {email}")
print(f"ユーザー名: {username}")
print(f"ドメイン: {domain}")
print(f"名: {first_name}")
print(f"姓: {last_name}")

実行結果:

メールアドレス: taro.yamada@example.co.jp
ユーザー名: taro.yamada
ドメイン: example.co.jp
名: taro
姓: yamada

中級演習

演習4: リストの集計 ⭐⭐☆

テストの点数リストから統計情報を計算してください。

仕様:

  1. 点数リスト: [85, 92, 78, 90, 88, 76, 95]
  2. 以下を計算して表示:
    • 平均点
    • 最高点と最低点
    • 80点以上の点数の数
💡 ヒント
  • sum(), len() で平均
  • max(), min() で最高・最低
  • ループで条件に合う数をカウント
✅ 解答例
Python
scores = [85, 92, 78, 90, 88, 76, 95]

# 平均点
average = sum(scores) / len(scores)

# 最高点・最低点
highest = max(scores)
lowest = min(scores)

# 80点以上の数
above_80 = 0
for score in scores:
    if score >= 80:
        above_80 += 1

print(f"点数リスト: {scores}")
print(f"平均点: {average:.1f}点")
print(f"最高点: {highest}点")
print(f"最低点: {lowest}点")
print(f"80点以上: {above_80}人")

実行結果:

点数リスト: [85, 92, 78, 90, 88, 76, 95]
平均点: 86.3点
最高点: 95点
最低点: 76点
80点以上: 5人

演習5: 辞書の操作 ⭐⭐☆

商品の在庫管理システムを作成してください。

仕様:

  1. 商品辞書を作成:{"りんご": 50, "みかん": 30, "バナナ": 20}
  2. 以下の操作を実行:
    • りんごを10個販売(在庫を減らす)
    • ぶどうを15個入荷(新規追加)
    • 全商品の在庫数を表示
    • 在庫の合計を計算
💡 ヒント
  • 辞書の値を変更: dict["key"] -= 10
  • 新規追加: dict["new_key"] = 15
  • values() で値の一覧を取得
✅ 解答例
Python
# 初期在庫
inventory = {
    "りんご": 50,
    "みかん": 30,
    "バナナ": 20
}

print("初期在庫:")
for item, count in inventory.items():
    print(f"  {item}: {count}個")

# りんごを10個販売
inventory["りんご"] -= 10
print("\nりんごを10個販売しました")

# ぶどうを15個入荷
inventory["ぶどう"] = 15
print("ぶどうを15個入荷しました")

# 現在の在庫
print("\n現在の在庫:")
for item, count in inventory.items():
    print(f"  {item}: {count}個")

# 在庫の合計
total = sum(inventory.values())
print(f"\n在庫合計: {total}個")

実行結果:

初期在庫:
  りんご: 50個
  みかん: 30個
  バナナ: 20個

りんごを10個販売しました
ぶどうを15個入荷しました

現在の在庫:
  りんご: 40個
  みかん: 30個
  バナナ: 20個
  ぶどう: 15個

在庫合計: 105個

演習6: ブール型と条件判定 ⭐⭐☆

ログイン認証システムを作成してください。

仕様:

  1. 正しいユーザー名とパスワードを変数に保存
  2. 入力されたユーザー名とパスワードをチェック
  3. 以下の条件で判定:
    • 両方正しい → "ログイン成功"
    • どちらか間違い → "ユーザー名またはパスワードが違います"
💡 ヒント
  • == で文字列を比較
  • and で両方の条件をチェック
✅ 解答例
Python
# 正しい認証情報
correct_username = "admin"
correct_password = "password123"

# 入力された情報(実際はinput()で取得)
input_username = "admin"
input_password = "password123"

# 認証チェック
is_username_correct = input_username == correct_username
is_password_correct = input_password == correct_password
is_authenticated = is_username_correct and is_password_correct

print(f"ユーザー名チェック: {is_username_correct}")
print(f"パスワードチェック: {is_password_correct}")

if is_authenticated:
    print("ログイン成功")
else:
    print("ユーザー名またはパスワードが違います")

# 間違った例
print("\n--- 間違った例 ---")
input_username2 = "admin"
input_password2 = "wrong_password"

is_authenticated2 = (input_username2 == correct_username and
                     input_password2 == correct_password)

if is_authenticated2:
    print("ログイン成功")
else:
    print("ユーザー名またはパスワードが違います")

実行結果:

ユーザー名チェック: True
パスワードチェック: True
ログイン成功

--- 間違った例 ---
ユーザー名またはパスワードが違います

応用演習

演習7: 型変換の実践 ⭐⭐⭐

CSV形式のデータを処理するプログラムを作成してください。

仕様:

  1. CSV文字列: "太郎,25,85.5,True"(名前,年齢,スコア,合格フラグ)
  2. データを適切な型に変換
  3. 以下を表示:
    • 全データ
    • 来年の年齢
    • スコアの整数部分
    • 合格判定(Trueなら"合格"、Falseなら"不合格")
💡 ヒント
  • split(",") で分割
  • int(), float() で型変換
  • "True" == "True" でブール判定
✅ 解答例
Python
# CSVデータ
csv_data = "太郎,25,85.5,True"

# カンマで分割
parts = csv_data.split(",")

# 型変換
name = parts[0]              # 文字列のまま
age = int(parts[1])          # 整数に変換
score = float(parts[2])      # 小数に変換
passed = parts[3] == "True"  # ブール値に変換

# データ表示
print("=== データ表示 ===")
print(f"名前: {name} (型: {type(name).__name__})")
print(f"年齢: {age} (型: {type(age).__name__})")
print(f"スコア: {score} (型: {type(score).__name__})")
print(f"合格: {passed} (型: {type(passed).__name__})")

# 計算
next_year_age = age + 1
score_int = int(score)
result = "合格" if passed else "不合格"

print("\n=== 計算結果 ===")
print(f"{name}さんの来年の年齢: {next_year_age}歳")
print(f"スコアの整数部分: {score_int}点")
print(f"合格判定: {result}")

実行結果:

=== データ表示 ===
名前: 太郎 (型: str)
年齢: 25 (型: int)
スコア: 85.5 (型: float)
合格: True (型: bool)

=== 計算結果 ===
太郎さんの来年の年齢: 26歳
スコアの整数部分: 85点
合格判定: 合格

演習8: データの集約 ⭐⭐⭐

複数の生徒データを処理するプログラムを作成してください。

仕様:

  1. 生徒のリスト(各生徒は辞書)
  2. 以下を計算:
    • 全生徒の平均点
    • 最高点を取った生徒の名前
    • 80点以上の生徒のリスト
💡 ヒント
  • リストの各要素(辞書)をループで処理
  • max() にキー関数を指定: max(students, key=lambda s: s["score"])
✅ 解答例
Python
# 生徒データ
students = [
    {"name": "太郎", "score": 85},
    {"name": "花子", "score": 92},
    {"name": "次郎", "score": 78},
    {"name": "美咲", "score": 88},
    {"name": "健太", "score": 95}
]

# 平均点
total_score = 0
for student in students:
    total_score += student["score"]
average = total_score / len(students)

# 最高点の生徒
top_student = students[0]
for student in students:
    if student["score"] > top_student["score"]:
        top_student = student

# 80点以上の生徒
high_scorers = []
for student in students:
    if student["score"] >= 80:
        high_scorers.append(student["name"])

# 結果表示
print("=== 生徒一覧 ===")
for student in students:
    print(f"{student['name']}: {student['score']}点")

print(f"\n平均点: {average:.1f}点")
print(f"最高点: {top_student['name']}さん ({top_student['score']}点)")
print(f"80点以上の生徒: {', '.join(high_scorers)}")

実行結果:

=== 生徒一覧 ===
太郎: 85点
花子: 92点
次郎: 78点
美咲: 88点
健太: 95点

平均点: 87.6点
最高点: 健太さん (95点)
80点以上の生徒: 太郎, 花子, 美咲, 健太

演習9: エラー修正 ⭐⭐⭐

以下のコードにはエラーがあります。すべて修正してください。

Python
# エラーがあるコード
age = "25"
next_year = age + 1

name = 太郎
message = f"こんにちは、{name}さん"

scores = [85, 92, 78]
print(scores[3])

user = {"name": "太郎", "age": 25}
print(user["email"])
💡 ヒント
  1. 文字列と数値の計算
  2. 文字列のクォート忘れ
  3. リストのインデックス範囲外
  4. 辞書の存在しないキー
✅ 解答例
Python
# 修正後のコード

# エラー1: 文字列を数値に変換
age = "25"
next_year = int(age) + 1
print(f"来年の年齢: {next_year}")

# エラー2: 文字列をクォートで囲む
name = "太郎"
message = f"こんにちは、{name}さん"
print(message)

# エラー3: インデックスの範囲チェック
scores = [85, 92, 78]
# print(scores[3])  # IndexError
if len(scores) > 3:
    print(scores[3])
else:
    print(f"インデックス3は範囲外です(最大: {len(scores) - 1})")

# エラー4: get()で安全にアクセス
user = {"name": "太郎", "age": 25}
email = user.get("email", "メールアドレス未登録")
print(f"メール: {email}")

実行結果:

来年の年齢: 26
こんにちは、太郎さん
インデックス3は範囲外です(最大: 2)
メール: メールアドレス未登録

エラーの説明:

  1. 文字列 "25" と数値 1 は計算できない → int() で変換
  2. 変数 太郎 は定義されていない → "太郎" とクォートで囲む
  3. リストのインデックスは0-2まで(3は範囲外)→ 範囲チェック
  4. 辞書に "email" キーは存在しない → get() で安全にアクセス

実践問題

演習10: ミニアプリケーション ⭐⭐⭐

簡単な買い物カート機能を作成してください。

仕様:

  1. 商品リスト(辞書のリスト):
    Python
    [
        {"name": "りんご", "price": 150, "quantity": 3},
        {"name": "みかん", "price": 100, "quantity": 5},
        {"name": "バナナ", "price": 200, "quantity": 2}
    ]
  2. 以下を計算・表示:
    • 各商品の小計(価格 × 数量)
    • 合計金額
    • 消費税(10%)
    • 税込合計
    • 最も高い商品
💡 ヒント
  • ループで各商品を処理
  • 小計 = price × quantity
  • 税込 = 合計 × 1.1
✅ 解答例
Python
# 商品リスト
cart = [
    {"name": "りんご", "price": 150, "quantity": 3},
    {"name": "みかん", "price": 100, "quantity": 5},
    {"name": "バナナ", "price": 200, "quantity": 2}
]

print("=== 買い物カート ===")

# 合計金額
total = 0

# 各商品の小計
for item in cart:
    subtotal = item["price"] * item["quantity"]
    total += subtotal
    print(f"{item['name']}: {item['price']}円 × {item['quantity']}個 = {subtotal}円")

# 消費税
tax_rate = 0.1
tax = total * tax_rate
total_with_tax = total + tax

print(f"\n小計: {total}円")
print(f"消費税({tax_rate * 100}%): {int(tax)}円")
print(f"合計: {int(total_with_tax)}円")

# 最も高い商品
most_expensive = cart[0]
for item in cart:
    if item["price"] > most_expensive["price"]:
        most_expensive = item

print(f"\n最も高い商品: {most_expensive['name']} ({most_expensive['price']}円)")

実行結果:

=== 買い物カート ===
りんご: 150円 × 3個 = 450円
みかん: 100円 × 5個 = 500円
バナナ: 200円 × 2個 = 400円

小計: 1350円
消費税(10.0%): 135円
合計: 1485円

最も高い商品: バナナ (200円)

まとめ

このレッスンでは、モジュール2で学んだ内容を演習で統合して確認しました。

  • 変数、数値、文字列、ブール、リスト、辞書を組み合わせて問題を解く力を確認しました。
  • 文字列分割や集計関数、f-stringを使って実践的な出力を作成できるようになりました。
  • 型変換を適切に使い、入力値を計算可能な形へ整える手順を身につけました。
  • TypeErrorIndexError など、初学者が遭遇しやすいエラーへの対応力を強化しました。
  • 小さな要件を分解して実装し、結果を検証する一連の流れを実践できる状態になりました。