calcVlad/BuggyCalculator/MainWindow.axaml.cs

92 lines
4.0 KiB
C#
Raw Permalink Normal View History

2025-02-05 13:36:06 +00:00
using System;
using Avalonia;
using Avalonia.Controls;
using Avalonia.Markup.Xaml;
namespace BuggyCalculator
{
public partial class MainWindow : Window
{
private TextBox _input1;
private TextBox _input2;
private ComboBox _operation;
private TextBlock _result;
private Button _calculateButton;
public MainWindow()
{
InitializeComponent();
_input1 = this.FindControl<TextBox>("Input1") ?? throw new InvalidOperationException("Input1 not found");
_input2 = this.FindControl<TextBox>("Input2") ?? throw new InvalidOperationException("Input2 not found");
_operation = this.FindControl<ComboBox>("Operation") ?? throw new InvalidOperationException("Operation not found");
_result = this.FindControl<TextBlock>("Result") ?? throw new InvalidOperationException("Result not found");
_calculateButton = this.FindControl<Button>("CalculateButton") ?? throw new InvalidOperationException("CalculateButton not found");
_calculateButton.Click += Calculate;
}
private void InitializeComponent()
{
AvaloniaXamlLoader.Load(this);
}
private void Calculate(object? sender, EventArgs e)
{
try
{
if (string.IsNullOrWhiteSpace(_input1.Text))
{
_result.Text = "Ошибка: Первое поле пустое.";
return;
}
if (!double.TryParse(_input1.Text, out double num1))
{
throw new FormatException("Ошибка: Некорректный ввод");
}
double num2 = string.IsNullOrWhiteSpace(_input2.Text) ? 0 : double.Parse(_input2.Text);
if (_operation.SelectedItem is ComboBoxItem selectedItem)
{
string operation = selectedItem.Content.ToString();
double result = operation switch
{
"Сложение" => num1 + num2,
"Вычитание" => num1 - num2,
"Умножение" => num1 * num2,
"Деление" => num2 != 0 ? num1 / num2 : throw new DivideByZeroException(),
"Возведение в степень" => num2 < 0 ? throw new InvalidOperationException("Возведение в отрицательную степень запрещено") : Math.Pow(num1, num2),
"Квадратный корень" => num1 >= 0 ? Math.Sqrt(num1) : throw new InvalidOperationException("Квадратный корень из отрицательного числа невозможен"),
"Логарифм" => num1 > 0 && num2 > 0 && num2 != 1 ? Math.Log(num1, num2) : throw new InvalidOperationException("Основание логарифма должно быть > 0 и != 1"),
"Синус" => Math.Sin(num1),
"Косинус" => Math.Cos(num1),
"Тангенс" => Math.Tan(num1),
_ => throw new InvalidOperationException("Неизвестная операция")
};
_result.Text = $"Результат: {result}";
}
else
{
_result.Text = "Ошибка: Не выбрана операция.";
}
}
catch (FormatException)
{
_result.Text = "Ошибка: Неверный формат числа.";
}
catch (DivideByZeroException)
{
_result.Text = "Ошибка: Деление на ноль.";
}
catch (Exception ex)
{
Environment.FailFast(ex.Message);
}
}
}
}