Visual c# rekenmachine met rekenregels ?

Status
Niet open voor verdere reacties.

mcjambi

Gebruiker
Lid geworden
1 dec 2011
Berichten
8
Hallo beste lezers.

Ik ben jamilio en ik ben 16 jaar en krijg nu al 11 weken les op de opleiding gamedevelopment.

Een paar weken geleden had ik een opdracht van mijn leraar om een simpele rekenmachine te bouwen met een button om te clearen, plus, min, keer, deel, =, en natuurlijk de nummers 0t/m9. Dit is mij gelukt in een zeer korte tijd met gebruik van try/catch en if statements.

Bij mijn eerste versie had nog wat bugs en liep vast zodra ik bijvoorbeeld 2x2x2 of 1+2x3 intypte. Deze bug heb ik gefixt. zodra er een 2e operator bijkomt dat hij dan een error geeft van: "deze rekenmachine kent geen rekenregels" en dan als je op OK drukte cleart hij automatisch alle variabelen en text velden.

Nu loop ik tegen het probleem aan dat ik een rekenmachine wil maken die volgens de rekenregels rekent alleen heb ik geen idee hoe ik dat zou moeten doen. wat ik bijvoorbeeld wil dat mijn rekenmachine in 1 keer kan uitrekenen is dit: 1+3x5+√9. Hier zou 19 moeten uitkomen. dan zou je in een textbox de som kunnen invullen en zodra je op = button drukt dat hij dan eerst wortels en machten uitrekent en dan keer en deel en daarna plus en min. Op mijn android telefoon heb ik een calculator app die dit wel doet en de calculator van google ook. Maar windows calculator ondersteunt dit weer niet. Dit moet op 1 of andere manier mogelijk zijn maar ik kom er niet uit hoe. Weet iemand mij misschien op weg te helpen?

Hieronder is de code van de rekenmachine die ik nu op het moment heb en werkt
Code:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        double total1 = 0;
        double total2 = 0;
        double total3 = 0;
        string buffer = "";
        string check = "";

        private void btnClear_Click(object sender, EventArgs e)
        {
            txtDisplay.Clear();
            txtDisplay2.Clear();
            total1 = 0;
            total2 = 0;
            total3 = 0;
            buffer = "";
            check = "";
        }

        private void btn1_Click(object sender, EventArgs e)
        {
            txtDisplay.Text = txtDisplay.Text + btn1.Text;
        }

        private void btn2_Click(object sender, EventArgs e)
        {
            txtDisplay.Text = txtDisplay.Text + btn2.Text;
        }

        private void btn3_Click(object sender, EventArgs e)
        {
            txtDisplay.Text = txtDisplay.Text + btn3.Text;
        }

        private void btn4_Click(object sender, EventArgs e)
        {
            txtDisplay.Text = txtDisplay.Text + btn4.Text;
        }

        private void btn5_Click(object sender, EventArgs e)
        {
            txtDisplay.Text = txtDisplay.Text + btn5.Text;
        }

        private void btn6_Click(object sender, EventArgs e)
        {
            txtDisplay.Text = txtDisplay.Text + btn6.Text;
        }

        private void btn7_Click(object sender, EventArgs e)
        {
            txtDisplay.Text = txtDisplay.Text + btn7.Text;
        }

        private void btn8_Click(object sender, EventArgs e)
        {
            txtDisplay.Text = txtDisplay.Text + btn8.Text;
        }

        private void btn9_Click(object sender, EventArgs e)
        {
            txtDisplay.Text = txtDisplay.Text + btn9.Text;
        }

        private void btn0_Click(object sender, EventArgs e)
        {
            txtDisplay.Text = txtDisplay.Text + btn0.Text;
        }

        private void btnReken_Click(object sender, EventArgs e)
        {
            txtDisplay2.Clear();
            try
            {
                switch (buffer)
                {
                    case "+": total2 = Convert.ToDouble(txtDisplay.Text);
                        total3 = total1 + total2;
                        txtDisplay.Text = total3.ToString();
                        buffer = "";
                        check = "";
                        break;

                    case "-": total2 = Convert.ToDouble(txtDisplay.Text);
                        total3 = total1 - total2;
                        txtDisplay.Text = total3.ToString();
                        buffer = "";
                        check = "";
                        break;

                    case "*": total2 = Convert.ToDouble(txtDisplay.Text);
                        total3 = total1 * total2;
                        txtDisplay.Text = total3.ToString();
                        buffer = "";
                        check = "";
                        break;

                    case "/": total2 = Convert.ToDouble(txtDisplay.Text);
                        total3 = total1 / total2;
                        txtDisplay.Text = total3.ToString();
                        buffer = "";
                        check = "";
                        break;

                    case "wortel": total3 = Math.Sqrt(total1);
                        txtDisplay.Text = total3.ToString();
                        buffer = "";
                        check = "";
                        break;

                    case "macht": total2 = Convert.ToDouble(txtDisplay.Text);
                        total3 = Math.Pow(total1, total2);
                        txtDisplay.Text = total3.ToString();
                        buffer = "";
                        check = "";
                        break;

                }
            }

            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "Er is iets fout gegaan");
            }
        }

        private void btnPunt_Click(object sender, EventArgs e)
        {
            txtDisplay.Text = txtDisplay.Text + btnPunt.Text;
        }

        private void btnSluit_Click(object sender, EventArgs e)
        {
            MessageBox.Show("Gemaakt door Jamilio. Klik op OK om af te sluiten", "Afsluiten");
            Close();
        }

        private void btnPlus_Click(object sender, EventArgs e)
        {
            if ((buffer == "-") || (buffer == "*") || (buffer == "/") || (check == "plus") || (buffer == "wortel") || (buffer == "macht"))
            {
                MessageBox.Show("Deze rekenmachine kent geen rekenregels", "Probeer opnieuw");
                txtDisplay2.Clear();
                txtDisplay.Clear();
                buffer = "";
                check = "";
            }
            else if (txtDisplay.Text != "")
                {
                    txtDisplay2.Text += txtDisplay.Text;
                    txtDisplay2.Text += "+";
                    total1 = Convert.ToDouble(txtDisplay.Text);
                    buffer = "+";
                    check = "plus";
                    txtDisplay.Clear();
                }
        }

        private void btnMin_Click(object sender, EventArgs e)
        {
            if ((buffer == "+") || (buffer == "*") || (buffer == "/") || (check == "min") || (buffer == "wortel") || (buffer == "macht"))
            {
                MessageBox.Show("Deze rekenmachine kent geen rekenregels", "Probeer opnieuw");
                txtDisplay2.Clear();
                txtDisplay.Clear();
                buffer = "";
                check = "";
            }
            else if (txtDisplay.Text != "")
            {
                txtDisplay2.Text += txtDisplay.Text;
                txtDisplay2.Text += "-";
                total1 = Convert.ToDouble(txtDisplay.Text);
                buffer = "-";
                check = "min";
                txtDisplay.Clear();
            }
        }

        private void btnKeer_Click(object sender, EventArgs e)
        {
            if ((buffer == "-") || (buffer == "+") || (buffer == "/") || (check == "keer") || (buffer == "wortel") || (buffer == "macht"))
            {
                MessageBox.Show("Deze rekenmachine kent geen rekenregels", "Probeer opnieuw");
                txtDisplay2.Clear();
                txtDisplay.Clear();
                buffer = "";
                check = "";
            }
            else if (txtDisplay.Text != "")
            {
                txtDisplay2.Text += txtDisplay.Text;
                txtDisplay2.Text += "x";
                total1 = Convert.ToDouble(txtDisplay.Text);
                buffer = "*";
                check = "keer";
                txtDisplay.Clear();
            }
        }

        private void btnDeel_Click(object sender, EventArgs e)
        {
            if ((buffer == "*") || (buffer == "+") || (buffer == "-") || (check == "deel") || (buffer == "wortel") || (buffer == "macht"))
            {
                MessageBox.Show("Deze rekenmachine kent geen rekenregels", "Probeer opnieuw");
                txtDisplay2.Clear();
                txtDisplay.Clear();
                buffer = "";
                check = "";
            }
            else if (txtDisplay.Text != "")
            {
                txtDisplay2.Text += txtDisplay.Text;
                txtDisplay2.Text += ":";
                total1 = Convert.ToDouble(txtDisplay.Text);
                buffer = "/";
                check = "deel";

                txtDisplay.Clear();
            }
        }

        private void btnWortel_Click(object sender, EventArgs e)
        {
            if ((buffer == "*") || (buffer == "+") || (buffer == "-") || (check == "wortel") || (buffer == "/") || (buffer == "macht"))
            {
                MessageBox.Show("Deze rekenmachine kent geen rekenregels", "Probeer opnieuw");
                txtDisplay2.Clear();
                txtDisplay.Clear();
                buffer = "";
                check = "";
            }
            else if (txtDisplay.Text != "")
            {
                txtDisplay2.Text += txtDisplay.Text;
                txtDisplay2.Text += "√";
                total1 = Convert.ToDouble(txtDisplay.Text);
                buffer = "wortel";
                check = "wortel";
                txtDisplay.Clear();
            }
        }

        private void pi_Click(object sender, EventArgs e)
        {
            if (total1 != 0)
            {
                total2 = 3.14159265;
                txtDisplay.Text += "Ï€";
            }
            else if (total2 == 0)
            {
                total1 = 3.14159265;
            }
        }

        private void btnMacht_Click(object sender, EventArgs e)
        {
            if ((buffer == "-") || (buffer == "+") || (buffer == "/") || (check == "macht") || (buffer == "wortel") || (buffer == "*"))
            {
                MessageBox.Show("Deze rekenmachine kent geen rekenregels", "Probeer opnieuw");
                txtDisplay2.Clear();
                txtDisplay.Clear();
                buffer = "";
                check = "";
            }
            else if (txtDisplay.Text != "")
            {
                txtDisplay2.Text += txtDisplay.Text;
                txtDisplay2.Text += "^";
                total1 = Convert.ToDouble(txtDisplay.Text);
                buffer = "macht";
                check = "macht";
                txtDisplay.Clear();
            }
        }
    }
}

alvast bedankt
 
EDIT: 1+3x5+√9 tussen de laatste + en 9 moet een wortel staan, maar de forum doet raar :P ? dus 1+3x5+(wortelteken)9
 
Als op mijn Windows 7 Home Edition 64 Bit de calculator open, valt mij op dat ik eerst het nummer (9) moet invoeren en dan op de wortel moet drukken..
Ook vraag ik mij af of jou calculator zich wel aan de voor rang regels houd ;)
 
Als op mijn Windows 7 Home Edition 64 Bit de calculator open, valt mij op dat ik eerst het nummer (9) moet invoeren en dan op de wortel moet drukken..

Dat klopt, op het moment bij mijn huidige rekenmachine moet dat ook maar ik was van plan om iets te schrijven dat de wortels en machten detecteert zodat hij die berekeningen op de volgorde van de reken regels doet.

Ook vraag ik mij af of jou calculator zich wel aan de voor rang regels houd ;)

Daar gaat deze topic over. Ik ben naar iemand opzoek die mij op weg kan helpen om een programma te schrijven in visual c# die een hele regel rekensom kan uitrekenen volgens de rekenregels ( voorrang regels )

En nog voor het geval als deze topic gesloten word omdat er niet word geholpen met school opdrachten / huiswerk a.u.b niet dicht doen. Ik heb de toets van deze rekenmachine al gemaakt en ik heb hier zeer goed op gescoord. Alleen het moet gewoon mogelijk zijn om een rekenmachine te bouwen die hele rekenregels kan uitrekenen ( ze bestaan wel maar ik wil zelf weten hoe het dan in zijn werk zou gaan ) dus dit doe ik gewoon buiten de schoolopdrachten om.
 
Laatst bewerkt:
wat je zou kunnen doen is het volgende:

pseudo code:


calculate:
while char != operator (+-*/( ) )
lees value -> valueStack.push(value)
lees operator -> operatorStack.push(operator)
while nextChar != operator
lees value -> valueStack.push(value)

lees operator:
previousOperator = operatorStack.peek()
compare operators:
- als de huidige operator geen voorrang, cijfers poppen en de operator: totaal uitrekenen en doorgaan.
- anders: operator pushen totdat je een nieuwe operator tegenkomt en deze methode opnieuw uitvoeren.

wanneer er niks meer te lezen is: pop 2 getallen, pop een operator. dit optellen bij het totaal (of delen van het totaal, net wat de operator doet) totdat er niks meer in de stack staat.

zoiets zou moeten werken denk ik. misschien dat het beter op een andere manier kan maar zo zou ik het proberen.
Verder moet je wel weten hoe je een stack gebruikt en wat het principe van een stack is (FILO, first in, last out).

Succes er mee !

[EDIT]

Voorbeeld:

als je namelijk 1 stored, de + en daarna de 2, vervolgens kom je de * tegen (hogere prioriteit dus ga door) en daarna de 3. Er zijn geen waardes meer dus ga rekenen.

dan staat er dus in je valueStack: (1,2,3) en in je operatorStack: (+,*)

value1 = valueStack.pop(); hier staat nu 3 in
value2 = valueStack.pop(); hier staat nu 2 in

operator = operatorStack.pop(); hier staat nu * in

total = calculate ( value1, value2, operator);

valueStack.push(total);

value1 = valueStack.pop(); hier staat nu 6 in
value2 = valueStack.pop(); hier staat nu 1 in

operator = operatorStack.pop(); hier staat nu + in

total = calculate(value1, value2, operator);

en je hebt 7
 
Laatst bewerkt:
Dankjewel Westerland, ik heb de stacks net gebruikt naar een half uur research wat is eigenlijk is en wat het doet en het is gelukt!, alleen loop ik nu tegen he probleem aan dat als ik 2+1x3+5x6 dat die dan eerst 5x6 doet terwijl hij 1x3 moet pakken !, ik probeer al uit te vogelen waarom maar teminste dankjewel voor de reactie. nu heb ik er weer wat bij geleerd =D
 
graag gedaan hoor maar dat klopt niet wat je zegt. als 1*3 in de stack staat dan komt die de volgende operator tegen (+ voor de (5*6)) en die heeft geen prioriteit kortom alles poppen en uitrekenen, antwoord pushen en doorgaan met rekenen.

wat die zou moeten doen:

value.push(2);
operator.push(+);
value.push(1);
CheckOperator(operator.peek(), currentOpertaor); // vergelijk + met * resultaat is dat * voorrang heeft dus doorgaan met puseh
value.push(3);
CHeckOperator(operator.peek(), currentOperator); // vergelijk * met +. restultaat is dat * voorrang heeft (in de stack staat deze dus uitrekenen)

value.push( 3* 1 + 2 );
operator.push(currentOperator);
//einde nog niet berijkt dus doorlezen
value.push(5);
CheckOperator(operator.peek(), currentOperator); // vergelijk + met *. keer voorrang dus doorlezen
opartor.push(*);
value.push(6);

//einde bereikt dus uitrekenen:

value.push(6*5)
value.push(30 + 5);

einde bereikt =)
 
Ik programmeer nog niet zo lang, maar ik denk niet dat je op die manier ver gaat komen. Enkele mogelijkheden zijn om je som te analyseren. Dit moet je uiteraard je programma laten doen. Dus je moet operators herkennen en hier prioriteiten aan toe kennen. Afhankelijk van de prioriteit kan je een bepaalde method aanroepen die 2 getallen accepteerd.

Je kunt aan twee dingen denken. Of een tree...

http://www.codeproject.com/KB/recipes/binary_tree_expressions.aspx

Dit is mij tot op heden niet gelukt... je kunt ook denken om je getallen in een array te stoppen. Bijv. ArrayList of Collections.

Ik ben er nu zelf ook mee bezig.. ik doe middels een substring functie door een som (string) heen iteraten.. middels een foreach of een for loop. Zodoende kan ik door een som heen gaan en bepalen vanaf welk punt ik ga rekenen.

Begin simpel.. probeer een operator uit te rekenen binnen je applicatie.

(2*2)+3
herken de haakjes en pak de som apart
(2*2) vervang door #..
#+3
bereken 2*2
vervang # door uitkomst 4
4+3
bereken 4+3
Kijk maar eens of je hier wat mee kunt. Zodra mijn rekenmachine af is zal ik hem hier plaatsen.

Groetjes SpaceLama
 
Laatst bewerkt:
dankjullie wel voor de reacties, ik doe zelf ook nogmaar 11 weken aan c#, java programmeren en ken zelf dus nog niet eens de basis. maarja, ik steek hier zoveel vrijetijd in omdat ik toch niks anders te doen heb maar ik heb mijn html leraar gevraagd ( hij is ook goed in programmeren ) en hij had het ook over arrays alleen het is wel ingewikkeld om zo iets te maken maar het moet in principe mogelijk zijn. We hebben al op papier geschreven hoe we dat zouden kunnen doen met arrays alleen we liepen tegen het probleem aan dat c# geen unlimited arrays space kan gebruiken dus dan moeten we zelf het aantal declareren. Ook hadden we het idee om eerst een code te maken die 3 verschillende operatoren kunnen uitrekenen en dat we hem dan zou zouden gaan uitbreiden. Ik zal dit idee ergens eind deze week gaan schrijven in c#
 
Laatst bewerkt:
Het stackprincipe kan prima, heb het zelf net ff uitgeprogrammeerd (15 minuutjes ofzo dus kunnen fouten in zitten) maar 1+2*3 doet het gewoon. je vorig probleem ook trouwens (2+1*3+5*6). hij rekent eerst 1*3 uit, dan telt die er 2 bij op vervolgens rekent die 5*6 uit en telt die het antwoord van de vorige som er bij op. Je zal alleen wel iets leuks moeten bedenken als je haakjes erin gaat gooien (forced push o.i.d.)

als je het werkend wil zien:
http://dl.dropbox.com/u/3380837/Calc.rar

wat spacelama zei kan natuurlijk ook, er zijn altijd meerdere manieren om tot een oplossing te komen.

N.B.

bedenk me net dat het mijn code alleen werkt met single digit getallen ^^ maargoed is het alleen bedoeld om aan te tonen dat het kan.

[edit]

verder werkt de / niet helemaal lekker (getallen moeten omgedraaid worden)
 
Laatst bewerkt:
Hmm, ik had vanochtend al een reactie geplaatst. Als je rekenmachine het volgende niet kan uitrekenen dan werkt het gewoon niet:
2*(3,3+4)
2--2*4

Als je een oplossing hiervoor weet binnen jouw aanpak dan ben ik zeer benieuwd. Anders zou ik die aanpak snel weggooien.

Groetjes Spacelama
 
Gelukt =)

werkt nu met digits >1 (1000+1000), haakjes werken. negatieve getallen werken:

opgelost dmv recursie en stacks.

2--2*4 maakt die netjes 10 van.
2*(3+4) maakt die 14 van.

deze keer alleen de executable beschikbaar:

http://dl.dropbox.com/u/3380837/Calc.exe

er zullen ongetwijfeld fouten in zitten aangezien ik er +- 1.5 uur meer bezig geweest ben. verder ga ik er geen tijd meer in steken aangezien ik het druk genoeg heb met andere projecten.
Dit probleem oplossen met stacks is dus mogelijk.
 
Laatst bewerkt:
Mooi zo.. ik ben zeer benieuwd naar de source code... Ik ben zeer benieuwd hoe die stacks werken.
 
Hallo iedereen,

Bij deze mijn calculator. Inzoverre ik het getest heb kan dit rekenmachine elke complexe som aan. Of het nu om gaat om haakjes weg te werken of dubbele - sommen. Bijv. 2--2*3. Elke som is op te lossen. Graag feedback...
Ik wil feedback op mijn code.. hoe ik kleine stukjes code beter had kunnen aanpakken, maar ook feedback hoe ik het gehele rekenmachine project beter had kunnen aanpakken.


form1.cs

Code:
using System;
using System.Collections;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace RekenMachine
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void txtSom_TextChanged(object sender, EventArgs e)
        {
            lstbxResultBox.Items.Clear();
        }

        private void Form1_Load(object sender, EventArgs e)
        {

        }

        private void btnBereken_Click(object sender, EventArgs e)
        {
            lstbxResultBox.Items.Clear();

            string deelSomResultaat = null;
            string nieuweSom = null;
            string deelSom = null;
            Bereken reken = new Bereken();

            // haal alle spaties weg
            nieuweSom = reken.spatiesVerwijderen(txtSom.Text);
            string tekst;
            tekst = String.Format("Begin som {0}", nieuweSom);
            lstbxResultBox.Items.Add(tekst);

            deelSom = reken.mintekensIndelen(nieuweSom);
            reken.bepalenComplexiteitSom(deelSom);

            #region rekenen met haakjes
            if (reken.aantalHaakOperator >= 1)
            {
                int aantalKeerHaak = reken.aantalHaakOperator;
                for (int i = 0; i < aantalKeerHaak; i++)
                {
                    reken.bepalenComplexiteitSom(deelSom);
                    if (reken.aantalHaakOperator > 0)
                    {
                        deelSom = reken.verkrijgSomTussenHaakjes(deelSom);
                        reken.indelenSom(deelSom);

                        #region rekenen met *
                        // if * present calculate with *
                        if (reken.aantalMaalDeelSom >= 1)
                        {
                            int aantalKeerLoop = reken.aantalMaalDeelSom;
                            for (int j = 0; j < aantalKeerLoop; j++)
                            {
                                deelSom = reken.mintekensIndelen(deelSom);
                                reken.indelenSom(deelSom);
                                reken.verkrijgGetallenMaalSom(deelSom);
                                deelSomResultaat = reken.voerMaalSomUit();
                                deelSom = reken.deelSomOpmaken(deelSom);
                                deelSom = reken.maakDeelSomCompleet(deelSomResultaat, deelSom);

                                tekst = String.Format("Deel som na Maal {0}. ", deelSom);
                                lstbxResultBox.Items.Add(tekst);
                            }
                        }
                        #endregion
                        #region rekenen met /
                        // if / present calculate with /
                        if (reken.aantalDeelDeelSom >= 1)
                        {
                            int aantalKeerLoop = reken.aantalDeelDeelSom;
                            for (int j = 0; j < aantalKeerLoop; j++)
                            {
                                deelSom = reken.mintekensIndelen(deelSom);
                                reken.indelenSom(deelSom);
                                reken.verkrijgGetallenDeelSom(deelSom);
                                deelSomResultaat = reken.voerDeelSomUit();
                                deelSom = reken.deelSomOpmaken(deelSom);
                                deelSom = reken.maakDeelSomCompleet(deelSomResultaat, deelSom);

                                tekst = String.Format("Deel som na Deel {0}. ", deelSom);
                                lstbxResultBox.Items.Add(tekst);
                            }
                        }
                        #endregion
                        #region rekenen met +
                        // if + present calculate with +
                        if (reken.aantalPlusDeelSom >= 1)
                        {
                            int aantalKeerLoop = reken.aantalPlusDeelSom;
                            for (int j = 0; j < aantalKeerLoop; j++)
                            {
                                deelSom = reken.mintekensIndelen(deelSom);
                                reken.indelenSom(deelSom);
                                reken.verkrijgGetallenPlusSom(deelSom);
                                deelSomResultaat = reken.voerPlusSomUit();
                                deelSom = reken.deelSomOpmaken(deelSom);
                                deelSom = reken.maakDeelSomCompleet(deelSomResultaat, deelSom);

                                tekst = String.Format("Deel som na Plus {0}. ", deelSom);
                                lstbxResultBox.Items.Add(tekst);
                            }
                        }
                        #endregion
                        #region rekenen met -
                        // if - present calculate with -
                        if (reken.aantalMinDeelSom >= 1)
                        {
                            int aantalKeerLoop = reken.aantalMinDeelSom;
                            for (int j = 0; j < aantalKeerLoop; j++)
                            {
                                deelSom = reken.mintekensIndelen(deelSom);
                                reken.indelenSom(deelSom);
                                reken.verkrijgGetallenMinSom(deelSom);
                                deelSomResultaat = reken.voerMinSomUit();
                                deelSom = reken.deelSomOpmaken(deelSom);
                                deelSom = reken.maakDeelSomCompleet(deelSomResultaat, deelSom);

                                tekst = String.Format("Deel som na Min {0}. ", deelSom);
                                lstbxResultBox.Items.Add(tekst);
                            }
                        }
                        #endregion
                        deelSom = reken.maakSomCompleet(deelSomResultaat, reken.OudeSom);
                    }
                }
            }
            #endregion

            tekst = String.Format("Resultaat deel som {0}. ", deelSom);
            lstbxResultBox.Items.Add(tekst);

            #region rekenen zonder haakjes
            deelSom = reken.mintekensIndelen(deelSom);
            reken.indelenSom(deelSom);

            #region rekenen met *
            // if * present calculate with *
            if (reken.aantalMaalDeelSom >= 1)
            {
                int aantalKeerLoop = reken.aantalMaalDeelSom;
                for (int j = 0; j < aantalKeerLoop; j++)
                {
                    deelSom = reken.mintekensIndelen(deelSom);
                    reken.indelenSom(deelSom);
                    reken.verkrijgGetallenMaalSom(deelSom);
                    deelSomResultaat = reken.voerMaalSomUit();
                    deelSom = reken.deelSomOpmaken(deelSom);
                    deelSom = reken.maakDeelSomCompleet(deelSomResultaat, deelSom);

                    tekst = String.Format("Deel som na Maal {0}. ", deelSom);
                    lstbxResultBox.Items.Add(tekst);
                }
            }
            #endregion
            #region rekenen met /
            // if / present calculate with /
            if (reken.aantalDeelDeelSom >= 1)
            {
                int aantalKeerLoop = reken.aantalDeelDeelSom;
                for (int j = 0; j < aantalKeerLoop; j++)
                {
                    deelSom = reken.mintekensIndelen(deelSom);
                    reken.indelenSom(deelSom);
                    reken.verkrijgGetallenDeelSom(deelSom);
                    deelSomResultaat = reken.voerDeelSomUit();
                    deelSom = reken.deelSomOpmaken(deelSom);
                    deelSom = reken.maakDeelSomCompleet(deelSomResultaat, deelSom);

                    tekst = String.Format("Deel som na Deel {0}. ", deelSom);
                    lstbxResultBox.Items.Add(tekst);
                }
            }
            #endregion
            #region rekenen met +
            // if + present calculate with +
            if (reken.aantalPlusDeelSom >= 1)
            {
                int aantalKeerLoop = reken.aantalPlusDeelSom;
                for (int j = 0; j < aantalKeerLoop; j++)
                {
                    deelSom = reken.mintekensIndelen(deelSom);
                    reken.indelenSom(deelSom);
                    reken.verkrijgGetallenPlusSom(deelSom);
                    deelSomResultaat = reken.voerPlusSomUit();
                    deelSom = reken.deelSomOpmaken(deelSom);
                    deelSom = reken.maakDeelSomCompleet(deelSomResultaat, deelSom);

                    tekst = String.Format("Deel som na Plus {0}. ", deelSom);
                    lstbxResultBox.Items.Add(tekst);
                }
            }
            #endregion
            #region rekenen met -
            // if - present calculate with -
            if (reken.aantalMinDeelSom >= 1)
            {
                int aantalKeerLoop = reken.aantalMinDeelSom;
                for (int j = 0; j < aantalKeerLoop; j++)
                {
                    deelSom = reken.mintekensIndelen(deelSom);
                    reken.indelenSom(deelSom);
                    reken.verkrijgGetallenMinSom(deelSom);
                    deelSomResultaat = reken.voerMinSomUit();
                    deelSom = reken.deelSomOpmaken(deelSom);
                    deelSom = reken.maakDeelSomCompleet(deelSomResultaat, deelSom);

                    tekst = String.Format("Deel som na Min {0}. ", deelSom);
                    lstbxResultBox.Items.Add(tekst);
                }
            }
            #endregion



            #endregion // region: rekenen zonder haakjes
            if (!string.IsNullOrEmpty(deelSom))
            {
                deelSom = deelSom.Replace("~", "-");
            }
            tekst = String.Format("Oplossing totale som {0}. ", deelSom);
            lstbxResultBox.Items.Add(tekst);
        }


        #region Som knoppen
        private void button1_Click(object sender, EventArgs e)
        {
            txtSom.Text = @"0,5*3+(4/-0,2)+5";
        }

        private void button2_Click(object sender, EventArgs e)
        {
            txtSom.Text = @"2*2+(2*3)/(2*3)+2*2-8";
        }

        private void button3_Click(object sender, EventArgs e)
        {
            txtSom.Text = @"2+(3-100*(2/10))";
        }

        private void button4_Click(object sender, EventArgs e)
        {
            txtSom.Text = @"(2+2)+(2+2)";
        }

        private void button5_Click(object sender, EventArgs e)
        {
            txtSom.Text = @"2*6*(3-0,66*1,25)-(((2+1)/3*(1/0,92)-2)-2)";
        }

        private void button6_Click(object sender, EventArgs e)
        {
            txtSom.Text = @"11,57/89,01";
        }
        #endregion
    }
}

bereken.cs

Code:
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;


namespace RekenMachine
{
    class Bereken
    {
        public int HaakLinks { get; set; }
        public int HaakRechts { get; set; }
        public string OudeSom { get; set; }
        public string OudeDeelSom { get; set; }

        public double VoorGetal { get; set; }
        public double AchterGetal { get; set; }
        public int getalPositieVoor;
        public int lengteTeVervangenSom;
        public int lengteSom = 0;

        public string eenKarakter = null;
        public int aantalHaakOperator = 0;
        public int aantalMaalOperator = 0;
        public int aantalDeelOperator = 0;
        public int aantalPlusOperator = 0;
        public int aantalMinOperator = 0;

        public int aantalMaalDeelSom = 0;
        public int aantalDeelDeelSom = 0;
        public int aantalPlusDeelSom = 0;
        public int aantalMinDeelSom = 0;

        ArrayList operatorMaal = new ArrayList();
        ArrayList operatorDeel = new ArrayList();
        ArrayList operatorPlus = new ArrayList();
        ArrayList operatorMin = new ArrayList();

        public string spatiesVerwijderen(string som)
        {
            som = som.Replace(" ", "");
            return som;
        }

        public string mintekensIndelen(string nieuweSom)
        {
            string min = null;
            if (!string.IsNullOrEmpty(nieuweSom))
            {
                nieuweSom = nieuweSom.Replace("~","-");
                lengteSom = nieuweSom.Length;
                int i = 0;
                string secondMin = null;
                for (i = 0; i < lengteSom; i++)
                {

                    min = nieuweSom.Substring(i, 1);

                    if (i == 0 && min == "-" ||
                        secondMin == "+" && min == "-" ||
                        secondMin == "*" && min == "-" ||
                        secondMin == ")" && min == "-" ||
                        secondMin == "/" && min == "-" ||
                        secondMin == "-" && min == "-"
                        )
                    {
                        nieuweSom = nieuweSom.Remove(i, 1);
                        nieuweSom = nieuweSom.Insert(i, "~");
                    }
                    secondMin = min;
                }
            }
            return nieuweSom;
        }

        public string haakjesVerwijderen(string deelSom)
        {
            deelSom = deelSom.Replace("(", "");
            deelSom = deelSom.Replace(")", "");
            return deelSom;
        }

        public string verkrijgSomTussenHaakjes(string nieuweSom)
        {
            lengteSom = nieuweSom.Length;
            if (aantalHaakOperator >= 1)
            {
                int y;
                for (y = 0; y < lengteSom; y++)
                {
                    string haakRechts = nieuweSom.Substring(y, 1);
                    if (haakRechts == ")")
                    {
                        HaakRechts = y;
                        break;
                    }
                }

                for (int x = y; x > 0; x--)
                {
                    string haakLinks = nieuweSom.Substring(x, 1);
                    if (haakLinks == "(")
                    {
                        HaakLinks = x;
                        break;
                    }
                }

                string deelSom = nieuweSom.Substring(HaakLinks, (HaakRechts - HaakLinks) + 1);
                OudeSom = nieuweSom.Replace(deelSom, "#");
                deelSom = haakjesVerwijderen(deelSom);
                return deelSom;
            }
            return nieuweSom;
        }

        public void bepalenComplexiteitSom(string Som)
        {
            lengteSom = Som.Length;
            if (!string.IsNullOrEmpty(Som))
            {
                aantalHaakOperator = 0;
                for (int i = 0; i < lengteSom; i++)
                {
                    string zoekOperator = Som.Substring(i, 1);
                    if (zoekOperator == "(")
                    {
                        aantalHaakOperator++;
                    }
                    else if (zoekOperator == "*")
                    {
                        aantalMaalOperator++;
                    }
                    else if (zoekOperator == "/")
                    {
                        aantalDeelOperator++;
                    }

                    else if (zoekOperator == "+")
                    {
                        aantalPlusOperator++;
                    }

                    else if (zoekOperator == "-")
                    {
                        aantalMinOperator++;
                    }

                }
            }
        }

        public void indelenSom(string Som)
        {

            if (!string.IsNullOrEmpty(Som))
            {
                lengteSom = Som.Length;

                operatorMaal.Clear();
                operatorDeel.Clear();
                operatorPlus.Clear();
                operatorMin.Clear();

                aantalMaalDeelSom = 0;
                aantalDeelDeelSom = 0;
                aantalPlusDeelSom = 0;
                aantalMinDeelSom = 0;

                mintekensIndelen(Som);

                for (int i = 0; i < lengteSom; i++)
                {
                    string zoekOperator = Som.Substring(i, 1);
                    if (zoekOperator == "*")
                    {
                        operatorMaal.Add(i);
                        aantalMaalDeelSom++;
                    }
                    else if (zoekOperator == "/")
                    {
                        operatorDeel.Add(i);
                        aantalDeelDeelSom++;
                    }

                    else if (zoekOperator == "+")
                    {
                        operatorPlus.Add(i);
                        aantalPlusDeelSom++;
                    }

                    else if (zoekOperator == "-")
                    {
                        operatorMin.Add(i);
                        aantalMinDeelSom++;
                    }
                }
            }
        }

        public string deelSomOpmaken(string deelSom)
        {
            deelSom = deelSom.Remove(getalPositieVoor, lengteTeVervangenSom + 1);
            deelSom = deelSom.Insert(getalPositieVoor, "#");
            OudeDeelSom = deelSom;
            getalPositieVoor = 0;
            lengteTeVervangenSom = 0;
            return deelSom;
        }

        public void verkrijgGetallenMaalSom(string som)
        {
            if (operatorMaal.Count >= 1)
            {
                eenKarakter = null;
                lengteSom = som.Length;
                foreach (int positie in operatorMaal)
                {
                    // getal voor de operator
                    int tellerVoor = 0;
                    for (int i = positie - 1; i < lengteSom; i--)
                    {
                        if (i > -1)
                        {
                            eenKarakter = som.Substring(i, 1);
                        }
                        if (i == -1 || eenKarakter == "*" || eenKarakter == "/" || eenKarakter == "+" || eenKarakter == "-" || eenKarakter == "(" || eenKarakter == ")")
                        {
                            string getal = som.Substring(i + 1, tellerVoor);
                            string num = getal.Replace(".", ",");
                            num = num.Replace("~", "-");
                            lengteTeVervangenSom = 0;
                            lengteTeVervangenSom = lengteTeVervangenSom + num.Length;
                            VoorGetal = Convert.ToDouble(num); // thread culture
                            getalPositieVoor = i + 1;
                            break;
                        }
                        tellerVoor++;
                    }

                    int einde = lengteSom + 1;
                    int tellerAchter = 0;

                    // getal achter de operator
                    for (int i = positie + 1; i < einde; i++)
                    {
                        if (i < lengteSom)
                        {
                            eenKarakter = som.Substring(i, 1);
                        }
                        if (i == lengteSom || eenKarakter == "*" || eenKarakter == "/" || eenKarakter == "+" || eenKarakter == "-" || eenKarakter == "(" || eenKarakter == ")")
                        {
                            string getal = som.Substring(positie + 1, tellerAchter);
                            string num = getal.Replace(".", ",");
                            num = num.Replace("~", "-");
                            lengteTeVervangenSom = lengteTeVervangenSom + num.Length;
                            AchterGetal = Convert.ToDouble(num);
                            break;
                        }
                        tellerAchter++;

                    }
                    operatorMaal.Remove(positie);
                    break;
                } // foreach end
            }
        }

        public void verkrijgGetallenDeelSom(string som)
        {
            if (operatorDeel.Count >= 1)
            {
                eenKarakter = null;
                lengteSom = som.Length;
                foreach (int positie in operatorDeel)
                {
                    // getal voor de operator
                    int tellerVoor = 0;
                    for (int i = positie - 1; i < lengteSom; i--)
                    {
                        if (i > -1)
                        {
                            eenKarakter = som.Substring(i, 1);
                        }
                        if (i == -1 || eenKarakter == "*" || eenKarakter == "/" || eenKarakter == "+" || eenKarakter == "-" || eenKarakter == "(" || eenKarakter == ")")
                        {
                            string getal = som.Substring(i + 1, tellerVoor);
                            string num = getal.Replace(".", ",");
                            num = num.Replace("~", "-");
                            lengteTeVervangenSom = 0;
                            lengteTeVervangenSom = lengteTeVervangenSom + num.Length;
                            VoorGetal = Convert.ToDouble(num); // thread culture
                            getalPositieVoor = i + 1;
                            break;
                        }
                        tellerVoor++;
                    }

                    int einde = lengteSom + 1;
                    int tellerAchter = 0;

                    // getal achter de operator
                    for (int i = positie + 1; i < einde; i++)
                    {
                        if (i < lengteSom)
                        {
                            eenKarakter = som.Substring(i, 1);
                        }
                        if (i == lengteSom || eenKarakter == "*" || eenKarakter == "/" || eenKarakter == "+" || eenKarakter == "-" || eenKarakter == "(" || eenKarakter == ")")
                        {
                            string getal = som.Substring(positie + 1, tellerAchter);
                            string num = getal.Replace(".", ",");
                            num = num.Replace("~", "-");
                            lengteTeVervangenSom = lengteTeVervangenSom + num.Length;
                            AchterGetal = Convert.ToDouble(num);
                            break;
                        }
                        tellerAchter++;

                    }
                    operatorDeel.Remove(positie);
                    break;
                } // foreach end
            }
        }

        public void verkrijgGetallenPlusSom(string som)
        {
            if (operatorPlus.Count >= 1)
            {
                eenKarakter = null;
                lengteSom = som.Length;
                foreach (int positie in operatorPlus)
                {
                    // getal voor de operator
                    int tellerVoor = 0;
                    for (int i = positie - 1; i < lengteSom; i--)
                    {
                        if (i > -1)
                        {
                            eenKarakter = som.Substring(i, 1);
                        }
                        if (i == -1 || eenKarakter == "*" || eenKarakter == "/" || eenKarakter == "+" || eenKarakter == "-" || eenKarakter == "(" || eenKarakter == ")")
                        {
                            string getal = som.Substring(i + 1, tellerVoor);
                            string num = getal.Replace(".", ",");
                            num = num.Replace("~", "-");
                            lengteTeVervangenSom = 0;
                            lengteTeVervangenSom = lengteTeVervangenSom + num.Length;
                            VoorGetal = Convert.ToDouble(num); // thread culture
                            getalPositieVoor = i + 1;
                            break;
                        }
                        tellerVoor++;
                    }

                    int einde = lengteSom + 1;
                    int tellerAchter = 0;

                    // getal achter de operator
                    for (int i = positie + 1; i < einde; i++)
                    {
                        if (i < lengteSom)
                        {
                            eenKarakter = som.Substring(i, 1);
                        }
                        if (i == lengteSom || eenKarakter == "*" || eenKarakter == "/" || eenKarakter == "+" || eenKarakter == "-" || eenKarakter == "(" || eenKarakter == ")")
                        {
                            string getal = som.Substring(positie + 1, tellerAchter);
                            string num = getal.Replace(".", ",");
                            num = num.Replace("~", "-");
                            lengteTeVervangenSom = lengteTeVervangenSom + num.Length;
                            AchterGetal = Convert.ToDouble(num);
                            break;
                        }
                        tellerAchter++;

                    }
                    operatorDeel.Remove(positie);
                    break;
                } // foreach end
            }
        }

        public void verkrijgGetallenMinSom(string som)
        {
            if (operatorMin.Count >= 1)
            {
                eenKarakter = null;
                lengteSom = som.Length;
                foreach (int positie in operatorMin)
                {
                    // getal voor de operator
                    int tellerVoor = 0;
                    for (int i = positie - 1; i < lengteSom; i--)
                    {
                        if (i > -1)
                        {
                            eenKarakter = som.Substring(i, 1);
                        }
                        if (i == -1 || eenKarakter == "*" || eenKarakter == "/" || eenKarakter == "+" || eenKarakter == "-" || eenKarakter == "(" || eenKarakter == ")")
                        {
                            string getal = som.Substring(i + 1, tellerVoor);
                            string num = getal.Replace(".", ",");
                            num = num.Replace("~", "-");
                            lengteTeVervangenSom = 0;
                            lengteTeVervangenSom = lengteTeVervangenSom + num.Length;
                            VoorGetal = Convert.ToDouble(num); // thread culture
                            getalPositieVoor = i + 1;
                            break;
                        }
                        tellerVoor++;
                    }

                    int einde = lengteSom + 1;
                    int tellerAchter = 0;

                    // getal achter de operator
                    for (int i = positie + 1; i < einde; i++)
                    {
                        if (i < lengteSom)
                        {
                            eenKarakter = som.Substring(i, 1);
                        }
                        if (i == lengteSom || eenKarakter == "*" || eenKarakter == "/" || eenKarakter == "+" || eenKarakter == "-" || eenKarakter == "(" || eenKarakter == ")")
                        {
                            string getal = som.Substring(positie + 1, tellerAchter);
                            string num = getal.Replace(".", ",");
                            num = num.Replace("~", "-");
                            lengteTeVervangenSom = lengteTeVervangenSom + num.Length;
                            AchterGetal = Convert.ToDouble(num);
                            break;
                        }
                        tellerAchter++;

                    }
                    operatorDeel.Remove(positie);

                    break;
                } // foreach end
            }
        }

        public string voerMaalSomUit()
        {
            string somResultaat = Convert.ToString(VoorGetal * AchterGetal);
            return somResultaat;
        }
        public string voerDeelSomUit()
        {
            string somResultaat = Convert.ToString(VoorGetal / AchterGetal);
            return somResultaat;
        }
        public string voerPlusSomUit()
        {
            string somResultaat = Convert.ToString(VoorGetal + AchterGetal);
            return somResultaat;
        }
        public string voerMinSomUit()
        {
            string somResultaat = Convert.ToString(VoorGetal - AchterGetal);
            return somResultaat;
        }

        public string maakSomCompleet(string somResultaat, string oudeSom)
        {
            if (!string.IsNullOrEmpty(oudeSom))
            {
                oudeSom = oudeSom.Replace("#", somResultaat);
            }
            return oudeSom;
        }
        public string maakDeelSomCompleet(string somResultaat, string deelSom)
        {
            string nieuweDeelSom = OudeDeelSom.Replace("#", somResultaat);
            return nieuweDeelSom;
        }
    }
}
 
Laatst bewerkt:
voor haakjes doet hij het automatish:
voorbeeld: (5 + 3) * 3

zulke bewerkingen kan je in een integer steken, maar als je letter erbij begint te voegen heb je wel problemen.
daar zijn oplossingen voor te vinden ;).

met dubbele sommen zoals : 3 - - 5 de twee minetjes kan je zodanig in verwerken dat het een + word.
hier moet je gebruik gaan maken van een string
voobeeld:

Code:
string test = "3 - - 5";

deze string kap je in strukjes door middel van een foreach
en als je twee dezelfde tekens achter elkaar hebt, om dit te controleren maak je gebruik van substring.
deze zet je in een teller.
en dan zet je deze in een swtich welke operator het heeft.

bevoorbeeld:
een min geef je waarde 1
en je hebt nog een min en dat is waarde 1
de waardes tel je op en zet als je cijfer 2 hebt betekent het +

als je bevoorbeeld dit hebt : 5 - + 2
een min betekend waarde 1
een plus betekend waarde 2
dit geeft een waarde van 3
en 3 betekend een -

hopelijk heb hier iets aan.
Als ik voorbeeld code moet geven kan je altijd zeggen.


met vriendelijke groetjes, jim
 
Laatst bewerkt:
Damn, Ik zou hem wel willen zien werken in een project file. Ik begrijp namelijk de helft van de code niet noch ziet het er wel intressant uit. Dan zou ik een duidelijke beeld kunnen krijgen van de arrays ( hoe ze te werk gaan ). En het zou ook wel handig zijn om de commentaar erbij te zetten wat welke methode doet. ( ik klaag niet maar zover ik het heb geleerd is dat heel belangrijk als je grote codes met mensen deelt ). Ondertussen ga ik hem proberen te kopiëren in een project file en dan kijken hoe die werkt :D, thx man.
 
Oke, ik heb hem zojuist in een project file kunnen zetten, het is awesome om te zien hoe hij werkt maar ik heb een probleempje gevonden. de som: 2+2*28/2*(1+6) kan hij niet uitrekenen. Hij geeft 6 aan terwijl het antwoord 198 moet zijn. Hij rekent inderdaad eerst de haakjes uit, daarna 2*28 en daarna 2*7 en dan doet hij pas de deel. Maar volgens de rekenregels is het van links naar rechts de / of * voor de + en -, maakt niet uit welke hij eerst ziet. Maar de rekenmachine pakt toch de * voor de /. En het is best jammer dat hij geen doubles neemt :P ( zou dat mogelijk zijn om nog te doen ? ) Mijn leraar is hier vast geïnteresseerd in en ik wil het hem morgen dus ook laten zien en als dat van jou mag dan ook nog de wortels en machten toevoegen en hem langzamerhand uitbreiden als we eruit zijn hoe dat dan zou kunnen.
 
Laatst bewerkt:
@mcjambi: Ik denk dat het verstandig is als je zelf eerst even de code bestudeert en er probeert achter te komen wat wat precies doet.
Daarna kun je 't probleem eerst zelf proberen op te lossen, als het niet lukt helpen wij wel.
 
Wat JoZ1 zegt, je moet eerst uw code bestuderen en weten wat het doet.

Maar als je er toch nietveel vanaf weet, zou ik eerst een rekenmachine maken in console-application en zo stilletjes uitbreiden naar GUI.
vervolgens kan je dubbele tekens erin toevoegen, dan moet je gwn doen wat ik hierboven heb uitgelegd.


Verder veel succes ;)


Met vriendelijke groetjes, jim
 
Hallo,

Mijn rekenmachine rekent volgens de bekende methode: Meneer van dale wacht op antwoord. Hij rekent dus wel alles volgens methode uit. Ik ben ook niet zozeer benieuwd meer of het allemaal klopt qua uitrekenen, want dat geloof ik wel, maar ik ben meer benieuwd naar andere methodieken hoe ik dit project had kunnen aanpakken of hoe ik sommige stukken code zou kunnen verbeteren.

Even terug te komen op vorige post:
2--2 is geen +, want 2--2*3 komt heel wat anders uit als je het in een plus omzet.
daarnaast is 5-+2 een onzinnige som. +5-+2 net zo. Mijn rekenmachine accepteerd alleen normale sommen.
Het -- probleem heb ik opgelost door -getal te vervangen door ~getal en daarmee verder te rekenen.

Tot nu toe heb ik nog weinig bruikbare feedback ontvangen. Hopelijk gaat dit nog komen.

Bijvoorbaat dank!

Groetjes SpaceLama

p.s. je kunt de code gebruiken als je wilt... maakt mij echt niet uit... mocht je aanpassingen maken en bepaalde zaken anders oplossen dan zou ik dat wel graag willen zien. Enige reden dat ik hier post is omdat ik van mijn code wil leren.

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