Einföld reiknivél með C sharp

Úr Wikibókunum
Þessi bók þarfnast hreingerningar svo hún hæfi betur sem grein hér á Wikibækur. Skoðaðu sýnibækur til að bæta hana.

Hér mun ég lýsa hvernig á að gera einfalda reiknivél með C# í þróunarumhverfinu Visual Studios 2005. Þessi reiknivél getur eingöngu notast við + - / og *, ekki verður hægt að hafa kommur og því myndi útkoman úr 9/2 vera 4. Einnig verður alltaf að ýta á = eftir hvert dæmi. Þessari reiknivél er fyrst og fremst ætluð til að kenna algjöran grunn í C#. Það verður farið út í viðmót auk virkni eins og þegar klikkað er á takka, hvernig á að ná í og setja texta í textbox og síðast, en ekki síst if föll og Switch notkun.

Tek það einnig fram að þetta er unnið á vél með upp settu Windows Vista og að ég er lesblind svo ég tek Halldór Laxness á stafsetningarvillur takk fyrir.



Þegar þú hefur ræst Visual Studios, farðu í File => New => Project. Veldu þar C# og Windows Application. Gefuðu síðan verkinu viðeigandi nafn, til dæmis Reiknivél.

ATH ef ekki er uppi yfirstrikaðir gluggar er hægt að fara í View og bæta þeim inn. Til vinstri er Toolbox sem við notum til að setja hluti eins og takka á Formið. Formið gluggaviðmótið að þínu forriti og heitir hér Form1, því viljum við breyta. Hægra meginn sérðu svolítið sem heitir Solutions Explorer, hér sérðu alla hluta forritsins. Þar sérðu núna eitthvað sem heitir Form1.cs Hægri klikkaðu á það og veldu Rename og breytu nafninu í MainWindow.cs , núna gæti Visual Studios spurt þig hvort þú viljir breyta öllum stöðum þar sem Form1 er í MainWindow veldu Yes.

Þá ertu búinn að breyta nafninu á Forminu en eins og þú sérð stendur ennþá Form1 á glugganum sem við vinnum með. Til að breyta þessu klikkaðu á formið og farðu í Properties gluggann. Finndu þar Text og breyttu því í Reiknivél. Þetta er algjörlega óháð öðrum hlutum forritsins og er bara texti sem er birtur á glugganum svo nafið gæti þessvegna verið nagli.


Innsetning hluta[breyta]

Ég ætla ekki að fara út í flókna reiknivél svo við skulum bara setja inn 1 textbox og 16 buttons (takka). Það eru 10 takkar fyrir tölunar 0-10, 5 takkar fyrir + - * / = og einn fyrir C sem væri þá hreinsa.

Klikkaðu á ToolBox. Þar ættirðu að sjá eftirfarandi.

Yfirstrikaðir hlutir eru þeir sem við notum í þessu forriti. Dragðu þá yfir á MainWindow og breyttu textanum á tökkunum úr button í tölustafi og merkin + - * / = og C.

Einnig skulum við gefa þessum hlutum ný nöfn eftir vissum reglum. Þegar þú gefur takka nafn er fyrri parturinn alltaf m_bttn, bttn er stytting á button. Reglan er að taka út sérhljóðana, því myndi textBox vera txtbx. Einnig skaltu halda þig við annað hvort íslensku eða ensku. Ég ætla að notast við ensk heiti þannig að ég myndi skýra takkana mína m_bttnOne, m_bttnTwo.......

Einnig skaltu stilla möguleikann ReadOnly sem true fyrir textboxið þitt. Þennan möguleika má einnig finna undir properties glugganum. Með því að stilla ReadOnly á true erum við að hamla því að fólk skrifi sjálft í textaboxið. Við viljum það ekki á svo einfaldri reiknivél.

Einnig má breyta lit og stærð leturs og þar fram eftir götunum. Þetta er allt hægt undir properties og ætti að útskýra sig sjálft með smá fikti.

Þá er viðmótið komið nema þig langi að fikta í því eitthvað frekar.

Prófaðu að keyra forritið með því að ýta á græna play takkann eða með því að fara í Debug -> Start Debuging og athuga þar með hvort forritið virki ekki áður en við förum að setja virkni á bakvið takkana.


Virkni[breyta]

Núna skulum við fara láta virkni fyrir aftan takkana. Byrjaðu tildæmis á að klikka á tölu, til dæmis fimm og í properties glugganum ýttu á eldinguna sem er efst í properties glugganum. Þar undir er einhvað sem kallast Click fyrir aftan það skaltu skrifa OnFiveClick og ýta á enter, þá hopparu yfir í forritunarkóðann. Það sem þú gerðir núna var að búa til ClickEvent, það er fall sem fer af stað ef ýtt er á takkann. Gerðu þetta fyrir alla takkana og kóðinn ætti þá að líta einhvernvegin svona út:

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

namespace Reiknivél
{
    public partial class MainWindow : Form
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        private void OnZeroClick(object sender, EventArgs e)
        {
        }

        private void OnOneClick(object sender, EventArgs e)
        {
        }

        private void OnTwoClick(object sender, EventArgs e)
        {
        }

        private void OnThreeClick(object sender, EventArgs e)
        {
        }

        private void OnFourClick(object sender, EventArgs e)
        {
        }

        private void OnFiveClick(object sender, EventArgs e)
        {
        }

        private void OnSixClick(object sender, EventArgs e)
        {
        }

        private void OnSevenClick(object sender, EventArgs e)
        {
        }

        private void OnEightClick(object sender, EventArgs e)
        {
        }

        private void OnNineClick(object sender, EventArgs e)
        {
        }

        private void OnClearClick(object sender, EventArgs e)
        {
        }

        private void OnDivClick(object sender, EventArgs e)
        {
        }

        private void OnMultClick(object sender, EventArgs e)
        {
        }

        private void OnSubClick(object sender, EventArgs e)
        {
        }

        private void OnPlusClick(object sender, EventArgs e)
        {
        }
    }
}

Þessi föll býr Visual Studios til fyrir okkur.Það sem við viljum láta tölu föllin einfaldlega skrifa töluna í textboxið okkar. Til að breyta texta sem er á hverju sem er, til dæmis textboxum og buttons skrifum við nafn hlutsins .Text = einhvað. Til að gera þetta verður við að setja innstring breyta, sú breyta er notuð fyrir almennan texta í C#. Ef þú vilt sjálfur gefa upp í texta hvað skulu fara inn í string breytu verður það að vera með gæsalöppum utan um.

           string breyta = "einhvað"

Þá skulum við fara setja einhvað inn í þessi föll okkar. Inn í fallið fyrir fimm myndum við setja (textaboxið mitt heitir m_txtCalc)

           m_txtbxCalc.Text = "5";

Gerðu þetta fyrir allar tölunar og prófaðu að keyra forritið eins og var lýst áðan. Fiktaðu aðeins í tökkunum. Þú sérð að þegar þú setur nýja tölu inn dettur hin talan út. Það er nú ekki nógu gott, í rauninni þurfum við að segja að texti í textboxi sé jafnt og textinn í textboxinu plús næsta tala. Hérna kemur dæmi um akkúrat það fyrir töluna 5.

           m_txtbxCalc.Text = m_txtbxCalc.Text + "5";

Breyttu þessu nú allstaðar og keyrðu forritið aftur til að athuga hvort þetta virki nú ekki alveg rétt. Staðreyndin er samt sú að stundum viljum við byrja á nýrri tölu t.d. eftir að við höfum ýtt á plús. En þá þurfum við líka að vita að það hefur verið ýtt á plús.


Núna skulum við færa okkur tímabundið í stærðfræðimerkin. Ég ætla að nota plús sem dæmi. Það sem þarf að koma fram í þessum föllum er hvaða merki var ýtt á, að það hafi verið ýtt á merki(til að nota í tölu föllunum) og að geyma töluna sem er nú þegar. Til að geyma þessar upplýsingar þurfum við eina int breytu(geymir tölur), eina string breytu (geymir texta) og eina bool breytu(geymir satt eða ósatt). Þessar breytur þurfum við að skilgreina og núllstilla og gerum það í upphafi forritsins beint á eftir Main fallinu. Það gerum við svona. Góð regla er að fyrir framan breytunöfn að setja í litlum stöfum fyrsta stafinn í nafni tegundar breytu eða str í string tilvikum. Þetta auðveldar öðrum sem lesa kóðann að muna hvaða tegund hvaða breyta er. Einnig viljum við núllstilla og það gerum við svona.

       string strSign = "";
       int iFirstNumber = 0;
       bool bSigned = false; 

Þá innihalda allar breytunar einhvað sem okkur finnst kannski skrítið að þurfi en tölvan þarf að vita hvort eigi að gera sumar aðgerðir, til dæmis if föll eins og hér kemur seinna. Sem dæmi má taka ef ýtt er á plús og síðan einhverja tölu myndi tölvan leggja þá tölu saman við 0. Ef þetta hefði ekki verið skilgreint myndi koma upp villa.

Það fyrsta sem við gerum í plús fallinu er að geyma töluna sem nú þegar er búið að stimpla inn sem int tölu svo hægt sé að reikna úr henni. Þá segjum við að

       iFirstNumber = int.Parse(m_txtbxCalc.Text);

Hér notum við Parse til að breyta string úr textboxinu í int og getum því geymt það í int breytunni iFirstNumber. Næst viljum við segja að við höfum valið + svo við setjum það inn í strSign breytuna.

       strSign = "+";

Að lokum viljum við vita hvort það hafi verið ýtt á merki svo við setjum bSigned sem true svona:

       bSigned = true;

Einnig viltu setja if setningu í kringum fallið sem tilgreinir að þetta keyrist bara ef m_txtbxCalc.Text er ekki tómur. Þú lærir meira um if setningar seinna svo þú bætir þessu inn í þegar þú hefur lært það.


Núna snúum við okkur aftur að tölu föllunum, tek fall fyrir fimm aftur sem dæmi. Það er sem sagt tvennt sem við viljum geta gert í þessum föllum, það er skrifað nokkrar tölur og einnig byrjað á nýrri tölu. Til þess notum við if else föll upp á íslensku ef annars föllin. Við viljum að ef það hefur verið ýtt á merki sem sagt bSigned er true að þá byrjum við á nýrri tölu, annars viljum við halda áfram að skrifa tölunar okkar. Það gerum við einfaldlega svona:

           if (bSigned == true)
           {
               m_txtbxCalc.Text = "1";
               bSigned = false;
           }
           else
           {
               m_txtbxCalc.Text = m_txtbxCalc.Text + "1";
           }

Við segjum sem sagt ef (bSigned == satt) þá gera það sem er innan sviga, annars gera það sem er í else sviganum. Þannig að þegar búið er að ýta á plús skrifum við bara töluna og mjög mikilvægt er að setja bSigned sem false svo að við hoppum ekki alltaf inn í þetta fall ( viljum stundum fara í else fallið) Gerðu þetta fyrir öll töluföllin og þá höfum við klárað þau föll.



Þá höfum við lokið + - / * og töluvirkni, þá er komið að sjálfri reiknivirkninni sem fellur undir fallið = sem heitir hjá mér Equl. Þegar ýtt er á = erum við komin með upplýsingar um fyrri töluna og hvaða merki var notað og þurfum að taka inn seinni töluna. Þá þurfum við að skilgreina aðra int breytu og gerum það á sama stað og áður, svona í leiðinni skulum við búa til int breytu sem heldur utan um svarið. Því ætti skilgreining á breytum að líta svona út í endann.

       string strSign = "";
       int iFirstNumber = 0;
       int iSecounNumber = 0;
       int answer = 0;
       bool bSigned = false;

Þá skulum við geyma síðari töluna og gerum það eins og áður (setjum þetta in í OnEqulsClick fallið. Til að hindra villu sem gæti komið upp ef listinn er tómur skalltu nota if setningu til að útiloka að það gerist. Equl fallið þarf að gera mismunandi hluti eftir því hvaða merki var valið til að ráða úr þeim málum notumst við switch. Switch tekur inn string breytu sem inniheldur einhvað sem switch notar til að velja hvað eigi að gera. Í okkar tilfelli notum við string breytuna strSign sem inniheldur stærðfræðimerkin. Við gerum síðan case fyrir hvert merki, hér er dæmi fyrir plús.

       switch (strSign)
       {
               case "+":
               iAnswer = iFirstNumber + iSecounNumber;
               m_txtbxCalc.Text = iAnswer.ToString();
               break;
       }

Þetta segir að ef strSign er + er þetta case framkvæmt. Takið eftir því hvernig case er skilgreint, það er case svo merkið innan gæsalappa og svo tvípunktur það sem kemur á eftir er það sem er gert. Þetta case stopar þegar kemur að break sem þýðir einfaldlega stopp. Það sem við erum að gera í þessum föllum er að gera að reikna úr dæminu og síðan setja það í textboxið okkar. Hérna breytum við iAnswer í string með því að nota ToString() sem er innbygt í Visual Studios. Reyndu nú að klára case fyrir - * og /



Núna eigum við bara einn takka eftir sem er C takinn sem hreinsar allt. Þetta fall skaltu reyna að gera sjálf/ur, tek það fram að nústilla þarf allar breytur.


Gefstu upp?[breyta]

Hérna er þá heildar kóðinn ef þú ert alveg föst/fastur.
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace Reiknivél
{
    public partial class MainWindow : Form
    {


        public MainWindow()
        {
            InitializeComponent();
        }

        string strSign = "";
        int iFirstNumber = 0;
        int iSecounNumber = 0;
        int answer = 0;
        bool bSigned = false;

        private void OnZeroClick(object sender, EventArgs e)
        {
            if (bSigned == true)
            {
                m_txtbxCalc.Text = "0";
                bSigned = false;
            }
            else
            {
                m_txtbxCalc.Text = m_txtbxCalc.Text + "0";
            }
        }

        private void OnOneClick(object sender, EventArgs e)
        {
            if (bSigned == true)
            {
                m_txtbxCalc.Text = "1";
                bSigned = false;
            }
            else
            {
                m_txtbxCalc.Text = m_txtbxCalc.Text + "1";
            }
        }

        private void OnTwoClick(object sender, EventArgs e)
        {
            if (bSigned == true)
            {
                m_txtbxCalc.Text = "2";
                bSigned = false;
            }
            else
            {
                m_txtbxCalc.Text = m_txtbxCalc.Text + "2";
            }
        }

        private void OnThreeClick(object sender, EventArgs e)
        {
            if (bSigned == true)
            {
                m_txtbxCalc.Text = "3";
                bSigned = false;
            }
            else
            {
                m_txtbxCalc.Text = m_txtbxCalc.Text + "3";
            }
        }

        private void OnFourClick(object sender, EventArgs e)
        {
            if (bSigned == true)
            {
                m_txtbxCalc.Text = "4";
                bSigned = false;
            }
            else
            {
                m_txtbxCalc.Text = m_txtbxCalc.Text + "4";
            }
        }

        private void OnFiveClick(object sender, EventArgs e)
        {
            if (bSigned == true)
            {
                m_txtbxCalc.Text = "5";
                bSigned = false;
            }
            else
            {
                m_txtbxCalc.Text = m_txtbxCalc.Text + "5";
            }
        }

        private void OnSixClick(object sender, EventArgs e)
        {
            if (bSigned == true)
            {
                m_txtbxCalc.Text = "6";
                bSigned = false;
            }
            else
            {
                m_txtbxCalc.Text = m_txtbxCalc.Text + "6";
            }
        }

        private void OnSevenClick(object sender, EventArgs e)
        {
            if (bSigned == true)
            {
                m_txtbxCalc.Text = "7";
                bSigned = false;
            }
            else
            {
                m_txtbxCalc.Text = m_txtbxCalc.Text + "7";
            }
        }

        private void OnEightClick(object sender, EventArgs e)
        {
            if (bSigned == true)
            {
                m_txtbxCalc.Text = "8";
                bSigned = false;
            }
            else
            {
                m_txtbxCalc.Text = m_txtbxCalc.Text + "8";
            }
        }

        private void OnNineClick(object sender, EventArgs e)
        {
            if (bSigned == true)
            {
                m_txtbxCalc.Text = "9";
                bSigned = false;
            }
            else
            {
                m_txtbxCalc.Text = m_txtbxCalc.Text + "9";
            }
        }
  
        private void OnClearClick(object sender, EventArgs e)
        {
            strSign = "";
            iFirstNumber = 0;
            iSecounNumber = 0;
            answer = 0;
            bSigned = false;
            m_txtbxCalc.Text = "";
        }

        private void OnDivClick(object sender, EventArgs e)
        {
            if (m_txtbxCalc.Text != "")
            {
                iFirstNumber = int.Parse(m_txtbxCalc.Text);
                strSign = "/";
                bSigned = true;
            }
        }

        private void OnMultClick(object sender, EventArgs e)
        {
            if (m_txtbxCalc.Text != "")
            {
                iFirstNumber = int.Parse(m_txtbxCalc.Text);
                strSign = "*";
                bSigned = true;
            }
        }

        private void OnSubClick(object sender, EventArgs e)
        {
            if (m_txtbxCalc.Text != "")
            {
                iFirstNumber = int.Parse(m_txtbxCalc.Text);
                strSign = "-";
                bSigned = true;
            }
        }

        private void OnPlusClick(object sender, EventArgs e)
        {
            if (m_txtbxCalc.Text != "")
            {
                iFirstNumber = int.Parse(m_txtbxCalc.Text);
                strSign = "+";
                bSigned = true;
            }
        }

        private void OnEqulsClick(object sender, EventArgs e)
        {
            if (m_txtbxCalc.Text != "")
            {
                iSecounNumber = int.Parse(m_txtbxCalc.Text);

                switch (strSign)
                {
                    case "-":
                        answer = iFirstNumber - iSecounNumber;
                        m_txtbxCalc.Text = answer.ToString();
                        break;
                    case "+":
                        answer = iFirstNumber + iSecounNumber;
                        m_txtbxCalc.Text = answer.ToString();
                        break;
                    case "/":
                        if (iSecounNumber == 0)
                        {
                            m_txtbxCalc.Text = "Get ekki deild með 0";
                        }
                        else
                        {
                            answer = iFirstNumber / iSecounNumber;
                            m_txtbxCalc.Text = answer.ToString();
                        }
                        break;
                    case "*":
                        answer = iFirstNumber * iSecounNumber;
                        m_txtbxCalc.Text = answer.ToString();
                        break;
                }
            }
        }
    }
}