import streamlit as st from sympy import symbols, solve, S, Interval, Eq import matplotlib.pyplot as plt import numpy as np def main(): st.title("集合操作アプリ") # メニューの選択 option = st.sidebar.selectbox("機能を選択してください", ["集合の操作", "全体集合の生成", "補集合の計算", "不等式の計算"]) if option == "集合の操作": set_operations() elif option == "全体集合の生成": generate_universe() elif option == "補集合の計算": complement_operation() elif option == "不等式の計算": inequality_solver() def parse_set(input_str): if input_str: try: return set(map(int, input_str.split(','))) except ValueError: st.error("入力が正しくありません。カンマ区切りの整数を入力してください。") return None else: st.error("入力が空です。カンマ区切りの整数を入力してください。") return None def set_operations(): st.header("集合の操作") with st.form(key='set_operations_form'): # ユーザー入力 set1 = st.text_input("集合1 (カンマ区切りで要素を入力してください)", "1,2,3") set2 = st.text_input("集合2 (カンマ区切りで要素を入力してください)", "3,4,5") set3 = st.text_input("集合3 (カンマ区切りで要素を入力してください)", "5,6,7") # フォーム送信ボタン submit_button = st.form_submit_button(label='実行') if submit_button: # 入力された文字列を集合に変換 set1 = parse_set(set1) set2 = parse_set(set2) set3 = parse_set(set3) if set1 is not None and set2 is not None and set3 is not None: # 集合の操作 st.subheader("集合の操作結果") st.subheader("和集合") union = set1.union(set2, set3) st.write(union) st.subheader("積集合") intersection = set1.intersection(set2, set3) if intersection: st.write(intersection) else: st.write("積集合の結果は空です。") st.subheader("差集合") difference = set1.difference(set2, set3) st.write(difference) st.subheader("対称差") symmetric_difference = set1.symmetric_difference(set2) st.write(symmetric_difference) def generate_universe(): st.header("全体集合の生成") with st.form(key='generate_universe_form'): # ユーザー入力 initial_value = st.number_input("初期値", value=0) step = st.number_input("ステップ", value=1) num_steps = st.number_input("回数", value=10, min_value=1) # フォーム送信ボタン submit_button = st.form_submit_button(label='生成') if submit_button: # 全体集合の生成 universe_set = set(range(initial_value, initial_value + step * num_steps, step)) st.subheader("生成された全体集合") st.write(universe_set) def complement_operation(): st.header("補集合の計算") with st.form(key='complement_operation_form'): # 全体集合の指定 universe = st.text_input("全体集合 (カンマ区切りで要素を入力してください)", "1,2,3,4,5,6,7,8,9,10") # 対象集合の指定 target_set = st.text_input("対象集合 (カンマ区切りで要素を入力してください)", "1,3,5") # フォーム送信ボタン submit_button = st.form_submit_button(label='計算') if submit_button: # 入力された文字列を集合に変換 universe_set = parse_set(universe) target_set = parse_set(target_set) if universe_set is not None and target_set is not None: # 補集合の計算 complement = universe_set.difference(target_set) st.subheader("補集合の計算結果") st.write(complement) def inequality_solver(): st.header("不等式の計算") with st.form(key='inequality_solver_form'): # ユーザー入力 inequality_input = st.text_input("不等式を入力してください", "2*x >= 2") # フォーム送信ボタン submit_button = st.form_submit_button(label='解を求める') if submit_button: # 不等式の解を求める x = symbols('x') inequality = eval(inequality_input) solution = solve(inequality, x) st.subheader("不等式の解") st.write(Eq(str(solution).replace("& (x < oo)",""))) if __name__ == "__main__": main()