Некорректное взаимодействие пользователя и интерфейса калькулятора при возведении числа в степень, извлечении корня. C# C#

Место общения программистов C#
Ответить
Гость
 Некорректное взаимодействие пользователя и интерфейса калькулятора при возведении числа в степень, извлечении корня. C#

Сообщение Гость »

Ввод происходит нажатием на кнопки интерфейса, при работе с маленькими числами (фото 1) все работает практически корректно — если нажать на кнопку удаления последнего символа, то получается фото 2. При работе с большими числами ( фото 3), справа не появляется ответ, а если нажать на кнопку удаления последнего символа, то получаю фото 4. и аналогичная ситуация с извлечением корня (фото 4 и 5), если извлечение не из числа 4, 16, 25 и т. д.

Код: Выделить всё

![photo 1](https://i.stack.imgur.com/fquRv.png)
![photo 2](https://i.stack.imgur.com/7AuDK.png)
![photo 3](https://i.stack.imgur.com/nIK1e.png)
![photo 4](https://i.stack.imgur.com/F6uP9.png)
![photo 5](https://i.stack.imgur.com/WCkrA.png)
![photo 6](https://i.stack.imgur.com/ybH38.png)
Думаю, проблема где-то в ExpressionManager (я пытался поместить сюда весь код, но все время пишет, что у меня какой-то неотформатированный код. Оставляю здесь ссылку на GitHub

Код: Выделить всё

using System;
using System.Text.RegularExpressions;
using System.Data;
using System.Linq;

namespace CalculatorApp
{
public class ExpressionManager
{
private string expressionString;

public ExpressionManager()
{
expressionString = string.Empty;
}

public void AppendToExpression(string value)
{
expressionString += value;
}

public void AppendFunction(string functionName)
{
expressionString += functionName;
}

public string? Evaluate()
{
try
{
expressionString = Regex.Replace(expressionString, @"sqrt\((-?\d+(\.\d+)?)\)", match =>
{
string argument = match.Groups[1].Value;
return $"({EvaluateSquareRoot(argument) ?? string.Empty})";
});

expressionString = Regex.Replace(expressionString, @"(\d+(\.\d+)?)\^(\d+(\.\d+)?)", match =>
{
string baseValue = match.Groups[1].Value;
string exponent = match.Groups[3].Value;
return $"({EvaluatePower(baseValue, exponent) ?? string.Empty})";
});

expressionString = Regex.Replace(expressionString, @"(\d+)!", match =>
{
string argument = match.Groups[1].Value;
return $"({EvaluateFactorial(argument) ?? string.Empty})";
});

expressionString = Regex.Replace(expressionString, @"(\d+(\.\d+)?)\^\((\d+(\.\d+)?)\)", match =>
{
string baseValue = match.Groups[1].Value;
string exponent = match.Groups[3].Value;
return $"({EvaluatePower(baseValue, exponent) ?? string.Empty})";
});

var result = new DataTable().Compute(expressionString, null);
return result?.ToString();
}
catch (Exception)
{
return null;
}
}

public string? EvaluateSquareRoot(string argument)
{
double value = double.Parse(argument);
double result = Math.Sqrt(value);
return result.ToString();
}

public string? EvaluatePower(string baseValue, string exponent)
{
double value = double.Parse(baseValue);
double power = double.Parse(exponent);
double result = Math.Pow(value, power);
return result.ToString();
}

public string? EvaluateFactorial(string argument)
{
int value = int.Parse(argument);
int result = Enumerable.Range(1, value).Aggregate(1, (p, item) => p * item);
return result.ToString();
}

public string GetCurrentExpression()
{
return expressionString;
}

public void ClearExpression()
{
expressionString = string.Empty;
}

public void RemoveLastCharacter()
{
if (expressionString.Length > 0)
{
expressionString = expressionString.Substring(0, expressionString.Length - 1);
}
}
}
}
некоторое время назад он работал хуже, как будто вообще не работал, но это все, что я могу сделать с этим кодом. Если бы кто-нибудь мог мне помочь, было бы очень здорово

Подробнее здесь: https://stackoverflow.com/questions/781 ... en-exponen
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»