| |
| import streamlit as st |
| import random |
| from sympy import symbols, factor, Eq, solve, expand |
|
|
| |
| 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}") |
|
|