黑马程序员技术交流社区
标题:
用控制台怎么做计算器
[打印本页]
作者:
?﹪滾妳媽丶
时间:
2014-4-7 16:42
标题:
用控制台怎么做计算器
本帖最后由 ?﹪滾妳媽丶 于 2014-4-8 09:44 编辑
之前做了一个简单的计算器,就是提示用户输入数字A运算符和数字B
假如是1+1+1-1+1/1*1这样的例子,就是一次性输成这样,然后按回车直接有结果。
我用+-*/这四个符号分隔出来,然后把每一个分隔出来的转成int类型数组。完全没思路,想到的也是错的。有没有人指点下。。
作者:
mdb
时间:
2014-4-7 19:17
没有小括号的话应该还好做,有括号就有点麻烦...
作者:
Monkey·D·Chas
时间:
2014-4-7 20:19
吧你输入的全部装进一个数组。用switch语句判断符号 最后输出
作者:
惊风侠
时间:
2014-4-7 22:21
我觉得判断是否输入合法是个问题。。
作者:
mdb
时间:
2014-4-8 01:48
本帖最后由 mdb 于 2014-4-8 01:51 编辑
最后手痒还是写了下,思路很简单,先算乘除法,最后算加减,算到最后就是一连串的加减法了,这样就很好处理了,先把整理个字符串给分成只有加减法的列表,然后把列表里有乘除法的项目先算出来再把结果的值存进去,最后整个列表就都是数字和运算符了,这样直接循环进行判断运算就可以了,简单写了个类,不考虑大小括号的运算符,明天再加个功能让它支持括号的表达式。
类
public class yunshuanshi
{
private List<string> all { get; set; }
public yunshuanshi(string s)
{
string[] numarr = s.Split(new char[] { '+', '-' });
List<string> la = Regex.Split(s.Replace("*", "").Replace("/", ""), @"\d+").Where(r => !string.IsNullOrEmpty(r)).ToList();
List<string> ls = new List<string>();
for (int i = 0; i < numarr.Length; i++)
{
ls.Add(numarr[i]);
if (i < la.Count)
ls.Add(la[i]);
}
all = ls;
}
public string yunshuan()
{
for (int i = 0; i < all.Count; i++) // 先乘除
{
if (all[i].Contains("*") || all[i].Contains("/"))
all[i] = chengchu(all[i]).ToString();
}
yunshuanall();// 后加减
return all[0]; // 结果
}
private void yunshuanall()
{
double sum = 0;
while (all.Count != 1)
{
switch (all[1])
{
case "+":
sum = double.Parse(all[0]) + double.Parse(all[2]);
break;
case "-":
sum = double.Parse(all[0]) - double.Parse(all[2]);
break;
}
all.RemoveRange(0, 3);
all.Insert(0, sum.ToString());
}
}
private double chengchu(string s)
{
List<string> cx = s.Split(new char[] { '*', '/' }).ToList();
List<string> fh = Regex.Split(s, @"\d+").Where(r => !string.IsNullOrEmpty(r)).ToList();
List<string> la = new List<string>();
for (int i = 0; i < cx.Count; i++)
{
la.Add(cx[i]);
if (i < fh.Count)
la.Add(fh[i]);
}
cx = la;
double sum = 0;
while (cx.Count != 1)
{
switch (cx[1])
{
case "*":
sum = double.Parse(cx[0]) * double.Parse(cx[2]);
break;
case "/":
sum = double.Parse(cx[0]) / double.Parse(cx[2].Trim() == "0" ? "1" : cx[2].Trim());
break;
}
cx.RemoveRange(0, 3);
cx.Insert(0, sum.ToString());
}
return sum;
}
}
复制代码
调用
yunshuanshi y = new yunshuanshi("2*40*5/2+10-5+4*16/8-5*18/3/2");
Console.WriteLine("结果是:" + y.yunshuan());
复制代码
简单试算了几个结果都对,不知道还有没有什么BUG
作者:
百川
时间:
2014-4-8 10:01
同上,手痒。思路是这个样子的,使用正则匹配,然后依次将含有/*+-的部分替换成运算结果。最后就可以得到结果。
为了简便,我只贴运算部分的代码。如果还是不明白可以回复我。
public static string operation(string str, string op)//str为输入的字符串,默认已经经过验证,op为运算符
{
string opstring = string.Format(@"((\d+)([\{0}](\d+)))", op);//组合字符串
do
{
Match m = Regex.Match(str, opstring);//匹配项
if (!string.IsNullOrEmpty(m.Groups[1].Value))
{
double a = Convert.ToDouble(m.Groups[2].Value);
double b = Convert.ToDouble(m.Groups[4].Value);
switch (op)//根据运算符运算
{
case "+": str = str.Replace(m.Groups[1].Value, (a + b).ToString()); break;
case "-": str = str.Replace(m.Groups[1].Value, (a - b).ToString()); break;
case "*": str = str.Replace(m.Groups[1].Value, (a * b).ToString()); break;
case "/": str = str.Replace(m.Groups[1].Value, (a / b).ToString()); break;
default: str = null; break;
}
}
} while (str.IndexOf(op) != -1);
return str;
}
复制代码
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2