C#计算器实验报告范文.docx
- 文档编号:9027370
- 上传时间:2023-02-02
- 格式:DOCX
- 页数:12
- 大小:68.02KB
C#计算器实验报告范文.docx
《C#计算器实验报告范文.docx》由会员分享,可在线阅读,更多相关《C#计算器实验报告范文.docx(12页珍藏版)》请在冰豆网上搜索。
C#计算器实验报告范文
实验一计算器的制作
软件学院软件一班李程2
一.实验要求
1.参照Windows系统提供的计算器功能,制作一个自己的计算器,至少能完成数据的加减乘除的基本功能。
2.控件的焦点以及Tab键的设置和使用
3.多个控件(按钮)事件的共享
4.键盘的事件的应用
二.设计思路
1.创建主体框架:
建立程序的主要界面后,系统自动生成界面的主要窗口生成代码。
对于每个按钮的的代码段中,分别添加事件触发的处理代码。
对于inputbox,显示输入的信息和显示处理后的结果。
2.数字1-9的按键的事件处理都是在inputbox中分别添加相对应的数字字符,把数字当成是字符串处理。
对于加减乘除四则运算按键,事件触发后的处理是在inputbox中的字符串后加上相应的四则运算符,要说明的是计算器的显示是按了四则运算符后并不是清屏inputbox的,而是把四则运算符一起显示出来直到输入完了运算式,按了“=”按键才开始运算并显示结果。
3.程序使用时是先把整个运算的式子输入到inputbox当中,程序把这一表达式转化成字符串,然后入栈,得到一个栈,运行四则运算函数,把字符从栈中读出,根据出栈的符号确定该进行那种运算处理。
4.程序最主要的关键之处是在于以何种方式对inputbox中的表达式进行入栈处理,本程序可以处理一些简单的数字表达式的简单的四则运算。
数字0-9的优先级同级,加减同级,乘除同级,但是它们相互之间的优先级有别,因此为了在运算处理当中能够处理表达式当中的不同的优先级的四则运算符时,就要采用数据结构当中处理表达式的方法,对inputbox当中的信息进行处理变成后缀表达式入栈。
然后把栈返回到四则运算函数那里,对栈进行出栈处理分别对出栈的符号进行识别计算按优先级处理。
通常地,计算机组成原理当中介绍的四则运算算法一般如下,在计算器编程当中可以从中获取可行的思想。
四则运算算法的一般描述:
1.加法算法
首先假定两个操作数均为小数(其他情况可以看做这种情况的特殊情况)。
a)通过界面输入获得两个操作数的值;
b)若两个数同号,则将两个操作数的整数部分和小数部分分别对应逐位相加,从最低位开始,若此位上的数字大于10,则向前位进1,此位减10;
c)若两个数字异号,则将负数放在第二个操作数内,正数放在第一个操作数内,然后将两个操作数的整数部分和小数部分分别对应逐位相减,判断结果的正负,若是整数,则要完成进位操作,若是负数则要完成借位操作;
d)将计算结果保存并输出。
e)
2.减法算法
首先通过界面输入两个操作数,然后调用令第二个操作数取相反数,调用加法函数就可以实现减法计算。
3.乘法算法
乘法的算法就是简单的按照一般的乘法计算方法来进行的。
考虑一般情况,两个操作数均为小数,从低位到高位,依次用第二个操作数的每一位上的数字乘以第一个操作数,然后将得出的结果调用加法函数相加即得到乘法的最后结果。
4.除法算法
除法算法也是按照中学学到的除法算法进行。
建立如下的除法算法:
a)输入两个操作数;
b)若第二个操作数为0,则输出除数不能为0的出错信息;
c)若第二个操作数不是0,则将第二个操作数乘以适当的倍率使其整数化,第一个操作数也做相应的变化;
d)从高位到低位,依次寻找每一个位置上的商值(这个值在0到9之间),直到第一个操作数的末尾;
e)保存并输出结果。
5.取倒数的算法
有了除法的算法,取倒数的算法就很简单了,直接用1和输入的操作数做除法运算,输出结果即可。
四则运算核心代码:
privatevoidprocessString()
{
double[]stacknum=newdouble[30];//'利用栈stacknum(30)计算队列sqeuestr(30)中的后缀表达式
inttop;
inti;
top=0;
try
{
for(i=0;i { switch(sqeuestr[i]) { case"+": top=top-1; stacknum[top-1]=stacknum[top-1]+stacknum[top]; break; case"-": top=top-1; stacknum[top-1]=stacknum[top-1]-stacknum[top]; break; case"/": top=top-1; if(stacknum[top]==0) { MessageBox.Show("除数不能为零"); } else stacknum[top-1]=stacknum[top-1]/stacknum[top]; break; case"*": top=top-1; stacknum[top-1]=stacknum[top-1]*stacknum[top]; break; default: stacknum[top++]=Convert.ToDouble(sqeuestr[i]); break; } } inputBox.Text=Convert.ToString(stacknum[0]);//将最后结果输出 } catch(Exceptione) { MessageBox.Show("表达式错误"); } } 数字转换成字符串并且入栈处理(转换成后缀表达式并入栈): privatevoidconvertString() { string[]stackstr=newstring[20];//stackstr用来将中缀表达式转化为后缀表达式,并将后缀表达式放进sqeuestr中 inttop;//top为指向stackstr的顶部,top总指向栈中的上一个元素 stringstr2; stringtext1_text; inttext_length; inti,currentprior,stackprior; boolsign;//定义标记来标记开是否为负号 stringtempStr; sign=false; top=0; lastsqeue=0; text1_text=inputBox.Text; text_length=text1_text.Length; tempStr=text1_text.Substring(0,1); if(tempStr.Equals("-")==true)//看第一个数是否为负数 { sign=true; text_length=text_length-1; text1_text=text1_text.Substring(1,text_length); } while(text_length>0) { str2=text1_text.Substring(0,1); if(str2.CompareTo("0")>=0&&str2.CompareTo("9")<=0||str2==".")//当当前字符为数或小数进直接入队列 { while(str2.CompareTo("0")>=0&&str2.CompareTo("9")<=0||str2==".") { sqeuestr[lastsqeue]=sqeuestr[lastsqeue]+str2; text_length=text_length-1; if(text_length>0) { text1_text=text1_text.Substring(1,text_length); str2=text1_text.Substring(0,1); } else break; } lastsqeue=lastsqeue+1; } elseif(str2=="+"||str2=="-"||str2=="/"||str2=="*"||str2=="^"||str2=="&") { if(top==0)//当前栈顶为空时,栈顶符运算符优先级为零,当前运算符优先级为运算符优级 { stackprior=0; currentprior=Precedence(str2); } else { stackprior=Precedence(stackstr[top-1]);//当前栈顶不为空时,栈顶符运算符优先级为栈顶运算符的优先级 currentprior=Precedence(str2);//当前运算符优先级为运算符优级 } if(currentprior>stackprior) { stackstr[top]=str2; top=top+1; } else { while(stackprior>=currentprior)//当栈顶的运算符优先级高于当前运算符优先级时,出栈 { sqeuestr[lastsqeue]=stackstr[top-1]; top=top-1; lastsqeue=lastsqeue+1; if(top==0) { stackprior=0; } else { stackprior=Precedence(stackstr[top-1]); } } stackstr[top]=str2;//当前运算符入栈 top=top+1; } text_length=text_length-1; text1_text=text1_text.Substring(1,text_length); } else { MessageBox.Show("表达式中出现非法字符"); return; } } for(i=top-1;i>=0;i--) { sqeuestr[lastsqeue]=stackstr[i];//栈中的运算符入队列 lastsqeue=lastsqeue+1; } if(sign==true) { sqeuestr[0]="-"+sqeuestr[0]; sign=false; } } 三.程序运行效果图 1.简单的四则混合运算: 式子的结果应该是6,按了等号键后,结果如下: 结果正确。 2.简单的有小数的四则混合运算: 式子的结果应该是0.3,按了等号键后,结果如下: 结果正确。 3. ”1/x”按键的测试,随便输入验证可得。 4实验总结 作为课程当中的第二门面向对象程序语言,c#的与大二学的面向对象语言JAVA在思想上的大部分相同,同时我们在程序语言的学习上不再是刚起步,以前的编程学习使得我在学习这门课的时候轻松不上。 一个好的程序除了好的算法以外,对程序的控制结构和数据结构的应用也很讲究。 因此在做C#计算器程序实验时,大二时数据结构的课程起了很大的帮助。 先说一下我刚起步实验的时候所遇到困难,在开始的时候由于是第一次接触这种控件即拉即用的编程方法,以前学JAVA的时候都是直接使用类继承等方法来创建窗口等控件。 因此相对JAVA来说,程序代码的编写量缩减了很多。 在做好了大概的框架后,着手按钮的事件响应处理的设定,在四则运算的方法处理上,刚开始的时候并不能进行运算符的优先级的处理,因此在处理1+2*3这样的有优先级不同的运算符时,并不能得出表达式的正确的值。 在运行程序检查完以后,为了能够正确实现有优先级不同的表达式的运行,翻查了数据结构课本,拾起以前的知识,应用后缀表达式来处理输入的表达式的运算,因此定义一个函数把inputbox当中的输入表达式进行处理成后缀表达式并入栈,然后把栈传给四则运算的处理函数。 处理函数出栈符号通过switch不断地进行四则运算的操作。 也就是说程序最主要的关键之处是在于以何种方式对inputbox中的表达式进行入栈处理,本程序可以处理一些简单的数字表达式的简单的四则运算。 数字0-9的优先级同级,加减同级,乘除同级,但是它们相互之间的优先级有别,因此为了在运算处理当中能够处理表达式当中的不同的优先级的四则运算符时,就要采用数据结构当中处理表达式的方法,对inputbox当中的信息进行处理变成后缀表达式入栈。 然后把栈返回到四则运算函数那里,对栈进行出栈处理分别对出栈的符号进行识别计算按优先级处理。 在整个编程过程中,我遇到的其他非算法的编程问题,例如界面,控件上所遇到的一些问题,经过不断地调整和问同学,最终获得了解决。 软件一班李程2
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- C# 计算器 实验 报告 范文
![提示](https://static.bdocx.com/images/bang_tan.gif)