Visual c# rekenmachine met rekenregels ?

Status
Niet open voor verdere reacties.
p.s.1.. let er wel op als je dit voorlegt aan je leraar als eigen materiaal zal je snel door de mand vallen.

Gelukkig ben ik niet zo iemand. Er zijn bepaalde mensen die dat wel doen maar dat zie je ook heel erg makkelijk zodra er vragen worden gesteld over de code, nee wat ik wil gaan doen is gewoon met mijn leraar er naar kijken en ervan leren. meer niet. verder kan ik je geen feedback geven op je code sorry.
 
Rpn calculator. De classic calculator opdracht van informtica opleidingen. Overigens ook weer prima met stacks op te lossen!
 
Westerland, zou je een voorbeeld code kunnen tonen van hoe je met een stack zou werken? Kan je daar ook alle soort sommen mee aanpakken?
(2*-2)+-3/(5/133)
 
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]
 
Bedankt..

Doe je nu eigenlijk op een geordende manier de getallen op volgorde in de stack plaatsen, zodat jij ze kan aanroepen wanneer je wil?
 
wat ik feitelijk nu doe is het volgende.

lees digit uit : push().
lees operator uit : push().
lees digit uit: push().
indien mogelijk lees operator uit en vergelijk. Heeft die hogere prioriteit, gooi hem in de stack en lees verder totdat een met lagere prioriteit tegekomen wordt.
Op dat moment worden er 2 digits gepopped en een operator. Het nieuwe getal wordt weer op de stack gegooit. Om de haakjes weg te werken doe ik feitelijk hetzelfde alleen werkt ik met een tijdelijke stack. Het tussenantwoord wordt berekend en op de totalstack gegooit.

Dit is ongeveer wat die doet.
in het weekend heb ik wel wat tijd en dan zal ik het eens kijken of ik het op een betere manier met stacks kan oplossen (had het niet recursief moeten proberen in deze opzet.).
 
Laatst bewerkt:
Ik ben zeer benieuwd. Jouw code is tot nu toe veel korter dan de mijne, maar hij zal tot nu toe niet alles kunnen wat mijn calculator kan. Echter ben ik wel zeer benieuwd hoe kort je mijn calculator kan maken door een andere (betere) aanpak. Mijn programma is over 1 jaar niet meer te lezen denk ik. Daarnaast zijn het heel veel herhaalde stukken code. Des te meer reden om feedback te krijgen...
 
Ik had vanavond even tijd dus ik heb m`n eigen code even nagekeken en ben opnieuw begonnen. Ik heb hetzelfde principe toegepast als voorheen alleen is de uitvoering nu beter (geen nutteloze code meer, onder voorbehoud natuurlijk xD). Ik hoop dat het je wat opheldering geeft over hoe je het met stacks kunt doen. Het stack gedeelte is +- 110 regels code (inclusief comments en witregels).

http://dl.dropbox.com/u/3380837/Calcv2.rar

Van het weekend wil ik wel feedback op je code geven alleen wil ik dan wel de hele source hebben zodat ik het makkelijk kan debuggen (vind ik zelf het fijnst).
Als je vragen over mijn code hebt ben je uiteraard altijd welkom die te stellen.

[edit]

comma getallen werken nu ook (3,3 punt niet doen dat vage antwoorden (3.3 maakt die namelijk 33 van ) )
verder kan die nu ook (2*-2)+-3/(5/133) uitrekenen en alle andere voorbeeld sommen die je gaf. whitespaces check ik niet op maar die negeert die gewoon ( zou gewoon moeten werken ?? niet getest )
 
Laatst bewerkt:
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan