This commit is contained in:
2025-12-08 09:46:07 +05:00
parent 346c17f47f
commit dab7ef852b
3 changed files with 1167 additions and 51 deletions

View File

@@ -1,6 +1,6 @@
import flet as ft import flet as ft
import designer as ds import designer as ds
from pages.tabs import start1,calculater2, binary_data3, binary_calculeator4, octogon_data5, octogon_calculeator6, sedecim_data7,sedecim_calculeator8, pentecostal_system9, pentecostal_calculeator10 from pages.tabs import start1,calculater2, binary_data3, binary_calculeator4, octogon_data5, octogon_calculeator6, sedecim_data7,sedecim_calculeator8, pentecostal_system9, pentecostal_calculeator10, arbitrary_calculator11
class Main_page(ft.View): class Main_page(ft.View):
def __init__(self, page): def __init__(self, page):
@@ -26,6 +26,7 @@ class Main_page(ft.View):
sedecim_calculeator8.Button_sedecim_calculator(), sedecim_calculeator8.Button_sedecim_calculator(),
pentecostal_system9.Button_binary_data(), pentecostal_system9.Button_binary_data(),
pentecostal_calculeator10.Button_quinquagesimal_calculator(), pentecostal_calculeator10.Button_quinquagesimal_calculator(),
arbitrary_calculator11.Button_arbitrary_calculator(),
ft.Container( ft.Container(
bgcolor="#280A3F", bgcolor="#280A3F",
expand=True, expand=True,

File diff suppressed because it is too large Load Diff

View File

@@ -155,7 +155,8 @@ class StepByStepSolver:
step1 = Step( step1 = Step(
"Исходные данные", "Исходные данные",
f"Необходимо преобразовать число {number} из {self.get_system_name()} " + f"Необходимо преобразовать число {number} из {self.get_system_name()} " +
f"({self.base}-ричной) системы в {target_base}-ричную систему", f"({self.base}-ричной) системы в {target_base}-ричную систему.\n" +
f"Это как перевод с одного языка на другой - число остаётся тем же, меняется только способ записи!",
f"Исходное число: {'-' if is_negative else ''}{number}{self.base}" f"Исходное число: {'-' if is_negative else ''}{number}{self.base}"
) )
steps.append(step1) steps.append(step1)
@@ -164,20 +165,39 @@ class StepByStepSolver:
if self.base != 10: if self.base != 10:
decimal_value = 0 decimal_value = 0
calculation = [] calculation = []
position_table = []
# Создаём таблицу разрядов
digits_list = list(reversed(number))
position_table.append("┌─" + "─┬─".join([""*5 for _ in digits_list]) + "─┐")
position_table.append("" + "".join([f"Поз {i}" for i in range(len(digits_list))]) + "")
position_table.append("├─" + "─┼─".join([""*5 for _ in digits_list]) + "─┤")
position_table.append("" + "".join([f"{self.base}^{i}={self.base**i}".center(5) for i in range(len(digits_list))]) + "")
position_table.append("├─" + "─┼─".join([""*5 for _ in digits_list]) + "─┤")
position_table.append("" + "".join([f"{d}".center(5) for d in digits_list]) + "")
position_table.append("└─" + "─┴─".join([""*5 for _ in digits_list]) + "─┘")
for i, digit in enumerate(reversed(number)): for i, digit in enumerate(reversed(number)):
digit_value = self.digits.index(digit) digit_value = self.digits.index(digit)
power = self.base ** i power = self.base ** i
term_value = digit_value * power term_value = digit_value * power
decimal_value += term_value decimal_value += term_value
calculation.append(f"{digit}×{self.base}^{i} = {digit_value}×{power} = {term_value}") calculation.append(f"Позиция {i}: {digit} × {self.base}^{i} = {digit_value} × {power} = {term_value}")
visual = "\n".join(calculation) visual = "\n".join(position_table)
visual += f"\n\nСумма: {' + '.join([str(digit_value * (self.base ** i)) for i, digit in enumerate(reversed(number)) for digit_value in [self.digits.index(digit)]])} = {decimal_value}" visual += "\n\nПОШАГОВЫЙ РАСЧЁТ:\n"
visual += "Каждая позиция (справа налево) имеет свой \"вес\" - степень основания.\n"
visual += f"В {self.base}-ричной системе веса позиций: 1, {self.base}, {self.base**2}, {self.base**3}...\n\n"
visual += "\n".join(calculation)
sum_parts = [str(self.digits.index(digit) * (self.base ** i)) for i, digit in enumerate(reversed(number))]
visual += f"\n\nИТОГОВАЯ СУММА: {' + '.join(sum_parts)} = {decimal_value}"
step2 = Step( step2 = Step(
"Перевод в десятичную систему", "Перевод в десятичную систему",
f"Каждую цифру умножаем на {self.base} в степени её позиции (справа налево, начиная с 0)", f"Представьте, что каждая позиция - это \"кармашек\" с определённой ценностью.\n" +
f"Самый правый \"стоит\" 1, следующий - {self.base}, потом {self.base**2} и так далее.\n" +
f"Мы умножаем цифру на \"цену\" её позиции и складываем всё вместе.",
visual, visual,
f"{decimal_value}₍₁₀₎" f"{decimal_value}₍₁₀₎"
) )
@@ -190,23 +210,35 @@ class StepByStepSolver:
divisions = [] divisions = []
temp = decimal_value temp = decimal_value
result_digits = [] result_digits = []
step_num = 1
visual = f"МЕТОД: Делим число на {target_base} до тех пор, пока не получим 0.\n"
visual += "Каждый остаток от деления - это одна цифра результата.\n"
visual += "Важно! Первый остаток будет ПОСЛЕДНЕЙ цифрой ответа.\n\n"
while temp > 0: while temp > 0:
remainder = temp % target_base remainder = temp % target_base
quotient = temp // target_base quotient = temp // target_base
result_digits.insert(0, self.digits[remainder]) result_digits.insert(0, self.digits[remainder])
divisions.append(f"{temp} ÷ {target_base} = {quotient}, остаток: {remainder} ({self.digits[remainder]})") divisions.append(f"Шаг {step_num}: {temp} ÷ {target_base} = {quotient}, остаток: {remainder} → цифра '{self.digits[remainder]}'")
step_num += 1
temp = quotient temp = quotient
result_number = ''.join(result_digits) if result_digits else "0" result_number = ''.join(result_digits) if result_digits else "0"
visual = "\n".join(divisions) visual += "\n".join(divisions)
visual += f"\n\nЧитаем остатки снизу вверх: {result_number}" visual += "\n\n" + "="*50
visual += f"\nСобираем остатки СНИЗУ ВВЕРХ (от последнего к первому):\n"
visual += ""*50 + "\n"
for i, digit in enumerate(result_digits):
visual += f"{digit} "
visual += f"\n\nОтвет: {result_number}"
step3 = Step( step3 = Step(
f"Перевод в {target_base}-ричную систему", f"Перевод в {target_base}-ричную систему",
f"Делим число на {target_base} и записываем остатки. " + f"Алгоритм деления с остатком - классический способ перевода.\n" +
"Читаем остатки снизу вверх", f"Представьте, что вы раскладываете конфеты по коробкам: в каждой {target_base} штук.\n" +
f"Остатки показывают, сколько конфет не поместилось в полные коробки на каждом этапе.",
visual, visual,
f"{'-' if is_negative else ''}{result_number}{target_base}" f"{'-' if is_negative else ''}{result_number}{target_base}"
) )
@@ -240,10 +272,12 @@ class StepByStepSolver:
""" """
steps = [] steps = []
# Шаг 1: Исходные данные # Шаг 1: Условие задачи
step1 = Step( step1 = Step(
"Условие задачи", "Условие задачи",
f"Необходимо сложить два числа в {self.get_system_name()} ({self.base}-ричной) системе счисления", f"Необходимо сложить два числа в {self.get_system_name()} ({self.base}-ричной) системе счисления.\n" +
f"Принцип такой же, как в десятичной системе, но \"переполнение\" происходит при {self.base}, а не при 10!\n" +
f"Пример: если в десятичной 9+1=10 (переносим 1), то в двоичной 1+1=10₍₂₎ (тоже переносим 1).",
f"{num1}{self.base}₎ + {num2}{self.base}₎ = ?", f"{num1}{self.base}₎ + {num2}{self.base}₎ = ?",
"" ""
) )
@@ -310,8 +344,11 @@ class StepByStepSolver:
step3 = Step( step3 = Step(
"Сложение в столбик", "Сложение в столбик",
f"Складываем числа справа налево, учитывая переносы. " + f"Складываем числа справа налево, учитывая переносы.\n" +
f"При сумме{self.base} делим на {self.base}: остаток - результат, частное - перенос", f"ПРАВИЛО: Если сумма{self.base}, то делим на {self.base}:\n" +
f" • Остаток от деления → записываем в результат\n" +
f" • Частное → переносим в следующий разряд\n" +
f"Например: если {self.base-1} + 1 = {self.base}, пишем 0 и переносим 1 (как 9+1=10 в десятичной).",
visual, visual,
f"{result_str}{self.base}" f"{result_str}{self.base}"
) )
@@ -348,10 +385,13 @@ class StepByStepSolver:
""" """
steps = [] steps = []
# Шаг 1: Исходные данные # Шаг 1: Условие задачи
step1 = Step( step1 = Step(
"Условие задачи", "Условие задачи",
f"Необходимо вычесть два числа в {self.get_system_name()} ({self.base}-ричной) системе счисления", f"Необходимо вычесть два числа в {self.get_system_name()} ({self.base}-ричной) системе счисления.\n" +
f"Вычитание работает как в десятичной, но занимаем не 10, а {self.base}.\n" +
f"Например: в десятичной при 3-5 занимаем 10, получается 13-5=8.\n" +
f"В {self.base}-ричной системе занимаем {self.base} из следующего разряда.",
f"{num1}{self.base}₎ - {num2}{self.base}₎ = ?", f"{num1}{self.base}₎ - {num2}{self.base}₎ = ?",
"" ""
) )
@@ -434,8 +474,12 @@ class StepByStepSolver:
step3 = Step( step3 = Step(
"Вычитание в столбик", "Вычитание в столбик",
f"Вычитаем числа справа налево. " + f"Вычитаем числа справа налево.\n" +
f"Если цифра уменьшаемого меньше вычитаемого, занимаем {self.base} из следующего разряда", f"ПРАВИЛО ЗАИМСТВОВАНИЯ:\n" +
f" • Если верхняя цифра < нижней, занимаем {self.base} из следующего разряда\n" +
f"К верхней цифре прибавляем {self.base}, вычитаем нижнюю\n" +
f" • Из следующего разряда вычитаем 1 (это \"долг\")\n" +
f"Это как занять 10₽ у друга, чтобы хватило на покупку!",
visual, visual,
f"{result_str}{self.base}" f"{result_str}{self.base}"
) )
@@ -473,7 +517,13 @@ class StepByStepSolver:
# Шаг 1: Исходные данные # Шаг 1: Исходные данные
step1 = Step( step1 = Step(
"Условие задачи", "Условие задачи",
f"Необходимо умножить два числа в {self.get_system_name()} ({self.base}-ричной) системе счисления", f"Необходимо умножить два числа в {self.get_system_name()} ({self.base}-ричной) системе счисления.\n" +
f"\nСПОСОБ РЕШЕНИЯ:\n" +
f"Умножение напрямую в {self.base}-ричной системе сложное, поэтому используем \"переводчика\":\n" +
f" 1. Переводим оба числа в привычную десятичную систему\n" +
f" 2. Умножаем в десятичной системе (это мы умеем!)\n" +
f" 3. Переводим результат обратно в {self.base}-ричную систему\n" +
f"Это как перевести иностранный текст на русский, решить задачу и перевести ответ обратно.",
f"{num1}{self.base}× {num2}{self.base}₎ = ?", f"{num1}{self.base}× {num2}{self.base}₎ = ?",
"" ""
) )
@@ -491,37 +541,50 @@ class StepByStepSolver:
result_str = self.from_decimal(result_dec) result_str = self.from_decimal(result_dec)
step2 = Step( step2 = Step(
"Преобразование в десятичную систему", "Шаг 1: Преобразование в десятичную систему",
"Переводим оба числа в десятичную систему для проверки", f"Переводим множители из {self.base}-ричной в десятичную систему.\n" +
f"Используем метод разложения по разрядам (см. примеры выше).",
f"{num1}{self.base}₎ = {dec1}₍₁₀₎\n" + f"{num1}{self.base}₎ = {dec1}₍₁₀₎\n" +
f"{num2}{self.base}₎ = {dec2}₍₁₀₎", f"{num2}{self.base}₎ = {dec2}₍₁₀₎\n\n" +
"" f"Теперь работаем с привычными десятичными числами!",
f"Множители: {dec1} и {dec2}"
) )
steps.append(step2) steps.append(step2)
# Шаг 3: Умножение в десятичной системе # Шаг 3: Умножение в десятичной системе
step3 = Step( step3 = Step(
"Умножение в десятичной системе", "Шаг 2: Умножение в десятичной системе",
"Перемножаем числа в десятичной системе", f"Перемножаем числа обычным способом (как учили в школе).\n" +
f"{dec1} × {dec2} = {result_dec}", f"Это самая простая часть - обычное умножение!",
f"{dec1} × {dec2} = {result_dec}\n\n" +
f"Получили результат в десятичной системе: {result_dec}",
f"{result_dec}₍₁₀₎" f"{result_dec}₍₁₀₎"
) )
steps.append(step3) steps.append(step3)
# Шаг 4: Обратное преобразование # Шаг 4: Обратное преобразование
step4 = Step( step4 = Step(
f"Перевод результата в {self.base}-ричную систему", f"Шаг 3: Перевод результата в {self.base}-ричную систему",
f"Переводим результат обратно в {self.base}-ричную систему", f"Переводим полученный результат обратно в {self.base}-ричную систему.\n" +
f"{result_dec}₍₁₀₎ = {result_str}{self.base}", f"Используем метод деления с остатком (см. примеры выше).",
f"{result_dec}₍₁₀₎ = {result_str}{self.base}\n\n" +
f"Вернули ответ в исходную систему счисления!",
f"{result_str}{self.base}" f"{result_str}{self.base}"
) )
steps.append(step4) steps.append(step4)
# Шаг 5: Проверка # Шаг 5: Проверка
step5 = Step( step5 = Step(
"Итоговый результат", "Итоговый результат и проверка",
f"Результат умножения {num1}{self.base}× {num2}{self.base}", f"Проверяем логику решения:\n" +
f"{num1}{self.base}× {num2}{self.base} = {result_str}{self.base}\nПроверка: {dec1} × {dec2} = {result_dec}", f" • Исходная задача: {num1}{self.base}× {num2}{self.base}\n" +
f" • Перевели в десятичную: {dec1} × {dec2}\n" +
f" • Получили результат: {result_dec}\n" +
f" • Вернули в {self.base}-ричную: {result_str}{self.base}",
f"┌─────────────────────────────────┐\n" +
f"{num1}{self.base}× {num2}{self.base}₎ = {result_str}{self.base}₎ │\n" +
f"└─────────────────────────────────┘\n" +
f"Проверка: {dec1} × {dec2} = {result_dec}₍₁₀₎ = {result_str}{self.base}",
f"✓ Ответ: {result_str}{self.base}" f"✓ Ответ: {result_str}{self.base}"
) )
steps.append(step5) steps.append(step5)
@@ -544,7 +607,13 @@ class StepByStepSolver:
# Шаг 1: Исходные данные # Шаг 1: Исходные данные
step1 = Step( step1 = Step(
"Условие задачи", "Условие задачи",
f"Необходимо разделить два числа в {self.get_system_name()} ({self.base}-ричной) системе счисления", f"Необходимо разделить два числа в {self.get_system_name()} ({self.base}-ричной) системе счисления.\n" +
f"\nСПОСОБ РЕШЕНИЯ:\n" +
f"Деление в {self.base}-ричной системе очень трудоёмкое, поэтому используем метод \"переводчика\":\n" +
f" 1. Переводим делимое и делитель в десятичную систему\n" +
f" 2. Делим в десятичной системе (получаем частное и остаток)\n" +
f" 3. Переводим частное и остаток обратно в {self.base}-ричную систему\n" +
f"Проще решить на \"родном языке\" математики - в десятичной системе!",
f"{num1}{self.base}₎ ÷ {num2}{self.base}₎ = ?", f"{num1}{self.base}₎ ÷ {num2}{self.base}₎ = ?",
"" ""
) )
@@ -569,11 +638,13 @@ class StepByStepSolver:
# Шаг 2: Преобразование в десятичную систему # Шаг 2: Преобразование в десятичную систему
step2 = Step( step2 = Step(
"Преобразование в десятичную систему", "Шаг 1: Преобразование в десятичную систему",
"Переводим оба числа в десятичную систему", f"Переводим делимое и делитель из {self.base}-ричной в десятичную систему.\n" +
f"{num1}{self.base}₎ = {dec1}₍₁₀₎\n" + f"Используем знакомый метод разложения по разрядам.",
f"{num2}{self.base}₎ = {dec2}₍₁₀₎", f"Делимое: {num1}{self.base}₎ = {dec1}₍₁₀₎\n" +
"" f"Делитель: {num2}{self.base}₎ = {dec2}₍₁₀₎\n\n" +
f"Теперь задача выглядит просто: {dec1} ÷ {dec2}",
f"Числа в десятичной: {dec1} ÷ {dec2}"
) )
steps.append(step2) steps.append(step2)
@@ -582,9 +653,14 @@ class StepByStepSolver:
remainder = dec1 % dec2 remainder = dec1 % dec2
step3 = Step( step3 = Step(
"Деление в десятичной системе", "Шаг 2: Деление в десятичной системе",
"Выполняем целочисленное деление в десятичной системе", f"Выполняем целочисленное деление (деление нацело).\n" +
f"{dec1} ÷ {dec2} = {quotient} (остаток {remainder})", f"\nЧТО ПОЛУЧАЕМ:\n" +
f" • Частное (сколько раз {dec2} помещается в {dec1})\n" +
f" • Остаток (что осталось после деления)\n" +
f"\nПример: 17 ÷ 5 = 3 (остаток 2), потому что 5×3=15, а 17-15=2",
f"{dec1} ÷ {dec2} = {quotient} (остаток {remainder})\n\n" +
f"Проверка: {dec2} × {quotient} + {remainder} = {dec2 * quotient} + {remainder} = {dec1}",
f"Частное: {quotient}₍₁₀₎, Остаток: {remainder}₍₁₀₎" f"Частное: {quotient}₍₁₀₎, Остаток: {remainder}₍₁₀₎"
) )
steps.append(step3) steps.append(step3)
@@ -594,10 +670,12 @@ class StepByStepSolver:
remainder_str = self.from_decimal(remainder) if remainder != 0 else "0" remainder_str = self.from_decimal(remainder) if remainder != 0 else "0"
step4 = Step( step4 = Step(
f"Перевод результата в {self.base}-ричную систему", f"Шаг 3: Перевод результата в {self.base}-ричную систему",
f"Переводим частное и остаток обратно в {self.base}-ричную систему", f"Переводим частное и остаток обратно в {self.base}-ричную систему.\n" +
f"Частное: {quotient}₍₁₀₎ = {quotient_str}{self.base}\n" + f"Используем метод деления с остатком для перевода.",
f"Остаток: {remainder}₍₁₀₎ = {remainder_str}{self.base}", f"Частное: {quotient}₍₁₀₎ {quotient_str}{self.base}\n" +
f"Остаток: {remainder}₍₁₀₎ → {remainder_str}{self.base}\n\n" +
f"Вернули ответ в исходную систему счисления!",
f"{quotient_str}{self.base}₎ (остаток {remainder_str}{self.base}₎)" f"{quotient_str}{self.base}₎ (остаток {remainder_str}{self.base}₎)"
) )
steps.append(step4) steps.append(step4)
@@ -605,11 +683,18 @@ class StepByStepSolver:
# Шаг 5: Проверка # Шаг 5: Проверка
check_result = dec2 * quotient + remainder check_result = dec2 * quotient + remainder
step5 = Step( step5 = Step(
"Проверка результата", "Итоговый результат и проверка",
"Проверяем: делитель × частное + остаток = делимое", f"Проверяем правильность по формуле:\n" +
f"{dec2} × {quotient} + {remainder} = {check_result}\n" + f" Делимое = Делитель × Частное + Остаток\n" +
f"{num2}{self.base}× {quotient_str}{self.base}₎ + {remainder_str}{self.base}₎ = {num1}{self.base}", f"Это основное правило деления с остатком!",
f"✓ Ответ: {quotient_str}{self.base}₎ (остаток {remainder_str}{self.base}₎)" if remainder != 0 else f"✓ Ответ: {quotient_str}{self.base}" f"┌──────────────────────────────────────┐\n" +
f"{num1}{self.base}₎ ÷ {num2}{self.base}₎ = {quotient_str}{self.base}" +
(f" (ост. {remainder_str}{self.base}₎)" if remainder != 0 else "") + "\n" +
f"└──────────────────────────────────────┘\n\n" +
f"Проверка в десятичной: {dec2} × {quotient} + {remainder} = {check_result}\n" +
f"Проверка в {self.base}-ричной: {num2}{self.base}× {quotient_str}{self.base}" +
(f" + {remainder_str}{self.base}" if remainder != 0 else "") + f" = {num1}{self.base}₎ ✓",
f"✓ Ответ: {quotient_str}{self.base}" + (f" (остаток {remainder_str}{self.base}₎)" if remainder != 0 else "")
) )
steps.append(step5) steps.append(step5)