Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Общие вопросы по .NET и C# > калькулятор на C#


Автор: sugee 4.2.2006, 22:10
Решил вот написать простенький калькулятор...
Это моя первая программа на C#, поэтому возникают глупые вопросы.
В настоящий момент у меня есть текстовое поле и четыре кнопки:
"1","2","+","=".
Достаточно для того чтобы реализовать операцию сложения.
Есть обработчики для двух кнопок которые выводят нажатую цифирку
в текстовое поле.
Код

private void button1_Click(object sender, System.EventArgs e)
{
this.textBox1.Text = this.button1.Text;
}
        
private void button2_Click(object sender, System.EventArgs e)
{
this.textBox1.Text = this.button2.Text;
}


Вот теперь хотелось бы эти цифирки сложить.
Для начала надо преобразовать текстовые значения textBox-ов в int,
затем написать обработчики кнопок "+" и "=".
С "равно" все понятно вроде, а вот как быть с плюсом?
на ум приходят порядком подзабытые выражения типа "стек", но наверное на самом деле все не так мрачно.
В общем вот такой вопрос - как сделать 1+2 smile

Автор: mr.DUDA 5.2.2006, 00:43
Для операций с двумя операндами подойдёт и вариант попроще: есть текущее введённое число и предыдущее введённое. Пока не нажата кнопка операции либо "=", в текстбоксе редактируется "текущее". По нажатию на "+", текущее копируется в "предыдущее" и запоминается, что был нажат плюс. При последующем вводе цифры в текстбокс, всё его содержимое очищается и начинается ввод нового "текущего". Теперь если нажать на любую операцию "+", "-", "*", "/" или "=", то над "текущим" и "предыдущим" выполняется операция "плюс", и так далее как в китайском калькуляторе smile.

Автор: sugee 5.2.2006, 00:57
Ну, для начала как преобразовать string в int?

Автор: VisualProgrammerNET 5.2.2006, 03:12
метод Parse (класс Int32).

Автор: sugee 5.2.2006, 12:15
А как теперь наоборот int в string, чтобы вывести результат?

Автор: Hidrag 5.2.2006, 12:33
Вызвать метод ToString

Код

int i = 456;
string s = i.ToString();

Автор: sugee 5.2.2006, 13:04
Как не странно всё работаетsmile) Как то все подозрительно просто...
Дело в том, что это не только моя первая программа на C# но и вообще первая программа под Windows!

Автор: Дрон 5.2.2006, 15:11
sugee
Есть универсальный класс Convert для преобразований одних типов в другой.

Например если нужно преобразовать в строку, то делаем так:

Код

int i = 1234;
string s = Convert.ToString(i);


А обратно:

Код

string s = "1234";
int i = Convert.ToInt32(s);


и т.п.

Автор: sugee 5.2.2006, 18:37
Спасибо сейчас попробую!

Автор: sugee 6.2.2006, 00:24
Я рано радовался, получилось только с двумя слогаемыми.
Добавил кнопку "3" и вот до сих пор мучаюсь. 1+2+3 на моем китайском калькуляторе получается 7.
Я тут уже дошел до того что трассировочные таблицы рисую, по таблицам между прочим получается все правильно!
Вот обработчики кнопок
Код

private void button1_Click(object sender, System.EventArgs e) //кнопка 1
{
this.textBox1.Text = this.button1.Text;
tek = Int32.Parse(this.button1.Text);
}

private void button2_Click(object sender, System.EventArgs e) //кнопка 2
{
this.textBox1.Text = this.button2.Text;
tek = Int32.Parse(this.button2.Text);
}

private void button3_Click(object sender, System.EventArgs e) //кнопка +
{
prev = tek;
if(PlusClick == true) prev = prev + tek;
PlusClick = true;
}

private void button5_Click(object sender, System.EventArgs e) //кнопка 3
{
this.textBox1.Text = this.button5.Text;
tek = Int32.Parse(this.button5.Text);
}

private void button4_Click(object sender, System.EventArgs e) //кнопка =
{
if(PlusClick == true) result = prev + tek;
this.textBox1.Text = result.ToString();
}


При объявлении prev и tek(предыдущее и текущее) я обнуляю.
Хотя это тоже я погорячился, еще ведь умножать и делить придется.
PlusClick пока ничего не начали щелкать равно false.

Автор: mr.DUDA 6.2.2006, 01:12
Вот типо калькулятор, но не китайский smile
Реагирует на нажатие клавиш от 0 до 9 включительно, Enter (аналогично "=") и Escape (сброс). Поддерживает операции сложения, вычитания, умножения и деления:
Код
using System;
using System.Windows.Forms;

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

        float prev_value;
        Keys curr_operator = Keys.None;
        bool wait_for_new = false;

        void Calc()
        {
            float curr_value = float.Parse(textBox1.Text);
            float new_value = 0;
            switch(curr_operator)
            {
                case Keys.Add:
                    new_value = prev_value + curr_value;
                    textBox1.Text = new_value.ToString();
                    prev_value = new_value;
                    wait_for_new = true;
                    break;
                case Keys.Subtract:
                    new_value = prev_value - curr_value;
                    textBox1.Text = new_value.ToString();
                    prev_value = new_value;
                    wait_for_new = true;
                    break;
                case Keys.Multiply:
                    new_value = prev_value * curr_value;
                    textBox1.Text = new_value.ToString();
                    prev_value = new_value;
                    wait_for_new = true;
                    break;
                case Keys.Divide:
                    new_value = prev_value / curr_value;
                    textBox1.Text = new_value.ToString();
                    prev_value = new_value;
                    wait_for_new = true;
                    break;
                default: break;
            }
            curr_operator = Keys.None;
        }

        private void textBox1_KeyDown(object sender, KeyEventArgs e)
        {
            switch(e.KeyCode)
            {
                case Keys.Add:
                    Calc();
                    curr_operator = Keys.Add;
                    wait_for_new = true;
                    e.SuppressKeyPress = true;
                    break;
                case Keys.Subtract:
                    Calc();
                    curr_operator = Keys.Subtract;
                    wait_for_new = true;
                    e.SuppressKeyPress = true;
                    break;
                case Keys.Multiply:
                    Calc();
                    curr_operator = Keys.Multiply;
                    wait_for_new = true;
                    e.SuppressKeyPress = true;
                    break;
                case Keys.Divide:
                    Calc();
                    curr_operator = Keys.Divide;
                    wait_for_new = true;
                    e.SuppressKeyPress = true;
                    break;
                case Keys.Enter:
                    Calc();
                    wait_for_new = true;
                    e.SuppressKeyPress = true;
                    break;
                case Keys.Escape:
                    e.SuppressKeyPress = true;
                    wait_for_new = true;
                    textBox1.Text = string.Empty;
                    break;
                default:
                    if(wait_for_new)
                    {
                        prev_value = (textBox1.Text.Length > 0) ? float.Parse(textBox1.Text) : 0;
                        textBox1.Text = string.Empty;
                        wait_for_new = false;
                    }
                    break;
            };
        }

    }
}


З.Ы. как оно работает - лучше не спрашивайте, т.к. это было написано в 0 часов ночи после литра пива smile

Автор: VisualProgrammerNET 6.2.2006, 01:32
Очень любопытно, зачем вот эта конструкция нужна? smile

Код

tek = Int32.Parse(this.button1.Text);


Не проще ли было просто написать

Код

tek = 1;

?

Автор: VisualProgrammerNET 6.2.2006, 02:20
Ну ты, Дуда, даёшь... smile Парень только начинает учиться, а тут такой кодище smile

Майн вариант:

Код

public partial class Form1 : Form
    {
        private int now, total;        
        private bool first = true, text = true;

        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {

        }

        private void PushTheButton(int num)
        {
            if (first)
            {
                first = false;
                textBox2.Text = num.ToString();
                return;
            }
            textBox2.Text += num.ToString();
        }

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

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

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

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

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

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

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

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

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

        private void button10_Click(object sender, EventArgs e)
        {
            now = int.Parse(textBox2.Text);
            if (text)
            {
                text = false;
                textBox1.Text =  now.ToString();
                first = true;
                total += now;
                return;
            }
            total += now;
            textBox1.Text += "+" + now.ToString();
            first = true;
        }

        private void button11_Click(object sender, EventArgs e)
        {
            if (text)
            {
                if (now == 0)
                {                    
                    return;
                }
                total += now;
                textBox1.Text += "+" + now.ToString() + "=" + total.ToString();
                textBox2.Text = total.ToString();
                return;
            }
            now = int.Parse(textBox2.Text);
            total += now;
            textBox1.Text += "+" + now.ToString();
            first = true;
            textBox1.Text += "=" + total.ToString();
            textBox2.Text = total.ToString();
            text = true;
            total = 0;
        }

        private void button12_Click(object sender, EventArgs e)
        {
            textBox1.Text = "Вводить цифры в поле снизу!";
            textBox2.Text = "0";
            text = true;
            first = true;
            total = 0;
        }

        private void button13_Click(object sender, EventArgs e)
        {
            this.Close();
        }
    }


До конца не тестил, но ошибок вроде нет - 2 ночи всётки. Плюс пересдача линала завтра...

(С другими действиями ака вычитание и поддержкой клавы некогда было возиться)
Экзешникъ:

Автор: sugee 6.2.2006, 15:16
mr.DUDA,VisualProgrammerNET - спасибо за код, буду разбираться.

Автор: passenger 24.3.2006, 10:01
А вот мой вариант
Написал только что на паре по культурологии smile
С классами.

Автор: Gesha 24.3.2006, 10:57
Мой вариант круче всех! smile

Код

System.Diagnostics.Process p = System.Diagnostics.Process.Start("calc");

Автор: mr.DUDA 24.3.2006, 11:15
Gesha, низачОт smile

Автор: Nestap 16.12.2008, 20:32
Рибята вот такои вапрос!

ести стринг  "25+545+457*25+52/2" в (плимер)

как делать чтоб всео выпольнось по теорие матиматике?

ну чтоб :
1 :  457*25
2:   52/2
....

плизз

Автор: Remember 16.12.2008, 22:08
Советую делать с помощью рекурсивного спуска.
Пример, реализации приведен в книге Герберта Шилдта "Полный справочник по C#" глава 26.
Когда-то делал, пришлось достаточно повозиться..

Автор: Nestap 16.12.2008, 22:18
Remember

а где взять книгу?
скиниш на емаил?

а нету токая функтия чтоб авто?

а может ктота уже зделал? 
и проста поделется с нами!

Автор: Remember 17.12.2008, 16:08
Цитата(Nestap @ 16.12.2008,  20:18)
Remember

а где взять книгу?
скиниш на емаил?

а нету токая функтия чтоб авто?

а может ктота уже зделал? 
и проста поделется с нами!

Ну код наверно, есть в файлах к книге.. Герберт Шилдт с тобой и поделиться smile
Поищи книгу.. кто ищет.. тот всегда найдет.. 

Автор: taiven 17.12.2008, 16:15
Цитата(Nestap @  16.12.2008,  19:32 Найти цитируемый пост)
ести стринг  "25+545+457*25+52/2" в (плимер)
как делать чтоб всео выпольнось по теорие матиматике?

http://trubetskoy1.narod.ru/ppn.html

Автор: mosya 26.1.2009, 14:28
Вклинюсь в темку smile
Вот вроде доделал свой калькулятор, но вот есть одно "но"...не работает "равно" по нажатию клавиши Enter... и то только в том случае когда активна форма...

В общем вот... сам калькулятор:
http://depositfiles.com/files/uv08itshq
кому не лень можете посмотреть что не так?... 
И так как это мой первый опыт в C# рад буду слышать любые замечания или пожелания как можно было сделать лучше и проще smile

Заранее спасибо!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)