Консольный калькулятор - C# (213875)
Формулировка задачи:
калькулятор консольный на C#
когда вводится выражение к примеру 5-4*(4-3) оно будет типа string
как его конвертировать в числовой тип и в нужный тип для знаков сложения, умножения, скобок,....чтобы потом совершить вычисление и вывести результат?
Решение задачи: «Консольный калькулятор»
textual
Листинг программы
using System;
using System.Text;
using System.Collections;
using System.Text.RegularExpressions;
using System.IO;
namespace ConsoleApplication2
{
// объект калькулятор
class xCalc
{
static public string mul_div(string str){ // умножение и деление
double na, nb;
Regex reg = new Regex(@"(\-*[\d,]+)([\*\/]{1})(\-*[\d,]+)");
Match mat = reg.Match(str);
if(mat.Groups.Count == 4) {
na = double.Parse(mat.Groups[1].ToString());
nb = double.Parse(mat.Groups[3].ToString());
if (mat.Groups[2].ToString()[0] == '*')
na *= nb;
else if(mat.Groups[2].ToString()[0] == '/')
na /= nb;
return str.Replace(mat.Groups[0].ToString(), na.ToString());
}
return str;
}
static public string add_sub(string str) { // сложение и вычитание
double na, nb;
Regex reg = new Regex(@"(\-*[\d,]+)([\+\-]{1})(\-*[\d,]+)");
Match mat = reg.Match(str);
if (mat.Groups.Count > 2)
{
na = double.Parse(mat.Groups[1].ToString());
nb = double.Parse(mat.Groups[3].ToString());
if (mat.Groups[2].ToString()[0] == '+')
na += nb;
else if (mat.Groups[2].ToString()[0] == '-')
na -= nb;
return str.Replace(mat.Groups[0].ToString(), na.ToString());
}
return str;
}
static public string scoba(string str){ // разбор скобок
char[] buf = { '*', '/' };
Regex reg = new Regex(@"\(([^\(\)]+)\)");
if (! reg.IsMatch(str))
return str;
Match mat = reg.Match(str);
string cm = mat.Groups[1].ToString();
while (cm.IndexOfAny(buf) != -1)
cm = xCalc.mul_div(cm);
Regex test = new Regex(@"^(\-*[\d,]+)$");
while (! test.IsMatch(cm))
cm = xCalc.add_sub(cm);
str = str.Replace(mat.Groups[0].ToString(), cm);
return scoba(str);
}
static public double calc(string str) { // функция для расчёта
str = scoba(str);
char[] buf = { '*', '/' };
while (str.IndexOfAny(buf) != -1)
str = xCalc.mul_div(str);
Regex test = new Regex(@"^(\-*[\d,]+)$");
while (! test.IsMatch(str))
str = xCalc.add_sub(str);
return double.Parse(str);
}
};
class Program
{
static void Main(string[] args)
{
// Не большой тест, если точности не будет выбросите код
// расчёт с целыми числами (-1)такая запись не поддерживается
Console.WriteLine("{0}\t{1}", xCalc.calc("49/7+20*5-400"), 49/7+20*5-400);
Console.WriteLine("{0}\t{1}", xCalc.calc("5*6+8*6"), 5*6+8*6);
Console.WriteLine("{0}\t{1}", xCalc.calc("(5-4*(10-8))*(4-3)"), (5-4*(10-8))*(4-3));
Console.WriteLine("{0}\t{1}", xCalc.calc("-7+8/2*(-200-100*2)"), -7+8/2*(-200-100*2));
Console.WriteLine("{0}\t{1}\n\n", xCalc.calc("-4/-4+-5/-5"), -4/-4+-5/-5);
// расчёт с не целыми с двойной точностью, в строке пишеться запятая а не точка
Console.WriteLine("{0}\t{1}", xCalc.calc("3,14*2/7,2"), 3.14*2/7.2);
Console.WriteLine("{0}\t{1}", xCalc.calc("4,5*2,5-4,5/2+(-0,45-1,2)"), 4.5*2.5-4.5/2+(-0.45-1.2));
Console.WriteLine("{0}\t{1}", xCalc.calc("20,5*(100/2,7)-(0,5*(0,7*(3,4+3)))"), 20.5*(100/2.7)-(0.5*(0.7*(3.4+3))));
Console.ReadKey();
}
}
}