qMath / app.py
OzoneAsai's picture
Update app.py
70a201e
# 必要なライブラリをインポート
import streamlit as st
import random
from sympy import symbols, factor, Eq, solve, expand
# Streamlitアプリのタイトルを設定
st.title("数学問題アプリ")
# サイドバーに説明を追加
st.sidebar.header("構文説明")
st.sidebar.markdown("$2x$と書きたい場合は「$2*x$」と、記述するように。また、平方根は$sqrt(2)$というように記述するように。")
st.sidebar.markdown("割り算は`/`を使うように。掛け算は`*`を使うように。")
# メインのコンテンツを作成
selected_function = st.sidebar.selectbox("問題形式を選択", ["因数分解", "方程式"])
x = symbols("x")
def generate_equation():
wh = random.choice([1, 2])
AExpression, sAExpression = None, None
if wh == 1:
a, b = [random.randint(min_value, max_value) for _ in range(2)]
init_problem = f"(x + {a})*(x + {b})"
AExpression = expand(init_problem)
elif wh == 2:
a, b = [random.randint(min_value, max_value) for _ in range(2)]
init_problem = f"{a} - {b}*x"
AExpression = expand(init_problem)
a, b = [random.randint(min_value, max_value) for _ in range(2)]
Secondarial_init_problem = f"{a} - {b}*x"
sAExpression = expand(Secondarial_init_problem)
return AExpression, sAExpression
def generate_problem():
a, b = [random.randint(min_value, max_value) for _ in range(2)]
if selected_function == "因数分解":
expression = expand(f"(x + {a})*(x + {b})")
elif selected_function == "方程式":
AExpression, sAExpression = generate_equation()
expression = Eq(AExpression, sAExpression) if sAExpression else Eq(AExpression, b)
return expression
# 問題生成ボタン
generate_button = st.button("問題を生成する")
if generate_button:
min_value = st.number_input("乱数の最小値を入力してください:", value=-10)
max_value = st.number_input("乱数の最大値を入力してください:", value=10)
expression = generate_problem()
# 生成した問題の表示
st.success(f"生成した問題: {expression}")
st.latex(expression)
# 解を求めるボタン
solve_button = st.button("解を求める")
if solve_button and selected_function == "方程式":
# 方程式の解を求める
solutions = solve(expression)
st.success(f"方程式の解: {solutions}")