Kalkulator - wątek - dzielenie przez 0

0

Mam zrobić na zaliczenie program. Wybrałam kalkulator, jednak nie może on m.in. dzielić przez 0. Tworzyłam go na podstawie tej stronki : http://www.centrumxp.pl/dotNet/701,Kalkulator-w-C.aspx

Stworzyłam wyjątek dla dzielenia bez 0. chcę aby użytkownik przy dzieleniu przez 0 otrzymał komunikat. Jednak cały mam +nieksończoność.

<code class="csharp">
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace Kalkulator
{
    public partial class frmKalkulator : Form
    {
        const int PLUS = 1;
        const int MINUS = 2;
        const int RAZY = 3;
        const int PODZIELIC = 4;

        double a = 0;
        double b = 0;
        int dzialanie = 0;
        bool kropka = false;
        int ilepoprzecinku = 0;
        int znak = PLUS;
        bool czykasowacekran = false;

        public void pokazznaki()
        {
            cmdSuma.Enabled = true;
            cmdRoznica.Enabled = true;
            cmdIloczyn.Enabled = true;
            cmdIloraz.Enabled = true;
            if (dzialanie != 0) cmdWynik.Enabled = true;
            cmdZnak.Enabled = true;
            cmdKropka.Enabled = true; 
        }

        public void ukryjznaki()
        {
            cmdSuma.Enabled = false;
            cmdRoznica.Enabled = false;
            cmdIloczyn.Enabled = false;
            cmdIloraz.Enabled = false;
            cmdZnak.Enabled = false;
            cmdWynik.Enabled = false;
        }

        public void cyfry(int i)
        {
            pokazznaki();
            if (dzialanie != 0)
            {
                if (!kropka) a = 10 * a + i;
                else
                {
                    if (i != 0) a = a + i / (Math.Pow(10, ilepoprzecinku++));
                    else ++ilepoprzecinku;
                }
            }
            else
            {
                if (!kropka) b = 10 * b + i;
                else
                {
                    if (i != 0) b = b + i / (Math.Pow(10, ilepoprzecinku++));
                    else ++ilepoprzecinku;
                }
            }

            if (czykasowacekran)
            {
                txtWynik.Text = "";
                czykasowacekran = false;
                znak = PLUS;
            }
            txtWynik.Text += i.ToString();
        }

        public double dzialaj(double x, double y, int dz)
        {
            ukryjznaki();
            double wynik = 0;
            if (dzialanie != 0)
            {
                switch (dzialanie)
                {
                    case PLUS: wynik = y + x; break;
                    case MINUS: wynik = y - x; break;
                    case RAZY: wynik = y * x; break;
                    case PODZIELIC: wynik = y / x; break;
                }
                txtWynik.Text = wynik.ToString();
                a = 0;
            }
            else wynik = y;
            dzialanie = dz;
            czykasowacekran = true;
            cmdKropka.Enabled = true;
            ilepoprzecinku = 0;
            return wynik;
        }



        public frmKalkulator()
        {
            InitializeComponent();
        }

        private void cmd1_Click(object sender, EventArgs e)
        {
            cyfry(1);
        }

        private void cmd2_Click(object sender, EventArgs e)
        {
            cyfry(2);
        }

        private void cmd3_Click(object sender, EventArgs e)
        {
            cyfry(3);
        }

        private void cmd4_Click(object sender, EventArgs e)
        {
            cyfry(4);
        }

        private void cmd5_Click(object sender, EventArgs e)
        {
            cyfry(5);
        }

        private void cmd6_Click(object sender, EventArgs e)
        {
            cyfry(6);
        }

        private void cmd7_Click(object sender, EventArgs e)
        {
            cyfry(7);
        }

        private void cmd8_Click(object sender, EventArgs e)
        {
            cyfry(8);
        }

        private void cmd9_Click(object sender, EventArgs e)
        {
            cyfry(9);
        }

        private void cmd0_Click(object sender, EventArgs e)
        {
            cyfry(0);
        }

        private void cmdKropka_Click(object sender, EventArgs e)
        {
            if (czykasowacekran)
            {
                txtWynik.Text = "";
                czykasowacekran = false;
                znak = PLUS;
            }
            if (txtWynik.Text == "") txtWynik.Text = "0";
            txtWynik.Text += ",";
            cmdKropka.Enabled = false;
            kropka = true;
            ilepoprzecinku = 1;
        }

        private void cmdSuma_Click(object sender, EventArgs e)
        {
            b = dzialaj(a, b, PLUS);
        }

        private void cmdRoznica_Click(object sender, EventArgs e)
        {
            b = dzialaj(a, b, MINUS);
        }

        private void cmdIloczyn_Click(object sender, EventArgs e)
        {
            b = dzialaj(a, b, RAZY);
        }

        private void cmdIloraz_Click(object sender, EventArgs e)
        {
            try
            {
                b = dzialaj(a, b, PODZIELIC);
                if (b == 0)
                    throw new DivideByZeroException();
            }
            catch (DivideByZeroException)
            {
                {
                    
                    txtWynik.Text = "Nie mozna dzielic przez zero!!";
                }

            }
        }
               
        private void cmdZnak_Click(object sender, EventArgs e)
        {
            if (znak == PLUS) znak = MINUS;
            else znak = PLUS;

            if (dzialanie != 0) { a = -a; txtWynik.Text = a.ToString(); }
            else { b = -b; txtWynik.Text = b.ToString(); }
        }

        private void cmdWynik_Click(object sender, EventArgs e)
        {
            b = dzialaj(a, b, dzialanie);
            txtWynik.Text = b.ToString();
            cmdKropka.Enabled = true;
            dzialanie = PLUS;
            a = 0;
            pokazznaki();
            cmdWynik.Enabled = false;
            cmdZnak.Enabled = false;
        }

        private void cmdAnuluj_Click(object sender, EventArgs e)
        {
            a = b = 0;
            dzialanie = 0;
            kropka = false;
            ilepoprzecinku = 0;
            txtWynik.Text = "";
            znak = PLUS;
            czykasowacekran = false;
            ukryjznaki();
        }

        private void frmKalkulator_KeyPress(object sender, KeyPressEventArgs e)
        {
            switch (e.KeyChar)
            {
                case '+': if (cmdSuma.Enabled) cmdSuma_Click(sender, e); return;
                case '-': if (cmdRoznica.Enabled) cmdRoznica_Click(sender, e); return;
                case '*': if (cmdIloczyn.Enabled) cmdIloczyn_Click(sender, e); return;
                case '/': if (cmdIloraz.Enabled) cmdIloraz_Click(sender, e); return;
                case (char)13: if (cmdWynik.Enabled) cmdWynik_Click(sender, e); return; // enter
                case (char)27: cmdAnuluj_Click(sender, e); return; // escape
                case '.':
                case ',': if (cmdKropka.Enabled) cmdKropka_Click(sender, e); return;
            }
            int n = (int)e.KeyChar;
            if (n < 48 || n > 57) return;
            n = int.Parse( e.KeyChar.ToString() );
            cyfry(n);
            return;
        }

       

        private void txtWynik_TextChanged(object sender, EventArgs e)
        {

        }

        private void wyjścieToolStripMenuItem_Click(object sender, EventArgs e)
        {
            Application.Exit();
        }

        private void oProgramieToolStripMenuItem_Click(object sender, EventArgs e)
        {
            Form2 OProgramieForm;
            OProgramieForm = new Form2();
            OProgramieForm.ShowDialog();
        }

        private void frmKalkulator_Load(object sender, EventArgs e)
        {

        }

           }
}
 
0
ola1990 napisał(a):
        private void cmdIloraz_Click(object sender, EventArgs e)
        {
            try
            {
                b = dzialaj(a, b, PODZIELIC);
                if (b == 0)
                    throw new DivideByZeroException();
            }
            catch (DivideByZeroException)
            {
                {
                    
                    txtWynik.Text = "Nie mozna dzielic przez zero!!";
                }

            }
        }

pierwsze pytanie po co robisz ifa i rzucasz wyjątek, żeby za chwilę i tak go złapać? Nie mógłbyś w tym ifie wyświetlić komunikatu?
Otrzymujesz nieskończoność dlatego, że jednak te działanie wykonujesz w metodzie dzialaj. Nie można dzielić przez zero to dostajesz +inf. A nieskoczoność !== 0.

0

Albo if i wtedy od razu komunikat (bez rzucania wyjątku), albo dzielenie bez sprawdzania czy jest 0, a wyjątek sam poleci.

1 użytkowników online, w tym zalogowanych: 0, gości: 1