首页 C#计算器

C#计算器

举报
开通vip

C#计算器 计算器 1 第1章 绪论 1.1 软件结构介绍 本软件是一个在visual studio 2010简体中文旗舰版设计中图形界面的简单的基于C# 的计算器。使用人员能快捷简单地进行操作。即时准确的获得需要的计算结果,为了尽 量的降低使用难度和节约使用者学习使用本软件的时间,在本软件中加入了必要的帮助 说明。在本文中,约定【OFF】表示的是本软件中的退出按钮,【1】代表的是本软件中 的“1按钮”而不是数值1。 本软件主要由3个WindowsForm 组成,分别是FrmIndex,FrmC...

C#计算器
计算器 1 第1章 绪论 1.1 软件结构介绍 本软件是一个在visual studio 2010简体中文旗舰版设计中图形界面的简单的基于C# 的计算器。使用人员能快捷简单地进行操作。即时准确的获得需要的计算结果,为了尽 量的降低使用难度和节约使用者学习使用本软件的时间,在本软件中加入了必要的帮助 说明。在本文中,约定【OFF】 关于同志近三年现实表现材料材料类招标技术评分表图表与交易pdf视力表打印pdf用图表说话 pdf 示的是本软件中的退出按钮,【1】代表的是本软件中 的“1按钮”而不是数值1。 本软件主要由3个WindowsForm 组成,分别是FrmIndex,FrmCalculator和FrmSpeial。下面 详细介绍三个Form的相关情况。 1.1.1 关于FrmIndex FrmIndex 的主要包括了一个菜单控件。一级菜单包括了【菜单】和【关于】。 【菜单】中包含了【科学计算器】,【特色功能】,【退出】。【科学计算器】可以打开 FrmCalculator。【特色功能】可以打开FrmSpeial。【退出】可以释放本软件运行时使用的系统 资源并关闭软件。 【关于】中包含了【关于软件】和【鸣谢】。【关于软件】会弹出一个MessageBox,简单 介绍了这个软件的相关 内容 财务内部控制制度的内容财务内部控制制度的内容人员招聘与配置的内容项目成本控制的内容消防安全演练内容 。【鸣谢】会弹出一个MessageBox,对本软件在设计过程中给过我 帮助的人表示感谢。 1.1.2 关于FrmCalculator FrmCalculator是本软件的主体内容,模拟了Windows系统中自带的计算器的部分功能。而 界面则模仿常见的带双行显示器的科学计算器界面。算式和输入的数字分行显示,上行显示 算式,而下行显示正在输入的数字或者是最后的计算结果。界面如下图1.1所示: 计算器 2 图1.1 科学计算器运行图 界面中各个控件简介如下: 【txtInput】:即两个TextBox控件中上面的一个,用来显示算式。为方便叙述,下文再次提及 这个控件时,用算式框来代替; 【numInput】:即两个TextBox控件中下面的一个,用来显示当前输入的数字,下文中提及这个 控件时,用数字框代替; 【CA】:用来同时清空算式框和数字框的内容。 【CE】:用来清空数字框中的内容; 【←】:用来逐个清空数字框中的内容; 【OFF】:关闭软件,并释放软件运行时使用的系统资源; 【sin】【cos】【tan】:输入三角函数; 【1/X】:求倒数; 【x2】,【X3】,【X^Y】:求X的平方,X的立方,X的Y次方; 【√】:求平方根; 【%】:百分号; 计算器 3 【π】【e】:输入π,e; 【(】【)】:输入左右括号; 【+】【-】【×】【÷】:输入加减乘除号; 【0-9】,【.】【±】:输入0-9,小数点,正负号; 【=】:输入等于号,并开始计算算式,并将结果返回到数字框内。 1.1.3 关于FrmSpeical 顾名思义,FrmSpeical实现的是区别于Windows自带计算器的功能。FrmSpeical分两个选项 卡,【Page1】和【Page2】。 【Page1】界面如下图1.2所示: 图1.2 FrmSpecial-Page1运行图 【Page1】的Text属性设置为“最大公约数与最小公倍数”,实现求两个数的最大公约数和最 小公倍数的功能。【Page1】中有两个TextBox控件,分别用来显示两个数字。两个TextBox右边 的红色【←】按键用来逐个删除对应的TextBox控件中的内容。而中间的【↑】用来控制输入 点在两个TextBox间切换。当它显示为【↑】时,输入点在上面的TextBox中,点击之后它会显 示为【↓】,此时输入点被切换到下面的TextBox中。反之亦然。在输入两个整数之后,点击 计算器 4 【OK】,软件会求出两个数的最大公约数和最小公倍数并将结果返回到【Page1】中的两个label 控件中以显示结果。 【Page2】的界面如下图1.3所示: 图1.3 FrmSpecial-Page2运行图 【Page2】的Text属性设置为“质数判断”,实现判断一个整数是否为质数的功能。【Page2】 只有一个TextBox控件,用来显示输入的数字。在数字输入完成后,点击【OK】,软件将开始 验证该数字是否为一个质数,并将结果返回到label控件中显示。 计算器 5 1.2 功能结构 1.3 算法与类的设计 本软件中包含了一个算法类Algorithm,主要用来实现逆波兰算法以支持FrmCalculator实 现科学计算器的功能。。而FrmSpecial中用到的求两个数的最大公约数,最小公倍数和验证一 个数是否为质数的 方法 快递客服问题件处理详细方法山木方法pdf计算方法pdf华与华方法下载八字理论方法下载 并没有包含到这个类中。所以我们分开来叙述。 1.3.1 Algorithm算法简述 这个类包含的变量有string类型的Stack两个,IntStack和OpStack。IntStack用来存储数字, OpStack用来存储操作符。 这个类包含的方法即各个方法的参数类型,作用如下表1.1所示: 表1.1 Algorithm中的主要算法 public bool IsNumber(string ch) 用来判断当前的string类型变量ch是 不是数字。(如何判断一个字符是否为 数字的问题,在诸多现成的Windows自 带的计算器模拟软件中采用的识别数字 的方式有两种。一种是ASCII码来判断, 另一种用正则表达式来判断。这里用正 则表达式方式。) 计算器 科学计算器 特色功能 算式输入 求取最大公约数和 最小公倍数 判断一个整数是否 是质数 逆波兰算法的实现 及结果的计算 数字的输入 操作符的输入 常见函数的输入 计算器 6 public string delZero(string numTxt) 用来在数字框输入的数字是如1.20或者 1.200之类的数字时,清除掉结尾的0。 public string delDot(string numTxt) 用来在数字框输入的数字是如1.0或者 1.00之类的数字时,清除掉结尾的0后, 数字框内的数字变成“1.”,这显然是非法 的,这个方法用来清除掉最后的小数点。 public static int priority(String Myop) 用来对软件支持的各个运算符的优 先级进行定义。这里用一个int值来计量 优先级方便后面对两个操作符之间优先 级进行比较,越先运算的操作符int值越 大。 private int CompareOperate(string ch,string stackCh) 用来比较两个操作符ch和stackCh的优先 级,并返回一个int值来表示比较的结果。 如果ch和stackCh的优先级相同返回0,ch 的优先级比stackCh低时返回-1。如果ch 的优先级比stackCh高时返回1。其他情况 返回-2。 public static string getResult(String Myop,String a,Sting b) 对a和b进行计算,并返回结果给 GetExpression(string InputString)。 public string GetExpression(string InputString) 调用 getResult并将最后运行结果显示到 数字框中 1.3.2 FrmSpecial中的两个关键的方法 FrmSpecial中求取两个数的最大公约数和最小公倍数的方法commonDivisorAndMultiple() 和验证一个整数是否为质数的方法IsPrime()是这个部分最核心的内容。 private void commonDivisorAndMultiple() 通过先将Page1中两个数字框中的数字转化成为 int类型变量,然后采用谭浩强的《C语言程序设计》中求两个数的最大公约数和最小公倍数的 内容稍作修改之后得来。最后将结果中最大公约数部分显示在Page2中的label控件 Page1LabelResultShow1中,而最小公倍数部分显示在Page1的label控件Page1LabelResultShow1 中。 IsPrime()依据质数的定义,如果有一个非零的并且并这个数本身小的数能整除,这个数这 个数不是质数来编写。如果,输入在数字框中的数字是一个负数时,先把求它的绝对值,然 后验证它的绝对值是不是质数。如果是,那么这个数是质数,如果不是,那么这个数也不是 质数。然后将结果显示在Page2的label控件Page2LabelResultShow中。 计算器 7 第2章 需求分析 2.1 需求分析 本软件以模仿Windows系统中自带的计算器为主,能支持带括号的十进制加减乘除运算, 能支持三角函数,求阶乘,支持求倒数,求X的Y次方,开根号,求平方,立方。支持百分号, 能输入π和e。 另外加入了去两个数的最大公约数和最小公倍数,以及判断一个数是否为质数的功能。 故应有两个模块:计算器模块和特殊功能模块。 特色功能模块的两个功能在谭浩强的《C语言程序设计》中已经有了现成的算法和程序, “重新发明车轮”是没有什么意义的,故不作太多论述。只对计算器模块做分析。 计算器模块应该有能响应处理算式输入的模块和算式转换和计算模块。 2.2算式输入模块 这个模块主要包括数字输入,加减乘除等操作符的输入,三角函数输入,常见函数输入 和括号的输入。并能最大限度的保证算式的合法性。 2.3 算式转换和计算模块 这个模块能实现逆波兰式把输入的中缀式转化成为后缀式,计算结果然后返回结果。 计算器 8 第3章 系统设计 这个软件的主体部分,科学计算器,要解决的问题主要是两个,第一是如何尽量避免输 入非法的算式,第二是整个设计的关键怎么样实现逆波兰算法得到正确的结果。这一章节就 来叙述整两个问题。 要叙述这两个问题,必须先对FrmCalculator有一个更深的了解。 3.1 FrmCalculator中的变量 FrmCalculator中包含了4个全局变量,bool型的IsMark,IsRight,string 型的RealStr和int 型的left。 这里IsMark用来判断是否准许输入数字,如果真则准许,假则不准许。初值为真,即true。 而IsRight用来判断最后一个算式框中最后一个字符是不是右括号,因为诸如“)1”这种类型的 算式是非法的。所以当IsRight是真时,不准许输入数字。而RealStr用来在最后按下【=】之后, 存储算式框里面的字符串,并作为参数传递给算法类Algotithm中的方法GetExpression(string InputString)。left用来记录左括号的个数,因为一个算式中,左括号的个数和右括号的个数必 须要保持一致否则这个算式是非法的。 3.2 FrmCalculator中的主要方法 FrmCalculator包含的主要方法及其参数,作用等如下表3.1: 表3.1 FrmCalculator包含的主要方法及其参数 方法名(包含了参数,返回值类型) 作用 private void PressNumBtn(string NumTxt) 处理数字按键 private void BtnCE_Click(object sender, EventArgs e) 将数字框清零 private void btnOff_Click(object sender, EventArgs e) 退出并释放软件运行使用的资源 private void PressMarkBtn(string MarkTxt) 三角函数按键处理 private void btnDaoshu_Click(object sender, EventArgs e) 求倒数 private void btnPer_Click(object sender, EventArgs e) 百分号 private void PressOpBtn(string OpTxt) 对加减乘除等运算符进行处理 private void numInput_TextChanged(object sender EventArgs e) 防止输入的数字含有空格 private void btnLeft_Click(object sender, EventArgs e) 输入( private void btnRight_Click(object sender, EventArgs e) 输入) private void btnEqual_Click(object sender, EventArgs e) 输入“=”,并计算返回结果 private void BtnCA_Click(object sender, EventArgs e) 同时归零数字框和算式框 private void BtnNumDel_Click(object sender, EventArgs e) 用于逐个删除数字框中的内容 private void BtnSqrt_Click(object sender, EventArgs e) 对数字框内的数字进行开根号 private void BtnSquare_Click(object sender, EventArgs e) 对数字框内的数字求平方 private void BtnCube_Click(object sender, EventArgs e) 对数字框内的数字求立方 private void BtnFactorial_Click(object sender, EventArgs e) 对数字框内的数字求阶乘 计算器 9 private void txtInput_TextChanged(object sender, EventArgs e) 用来控制IsRight 3.2.1 数字按键的处理 在叙述这个问题之前,先做一个定义。 定义 紧前:表示某个字符之前的一个字符。比如字符串“123”中,3的紧前是2,2的紧前是 1。 在输入数字时,数字紧前不能是右括号,所以此时IsRight必须是false才能准许数字输入。 如果输入数字时,算式框里面是含有“=”的,那么说明这次计算并不是软件运行后的第一次运 算。此时要将算式框归零,然后把被点击的数字显示在数字框内。如果算式框内不含有“=”, 那么我们只对数字框进行处理。如果数字框内是0,而被点击的数字是小数点,那么我们只要 在数字框内追加小数点即可。如果是其他的数字,那么用这个数字代替0.如果数字框内不是零, 那么我们直接在数字框内追加被点击的数字。输入数字后,最后一个字符就不是运算符了, 此时要把IsMark的值改成false。 数字按键处理方法的实现方法的流程图3.1如下: 计算器 10 图3.1 数字按键处理方法实现 3.2.2加减乘除等运算符进行处理 加减乘除运算符之间不能是运算符,所以必须在IsMark的值是false时才可以输入运算符。 输入运算符时必须要保证数字框中的数字是合法的。这里我们要先调用算法类中的delZero以 及delDot等函数对输入框内的数字进行处理。之后将数字框中的数字输入到算式框,然后再把 运算符追加在这个数字之后。所以这个方法包含了三个小的模块。实现这一个操作过程的流 程图3.2如下所示: 计算器 11 图3.2 操作符输入流程 3.2.3输入“(”和“)” 在算式中,左右括号必然要成对出现,即左括号的个数要和右括号的个数一样多。为了 防止出现括号个数不一致的问题,这里用了一个int型的变量left来存储左括号的个数,每次成 功加入了一个左括号时,left就加1,当成功加入一个右括号时,left就减1。如果left小于等于0 时,不响应右括号的输入。实现流程如图3.3和图3.4所示: 图3.3 左括号输入流程图 图3.4 右括号输入流程 计算器 12 3.2.4控制IsRight bool型变量IsRight记录了算式的最后一个字符是否为右括号“)”,这里我们要用到string 类型数据中的一个方法,EndsWith(string value),即以string结束,返回值类型为一个bool型的 值,用来检测算式的最后一个字符。这里直接监视算式框的changed属性,在算式框中的内容 发生改变时,检测算式的最后一个字符是不是右括号“)”,如果是则将IsRight赋值为true,如 果不是则把IsRight赋值为false。实现流程图如下图3.5所示: 图3.5 IsRihgt的控制 3.2.5输入“=”,并计算返回结果 当使用者点击【=】时,如果算式框里面本身已经含有“=”,那么忽略这次输入。如果 不含“=”则先检查数字框里面有无数字,有数字则先在算式中追加数字,然后再追加“=”。 将算式中的sin,cos,tan分别替换成1S,1C,1T然后赋值给string类型变量RealStr。以RealStr 为参数调用GetExpression(string value),计算并返回结果到数字框中。实现此过程的伪 语言代码如下所示: S1:检查算式框是否已经有“=”,没有则执行下一步; S2:如果最后一个输入的字符不是操作符,数字框里面有数字,IsMark的值为false。 S3:把数字框里面的数字追加到算式,然后追加“=”。 S4:将算式中的sin,cos,tan分别替换成1S,1C,1T; S5:调用算法类中的GetExpression方法计算结果。 3.2.6逆波兰算法的实现和结果的计算 Algorithm类中最核心的内容是逆波兰算法的实现和结果的计算。这里主要用到了如下表 3.2所示的5个方法: 计算器 13 表3.2 逆波兰算法的实现和结果的计算 public bool IsNumber(string ch) 数字判断 public static int priority(String Myop) 优先级别定义 private int CompareOperate(string ch, string stackCh) 优先性级别比较 public string GetExpression(string InputString) 进行计算 public static String getResult(String Myop, String a, String b) 返回运算结果 IsNumber的实现流程图3.6如下所示: 图3.6 bool变量IsNumber的控制 优先级定义priority的伪代码如下: S1:读入操作符Myop; S2:如果Myop是加号或者减号,返回1, S3:如果Myop是乘号或者除号,返回2; S4:如果Myop是乘方,返回3; S5:如果Myop正弦或者余弦或者正切,返回4; S6:其他,返回0; CompareOperate的实现伪代码: S1:读入操作符ch; S2:如果ch的优先级和操作符栈顶元素stackCh相同,返回0; S3:如果ch的优先级比stackCh低,返回-1; S4:如果ch的优先级比stackCh高,返回1; S5:其他情况,返回-2; 计算器 14 GetExpression实现过程分为三个模块:数字的判别和处理,符号的判别和处理以及返回计 算结果。这里我们分块叙述这个方法的实现。 S1:建立bool型变量HasMark,初值为true。用于判断数字之后是否有符号,作用是用来得 到9以上数字。 S2:用一个for循环,对算式逐个字符进行读取,判别是否数字或则符号。 S3:分别对数字和符号进行判别处理;(这一步骤在后面叙述。) S4:返回计算结果。 对数字的判别和处理的伪代码: S1:如果是数字的话,要把数字放入数字栈IntStack中; S2:如果数字之后有符号,则数字栈顶字符串不变更; S3:如果数字后没有符号,数字栈顶字符串加上新字符串。 对符号进行判别处理的伪代码: S1:如果是“(”,入栈; S2:如果是“)”,调用getResult方法,获取计算结果值,并推入数字栈,直到符号栈顶是 “(”为止。弹出“(”。 S3:是 "+" 或者"-"或者"*" 或者"/" 或者"^"或者正弦或者余弦或者正切。 Case1:如果符号栈元素个数为0,入栈; Case2:如果符号栈顶元素是“(”,入栈; Case3:读入的符号比符号栈顶元素优先级高,读入符号入栈; Case4:读入的符号和符号栈顶符号的优先级相同,调用getResult方法,获取计算结果, 并推入数字栈,把符号推入符号栈; Case5:读入的符号比符号栈顶符号优先级低,建立一个局部int变量com,初值为-1; 调用getResult方法,获取计算结果值,并推入数字栈,如果符号栈不空,以读入操作符ch和栈 顶元素为参数调用CompareOperate,返回值赋值给com。直到while (com == -1 || com == 0)为假。 把符号推入符号栈。 返回计算结果结果的伪代码: S1:在符号栈不空,调用getResult方法,获取计算结果值,并推入数字栈; S2:符号栈空,返回最后结果。 计算器 15 getResult的伪代码: S1:读入操作符Myop,字符型的两个操作数a和b; S2:将a转成double型,赋值给x;将b转成double型,赋值给y;建立double型变量z; Case1:操作符是"+",z = x + y; Case:2:操作符是"-",z = x – y; Case3:操作符是"*",z = x * y; Case4:操作符是"/",z = x / y; Case5:操作符是"^",z = Math.Pow(x, y); Case6:操作符是正弦,z = Math.Sin(y * Math.PI / 180); Case7:操作符是余弦,z = Math.Cos(y * Math.PI / 180); Case8:操作符是正切,z = Math.Tan(y * Math.PI / 180); Case9:z=0; S3:传回结果; 计算器 16 第4章 详细设计 4.1 FrmIndex表单 加入一个菜单控件,如下更改菜单: 表4.1 FrmIndex表单的修改 一级菜单 【菜单】 【关于】 二级菜单 【科学计算器】 【关于软件】 【特色功能】 【鸣谢】 【退出】 【关于】菜单并不是本表单的主要部分,故不作叙述。【菜单】下各二级菜单选项的Click 事件代码如下: 4.1.1【科学计算器】: private void 科学计算器ToolStripMenuItem_Click(object sender, EventArgs e) { FrmCalculator f = new FrmCalculator(); f.Show(); this.Hide(); } 4.1.2【特色功能】 private void 特色功能ToolStripMenuItem_Click(object sender, EventArgs e) { FrmSpecial f = new FrmSpecial(); f.Show(); this.Hide(); } 4.1.3【退出】 private void 退出ToolStripMenuItem_Click(object sender, EventArgs e) { Application.Exit(); } 计算器 17 4.2 FrmCalculator表单 这里同样是先建立一个表单,把Text属性改成“科学计算器”,添加一个菜单控件,两个 TextBox控件和35个button控件。 4.2.1 菜单控件的修改 如下修改菜单控件属性: 表4.2 FrmCalculator菜单 一级菜单 【菜单】 二级菜单 【返回主选单】 【特色功能】 【退出】 各个二级菜单的Click事件的代码如下: 【返回主菜单】 private void 返回主菜单ToolStripMenuItem_Click(object sender, EventArgs e) { FrmIndex f = new FrmIndex(); f.Show(); this.Close(); } 【特色功能】 private void 特色功能ToolStripMenuItem_Click(object sender, EventArgs e) { FrmSpecial f = new FrmSpecial(); f.Show(); this.Close(); } 【退出】 private void 退出ToolStripMenuItem_Click(object sender, EventArgs e) { Application.Exit();} 计算器 18 4.2.2 TextBox控件的修改 如图: 图4.1 科学计算器TextBox截图 上面一个TextBox控件属性做如下表修改: 表4.3 txtInput的属性修改 属性 修改值 Name txtInput ReadOnly True Text 0 TextAlign Right 下面一个TextBox控件 表4.4 numInput的属性修改 属性 修改值 Name numInput TextAlign Right Text 0 4.2.3 Button控件的建立和属性修改 建立35个Button控件,如下图将Text属性修改成按钮上的字符,并如下图排布。将除去【←】 和【OFF】的BackColor属性改为Crimson,其他所有Button控件的BackColor属性改成 LightSkyBlue。 计算器 19 图4.2 科学计算器Button控件截图 各个button的Click事件代码如下: 【1】 private void btnOne_Click(object sender, EventArgs e) {PressNumBtn(btnOne.Text); } 【2】 private void btnTwo_Click(object sender, EventArgs e) {PressNumBtn(btnTwo.Text); } 【3】 private void btnThree_Click(object sender, EventArgs e) {PressNumBtn(btnThree.Text); } 【4】 private void btnFour_Click(object sender, EventArgs e) {PressNumBtn(btnFour.Text); } 【5】 private void btnFive_Click(object sender, EventArgs e) {PressNumBtn(btnFive.Text); } 【6】 private void btnSix_Click(object sender, EventArgs e) {PressNumBtn(btnSix.Text); } 【7】 private void btnSeven_Click(object sender, EventArgs e) {PressNumBtn(btnSeven.Text); } 计算器 20 【8】 private void btnEight_Click(object sender, EventArgs e) {PressNumBtn(btnEight.Text); } 【9】 private void btnNight_Click(object sender, EventArgs e) {PressNumBtn(btnNight.Text); } 【0】 private void btnZero_Click(object sender, EventArgs e) {if (this.numInput.Text != "0") {PressNumBtn(btnZero.Text); }} 【.】 private void btnDot_Click(object sender, EventArgs e) {if (!this.numInput.Text.Contains(".")){PressNumBtn(btnDot.Text); }} 【π】 private void btnPI_Click(object sender, EventArgs e) {his.numInput.Text = Math.PI.ToString();} 【e】 private void btnE_Click(object sender, EventArgs e) {this.numInput.Text = Math.E.ToString();} 【±】 private void btnNot_Click(object sender, EventArgs e) { if (this.numInput.Text.Contains("-"))//包含了负号 {this.numInput.Text = this.numInput.Text.Replace("-", "");} else {this.numInput.Text = this.numInput.Text.Insert(0, "-");} } 【CE】 private void BtnCE_Click(object sender, EventArgs e) {this.numInput.Text = "0";} 【OFF】 private void btnOff_Click(object sender, EventArgs e) {Application.Exit();} 计算器 21 【sin】 private void btnSin_Click(object sender, EventArgs e) {PressMarkBtn("sin");} 【cos】 private void btnCos_Click(object sender, EventArgs e) {PressMarkBtn("cos");} 【tan】 private void btnTan_Click(object sender, EventArgs e) {PressMarkBtn("tan");} 【1/X】 private void btnDaoshu_Click(object sender, EventArgs e) { if (this.numInput.Text != "0")//非零数字 { double temp = double.Parse(this.numInput.Text); this.numInput.Text = (1 / temp).ToString(); } } 【%】 private void btnPer_Click(object sender, EventArgs e) { if (this.numInput.Text != "0")//非零数字 { double temp = double.Parse(this.numInput.Text); this.numInput.Text = (temp * 0.01).ToString(); } } 【+】 private void btnPlus_Click(object sender, EventArgs e) {PressOpBtn("+");} 【-】 private void btnMinus_Click(object sender, EventArgs e) {PressOpBtn("-");} 【×】 private void btnTime_Click(object sender, EventArgs e) {PressOpBtn("*");} 计算器 22 【÷】 private void btnDiv_Click(object sender, EventArgs e) {this.PressOpBtn("/");} 【^】 private void btnSqu_Click(object sender, EventArgs e) {PressOpBtn("^");} 【(】 private void btnLeft_Click(object sender, EventArgs e) { if (this.txtInput.Text == "0"){this.txtInput.Text = "(";}//左括号开头 else//不是左括号开头 { if (this.txtInput.Text.EndsWith(")")){this.txtInput.Text += "×(";} else{this.txtInput.Text += "(";} } IsMark = true; left++; } 【)】 private void btnRight_Click(object sender, EventArgs e) { if (this.txtInput.Text != "0" && left > 0)//右括号不能开头左括号大于右括号的个数 { if (!IsMark)//右括号紧前不能是运算符 { if (IsRight)//算式以右括号结尾 {this.txtInput.Text += "×" + this.numInput.Text + ")";} else{this.txtInput.Text += this.numInput.Text + ")";} } else//右括号紧前是运算符 {if (this.txtInput.Text.EndsWith("("))//算式以左括号结尾 {this.txtInput.Text += this.numInput.Text + ")";} } 计算器 23 this.numInput.Text = "0";this.IsMark = false; left--; } } 【=】 private void btnEqual_Click(object sender, EventArgs e) { if (this.txtInput.Text.Contains("=") == false)//txtInput里面不含= { if (!IsMark)//数字框内有数字,此时IsMark==false { if (this.numInput.Text.StartsWith("-"))//负数 {this.txtInput.Text += "(0" + this.numInput.Text + ")=";} else//正数 {this.txtInput.Text += this.numInput.Text + "=";} } RealStr = this.txtInput.Text.Replace("sin", "1S").Replace("cos", "1C").Replace("tan", "1T"); this.numInput.Text = alg.GetExpression(RealStr); IsRight = false; } } 【CA】 private void BtnCA_Click(object sender, EventArgs e) { this.txtInput.Text = "0"; this.numInput.Text = "0"; IsMark = false; } 【←】 private void BtnNumDel_Click(object sender, EventArgs e) { 计算器 24 if (this.numInput.Text.Length > 1) { this.numInput.Text = this.numInput.Text.Remove(this.numInput.Text.Length - 1, 1); } else {this.numInput.Text = "0";} } 【√】 private void BtnSqrt_Click(object sender, EventArgs e) { if (this.numInput.Text.StartsWith("-"))//负数 {MessageBox.Show("亲,负数不能开根号的!", "Error");} else { double temp = double.Parse(this.numInput.Text); this.numInput.Text = Math.Sqrt(temp).ToString(); } } 【X2】 private void BtnSquare_Click(object sender, EventArgs e) { double temp = double.Parse(this.numInput.Text); this.numInput.Text = (temp * temp).ToString(); } 【X3】 private void BtnCube_Click(object sender, EventArgs e) { double temp = double.Parse(this.numInput.Text); this.numInput.Text = (temp * temp * temp).ToString(); } 【n!】 计算器 25 private void BtnFactorial_Click(object sender, EventArgs e) { if (this.numInput.Text.Contains("."))//数字框是一个小数 {MessageBox.Show("亲,小数不能求阶乘的哦!", "Error");} else if (this.numInput.Text.StartsWith("-")) {MessageBox.Show("亲,不支持负数求阶乘的哦!", "Error");} else { int temp = int.Parse(this.numInput.Text); int result = 1; for (int i = 1; i <= temp; i++) { result = result * i; } this.numInput.Text = result.ToString(); } } 4.3 FrmSpecial表单 建立一个表单,将表单的Text属性改成FrmSpecial。添加一个菜单控件,TabControl控件 一个包括了Page1和Page2,公共Button控件12个。 如下修改菜单控件属性: 表4.5 FrmSpecial菜单控件 一级菜单 【菜单】 二级菜单 【返回主选单】 【科学计算器】 【退出】 各个二级菜单项的Click事件代码: 【返回主菜单】 private void 返回主菜单ToolStripMenuItem_Click(object sender, EventArgs e) { 计算器 26 FrmIndex f = new FrmIndex(); f.Show(); this.Close(); } 【科学计算器】 private void 科学计算器ToolStripMenuItem_Click(object sender, EventArgs e) { FrmCalculator f = new FrmCalculator(); f.Show(); this.Close(); } 【退出】 private void 退出ToolStripMenuItem_Click(object sender, EventArgs e) {Appl
本文档为【C#计算器】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
is_454809
暂无简介~
格式:pdf
大小:1MB
软件:PDF阅读器
页数:39
分类:互联网
上传时间:2012-07-13
浏览量:80