11
13

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Pythonで四択問題アプリを作ってみた

Last updated at Posted at 2020-10-07

概要

G検定の勉強をしようと思い、
ローカルで動く四択問題アプアリを作りました。
問題集としては、一般社団法人日本ディープラーニング協会が実施しているG検定を題材としました。
G検定について

Python入門者にとってはちょうどいい教材になると思います。

処理内容

ざっくりと次のようなステップです。

  1. csvから問題を読み込む(No, 問題文, 回答 の3列)
  2. 読み込んだ問題から1行目のヘッダ部分をのぞいてリストに入れる
  3. 問題文をランダム出力する
  4. 回答選択肢を4つ出す。一つは正解、残り3つは他の問題の正解からランダムに選択する
  5. ユーザーから回答を受け付ける。回答番号(1~4)以外はやり直しさせる
  6. 回答の都度、正解、不正解を出力する
  7. 最後の問題が終わったら、最終的な正答率を出力する

開発環境

  • ローカルマシン(Mac)にて、Dockerを使ってLinux環境を構築
  • エディタはVS Code。
  • Python:3.8.5

問題集となるCSV

エクセルなどで、1行目をヘッダ行として、
1列目はNo、2列目は問題文、3列目は回答とするファイルを作り、csvで保存します。
保存する場所はプログラムと同じディレクトリとしています。
別の場所に保存する場合は、プログラムの方を修正する必要がありますのでご注意ください。

スクリーンショット 2020-10-07 16.54.21.jpg

コード


# 必要なライブラリの読み込み
import csv
import random


# 問題集ファイル(csv)の読み込み。1行目はヘッダなので読み込まない。
test_file = open('gkentei.csv')
test_data = csv.reader(test_file)
questions = []
for row in test_data:
    if test_data.line_num == 1:
        continue
    questions.append(row)
test_file.close()


# 純不同に出題するためにシャッフル
random.shuffle(questions)


# 正答率を計算するために、初期値として正答数に0をセット
correct_count = 0


# ループを回してランダムに出題しながら都度回答を表示
for quiz, question in enumerate(questions):
    # 選択肢を作る (1)誤りの3つをいれる
    answers = []
    while len(answers) < 3:
        choice = random.randint(1, len(questions))
        if (choice != quiz + 1) and (questions[choice-1][2] not in answers): # 正解ではない、かつ既に含まれていない
            answers.append(questions[choice-1][2])
            
    # 選択肢を作る (2)正解を入れる
    correct_ans = questions[quiz][2]
    answers.append(correct_ans)
    
    # 選択肢を作る (3)シャッフルする
    random.shuffle(answers)
        
    # 問題文を出力
    print('\n問題{}'.format(quiz + 1))
    print(questions[quiz][1])
    
    # 回答選択肢を出力
    print('\n---- 回答選択肢 -----')

    for i, ans in enumerate(answers):
        print('{}: {}'.format(i+1, ans))

    # 回答の受付と入力された値のチェック
    while True:
        user_ans = input('\n回答選択肢を入力してください。\n')
        if user_ans in ['1', '2', '3', '4']:
            break
        else:
            continue

    # 正解の表示
    print('\n----- 正解は -----')
    correct_num = answers.index(questions[quiz][2]) + 1
    print('{}: {}'.format(correct_num, questions[quiz][2]))
    
    # 結果
    if correct_num == int(user_ans):
        print('😀😀😀正解😀😀😀')
        correct_count += 1
    else:
        print('☠️☠️☠️残念☠️☠️☠️')
    print('\n\n■ □ ■ □ ■ □ ■ □ ■ □ ■ □ ■ □ ■ □ ')

# 最終結果を出力
correct_rate = int(correct_count / len(questions) * 100)
print('\n⭐️⭐️⭐️最終結果⭐️⭐️⭐️')
print('正答率は {}%です。{}問中 {}問正解'.format(correct_rate, len(questions), correct_count))


何かの参考になれば幸いです。

11
13
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
11
13

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?