Некогда мы уже создавали подобный калькулятор, но он был довольно простенький и не имел общего TextBox’a для всех чисел.
В данной статье же мы создадим более усовершенствованный калькулятор Windows Forms.Итак, выглядеть у нас он будет вот так:
Здесь у нас 19 кнопок Button, 1 Textbox и ещё 1 пустой Label (на рисунке он выделен). Применение его будет описано ниже.
Итак, создаём такую или похожую форму. Мы увеличили ширину TextBox’a, используя MultiLine:
Также в Свойствах мы увеличили размер шрифта в TextBox’e и Label’e до 12 пт.
Теперь делаем так, чтобы при нажатии на цифровые кнопки, в TextBox’e появлялась соответствующая цифра.
Для этого дважды кликаем на кнопке «0» и в открывшемся коде пишем:
1 2 3 4 |
private void button17_Click(object sender, EventArgs e) { textBox1.Text = textBox1.Text + 0; } |
Проверяем, несколько раз нажав на кнопку «0» у нас в форме.
Работает. Делаем то же самое с остальными цифровыми кнопками:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 |
private void button13_Click(object sender, EventArgs e) { textBox1.Text = textBox1.Text + 1; } private void button14_Click(object sender, EventArgs e) { textBox1.Text = textBox1.Text + 2; } private void button15_Click(object sender, EventArgs e) { textBox1.Text = textBox1.Text + 3; } private void button9_Click(object sender, EventArgs e) { textBox1.Text = textBox1.Text + 4; } private void button10_Click(object sender, EventArgs e) { textBox1.Text = textBox1.Text + 5; } private void button11_Click(object sender, EventArgs e) { textBox1.Text = textBox1.Text + 6; } private void button5_Click(object sender, EventArgs e) { textBox1.Text = textBox1.Text + 7; } private void button6_Click(object sender, EventArgs e) { textBox1.Text = textBox1.Text + 8; } private void button7_Click(object sender, EventArgs e) { textBox1.Text = textBox1.Text + 9; } |
Таким же образом кликаем дважды на кнопку «.» в форме. Она будет использоваться для создания десятичной дроби. Пишем следующий код:
1 2 3 4 |
private void button18_Click(object sender, EventArgs e) { textBox1.Text = textBox1.Text + ","; } |
Кнопки нажимаются, в TextBox’e отображаются нажатые цифры. Теперь надо научить программу производить с ними какие-либо операции. Как видно из формы, наш калькулятор сможет производить стандартные математические операции: сложение, вычитание, умножение и деление. Для начала мы создадим в самом начале программы несколько переменных, которые нам для этого понадобятся:
1 2 3 |
float a, b; int count; bool znak = true; |
Первым двум переменным будут присваиваться значения, набранные пользователем в калькуляторе. В последствии с ними будут производиться нужные математические операции. Тип float — это тип с плавающей точкой, позволяющий работать с десятичными дробями, что нам, безусловно, нужно при наличии кнопки «.» .
Благодаря второй переменной мы будем давать программе указания, какую именно операцию производить с переменными, описанными выше. Здесь нам не нужна дробь, поэтому обойдёмся целочисленным типом int.
Последняя переменная znak нам понадобится для того, чтобы менять знаки у введённых чисел. Тип bool может иметь два значения — ture и false. Мы представим, что если znak имеет значение true в программе, то это означает, что у числа знак +, если false — число отрицательное и перед собой имеет знак —. Изначально в калькуляторе вбиваются положительные числа, поэтому мы сразу присвоили переменной значение true.
Далее мы дважды нажимаем на кнопку «+», обозначающую сложение, на форме и пишем следующий код:
1 2 3 4 5 6 7 8 |
private void button4_Click(object sender, EventArgs e) { a = float.Parse(textBox1.Text); textBox1.Clear(); count = 1; label1.Text = a.ToString() + "+"; znak = true; } |
В строке 3 мы присваиваем первой переменной a то, что будет написано в TextBox’e (а именно число, которое введёт пользователь перед тем, как нажать кнопку «+»).
Затем TextBox очищается, число, введённое пользователем, в нём пропадает (но остаётся в переменной a)
Переменной count присваивается число 1, которая потом укажет программе, что именно операцию сложения надо будет произвести с числами.
Затем в Label записывается число из переменной a (то самое, которое изначально ввёл пользователь) и знак плюса. Выглядеть в форме это будет так, как описано ниже.
Пользователь вводит какое-либо число:
Затем нажимает на кнопку «+» и после этого видит:
Кроме того, как бы не было странным с первого взгляда, мы присваиваем переменной znak значение true, хотя выше, в начале кода, мы и так присваивали это же значение. Подробнее данную переменную мы опишем ниже, но смысл в том, что мы присваиваем значение true, когда хотим сделать введённое число отрицательным, если оно положительно, а значение false, когда хотим сделать число положительным, если оно отрицательное. Изначально у нас вводятся положительные числа, сначала первое, потом второе. И если первое число мы сделаем отрицательным, то значение у znak перейдёт в false и тогда получится, что второе слагаемое как бы отрицательное (на практике, просто чтобы поставить перед ним минус, придётся нажать дважды на соответствующую кнопку, чтобы с false значение перешло в true, а затем обратно с true в false, и появился знак минуса).
Подобным образом заполняем код для кнопок «-«, «*» и «/»:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
private void button8_Click(object sender, EventArgs e) { a = float.Parse(textBox1.Text); textBox1.Clear(); count = 2; label1.Text = a.ToString() + "-"; znak = true; } private void button12_Click(object sender, EventArgs e) { a = float.Parse(textBox1.Text); textBox1.Clear(); count = 3; label1.Text = a.ToString() + "*"; znak = true; } private void button16_Click(object sender, EventArgs e) { a = float.Parse(textBox1.Text); textBox1.Clear(); count = 4; label1.Text = a.ToString() + "/"; znak = true; } |
Разница лишь в значении переменной count и в том, какой знак добавляется в Label’e.
Далее нам понадобится создать функцию, которая будет применять нужные нам математические операции к числам. Назовём её calculate. Но перед этим мы кликнем дважды на кнопку «=» на форме и в коде к ней мы запишем:
1 2 3 4 5 |
private void button19_Click(object sender, EventArgs e) { calculate(); label1.Text = ""; } |
То есть, при нажатии пользователем на кнопку «=», как раз выполнится наша функция подсчёта calculate, и, заодно, очистится Label, так как результат мы в будущем коде выведем в TextBox.
Теперь-таки создаём нашу функцию calculate и пишем следующий код:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
private void calculate() { switch(count) { case 1: b = a + float.Parse(textBox1.Text); textBox1.Text = b.ToString(); break; case 2: b = a - float.Parse(textBox1.Text); textBox1.Text = b.ToString(); break; case 3: b = a * float.Parse(textBox1.Text); textBox1.Text = b.ToString(); break; case 4: b = a / float.Parse(textBox1.Text); textBox1.Text = b.ToString(); break; default: break; } } |
Здесь мы используем конструкцию switch-case.
Switch — это оператор управления. Он может включать в себя несколько case’ов. Case — метки, от значения которых зависит, какие операции будут происходить.
Строка switch(count) означает, что именно от значения count будет зависеть, какое действие будет происходить в коде switch’a.
Итак, если count=1 (в коде case 1:), то произойдёт следующее:
После того, как пользователь нажал «+», он, естественно, должен ввести второе слагаемое, что он и делает по стандартному сценарию, а затем нажать кнопку «=» (и в ней, как мы помним, как раз выполнится наша функция).
Как только кнопка «=» будет нажата, программа сложит число из переменной a с тем вторым слагаемым, которое записал пользователь в TextBox, и запишет результат в переменную b (строка 6 кода функции). В строке 7 программа выведет в TextBox результат сложения — переменную b.
Оператор break (строка 8) завершает исполнение кода switch при выполнении кода метки case 1, так как больше нам в нём делать нечего.
Точно так же строится алгоритм при case 2, case 3 и case 4 с той разницей, что в них происходит не сложение, а вычитание, умножение и деление соответственно.
Оператор default срабатывает, если вдруг что-то пойдёт не по плану и count примет какое-либо иное значение, не описанное в switch. Тогда срабатывает лишь оператор break.
Львиная доля программы готова. Нам надо лишь написать код для трёх оставшихся нетронутыми до этого время кнопок.
Дважды жмём в форме на кнопку «С». Она будет очищать все записи из TextBox’a и Label’a.
Код у неё элементарный:
1 2 3 4 5 |
private void button3_Click(object sender, EventArgs e) { textBox1.Text = ""; label1.Text = ""; } |
На очереди у нас кнопка «<—«. Она будет удалять последнюю цифру записанного в TextBox’e числа. Код:
1 2 3 4 5 6 7 8 9 10 |
private void button2_Click(object sender, EventArgs e) { int lenght = textBox1.Text.Length - 1; string text = textBox1.Text; textBox1.Clear(); for (int i = 0; i < lenght; i++) { textBox1.Text = textBox1.Text + text[i]; } } |
Мы вводим новую переменную lenght целочисленного типа и записываем в неё количество символов в TextBox’e минус один символ.
Также мы вводим новую переменную text, в которую полностью заносим текст из TextBox’а. Затем мы очищаем TextBox и вводим цикл for, через который записываем в TextBox строку text, но уже на символ короче.
Например, в TextBox’e записано число 504523
При нажатии на кнопку «<—« в переменную lenght записывается число 5 (6 цифр — 1), в переменную text записывается строка «504523», TextBox очищается, а затем в него по одному записываются символы из text, но в этот раз их будет не 6, а 5, то есть в TextBox’e появится число 50452.
У нас остаётся последняя кнопка, которая отвечает за знак первого слагаемого. Переходим к её коду. Тут мы будет работать с переменной znak, которую описывали выше. Код выглядит вот так:
1 2 3 4 5 6 7 8 9 10 11 12 |
private void button1_Click(object sender, EventArgs e) { if(znak==true) { textBox1.Text = "-" + textBox1.Text; znak = false; } else if (znak==false) { textBox1.Text=textBox1.Text.Replace("-", ""); znak = true; } |
Изначально, как мы помним, у переменной znak стоит значение true. Если мы нажмём на кнопку первый раз, то в TextBox’e перед числом появится знак «-«, а переменной znak будет присвоено значение false.
Если второй раз нажать на данную кнопку, то, так как znak у нас false, произойдёт второе условие. Здесь используется метод Replace, который заменяет какой-либо кусок строки на другой. В скобках после метода вначале пишется, что будет заменено в строке, а после запятой, то, на что заменять. В данном случае мы заменяем в TextBox’e минус на пустое значение.
Вот и всё, наш калькулятор Windows Forms готов! Можно его тестировать!
Если у Вас возникнут вопросы или просьбы по данной программе, можете оставить комментарий под этой записью. А исходный код калькулятора можно скачать ниже:
Скачать исходник
Поделиться в соц. сетях:
Хотелось бы узнать как обработать ошибку деления на 0.
При делении на 0 в качестве результата автоматически возвращается строка «бесконечность» (infinity).
Но можно и обработать данную ситуацию в программе, например, так (в методе calculate):
case 4:
float divider;
divider = float.Parse(textBox1.Text);
if (divider == 0.0)
MessageBox.Show(«Внимание! Деление на ноль!»);
else
{
b = a / divider;
textBox1.Text = b.ToString();
}
break;
Теперь при делении на 0 отобразится MessageBox с предупреждением.
ОГРОМНОЕ Вам спасибо!!!
Спасибо!
А что делать, если например: 1 плюс 2 и потом еще раз нажать на плюс 2. Посчитает только 2 + 2. Как сделать чтобы сначала считалось 1+2 потом 3+2
Очень хороший, наглядный урок !!!
А как сделать ввод чисел с клавиатуры? Эксепшн выскакивает, а при нажатии мышкой всё гуд
Доброго времени суток! Как сделать чтобы нельзя было повторно вводить запятую?
Здравствуйте, Евгений.
Для запрета на ввод дополнительной запятой с кнопки Button можно использовать следующий код вместо кода в button18_Click:
if (textBox1.Text.IndexOf(‘,’) == -1)
{
textBox1.Text += «,»;
}
Для подобного запрета с клавиатуры надо выбрать в TextBox’e событие KeyPress и написать в нём:
if (e.KeyChar == ‘,’)
{
if (textBox1.Text.IndexOf(‘,’) != -1)
{
e.Handled = true;
}
}
Здравствуйте, а не подскажете, как сделать так, чтобы этот калькулятор мог понимать скобки?
Нужно осуществить ввод с клавиатуры. Чтобы вводились только цифры. Помогите пожалуйста!!!
Для начала мы создадим в самом начале программы несколько переменных, которые нам для этого понадобятся:
float a, b;
int count;
bool znak = true;
Я не разобрался, где именно в начале программы, куда это писать??? Разъясните пожалуйста.
В главном классе формы. Сразу после слов:
public partial class Form1 : Form
{
Добро времени суток. Кто может помочь в создании подобия калькулятора но фишка в том что ввод должен быть с клавиатуры 10-ти чисел и после нажатия на кнопку должна все числа сложить и дать окончательный ответ.
Здравствуте, а как надо синус косинусы добавлять?
Здравствуйте! Добавьте еще нужное количество кнопок.
Код (в самой кнопке), вычисляющий, например, синус, будет таким:
double result = Math.Sin(Convert.ToDouble(textBox1.Text));
textBox1.Text = result.ToString();
Заметим, что метод Sin принимает аргумент в радианах.
А вот как его сохранить чтобы потом им можно было пользоваться
Вам нужно создать инсталлятор в Visual Studio (см. ссылку), таким образом у Вас будет установочный файл и появится возможность воспользоваться калькулятором без использования IDE.
Здравствуйте, большое спасибо за такую полезную статью!) Подскажите, пожалуйста, какой код необходим для вычисления синуса угла(допустим в 30 градусов и т.п.)? Кроме того, возведение в степень(любого числа в любую степень), вычисление корня, расчёт натурального лагорифма и факториала числа? Нужно ли при этом что-то добавлять кроме как в саму кнопку?
Здравствуйте!
Для вычисления синуса сначала необходимо перевести градусы в радианы:
double degree = 30;
double rad = degree * Math.PI / 180;
Затем вычислить синус с помощью статического метода класса Math:
Math.Sin(rad);
Возведение числа a в степень b: Math.Pow(a, b);
Вычисление квадратного корня: Math.Sqrt(a);
Натуральный логарифм: Math.Log(a);
Факториал вычисляется с помощью цикла или рекурсии. Пример: Рекурсивное вычисление факториала.
Помимо кода кнопок придётся также отредактировать метод calculate().
Здравствуйте, а как сделать, чтобы при нажатии знаков плюса, умножения и т.д. калькулятор не вылетал если не введено число?
Здравствуйте! Нужно для каждой математической операции добавить проверку на наличие числа в текстовом поле; и только если число введено, то можно выполнять вычисления.
if (textBox1.Text != «»)
{
// вычисляем
}
Программа требует доработки в виде обработки исключения при ошибочном нажатии на знаки вычисления если не введено число в TextBox.
А как сохранить файл (расширение) ,чтобы при каждом запуске в visual studio 2017 открывался код и форма редактирования этого калькулятора???
А разве не так происходит? Что у Вас открывается?
Уже разобрался)…но все равно спс…
Спасибо огромное, очень помогло, доступно написано поэтому можно понять. Админ всего хорошего