三角比のミニテスト作成プログラム

Last modified: 2019 年 01 月 21 日 13 時

三角比の値を学習したあとの確認テスト用に書きました。ランダムで三角比の問題を作成し、TeXファイルを出力します。

三角比のミニテスト

使い方

実行環境はPython 3です。

python3 sankakuhi.py 

とすれば、
弧度法のみにする場合は0、度数法のみの場合は1、混成は2を入力(default:2)

と聞かれるので、0であれば三角比の角度が弧度法で表された問題、1であれば度数法で、2であれば両方混じった問題が出題されます。何も入力しないと、デフォルトの2となります。また、次に
ファイル名の入力 (デフォルトのファイル名):

と聞かれるので、特に問題なければEnterを入力して、(デフォルトのファイル名)となります。これは、三角比ミニテスト201805031740.texのような日付と時間を組み合わせたファイル名になります。

生成されたTeXファイルのコンパイルにはtasks.styが必要になります。また、点数部分の画像sankakuhi_mark.pdfをTeXファイルと同じフォルダに置いてコンパイルします。下に、サンプル一式を置いているのでお試しください。

[このページのトップへ]

ソースコードとサンプル

自動生成したサンプル一式 (zipファイル)と生成されたPDFファイル

pythonスクリプト (.py) のダウンロード

#!/usr/bin/python3
# coding: UTF-8
import random
from datetime import datetime

# 三角比を収める (角度,n) n=0:radian, n=1:sin, n=2:cos, n=3:tan
dict = {
    (0, 0): r'0',
    (0, 1): r'0',
    (0, 2): r'1',
    (0, 3): r'0',
    (30, 0): r'\frac{\pi}{6}',
    (30, 1): r'\frac{1}{2}',
    (30, 2): r'\frac{\sqrt{3}}{2}',
    (30, 3): r'\frac{1}{\sqrt{3}}',
    (45, 0): r'\frac{\pi}{4}',
    (45, 1): r'\frac{1}{\sqrt{2}}',
    (45, 2): r'\frac{1}{\sqrt{2}}',
    (45, 3): r'1',
    (60, 0): r'\frac{\pi}{3}',
    (60, 1): r'\frac{\sqrt{3}}{2}',
    (60, 2): r'\frac{1}{2}',
    (60, 3): r'\sqrt{3}',
    (90, 0): r'\frac{\pi}{2}',
    (90, 1): r'1',
    (90, 2): r'0',
    (90, 3): '\\text{値なし}',
    (150, 0): r'\frac{5}{6}\pi',
    (150, 1): r'\frac{1}{2}',
    (150, 2): r'-\frac{\sqrt{3}}{2}',
    (150, 3): r'-\frac{1}{\sqrt{3}}',
    (135, 0): r'\frac{3}{4}\pi',
    (135, 1): r'\frac{1}{\sqrt{2}}',
    (135, 2): r'-\frac{1}{\sqrt{2}}',
    (135, 3): r'-1',
    (120, 0): r'\frac{2}{3}\pi',
    (120, 1): r'\frac{\sqrt{3}}{2}',
    (120, 2): r'-\frac{1}{2}',
    (120, 3): r'-\sqrt{3}',
    (180, 0): r'\pi',
    (180, 1): r'0',
    (180, 2): r'-1',
    (180, 3): r'0',
    (210, 0): r'\frac{7}{6}\pi',
    (210, 1): r'-\frac{1}{2}',
    (210, 2): r'-\frac{\sqrt{3}}{2}',
    (210, 3): r'\frac{1}{\sqrt{3}}',
    (225, 0): r'\frac{5}{4}\pi',
    (225, 1): r'-\frac{1}{\sqrt{2}}',
    (225, 2): r'-\frac{1}{\sqrt{2}}',
    (225, 3): r'1',
    (240, 0): r'\frac{4}{3}\pi',
    (240, 1): r'-\frac{\sqrt{3}}{2}',
    (240, 2): r'-\frac{1}{2}',
    (240, 3): r'\sqrt{3}',
    (270, 0): r'\frac{3}{2}\pi',
    (270, 1): r'-1',
    (270, 2): r'0',
    (270, 3): '\\text{値なし}',
    (330, 0): r'\frac{11}{6}\pi',
    (330, 1): r'-\frac{1}{2}',
    (330, 2): r'\frac{\sqrt{3}}{2}',
    (330, 3): r'-\frac{1}{\sqrt{3}}',
    (315, 0): r'\frac{7}{4}\pi',
    (315, 1): r'-\frac{1}{\sqrt{2}}',
    (315, 2): r'\frac{1}{\sqrt{2}}',
    (315, 3): r'-1',
    (300, 0): r'\frac{5}{3}\pi',
    (300, 1): r'-\frac{\sqrt{3}}{2}',
    (300, 2): r'\frac{1}{2}',
    (300, 3): r'-\sqrt{3}',
    (360, 0): r'2\pi',
    (360, 1): r'0',
    (360, 2): r'1',
    (360, 3): r'0',
}


class Trig:
    """
三角比のクラス
角度(度数法)で初期化して、
対応するradian, sin, cos, tanの値のtex表記を提供する。
"""

    def __init__(self, angle):
        self.angle = angle

    def ans(self, trig):
        key = (self.angle, trig)
        return dict[key]

    def quiz(self, trig, flag):
        fnc_name = ''
        if trig == 1:
            fnc_name = r'\sin'
        elif trig == 2:
            fnc_name = r'\cos'
        elif trig == 3:
            fnc_name = r'\tan'

        angle_name = ''
        if flag == 0:
            angle_name = dict[(self.angle, 0)]
        elif flag == 1:
            angle_name = str(self.angle) + '^\\circ'

        return '$\\displaystyle ' + fnc_name + angle_name + '$'


# 度数法・弧度法の選択とファイル名の入力
print('弧度法のみにする場合は0、度数法のみの場合は1、混成は2を入力(default:2)')
input_method = input('>>>  ')
flag_method = 2
if input_method == '0':
    flag_method = 0
elif input_method == '1':
    flag_method = 1

date = datetime.now()
file_name = '三角比ミニテスト' \
            + date.strftime('%Y') + date.strftime('%m') + date.strftime('%d') \
            + date.strftime('%H') + date.strftime('%M') + '.tex'
print(file_name)

message = 'ファイル名の入力 (' + file_name + u'): '
print(message)
input_name = input('>>>  ')
if input_name != '':
    file_name = input_name + '.tex'  # ファイル名の吟味が必要
print(file_name)

angle_list = [
    0, 30, 45, 60, 90, 150, 135, 120, 180, 210, 225, 240, 270, 330, 315, 300,
    360
]
trig_list = [1, 2, 3]
flag_list = []
if flag_method == 0:  # 0:弧度法 1:度数法
    flag_list = [0]
elif flag_method == 1:
    flag_list = [1]
else:
    flag_list = [0, 1]

cards_sin = [[flag, 1, angle] for flag in flag_list for angle in angle_list]
cards_cos = [[flag, 2, angle] for flag in flag_list for angle in angle_list]
cards_tan = [[flag, 3, angle] for flag in flag_list for angle in angle_list]
quiz_sin = random.sample(cards_sin, 8)
quiz_cos = random.sample(cards_cos, 8)
quiz_tan = random.sample(cards_tan, 8)
quiz_all = quiz_sin + quiz_cos + quiz_tan

quiz_list = random.sample(quiz_all, 24)

quiz_text = []
answer_text = []
for index in range(len(quiz_list)):
    f, t, a = quiz_list[index]
    trig = Trig(a)
    # print(trig.quiz(t, f))
    quiz_text.append(r' \task ' + trig.quiz(t, f) + '\n')
    answer_text.append(r'   \task $\displaystyle ' + trig.ans(t) + '$\n')

text_compile = r'%#! latexmk -dvi ' + file_name \
               + r' && dvipdfmx -f ume_font ' \
               + file_name.replace('tex', 'dvi') + '\n'
text_pre = r"""
\documentclass[a4paper,leqno,12pt]{jsarticle}
\usepackage{amsmath,amssymb}
\usepackage[top=1cm, bottom=1cm, left=1cm, right=1cm, includefoot, truedimen]{geometry}

%% euler font %%
\usepackage[T1]{fontenc}
\usepackage{euler}
\usepackage{concrete}
\let\myfrac\frac
\renewcommand{\frac}[2]{\myfrac{\,#1\,}{\,#2\,}}
%%%%%%%%%%%%%%%%

\usepackage[dvipdfmx]{graphicx}
\pagestyle{empty}
\usepackage{tasks}
\begin{document}\vspace*{-15mm}\noindent
\begin{minipage}{16.5cm}
 \begin{minipage}{5cm}
  \textbf{三角比ミニテスト} 
 \end{minipage}\hfill
 \begin{minipage}{3cm}
  \vspace{4mm}
  \includegraphics*[scale=0.5]{sankakuhi_mark.pdf}
 \end{minipage}
\end{minipage}\\[8mm]
\hfill 1年 \underline{\hspace{2zw}} 科
\underline{\hspace{2zw}} 番 氏名 \underline{\hspace{12zw}}\\[4mm]
次の三角比の値を答えよ。ただし、値がない場合は、「値なし」と記入すること。
\settasks{after-item-skip=20mm, counter-format=(tsk[1]), label-offset=5mm, column-sep=15mm}
\begin{tasks}(4)
"""

text_mid = r"""\end{tasks}

\newpage
\phantom{test}
\vfill\hspace{-10mm}
\rotatebox{180}{
 \begin{minipage}{\textwidth}
  解答
  \settasks{after-item-skip=4mm, counter-format=(tsk[1]), label-offset=5mm, column-sep=5mm}
  \begin{tasks}(4)
"""

text_post = """  \end{tasks}
 \end{minipage}
 }
\end{document}
"""

# ファイル作成・書き込み
file = open(file_name, 'w')
file.write(text_compile)
file.write(text_pre)
file.writelines(quiz_text)
file.write(text_mid)
file.writelines(answer_text)
file.write(text_post)
file.close()

[このページのトップへ]

あとがき

ブラウザ上で三角比ミニテストができるように改良するのが今後の課題です。やってみたいですが、なにぶん時間が。。

[このページのトップへ]