Pythonで暗記がはかどるコンソールアプリ作ってみた

2024年11月15日金曜日

Python サンプル

t f B! P L

さて、こちらではテスト期間になって1週間ほどたち、そろそろ暗記系科目の対策も練らなければいけない時期となりました。
そこで毎回課題になる教科が「公共」です。
一問一答問題を作ってもなんか順番で覚えちゃって本番では全く使えなくてうわーん
って感じでした。

そこで、「作った問題文をランダムにして出題するプログラムを作ればいいのでは!?」という思考にいたり、Pythonでそのようなコンソールアプリを作っていきます。

問題文のファイルと解答のファイルを準備しよう

まず、これが[公共.txt]というファイルです。
社会問題を解決し、人間らしい生活を求められるであろう権利
我々が福祉国家を追求してくのが基本方針となっきっかけの憲法
ワイマール憲法が導入されて我々が追求したもの
1957年にはじまって1967年に本人死亡により終了した訴訟
朝日訴訟の最高裁判所の判決に参考にした考え
障害があれば障害者福祉年金、児童扶養手当があっていだろうという訴訟
我々の憲法である働く権利
働く中での最低基準を示した法律2つ
憲法段階で保障している労働三法
国民が政治に参加する権利
選挙で投票内容を明かさないという、4原則の1つ
我々がもつ憲法改正するための権利
我々がもる最高裁判所裁判官をやめさせることができる権利
地方自治体特別法について我々がもつ権利
国や地方自治体に対して一定の職務の遂行を求め、参政権を補う権利
裁判を受ける権利を含む、公に様々な行動の要望を出せる権利
投資信託の運用収益などを受け取れる権利
人権が侵害されたときに公に救済を求めることができる権利
逮捕拘束のあとに無罪が確定したときに使える権利
公務員の不法行為による損害に対して使える権利
公害に対して主張された権利
表現の自由の1つとして公に対して情報の公開を求める権利
1999年に成立した情報を知るための法律
漏洩すると国の安全保障に著しい危険になるのを防ぐためにつくられた法律
個人に関する情報をもっている企業にたいして訂正削除を行える権利
2015年に改正された、個人の情報に関する法律

ちなみにこの問題文ですが、めちゃめちゃ適当に書いたので日本語がめちゃくちゃです。
これでも頑張ったほうなので大目に見てやってください。
そしてこれが、[公共解答.txt]というファイルです。
社会権
ワイマール憲法
福祉国家
朝日訴訟
プログラム規定説
堀木訴訟
勤労の権利
労働基準法、最低賃金法
団結権、団体交渉権、団体行動権(争議権)
参政権
秘密投票
国民投票権
国民審査権
制定同意権
請願権
国務請求権
受益権
請求権
刑事補償請求権
国家賠償請求権
環境権
知る権利
情報公開法
特定秘密保護法
自己情報コントロール権
個人情報保護法

問題文のファイルと解答のファイルはこんな感じです。
問題と解答の行を一致させるように必ず書いてください。
あとエンコードはUTF-8にしてください。

Pythonのソースコード

ここが今回のみそになる部分ですね。
とりあえずソースコード載せちゃいます。
import random
import sys

file1 = open("公共.txt","r",encoding="UTF-8")
text1 = file1.read()
file1.close()

file2 = open("公共解答.txt","r", encoding="UTF-8")
text2 = file2.read()
file2.close()

mondai = text1.splitlines()
kaitou = text2.splitlines()
lenght = list(range(len(mondai)))
random.shuffle(lenght)

oklist = []

while True:
    for i in lenght:
        if len(oklist) == len(lenght):
            print("Finished")
            input()
            sys.exit()
        elif i in oklist:
            pass
        else:
            print(mondai[i])
            input()
            print(kaitou[i])
            user = input()
            if (user == "ok" or user == "OK"):
                oklist.append(i)

ファイルの確認

実行する前にファイルの確認をしておきます。


こんな感じで3つのファイルがしっかりと配置されていることを確認してください。
そのうえ、2つのテキストファイルは「公共.txt」「公共解答.txt」にしてください。

使い方


まず、開くと、上のスクショのように問題がランダムが出てきます。
問題の解答を、手元のノートなどに書き留めておいてください。
一応input()にしているので、この時点で入力することもできますが、普通に紙に書いても大丈夫です。
書き終わったら、エンターキーを押してください。


そしたらこのように、それに対する解答が表示されます。
そしてここでまたinput()になっていますが、
ちゃんと覚えてる、大丈夫だってときはこの時点で「ok」と入力してください。


もし覚えていなかったという場合は何も入力しなくて大丈夫です。
ただ、「ok」を入力すると二週目以降にその問題が出なくなります。

今回のアプリは暗記が目的なので 「ok」と入力されなかった=覚えていなかった 問題を次の週に表示させ、何週もやっていくうちに、すべて「ok」=すべて覚えた状態 にするのが目標です。

そして、エンターキーを押します。


こんな感じで、次の問題が表示されます。以降、繰り返しとなります。
「ok」と入力されなかった問題に関しては2週目で表示されます。

そして、2週目でも「ok」と入力されなかった問題は3週目・・・と続きます。
んで、全部「ok」になったら


おめでとうございます。「Finished」と表示されました。
この状態から、エンターキーを押してもいいですし、コンソールごと閉じても大丈夫です。

以上が使い方になります。

ソースコードの解説



import random
import sys
普通に、必要なライブラリをインストールしてます。
問題をシャッフルするのにrandomが必須なのでrandom、プログラムを終了させるためにsysライブラリを使います。

file1 = open("公共.txt","r",encoding="UTF-8")
text1 = file1.read()
file1.close()

file2 = open("公共解答.txt","r", encoding="UTF-8")
text2 = file2.read()
file2.close()
2つのファイルの中身を取得しています。

mondai = text1.splitlines()
kaitou = text2.splitlines()
lenght = list(range(len(mondai)))
random.shuffle(lenght)
splitlines()を使って、行ごとに区切っています。
lenghtでは何をしているのかというと、ちょっとややこいのですが、
問題の数だけ[1, 2, 3, 4, 5, 6, …]というふうに数値の配列を作っています。
そんでrandom.shuffleでその作った配列をシャッフルしています。

oklist = []
oklistとは、「ok」と入力された問題の番号の配列です。
初期ではなしなので空にしています。

while True:
    for i in lenght:
        if len(oklist) == len(lenght):
            print("Finished")
            input()
            sys.exit()
        elif i in oklist:
            pass
        else:
            print(mondai[i])
            input()
            print(kaitou[i])
            user = input()
            if (user == "ok" or user == "OK"):
                oklist.append(i)
ここの部分が大事ですが、ちょっとかいせつが難しいですね。
まず、While True:無限にループさせます。
そしてfor分に関しての説明はは割愛して、「ok」の数が問題の数と一致していないか調べています。
もし、okの数=問題の数だった場合、全部覚えられたということで、Finishedと表示させ、sys.exit()で終了させています。
breakを使ってWhile Trueを抜け出す方法もありましたがなんかめんどかったのでsys.exit()を使います。

続いて「elif i in oklist」ですが、ここではその問題はoklistに含まれているか確認しています。
含まれている場合、それは「ok」と入力された問題=覚えた問題なのでスキップするようにpassにしてます。

そして、今までの2の条件に当てはまらなかった場合は普通に問題を表示させるようにしてます。
ここに関してはだいたい見ればわかると思います。

おわりに

ということでこんな感じですね。
多分探せば似たようなアプリがあるんでしょうが、自分でつくるということに意味があります。
コンソールアプリは見た目はアレですが、使いやすく、プログラムも書きやすいです。

少しでも参考になりましたら幸いです。

このブログを検索

要望について

ブログのレイアウトやテーマについての提案をいただきました。現在qooqテーマを適応中です。 語尾を自動でつけるプログラムを作りたいという要望をいただきました。是非紹介したいですがどの言語でどのようなプログラムかなど、お問い合わせフォームで詳しく教えてください!

最近の出来事

最近の出来事
寿司打お勧め75位♪(練習モードだけど)

アンケート

Welcome!

「プログラミング独学ブログ」へようこそ。 Yakinyといいます。幅広い範囲で投稿していますので、ぜひ過去の記事も見てみてください!!コメントも大歓迎です!更新がとまってしまって申し訳ございません

お問い合わせ

名前

メール *

メッセージ *

QooQ