Kalkulator w WinForms - prośba o review kodu

0

Cześć. Mówcie co jest złego w moim programie i co mam poprawić żeby było lepiej. Jeżeli chodzi o działanie programu to mam jeden problem.
Wciskanie "=" kilka razy po wykonaniu działania powoduje wykonywanie działania na wyniku i pierwszej liczbie czyli 2 + 3 = = = daje 5 7 9 a w standardowych kalkulatorach funkcjonuje to tak że dodawana byłaby druga liczba.
Czy trzeba wprowadzać jakąś dodatkową zmienną pomocniczą aby to osiągnąć nie psując przycisku i reszty programu "="?

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

namespace Kalkulator
{
    public partial class Form1 : Form
    {
        enum Dzialania { dodawanie, odejmowanie, mnozenie, dzielenie,nic};
        double pierwsze;
        double drugie;
        Dzialania dzialanie;

        bool czyjestkropka = false;
        bool czyusuwacstare = false;
        bool czymoznadzialac = true;

        public Form1()
        {
            InitializeComponent();
            textBox1.Text = "0";
            
        }

        private void WprowadzLiczbe(object sndr)
        {
            if ((czyusuwacstare==true)||(textBox1.Text == "0"))
            {
                pierwsze = Convert.ToDouble(textBox1.Text);
                textBox1.Text = ((Button)sndr).Text;
                czyusuwacstare = false;
                czyjestkropka = false;
                czymoznadzialac = true;// klawisze działań mogą przeprowadzać obliczenia jedynie po wprowadzeniu nowych danych

            }
            
            else
            {
                textBox1.Text += ((Button)sndr).Text;
            }
            
        }

        // Metoda wywoływana po wciśnięciu jednego z przycisków działania(+ - * /)
        private void UstawDzialanie(Dzialania jakiedzialanie)
        {
            // Jeśli można działać oraz rodzaj działania jest ustawiony następuje obliczanie
            if(czymoznadzialac==true)
            {
                WykonajDzialanie();
                czymoznadzialac = false;// Gdy false, przycisk dzialania moze zmieniac tylko rodzaj dzialania ale nie przeprowadzi obliczen
            }

            dzialanie = jakiedzialanie;// Rodzaj działania może być zawsze zmieniony
            czyusuwacstare = true;
            


        }


        private void WykonajDzialanie()
        {
            switch(dzialanie)
            {
                case Dzialania.dodawanie:
                    drugie = Convert.ToDouble(textBox1.Text);
                    textBox1.Text = Convert.ToString(pierwsze + drugie);
                    break;
                case Dzialania.odejmowanie:
                    drugie = Convert.ToDouble(textBox1.Text);
                    textBox1.Text = Convert.ToString(pierwsze - drugie);
                    break;
                case Dzialania.mnozenie:
                    drugie = Convert.ToDouble(textBox1.Text);
                    textBox1.Text = Convert.ToString(pierwsze * drugie);
                    break;
                case Dzialania.dzielenie:
                    drugie = Convert.ToDouble(textBox1.Text);
                    textBox1.Text = Convert.ToString(pierwsze / drugie);
                    break;


            }
            
        }


        private void button10_Click(object sender, EventArgs e)
        {
            WprowadzLiczbe(sender);
        }

        private void button1_Click(object sender, EventArgs e)
        {
            WprowadzLiczbe(sender);
        }

        private void button2_Click(object sender, EventArgs e)
        {
            WprowadzLiczbe(sender);
        }

        private void button9_Click(object sender, EventArgs e)
        {
            WprowadzLiczbe(sender);
        }

        private void button6_Click(object sender, EventArgs e)
        {
            WprowadzLiczbe(sender);
        }

        private void button7_Click(object sender, EventArgs e)
        {
            WprowadzLiczbe(sender);
        }

        private void button8_Click(object sender, EventArgs e)
        {
            WprowadzLiczbe(sender);
        }

        private void button3_Click(object sender, EventArgs e)
        {
            WprowadzLiczbe(sender);
        }

        private void button4_Click(object sender, EventArgs e)
        {
            WprowadzLiczbe(sender);
        }

        private void button5_Click(object sender, EventArgs e)
        {
            WprowadzLiczbe(sender);
        }

        private void button14_Click(object sender, EventArgs e)// Przycisk C
        {
            textBox1.Text = "0";
            czyjestkropka = false;
            czyusuwacstare = true;
            czymoznadzialac = false;
            dzialanie = Dzialania.nic;
            
        }

        

        private void button13_Click(object sender, EventArgs e)// Przycisk =
        {
            WykonajDzialanie();
            czymoznadzialac = false;
        }


        private void button11_Click(object sender, EventArgs e)// Przycisk +
        {
            UstawDzialanie(Dzialania.dodawanie);
        }

        private void button12_Click(object sender, EventArgs e)// Przycisk -
        {
            UstawDzialanie(Dzialania.odejmowanie);
        }

        private void button15_Click(object sender, EventArgs e)// Przycisk *
        {
            UstawDzialanie(Dzialania.mnozenie);
        }

        private void button16_Click(object sender, EventArgs e)// Przycisk /
        {
            UstawDzialanie(Dzialania.dzielenie);
        }

        private void button17_Click(object sender, EventArgs e)// Przycisk ,
        {
            if(czyjestkropka==false)
            {
                textBox1.Text += ",";
                czyjestkropka = true;
                czyusuwacstare = false;
            }
        }
    }
}
1

To co jest na minus

  1. Duplikacja kodu
     private void button7_Click(object sender, EventArgs e)
        {
            WprowadzLiczbe(sender);
        }
 
        private void button8_Click(object sender, EventArgs e)
        {
            WprowadzLiczbe(sender);
        }

Czym ten kod się różni?

2 . Nazewnictwo - czymoznadzialac? dałbyś chociaż camelCase, no i kod raczej powinien zawierać angielskie nazewnictwo zachowując np przedrostki is/has dla funkcji zwracających boolean

  1. Niepotrzebne komentarze - można tam dać nazwy funkcji, które odpowiadają faktycznie temu co dana funkcja robi.

  2. Kodu nie testowałem - ale czy to obsłuży dzielenie przez zero?

0

Nie chciałem tej duplikacji ale Visual Studio nie pozwalało mi zmieniać obsługi przycisków więc zostawiłem automatycznie wygenerowane metody.
Komentarze może czasami rzeczywiście bez sensu. W przypadku dzielenia przez zero wynikiem jest nieskończoność bo tak działa to na typie double.

1

Żeby do wielu przycisków dodać tą samą metodę możesz na przykład wybierając w properties danego przycisku stworzoną wcześniej metodę.

Najpierw dwuklikiem stworzyłem metodę dla button1, teraz mogę ją przypisać do button2
62ae7c643e.png

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