none
Помогите найти ошибку в программе RRS feed

  • Вопрос

  • Немного не правильно работает калькулятор. Помогите пожалуйста найти ошибку. Файл с солюшеном - тут. http://webfile.ru/6450432

    Исходный код:

    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;
    using System.Media;
    
    namespace Calculator_v1._3
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }
    
            int clear = 1;
            decimal result, mresult = 0;
            string op;
    
            int Clear(int cl)
            {
                switch (cl)
                {
                    case 1:
                        {
                            label_main.Text = "";
                        }
                        break;
                    case 2:
                        {
                            label_main.Text = "";
                            label_info.Text = "";
                            op = "";
                        } break;
                    case 3:
                        {
                            label_main.Text = "";
                            label_info.Text = label_info.Text.Remove(label_info.Text.IndexOf('r'));
                        } break;
                    case 4:
                        {
                            label_main.Text = "";
                            label_info.Text = label_info.Text.Remove(label_info.Text.IndexOf('s'));
                        } break;
                    case 5:
                        {
                            label_main.Text = "";
                            label_info.Text = label_info.Text.Remove(label_info.Text.LastIndexOf(' ') + 1);
                        } break;
                }
    
                return 0;
            }
    
            decimal evaluation(string op)
            {
                clear = 1;
                try
                {
                    switch (op)
                    {
                        case "+": result = result + Convert.ToDecimal(label_main.Text); break;
                        case "-": result = result - Convert.ToDecimal(label_main.Text); break;
                        case "/": result = result / Convert.ToDecimal(label_main.Text); break;
                        case "*": result = result * Convert.ToDecimal(label_main.Text); break;
                        case "Mod": result = result % Convert.ToDecimal(label_main.Text); break;
                        default: result = Convert.ToDecimal(label_main.Text); break;
                    }
                }
                catch (System.OverflowException) { label_info.Text = ""; label_info.Text = "Overflow"; clear = 2; SystemSounds.Asterisk.Play(); }
                catch (System.DivideByZeroException) { label_info.Text = ""; label_info.Text = "Cannot divide by zero"; clear = 2; SystemSounds.Asterisk.Play(); }
                return result;
            }
    
            private void button_0_Click(object sender, EventArgs e)
            {
                clear = Clear(clear);
                if (label_main.Text.Length < 28)
                    label_main.Text = label_main.Text + "0";
                else SystemSounds.Beep.Play();
            }
    
            private void button_1_Click(object sender, EventArgs e)
            {
                clear = Clear(clear);
                if (label_main.Text.Length < 28)
                    label_main.Text = label_main.Text + "1";
                else SystemSounds.Beep.Play();
            }
    
            private void button_2_Click(object sender, EventArgs e)
            {
                clear = Clear(clear);
                if (label_main.Text.Length < 28)
                    label_main.Text = label_main.Text + "2";
                else SystemSounds.Beep.Play();
            }
    
            private void button_3_Click(object sender, EventArgs e)
            {
                clear = Clear(clear);
                if (label_main.Text.Length < 28)
                    label_main.Text = label_main.Text + "3";
                else SystemSounds.Beep.Play();
            }
    
            private void button_4_Click(object sender, EventArgs e)
            {
                clear = Clear(clear);
                if (label_main.Text.Length < 28)
                    label_main.Text = label_main.Text + "4";
                else SystemSounds.Beep.Play();
            }
    
            private void button_5_Click(object sender, EventArgs e)
            {
                clear = Clear(clear);
                if (label_main.Text.Length < 28)
                    label_main.Text = label_main.Text + "5";
                else SystemSounds.Beep.Play();
            }
    
            private void button_6_Click(object sender, EventArgs e)
            {
                clear = Clear(clear);
                if (label_main.Text.Length < 28)
                    label_main.Text = label_main.Text + "6";
                else SystemSounds.Beep.Play();
            }
    
            private void button_7_Click(object sender, EventArgs e)
            {
                clear = Clear(clear);
                if (label_main.Text.Length < 28)
                    label_main.Text = label_main.Text + "7";
                else SystemSounds.Beep.Play();
            }
    
            private void button_8_Click(object sender, EventArgs e)
            {
                clear = Clear(clear);
                if (label_main.Text.Length < 28)
                    label_main.Text = label_main.Text + "8";
                else SystemSounds.Beep.Play();
            }
    
            private void button_9_Click(object sender, EventArgs e)
            {
                clear = Clear(clear);
                if (label_main.Text.Length < 28)
                    label_main.Text = label_main.Text + "9";
                else SystemSounds.Beep.Play();
            }
    
            private void button_Comma_Click(object sender, EventArgs e)
            {
                if (label_main.Text.Contains('.'))
                {
                    SystemSounds.Beep.Play();
                }
                else label_main.Text = label_main.Text + ".";
            }
    
            private void button_Plus_Click(object sender, EventArgs e)
            {
                if (clear == 3 || clear == 4 || clear == 5)
                    label_info.Text = label_info.Text + " + ";
                else label_info.Text = label_info.Text + label_main.Text + " + ";
                label_main.Text = evaluation(op).ToString();
                op = "+";
            }
    
            private void button_Minus_Click(object sender, EventArgs e)
            {
                if (clear == 3 || clear == 4 || clear == 5)
                    label_info.Text = label_info.Text + " - ";
                else label_info.Text = label_info.Text + label_main.Text + " - ";
                label_main.Text = evaluation(op).ToString();
                op = "-";
            }
    
            private void button_Slash_Click(object sender, EventArgs e)
            {
                if (clear == 3 || clear == 4 || clear == 5)
                    label_info.Text = label_info.Text + " / ";
                else label_info.Text = label_info.Text + label_main.Text + " / ";
                label_main.Text = evaluation(op).ToString();
                op = "/";
            }
    
            private void button_Asterisk_Click(object sender, EventArgs e)
            {
                if (clear == 3 || clear == 4 || clear == 5)
                    label_info.Text = label_info.Text + " * ";
                else label_info.Text = label_info.Text + label_main.Text + " * ";
                label_main.Text = evaluation(op).ToString();
                op = "*";
            }
    
            private void button_Mod_Click(object sender, EventArgs e)
            {
                if (clear == 3 || clear == 4 || clear == 5)
                    label_info.Text = label_info.Text + " Mod ";
                else label_info.Text = label_info.Text + label_main.Text + " Mod ";
                label_main.Text = evaluation(op).ToString();
                op = "Mod";
            }
    
            private void button_1_x_Click(object sender, EventArgs e)
            {
                if (label_info.Text.Contains("reciproc"))
                {
                    label_info.Text = label_info.Text.Insert(label_info.Text.IndexOf('r'), "reciproc(");
                    label_info.Text = label_info.Text.Insert(label_info.Text.IndexOf(')'), ")");
                }
                else
                    label_info.Text = label_info.Text + "reciproc(" + label_main.Text + ")";
                label_main.Text = (1 / Convert.ToDecimal(label_main.Text)).ToString(); clear = 3;
            }
    
            private void button_SquareRoot_Click(object sender, EventArgs e)
            {
                if (label_info.Text.Contains("sqrt"))
                {
                    label_info.Text = label_info.Text.Insert(label_info.Text.IndexOf('s'), "sqrt(");
                    label_info.Text = label_info.Text.Insert(label_info.Text.IndexOf(')'), ")");
                }
                else
                    label_info.Text = label_info.Text + "sqrt(" + label_main.Text + ")";
                label_main.Text = Math.Sqrt(Convert.ToDouble(label_main.Text)).ToString(); clear = 4;
            }
    
            private void button_Percent_Click(object sender, EventArgs e)
            {
                label_main.Text = (result * Convert.ToDecimal(label_main.Text) / 100).ToString();
                label_info.Text = label_info.Text + label_main.Text;
                clear = 5;
            }
    
            private void button_PlusMinus_Click(object sender, EventArgs e)
            {
                if (label_main.Text.Contains('-'))
                {
                    label_main.Text = label_main.Text.Remove(label_main.Text.IndexOf('-'), 1);
                }
                else label_main.Text = "-" + label_main.Text;
            }
    
            private void button_Equal_Click(object sender, EventArgs e)
            {
                if (clear != 3 && clear != 4 && clear != 5)
                    label_info.Text = label_info.Text + label_main.Text;
                label_main.Text = evaluation(op).ToString(); clear = 2;
            }
    
            private void button_CE_Click(object sender, EventArgs e)
            {
                Clear(2); clear = 1; label_main.Text = "0"; result = 0;
            }
    
            private void button_C_Click(object sender, EventArgs e)
            {
                Clear(1); clear = 1; label_main.Text = "0";
            }
    
            private void button_MS_Click(object sender, EventArgs e)
            {
                mresult = Convert.ToDecimal(label_main.Text);
                clear = 1;
                label_M.Text = "M";
            }
    
            private void button_MR_Click(object sender, EventArgs e)
            {
                label_main.Text = mresult.ToString();
                clear = 1;
            }
    
            private void button_M_plus_Click(object sender, EventArgs e)
            {
                mresult = mresult + Convert.ToDecimal(label_main.Text);
                clear = 1;
            }
    
            private void button_M_minus_Click(object sender, EventArgs e)
            {
                mresult = mresult - Convert.ToDecimal(label_main.Text);
                clear = 1;
            }
    
            private void button_MC_Click(object sender, EventArgs e)
            {
                mresult = 0;
                clear = 1;
                label_M.Text = String.Empty;
            }
    
            private void label1_TextChanged(object sender, EventArgs e)
            {
                if (label_main.Text.Length <= 20)
                {
                    Font font = new Font("Consolas", 14, FontStyle.Regular);
                    label_main.Font = font;
                }
                else if (label_main.Text.Length > 20 && label_main.Text.Length <= 26)
                {
                    Font font = new Font("Consolas", 11, FontStyle.Regular);
                    label_main.Font = font;
                }
                else
                {
                    Font font = new Font("Consolas", 9, FontStyle.Regular);
                    label_main.Font = font;
                }
            }
        }
    }
    

    28 марта 2013 г. 13:40

Ответы

  • Привет,

    чтобы работало как стандартный измените:

            private void button_Equal_Click(object sender, EventArgs e)
            {
                if (clear != 3 && clear != 4 && clear != 5)
                    label_info.Text = label_info.Text + label_main.Text;
                label_main.Text = evaluation(op).ToString(); clear = 2;
                label_info.Text = "";
                op = "=";
            }

    и в методе evaluation добавьте 

    case "=": break;


    Для связи [mail]

    • Предложено в качестве ответа Abolmasov Dmitry 29 марта 2013 г. 9:41
    • Помечено в качестве ответа LXGDARKEditor 30 марта 2013 г. 18:48
    29 марта 2013 г. 9:41

Все ответы

  • В целях ускорения решения вашей задачи было бы полезным расшифровать строку "Немного не правильно работает калькулятор".

    Что именно он делает не так, как ожидается?


    Женат на WPF. Тайно встречаюсь с WinRT. Не сложилось с C#!

    28 марта 2013 г. 14:50
    Отвечающий
  • Калькулятор - по типу виндовского. Есть 2 поля, водном, отображается то, что вводим с клавиатуры, в другом - история действий + результат. Вот это вспомогательное поле не совсем корректно выводит информацию. На словах внятно не объясню. Нужно солюшн запустить, чтобы увидеть что происходит.
    28 марта 2013 г. 17:12
  • Привет,

    чтобы работало как стандартный измените:

            private void button_Equal_Click(object sender, EventArgs e)
            {
                if (clear != 3 && clear != 4 && clear != 5)
                    label_info.Text = label_info.Text + label_main.Text;
                label_main.Text = evaluation(op).ToString(); clear = 2;
                label_info.Text = "";
                op = "=";
            }

    и в методе evaluation добавьте 

    case "=": break;


    Для связи [mail]

    • Предложено в качестве ответа Abolmasov Dmitry 29 марта 2013 г. 9:41
    • Помечено в качестве ответа LXGDARKEditor 30 марта 2013 г. 18:48
    29 марта 2013 г. 9:41
  • Дмитрий, спасибо, теперь вроде, все работает, как нужно. Единственное что...думаю, в обработку кнопки equal нужно добавить еще кое,что... Что имею ввиду - если в калькуляторе набрать, на пример 2+2 и нажать равно - покажет, естественно 4 :) а вот, если еще раз нажать равно, то покажет 6, еще раз равно - 8...и т. д. Т.е к конечному результату постоянно присваевается 2-ка. Тоже самое при умножении, делении..и других операциях.

    И еще, что нужно сделать, чтобы кнопки реагировали на нажатие цифр на клавиатуре? Сейчас можно только мышкой ?

    Спасибо.

    • Изменено Andrey Langovoy 30 марта 2013 г. 13:35
    • Помечено в качестве ответа LXGDARKEditor 30 марта 2013 г. 13:59
    • Снята пометка об ответе LXGDARKEditor 30 марта 2013 г. 18:48
    30 марта 2013 г. 13:31
  • Уважаемый plywoods. Один вопрос - одна тема. Создайте новую тему и задайте новый вопрос. Что бы было легче вникнуть в суть вопроса можете дать ссылку на этот топик. Это нужно что бы привлечь больше участников к вашей теме и ускорить помощь вам, так как в темы где ответ на первоначальный вопрос уже дан многие не заглядывают. Так же не забывайте помечать ответ решивший вашу проблему.

    Женат на WPF. Тайно встречаюсь с WinRT. Не сложилось с C#!

    30 марта 2013 г. 13:59
    Отвечающий
  • Уважаемый lxgdark я задал вопрос в пределах одной  темы...а если у меня по-ходу реализации, будет 20 вопросов, мне 20 тем создать, с одним и тем же приложением? Или все-таки можно обсудить все в пределах одного топика? Получается, что дискутировать, вообще не получится?
    30 марта 2013 г. 18:44
  • а если у меня по-ходу реализации, будет 20 вопросов, мне 20 тем создать

    Именно. Одну из причин этого я вам назвал. Вторая в том, что другие столкнувшиеся с одной из проблем, с которыми вы сталкиваетесь по ходу работы найдут тему конкретно по этой проблеме, а не тему в 100 сообщений из которых трудно что то вынести.

    К тому же ваши последующие вопросы не имеют отношения к первоначальному "Помогите найти ошибку". Ошибка найдена - ответ дан. Последующие вопросы по реализации тех или иных функций не являющихся следствием ошибки.

    P.S. Ошибся с пометкой ответа, исправил.


    Женат на WPF. Тайно встречаюсь с WinRT. Не сложилось с C#!

    30 марта 2013 г. 18:50
    Отвечающий