# 必要なライブラリをインポート 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}")