math pull
This commit is contained in:
@@ -1,4 +1,4 @@
|
||||
from designer import right_column
|
||||
from designer import right_column, StepByStepDisplay
|
||||
import flet as ft
|
||||
import sys
|
||||
import os
|
||||
@@ -11,8 +11,12 @@ class Button_quinquagesimal_calculator(ft.CupertinoButton):
|
||||
def __init__(self, text: str = "50-ричный калькулятор"):
|
||||
self.result_left = ft.Text(value="0", size=30, width=300)
|
||||
self.result_right = ft.Text(value="0", size=30, width=300)
|
||||
self.result_mult = ft.Text(value="0", size=30, width=300)
|
||||
self.result_div = ft.Text(value="0", size=30, width=300)
|
||||
self.decimal_left = ft.Text(value="(0₁₀)", size=14, color="#B0B0B0", width=300)
|
||||
self.decimal_right = ft.Text(value="(0₁₀)", size=14, color="#B0B0B0", width=300)
|
||||
self.decimal_mult = ft.Text(value="(0₁₀)", size=14, color="#B0B0B0", width=300)
|
||||
self.decimal_div = ft.Text(value="(0₁₀)", size=14, color="#B0B0B0", width=300)
|
||||
|
||||
# Поля ввода для вычитания
|
||||
self.input_left_1 = None
|
||||
@@ -22,9 +26,19 @@ class Button_quinquagesimal_calculator(ft.CupertinoButton):
|
||||
self.input_right_1 = None
|
||||
self.input_right_2 = None
|
||||
|
||||
# Поля ввода для умножения
|
||||
self.input_mult_1 = None
|
||||
self.input_mult_2 = None
|
||||
|
||||
# Поля ввода для деления
|
||||
self.input_div_1 = None
|
||||
self.input_div_2 = None
|
||||
|
||||
# Контейнеры для пошагового решения
|
||||
self.steps_left = ft.Column(scroll=ft.ScrollMode.AUTO, spacing=5)
|
||||
self.steps_right = ft.Column(scroll=ft.ScrollMode.AUTO, spacing=5)
|
||||
self.steps_mult = ft.Column(scroll=ft.ScrollMode.AUTO, spacing=5)
|
||||
self.steps_div = ft.Column(scroll=ft.ScrollMode.AUTO, spacing=5)
|
||||
|
||||
# Допустимые символы: 0-9, A-Z, a-n (всего: 10 + 26 + 14 = 50)
|
||||
self.digits = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmn"
|
||||
@@ -97,137 +111,19 @@ class Button_quinquagesimal_calculator(ft.CupertinoButton):
|
||||
|
||||
def show_steps_left(self, num1: str, num2: str, operation: Operation):
|
||||
"""Отображает пошаговое решение для левой колонки (вычитание)"""
|
||||
try:
|
||||
# Получаем шаги решения
|
||||
steps = self.solver.solve(num1, num2, operation)
|
||||
|
||||
# Очищаем предыдущие шаги
|
||||
self.steps_left.controls.clear()
|
||||
|
||||
# Добавляем заголовок
|
||||
self.steps_left.controls.append(
|
||||
ft.Text("📝 Ход решения:", size=14, weight=ft.FontWeight.BOLD, color="#FFD700")
|
||||
)
|
||||
|
||||
# Добавляем каждый шаг
|
||||
for i, step in enumerate(steps, 1):
|
||||
step_content = []
|
||||
|
||||
# Название шага
|
||||
step_content.append(
|
||||
ft.Text(f"Шаг {i}: {step.title}",
|
||||
size=12, weight=ft.FontWeight.BOLD, color="#00FFFF")
|
||||
)
|
||||
|
||||
# Описание
|
||||
step_content.append(
|
||||
ft.Text(step.description, size=10, color="#E0E0E0")
|
||||
)
|
||||
|
||||
# Визуализация (если есть)
|
||||
if step.visual:
|
||||
step_content.append(
|
||||
ft.Text(step.visual,
|
||||
size=10,
|
||||
font_family="Courier New",
|
||||
color="#90EE90",
|
||||
selectable=True)
|
||||
)
|
||||
|
||||
# Результат (если есть)
|
||||
if step.result:
|
||||
step_content.append(
|
||||
ft.Text(f"➤ {step.result}",
|
||||
size=11,
|
||||
weight=ft.FontWeight.BOLD,
|
||||
color="#00FF00")
|
||||
)
|
||||
|
||||
# Добавляем контейнер с шагом
|
||||
self.steps_left.controls.append(
|
||||
ft.Container(
|
||||
content=ft.Column(step_content, spacing=3),
|
||||
bgcolor="#2A1A3A",
|
||||
padding=8,
|
||||
border_radius=5,
|
||||
border=ft.border.all(1, "#4A3A5A")
|
||||
)
|
||||
)
|
||||
|
||||
self.steps_left.update()
|
||||
except Exception as ex:
|
||||
self.steps_left.controls.clear()
|
||||
self.steps_left.controls.append(
|
||||
ft.Text(f"Ошибка: {str(ex)}", color="red", size=10)
|
||||
)
|
||||
self.steps_left.update()
|
||||
StepByStepDisplay.show_steps(self.steps_left, self.solver, num1, num2, operation)
|
||||
|
||||
def show_steps_right(self, num1: str, num2: str, operation: Operation):
|
||||
"""Отображает пошаговое решение для правой колонки (сложение)"""
|
||||
try:
|
||||
# Получаем шаги решения
|
||||
steps = self.solver.solve(num1, num2, operation)
|
||||
|
||||
# Очищаем предыдущие шаги
|
||||
self.steps_right.controls.clear()
|
||||
|
||||
# Добавляем заголовок
|
||||
self.steps_right.controls.append(
|
||||
ft.Text("📝 Ход решения:", size=14, weight=ft.FontWeight.BOLD, color="#FFD700")
|
||||
)
|
||||
|
||||
# Добавляем каждый шаг
|
||||
for i, step in enumerate(steps, 1):
|
||||
step_content = []
|
||||
|
||||
# Название шага
|
||||
step_content.append(
|
||||
ft.Text(f"Шаг {i}: {step.title}",
|
||||
size=12, weight=ft.FontWeight.BOLD, color="#00FFFF")
|
||||
)
|
||||
|
||||
# Описание
|
||||
step_content.append(
|
||||
ft.Text(step.description, size=10, color="#E0E0E0")
|
||||
)
|
||||
|
||||
# Визуализация (если есть)
|
||||
if step.visual:
|
||||
step_content.append(
|
||||
ft.Text(step.visual,
|
||||
size=10,
|
||||
font_family="Courier New",
|
||||
color="#90EE90",
|
||||
selectable=True)
|
||||
)
|
||||
|
||||
# Результат (если есть)
|
||||
if step.result:
|
||||
step_content.append(
|
||||
ft.Text(f"➤ {step.result}",
|
||||
size=11,
|
||||
weight=ft.FontWeight.BOLD,
|
||||
color="#00FF00")
|
||||
)
|
||||
|
||||
# Добавляем контейнер с шагом
|
||||
self.steps_right.controls.append(
|
||||
ft.Container(
|
||||
content=ft.Column(step_content, spacing=3),
|
||||
bgcolor="#2A1A3A",
|
||||
padding=8,
|
||||
border_radius=5,
|
||||
border=ft.border.all(1, "#4A3A5A")
|
||||
)
|
||||
)
|
||||
|
||||
self.steps_right.update()
|
||||
except Exception as ex:
|
||||
self.steps_right.controls.clear()
|
||||
self.steps_right.controls.append(
|
||||
ft.Text(f"Ошибка: {str(ex)}", color="red", size=10)
|
||||
)
|
||||
self.steps_right.update()
|
||||
StepByStepDisplay.show_steps(self.steps_right, self.solver, num1, num2, operation)
|
||||
|
||||
def show_steps_mult(self, num1: str, num2: str, operation: Operation):
|
||||
"""Отображает пошаговое решение для колонки умножения"""
|
||||
StepByStepDisplay.show_steps(self.steps_mult, self.solver, num1, num2, operation)
|
||||
|
||||
def show_steps_div(self, num1: str, num2: str, operation: Operation):
|
||||
"""Отображает пошаговое решение для колонки деления"""
|
||||
StepByStepDisplay.show_steps(self.steps_div, self.solver, num1, num2, operation)
|
||||
|
||||
def calculate_subtraction(self, e):
|
||||
try:
|
||||
@@ -300,6 +196,85 @@ class Button_quinquagesimal_calculator(ft.CupertinoButton):
|
||||
self.result_right.value = "Ошибка"
|
||||
self.decimal_right.value = str(ex)
|
||||
e.page.update()
|
||||
|
||||
def calculate_multiplication(self, e):
|
||||
try:
|
||||
val1 = (self.input_mult_1.value or "").strip()
|
||||
val2 = (self.input_mult_2.value or "").strip()
|
||||
|
||||
# Проверка корректности 50-ричных чисел
|
||||
if not self.validate_base50(val1) or not self.validate_base50(val2):
|
||||
self.result_mult.value = "Ошибка: неверный формат"
|
||||
self.decimal_mult.value = "Используйте 0-9, A-Z, a-n"
|
||||
e.page.update()
|
||||
return
|
||||
|
||||
# Преобразуем в десятичные числа
|
||||
num1 = self.from_base50(val1 if val1 else "0")
|
||||
num2 = self.from_base50(val2 if val2 else "0")
|
||||
|
||||
# Вычисляем результат
|
||||
result = num1 * num2
|
||||
|
||||
# Преобразуем обратно в 50-ричный формат
|
||||
base50_result = self.to_base50(result)
|
||||
|
||||
self.result_mult.value = base50_result
|
||||
self.decimal_mult.value = f"({result}₁₀)"
|
||||
e.page.update()
|
||||
|
||||
# Получаем пошаговое решение
|
||||
clean_val1 = val1.lstrip('-') if val1.startswith('-') else val1
|
||||
clean_val2 = val2.lstrip('-') if val2.startswith('-') else val2
|
||||
self.show_steps_mult(clean_val1 if clean_val1 else "0", clean_val2 if clean_val2 else "0", Operation.MULTIPLICATION)
|
||||
|
||||
except ValueError as ex:
|
||||
self.result_mult.value = "Ошибка"
|
||||
self.decimal_mult.value = str(ex)
|
||||
e.page.update()
|
||||
|
||||
def calculate_division(self, e):
|
||||
try:
|
||||
val1 = (self.input_div_1.value or "").strip()
|
||||
val2 = (self.input_div_2.value or "").strip()
|
||||
|
||||
# Проверка корректности 50-ричных чисел
|
||||
if not self.validate_base50(val1) or not self.validate_base50(val2):
|
||||
self.result_div.value = "Ошибка: неверный формат"
|
||||
self.decimal_div.value = "Используйте 0-9, A-Z, a-n"
|
||||
e.page.update()
|
||||
return
|
||||
|
||||
# Преобразуем в десятичные числа
|
||||
num1 = self.from_base50(val1 if val1 else "0")
|
||||
num2 = self.from_base50(val2 if val2 else "0")
|
||||
|
||||
# Проверка деления на ноль
|
||||
if num2 == 0:
|
||||
self.result_div.value = "Ошибка"
|
||||
self.decimal_div.value = "Деление на ноль!"
|
||||
e.page.update()
|
||||
return
|
||||
|
||||
# Вычисляем результат (целочисленное деление)
|
||||
result = num1 // num2
|
||||
|
||||
# Преобразуем обратно в 50-ричный формат
|
||||
base50_result = self.to_base50(result)
|
||||
|
||||
self.result_div.value = base50_result
|
||||
self.decimal_div.value = f"({result}₁₀)"
|
||||
e.page.update()
|
||||
|
||||
# Получаем пошаговое решение
|
||||
clean_val1 = val1.lstrip('-') if val1.startswith('-') else val1
|
||||
clean_val2 = val2.lstrip('-') if val2.startswith('-') else val2
|
||||
self.show_steps_div(clean_val1 if clean_val1 else "0", clean_val2 if clean_val2 else "0", Operation.DIVISION)
|
||||
|
||||
except ValueError as ex:
|
||||
self.result_div.value = "Ошибка"
|
||||
self.decimal_div.value = str(ex)
|
||||
e.page.update()
|
||||
|
||||
def test_data(self, e):
|
||||
# Создаем поля ввода для 50-ричных чисел
|
||||
@@ -340,6 +315,40 @@ class Button_quinquagesimal_calculator(ft.CupertinoButton):
|
||||
input_filter=ft.InputFilter(regex_string=allowed_chars),
|
||||
hint_text="Например: C (12₁₀) или k (46₁₀)"
|
||||
)
|
||||
|
||||
self.input_mult_1 = ft.TextField(
|
||||
label="50-ричное число 1",
|
||||
width=250,
|
||||
text_align=ft.TextAlign.RIGHT,
|
||||
value="0",
|
||||
input_filter=ft.InputFilter(regex_string=allowed_chars),
|
||||
hint_text="Например: A (10₁₀) или d (39₁₀)"
|
||||
)
|
||||
self.input_mult_2 = ft.TextField(
|
||||
label="50-ричное число 2",
|
||||
width=250,
|
||||
text_align=ft.TextAlign.RIGHT,
|
||||
value="0",
|
||||
input_filter=ft.InputFilter(regex_string=allowed_chars),
|
||||
hint_text="Например: 5 (5₁₀) или B (11₁₀)"
|
||||
)
|
||||
|
||||
self.input_div_1 = ft.TextField(
|
||||
label="50-ричное число 1",
|
||||
width=250,
|
||||
text_align=ft.TextAlign.RIGHT,
|
||||
value="0",
|
||||
input_filter=ft.InputFilter(regex_string=allowed_chars),
|
||||
hint_text="Например: 14 (54₁₀) или Z (35₁₀)"
|
||||
)
|
||||
self.input_div_2 = ft.TextField(
|
||||
label="50-ричное число 2",
|
||||
width=250,
|
||||
text_align=ft.TextAlign.RIGHT,
|
||||
value="0",
|
||||
input_filter=ft.InputFilter(regex_string=allowed_chars),
|
||||
hint_text="Например: 2 (2₁₀) или A (10₁₀)"
|
||||
)
|
||||
|
||||
right_column.controls = [ft.Container(
|
||||
bgcolor="#55257D",
|
||||
@@ -412,6 +421,60 @@ class Button_quinquagesimal_calculator(ft.CupertinoButton):
|
||||
border_radius=5,
|
||||
)
|
||||
]
|
||||
),
|
||||
ft.Column(
|
||||
expand=True,
|
||||
alignment=ft.MainAxisAlignment.START,
|
||||
horizontal_alignment=ft.CrossAxisAlignment.CENTER,
|
||||
controls=[
|
||||
self.input_mult_1,
|
||||
ft.Text("——— Умножение", size=12, color="white"),
|
||||
self.input_mult_2,
|
||||
ft.Container(
|
||||
content=ft.Column([
|
||||
self.result_mult,
|
||||
self.decimal_mult
|
||||
], horizontal_alignment=ft.CrossAxisAlignment.CENTER),
|
||||
bgcolor="#3A1E51",
|
||||
padding=10,
|
||||
border_radius=5,
|
||||
),
|
||||
ft.CupertinoButton("=", on_click=self.calculate_multiplication),
|
||||
ft.Container(
|
||||
expand=True,
|
||||
content=self.steps_mult,
|
||||
bgcolor="#1A0A2A",
|
||||
padding=10,
|
||||
border_radius=5,
|
||||
)
|
||||
]
|
||||
),
|
||||
ft.Column(
|
||||
expand=True,
|
||||
alignment=ft.MainAxisAlignment.START,
|
||||
horizontal_alignment=ft.CrossAxisAlignment.CENTER,
|
||||
controls=[
|
||||
self.input_div_1,
|
||||
ft.Text("——— Деление", size=12, color="white"),
|
||||
self.input_div_2,
|
||||
ft.Container(
|
||||
content=ft.Column([
|
||||
self.result_div,
|
||||
self.decimal_div
|
||||
], horizontal_alignment=ft.CrossAxisAlignment.CENTER),
|
||||
bgcolor="#3A1E51",
|
||||
padding=10,
|
||||
border_radius=5,
|
||||
),
|
||||
ft.CupertinoButton("=", on_click=self.calculate_division),
|
||||
ft.Container(
|
||||
expand=True,
|
||||
content=self.steps_div,
|
||||
bgcolor="#1A0A2A",
|
||||
padding=10,
|
||||
border_radius=5,
|
||||
)
|
||||
]
|
||||
)
|
||||
]
|
||||
)
|
||||
|
||||
Reference in New Issue
Block a user