Модераторы: Partizan, gambit

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> калькулятор на C#, преобразовать string в int и кое что ещё 
V
    Опции темы
sugee
Дата 4.2.2006, 22:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 423
Регистрация: 12.6.2005

Репутация: нет
Всего: 4



Решил вот написать простенький калькулятор...
Это моя первая программа на 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
PM MAIL   Вверх
mr.DUDA
Дата 5.2.2006, 00:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 110
Всего: 232



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


--------------------
user posted image
PM MAIL WWW   Вверх
sugee
Дата 5.2.2006, 00:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 423
Регистрация: 12.6.2005

Репутация: нет
Всего: 4



Ну, для начала как преобразовать string в int?
PM MAIL   Вверх
VisualProgrammerNET
Дата 5.2.2006, 03:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Почётный халявщик
**


Профиль
Группа: Участник
Сообщений: 461
Регистрация: 30.10.2005
Где: Зеленоград

Репутация: 4
Всего: 6



метод Parse (класс Int32).


--------------------
3 ГОДА НА user posted image 
PM MAIL ICQ   Вверх
sugee
Дата 5.2.2006, 12:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 423
Регистрация: 12.6.2005

Репутация: нет
Всего: 4



А как теперь наоборот int в string, чтобы вывести результат?
PM MAIL   Вверх
Hidrag
Дата 5.2.2006, 12:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 877
Регистрация: 9.4.2005
Где: JDK

Репутация: 2
Всего: 25



Вызвать метод ToString

Код

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



--------------------
user posted image
PM WWW ICQ   Вверх
sugee
Дата 5.2.2006, 13:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 423
Регистрация: 12.6.2005

Репутация: нет
Всего: 4



Как не странно всё работаетsmile) Как то все подозрительно просто...
Дело в том, что это не только моя первая программа на C# но и вообще первая программа под Windows!
PM MAIL   Вверх
Дрон
Дата 5.2.2006, 15:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Java-ненавистник :)
****


Профиль
Группа: Участник Клуба
Сообщений: 3179
Регистрация: 29.12.2002
Где: Санкт-Петербург

Репутация: 24
Всего: 93



sugee
Есть универсальный класс Convert для преобразований одних типов в другой.

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

Код

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


А обратно:

Код

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


и т.п.


--------------------
Да. Именно так.
PM   Вверх
sugee
Дата 5.2.2006, 18:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 423
Регистрация: 12.6.2005

Репутация: нет
Всего: 4



Спасибо сейчас попробую!
PM MAIL   Вверх
sugee
Дата 6.2.2006, 00:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 423
Регистрация: 12.6.2005

Репутация: нет
Всего: 4



Я рано радовался, получилось только с двумя слогаемыми.
Добавил кнопку "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.
PM MAIL   Вверх
mr.DUDA
Дата 6.2.2006, 01:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 110
Всего: 232



Вот типо калькулятор, но не китайский 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


--------------------
user posted image
PM MAIL WWW   Вверх
VisualProgrammerNET
Дата 6.2.2006, 01:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Почётный халявщик
**


Профиль
Группа: Участник
Сообщений: 461
Регистрация: 30.10.2005
Где: Зеленоград

Репутация: 4
Всего: 6



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

Код

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


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

Код

tek = 1;

?


--------------------
3 ГОДА НА user posted image 
PM MAIL ICQ   Вверх
VisualProgrammerNET
Дата 6.2.2006, 02:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Почётный халявщик
**


Профиль
Группа: Участник
Сообщений: 461
Регистрация: 30.10.2005
Где: Зеленоград

Репутация: 4
Всего: 6



Ну ты, Дуда, даёшь... 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 ночи всётки. Плюс пересдача линала завтра...

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

Это сообщение отредактировал(а) VisualProgrammerNET - 6.2.2006, 02:23

Присоединённый файл ( Кол-во скачиваний: 144 )
Присоединённый файл  Casio.exe.txt 24,00 Kb


--------------------
3 ГОДА НА user posted image 
PM MAIL ICQ   Вверх
sugee
Дата 6.2.2006, 15:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 423
Регистрация: 12.6.2005

Репутация: нет
Всего: 4



mr.DUDA,VisualProgrammerNET - спасибо за код, буду разбираться.
PM MAIL   Вверх
passenger
Дата 24.3.2006, 10:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 9.2.2006

Репутация: нет
Всего: нет



А вот мой вариант
Написал только что на паре по культурологии smile
С классами.

Присоединённый файл ( Кол-во скачиваний: 229 )
Присоединённый файл  _________Calculator_______.zip 41,21 Kb
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.0606 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.