C# 做一个简单的计算器练手,高手进来指点下..

誮訫小緣帥 2012-06-15 04:06:12
哪位高手帮我注释下下面的代码意思啊..
我自已做了几个版本,只做了+ - * /四种运算,
有一个很纠结的问题..改了几次都木有解决,就是小数点.<怎么发图的?汗..>
比如:0.1 然后可以一直这样输入:0.1.1.1.1.1在网上找了几个教程的代码都有这个问题.
然后下面那个代码,我看得有点晕,我是新手..请高手帮我注释下,多谢!


using System;
using System.Windows.Forms;
using System.Drawing;

public class win:Form {

Button[] b = new Button[10];
Button bDot,bPlus,bSub,bMul,bDiv,bEqu,bClr;
Panel panCalc;
TextBox txtCalc;

Double dblAcc;
Double dblSec;
bool blnClear,blnFrstOpen;
String strOper;

public win() {
try {
this.Text="Calculator";
panCalc=new Panel();
txtCalc = new TextBox();

txtCalc.Location = new Point(10,10);
txtCalc.Size=new Size(150,10);
txtCalc.ReadOnly=true;
txtCalc.RightToLeft=RightToLeft.Yes;
panCalc.Size=new Size(200,200);
panCalc.BackColor=Color.Aqua;
panCalc.Controls.Add(txtCalc);
addButtons(panCalc);
this.Size=new Size(200,225);
this.Controls.Add(panCalc);

dblAcc=0;
dblSec=0;
blnFrstOpen=true;
blnClear=false;
strOper=new String('=',1);
}
catch (Exception e) {
Console.WriteLine("error ...... " + e.StackTrace);
}
}

private void addButtons(Panel p) {
for (int i=0;i<=9;i++) {
b[i]=new Button();
b[i].Text=Convert.ToString(i);
b[i].Size=new Size(25,25);
b[i].BackColor=Color.White;
b[i].Click+=new EventHandler(btn_clk);
p.Controls.Add(b[i]);
}
b[0].Location=new Point(10,160);
b[1].Location=new Point(10,120);
b[4].Location=new Point(10,80);
b[7].Location=new Point(10,40);

b[2].Location=new Point(50,120);
b[5].Location=new Point(50,80);
b[8].Location=new Point(50,40);

b[3].Location=new Point(90,120);
b[6].Location=new Point(90,80);
b[9].Location=new Point(90,40);

bDot=new Button();
bDot.Size=new Size(25,25);
bDot.Location=new Point(50,160);
bDot.BackColor=Color.White;
bDot.Text=".";
bDot.Click+=new EventHandler(btn_clk);

bPlus=new Button();
bPlus.Size=new Size(25,25);
bPlus.Location=new Point(130,160);
bPlus.BackColor=Color.White;
bPlus.Text="+";
bPlus.Click+=new EventHandler(btn_Oper);

bSub=new Button();
bSub.Size=new Size(25,25);
bSub.Location=new Point(130,120);
bSub.BackColor=Color.White;
bSub.Text="-";
bSub.Click+=new EventHandler(btn_Oper);

bMul=new Button();
bMul.Size=new Size(25,25);
bMul.Location=new Point(130,80);
bMul.BackColor=Color.White;
bMul.Text="*";
bMul.Click+=new EventHandler(btn_Oper);

bDiv=new Button();
bDiv.Size=new Size(25,25);
bDiv.Location=new Point(130,40);
bDiv.BackColor=Color.White;
bDiv.Text="/";
bDiv.Click+=new EventHandler(btn_Oper);

bEqu=new Button();
bEqu.Size=new Size(25,25);
bEqu.Location=new Point(90,160);
bEqu.BackColor=Color.White;
bEqu.Text="=";
bEqu.Click+=new EventHandler(btn_equ);

bClr=new Button();
bClr.Size=new Size(20,45);
bClr.Location=new Point(170,40);
bClr.BackColor=Color.Orange;
bClr.Text="AC";
bClr.Click+=new EventHandler(btn_clr);

p.Controls.Add(bDot);
p.Controls.Add(bPlus);
p.Controls.Add(bSub);
p.Controls.Add(bMul);
p.Controls.Add(bDiv);
p.Controls.Add(bEqu);
p.Controls.Add(bClr);
}

private void btn_clk(object obj,EventArgs ea) {
if(blnClear)
txtCalc.Text="";

Button b3=(Button)obj;

txtCalc.Text+=b3.Text;

if (txtCalc.Text==".")
txtCalc.Text="0.";
dblSec=Convert.ToDouble(txtCalc.Text);

blnClear=false;
}

private static void Main() {
Application.Run(new win());
}

private void btn_Oper(object obj,EventArgs ea) {
Button tmp=(Button)obj;
strOper=tmp.Text;
if (blnFrstOpen)
dblAcc=dblSec;
else
calc();

blnFrstOpen=false;
blnClear=true;
}

private void btn_clr(object obj,EventArgs ea) {
clear();
}

private void btn_equ(object obj,EventArgs ea) {
calc();

}

private void calc() {

switch(strOper) {

case "+":
dblAcc+=dblSec;
break;
case "-":
dblAcc-=dblSec;
break;
case "*":
dblAcc*=dblSec;
break;
case "/":
dblAcc/=dblSec;
break;
}

strOper="=";
blnFrstOpen=true;
txtCalc.Text=Convert.ToString(dblAcc);
dblSec=dblAcc;
}

private void clear() {
dblAcc=0;
dblSec=0;
blnFrstOpen=true;
txtCalc.Text="";
txtCalc.Focus();

}
}
...全文
363 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
Code__Boy 2012-06-16
  • 打赏
  • 举报
回复
算法优先算法 通过栈实现
百度下吧!!!
wanghui0380 2012-06-15
  • 打赏
  • 举报
回复
额,别瞎弄,你的先去看状态机

有状态判定,压栈,出栈,你才能把这东西做好

  • 打赏
  • 举报
回复
自己瞎琢磨这类问题意义不大。你如果学过基本的编译系统原理和技术,就知道要按照基本的词法分析模块去写。最笨地,找个.net的开源 Lex 或者 Yacc 用一下啊。
__天涯寻梦 2012-06-15
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 的回复:]
引用 3 楼 的回复:

数据类型不要用 double ,改 decimal


请问这么改了有什么好处呢/?主要是因为什么要改成decimal的呢?
[/Quote]
double 的运算在某些条件下有偏差的
double d1 = 0.99998;
double d2 = 0.00001;
double d3 = d1 + d2;
// d3 值为 0.99998999999999993
誮訫小緣帥 2012-06-15
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]

数据类型不要用 double ,改 decimal
[/Quote]

请问这么改了有什么好处呢/?主要是因为什么要改成decimal的呢?
誮訫小緣帥 2012-06-15
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]

你可以自己判断啊,
在textchanged事件中判断,
比如:
只能输入1个小数点,输入第2个就阻止,不能输入
string str = text1.Text;
int count = str.Split(new char[] { '.' }, StringSplitOptions.RemoveEmptyEntries).Count();
if(count>2)
{
e.……
[/Quote]
嗯嗯..多谢指点,我现在还在新手层..这点确实没有想到..除数不能为0.
__天涯寻梦 2012-06-15
  • 打赏
  • 举报
回复
数据类型不要用 double ,改 decimal
ohkuy 2012-06-15
  • 打赏
  • 举报
回复
你可以自己判断啊,
在textchanged事件中判断,
比如:
只能输入1个小数点,输入第2个就阻止,不能输入
string str = text1.Text;
int count = str.Split(new char[] { '.' }, StringSplitOptions.RemoveEmptyEntries).Count();
if(count>2)
{
e.Handle=true;
}
输入001算成1或格式错误等,
还有你的这个太粗糙了,没有扩展性,
连除法的除数为0都没有处理
誮訫小緣帥 2012-06-15
  • 打赏
  • 举报
回复
没有人呀..自己先顶下,....

111,126

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Creator Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧