首页 新闻 会员 周边 捐助

求助:用C#做个简单的计算器 请大家帮我讲解讲解

0
悬赏园豆:10 [已解决问题] 解决于 2009-05-25 09:03

思路应该是怎样的?

问题补充: 只进行简单的操作,加减乘除,C,CA 请多多指教,先谢谢了。
run777的主页 run777 | 初学一级 | 园豆:195
提问于:2009-05-21 13:41
< >
分享
最佳答案
0

主要是掌握住压栈算法,在校期间教辅提过这个设计案例:

设算数 “i0”,“i1”,“i2”,……

设算符 优先级0 “+”,“-”, 优先级1 “*”,“/”, 优先级2 “(”,“)”

设算式 i = i0 + i1 - i2 * i3 / (i4 * i5)……

Class Sign{

  public int Priority{get;private set}//优先级

      public int NumberCount{get;private set}//表示几元运算

      public string Value{get;private set}//表现值

}

int Calculate(string i){

     int index;

     Stack<int> numbers = new Stack<int>();

     Stack<Sign> signs = new Stack<Sign>();

     int n;

     Sign s;

     while(index < i.length){

             n = GetNumber(i, ref index);

             if(n >= 0){//匹配成功

                   numbers.push(n);

             }

              else{

                    s = GetSign(i, ref index);

                    if(s == null){//非法字符?

                        ........//可以 Throw Exception 或 做忽略等处理

                    }

                    if(s.Priority > signs.Current.Priority){//压栈

                          signs.push(s);

                   }

                   else{//计算 signs.Current

                          int[] ns = new int[signs.Current.NumberCount];

                          for(int j = 0;j < ns.length;j ++){

                                 ns[j] = numbers.pop();

                          }

                          numbers.push(Calculate(signs.Current, ns));//计算并保存子式

                          signs.push(s);

                   }

              }

     }

      //计算余式

      while(signs.Count > 0){

          int[] ns = new int[signs.Current.NumberCount];

          for(int j = 0;j < ns.length;j ++){

                ns[j] = numbers.pop();

          }

         numbers.push(Calculate(signs.Current, ns));//计算并保存子式

         signs.pop();

     }

}

int GetNumber(string i,  ref int charIndex){//读取算数

      //如果能运用正则表达式一次性清理出所有 算数、算符 则最好:),那本方法就可以省去了

}

Sign GetSign(string i, ref int charIndex){//读取算符

     //如果能运用正则表达式一次性清理出所有 算数、算符 则最好:),那本方法就可以省去了

}

int Calculate(Sign sign, int[] numbers){//计算该算式

      switch(sign.Value){

      case("+"):

           //处理加法逻辑

            break;

       Default:

            //Throw Exception 或 返回默认运算等

            break;

      }

}

大概的算法脉络或许是这样,其中有很多细节需要自行把握了(异常处理等)。

从几何时,我也能徒手编程了:),偶尔练练算法感觉挺舒畅的。

--------------------------------------------------------------------------

貌似“负数”没考虑进去!

陛下 | 老鸟四级 |园豆:3938 | 2009-05-21 16:37
其他回答(1)
0

这个代码应该很多。
当初我也作过。思路:
采用Winform吧。关键的问题是
1)界面
2)计算用户输入数据
3)显示。
这里一个加法操作为例(其他操作类似)开发步骤:
1)vs2005/8新建一个Winform 项目
2)在界面上拖放几个控件:3个文本框textbox.一个按钮(也可以单独为加减乘除个设置一个按钮);
3)选择一个按钮button,双击。后台产生事件对应的方法button1_ObjectClick(object sender, eventarg e)
4)在这里button1_ObjectClick添加代码。获取你控件的值,加数1和加数2.double dNum1 = double.parse(textbox1.text);//转换输入类型为数值型
double dNum2 = double.parse(textbox2.text);//转换输入类型为数值型
 double dSum = dNum1 + dNum2 ;//计算结果;
textBox3.text = dSum.toString();//转换类型。显示结果。
5)记得类型转换前,判断一下用户的输入是否为空。
6)除法操作,除数不能为空。

  希望对你有参考价值~

Frank Xu Lei | 园豆:1860 (小虾三级) | 2009-05-21 16:34
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册