Met enige aanpassingen zou dat vast wel werken alleen in de huidige setting zoals ik het gemaakt heb gaat dat niet lukken. comma getallen worden niet uitgelezen, in theorie die wel gewoon moeten werken alleen zitten er nog bugs in. bij de subsom -3/(5/133) word bijvoorbeeld eerst 5/133 uitgerekend en daarna -3/(antwoord) alleen is het niet in de goede volgorde waardoor je dus een verkeerd antwoord krijgt.
Gezien het gebrek aan tijd kan ik niet meer tijd in de rekenemachine steken dan ik nu al gedaan heb. je bent welkom om het zelf te verbeteren alleen adviseer ik je om het alleen als referentie te gebruiken. Ik heb het geprogrammeerd om het werkend te krijgen, om te laten zien dat het kan. Dit houdt in dat als ik bugs tegenkwam ik de bugs gefixed heb waardoor het uiteindelijk werkte. Als je dit principe wilt toepassen zou ik het opnieuw gaan maken aangezien er veel overbodige dingen instaan en dingen die mis kunnen gaan.
[cpp]
private Stack<double> totalValueStack = new Stack<double>();
private Stack<String> totalOperatorStack = new Stack<string>();
private Dictionary<string, double> priority = new Dictionary<string, double>();
private const string operators = "+-*/";
public Form1()
{
InitializeComponent();
priority.Add("*", 4);
priority.Add("/", 3);
priority.Add("+", 2);
priority.Add("-", 1);
}
private void btnCalc_Click(object sender, EventArgs e)
{
totalOperatorStack.Clear();
totalValueStack.Clear();
string input = tbInput.Text;
ToStack(input,0);
if (totalOperatorStack.Count != 0)
{
while (totalOperatorStack.Count != 0)
{
Calculate(totalValueStack, totalOperatorStack);
}
}
tbInput.Text = totalValueStack.Pop().ToString();
}
private double ToStack(string handleInput, int iterator)
{
string input = handleInput;
string value = "";
Stack<double> valueStack = new Stack<double>();
Stack<String> operatorStack = new Stack<string>();
for (int i = iterator; i < input.Length; i++)
{
//negative number check
if (i == 0 && input == '-' || (i > 0 && operators.Contains(input[i - 1]) && input == '-'))
{
value += "-";
continue;
}
//get digits
if (Char.IsDigit(input))
{
value += input.ToString();
int tempCounter = i;
while (++tempCounter != input.Length && Char.IsDigit(input[tempCounter]))
{
value += input[tempCounter].ToString();
}
i = tempCounter - 1;
valueStack.Push(double.Parse(value));
value = "";
}
//handle operators
else
{
if (operators.Contains(input))
{
if (operatorStack.Count > 0)
{
//if current operator has a higher priority, push it and continue
if (CompareOperators(operatorStack.Peek(), input.ToString()))
{
operatorStack.Push(input.ToString());
}
else
{
while (operatorStack.Count != 0)
{
Calculate(valueStack, operatorStack);
}
operatorStack.Push(input.ToString());
}
}
else
{
operatorStack.Push(input.ToString());
}
}
else if (input == '(')
{
string subString = input.Substring(i + 1, (input.Length - (i + 1)));
double processed = ToStack(subString, 0);
if (subString.Length == processed)
{
break;
}
}
else
{
if (i + 1 != input.Length)
{
while (operatorStack.Count != 0)
{
Calculate(valueStack, operatorStack);
}
if (valueStack.Count != 0)
{
totalValueStack.Push(valueStack.Pop());
}
return i + 1;
}
}
}
}
if (valueStack.Count == 1)
{
totalValueStack.Push(valueStack.Pop());
totalOperatorStack.Push(operatorStack.Pop());
}
//all done parsing doubleo the stack. calculate whats still remaining.
while (operatorStack.Count != 0)
{
Calculate(valueStack, operatorStack);
}
if (valueStack.Count != 0)
{
totalValueStack.Push(valueStack.Pop());
}
return input.Length;
}
private void Calculate(Stack<double> valueStack, Stack<string> operatorStack)
{
double value1, value2;
switch (operatorStack.Pop())
{
case "*":
valueStack.Push(valueStack.Pop() * valueStack.Pop());
break;
case "/":
value1 = valueStack.Pop();
value2 = valueStack.Pop();
valueStack.Push(value2 / value1);
break;
case "+":
valueStack.Push(valueStack.Pop() + valueStack.Pop());
break;
case "-":
value1 = valueStack.Pop();
value2 = valueStack.Pop();
valueStack.Push(value2 - value1);
break;
}
}
/// <summary>
/// returns if current operator has a higher priority
/// </summary>
/// <param name="inStack"></param>
/// <param name="current"></param>
/// <returns></returns>
private bool CompareOperators(string inStack, string current)
{
return priority[inStack] < priority[current];
}
[/cpp]