(完整word版)计算器的设计
(word完整版)用MATLAB GUI设计简单计算器

摘要基于MATLAB GUI的计算器设计是利用GUIDE创建图形用户界面进行计算器设计。
设计计算器时,主要是考虑到计算器的易用性、功能的常用程度进行计算器界面与功能的设计。
通过调整控件和文本的布局及颜色,使界面简单大方、布局合理,达到界面友好的效果。
计算器设计时主要利用到get和set两个函数进行各个控件属性值的传递和设置。
计算器实现的功能有:数字0~9和小数点的输入显示,平方、开平方和对数的输入显示。
进行四则运算、正弦计算、余弦计算、正切计算和余切计算,可以求阶乘、求百分数和求倒数。
可以进行括号及变量x与变量y的输入,结合坐标轴编辑框和曲线颜色编辑框实现函数的曲线绘制。
最后运行调试,实现基于MATLAB GUI的计算器的设计。
MATLAB GUI介绍MATLAB是美国MathWorks公司出品的商业数学软件,用于算法开发、数据可视化、数据分析以及数值计算的高级技术计算语言和交互式环境。
MATLAB是matrix和laboratory两个词的组合,意为矩阵工厂,主要面对科学计算、可视化以及交互式程设计的高科技计算环境。
MATLAB是将数值分析、矩阵计算、科学数据可视化以及非线性动态系统的建模和仿真等诸多强大功能集成在一个易于使用的视窗环境中,为科学研究、工程设计以及必须进行有效数值计算的众多科学领域提供了一种全面的解决方案,并在很大程度上摆脱了传统非交互式程序设计语言的编辑模式,特别是所附带的30多种面向不同领域的工具箱支持,使得它在许多科学领域中成为计算机辅助设计和分析、算法研究和应用开发的基本工具和首选平台。
MATLAB的图形用户界面(Graphical User Interface,简称GUI,又称图形用户接口)是指采用图形方式显示的计算机操作用户界面。
与早期计算机使用的命令行界面相比,图形界面对于用户来说在视觉上更易于接受。
MATLAB的图形用户界(GUI)是由光标,窗口,菜单、文字说明等对象构成一个用户界面。
计算器课程设计

3.3
函数功能描述
1) InitApp() 函数原型: void InitApp() InitApp()函数用于初始化程序,完成程序图形模式的进入和结构变 量、结构数组进行赋初值的操作。 2) Showme() 函数原型:void Showme() Showme()函数用于计算器界面的显示,按钮的显示通过循环来完成。 3)Load()
简易计算器
就计算机工具地历史而言,中国古代最早采用地一种计算工具叫筹 策,又叫做算筹,这种算筹多用竹子制成,也有用木头,兽骨充当材料 的,大约270枚一束,放在布袋里可随身携带。直到今天仍在使用的住 算盘,是中国古代计算工具领域中的另一项发明明代时的住算盘已经与 现代的住算盘几乎相同。 17世纪初,西方国家的计算工具有了较大的发展。英国数学家纳尔 发现了“纳皮尔算筹”;英国牧师奥却德发明了圆柱形对数计算尺,这种 计算尺不仅能做加减乘涂,乘方和开方运算,甚至可以计算三角函数, 指数函数和对数函数。这些计算工具不仅带动了计算的发展,也为现代 计算器发展尊定了良好的基础,成为现代社会应用广泛的计算工具,如 手机,操作系统上附带的多功能计算器。
2.计算机界面显示
此计算机界面由一个窗口,一个文本输入框,一个表是基因功能是 否启用的标签和28个按钮构成。这4个组成部分分别由3个结构变量和28 个元素的结构数组来实现。
Showme() 输入是否为Alt+X键? 开始 结束 InitApp() 调用bioskey(),获取用户按键值 Load() 完成按键模拟,调用CommandButton_Click()完成相应功能 调用Unload(), 退出系统 进入while()主循环 是 否 在绘制主窗口的Form()函数中,主要调用bar()函数画出一个淡灰色的 填充窗口作为主窗口,调用line()函数化初 这个填充窗口的边框,又调 用bar()函数化出一个红色的窗口标题栏。 在绘制文本的Textbox()函数中,主要调用bar()函数在主窗口中画出一
计算器设计过程

1、"加","减","乘","除"命令按钮的click事件 '加按钮 private sub command12_click() txtlabel.text="加" end sub '减按钮 private sub command13_click() txtlabel.text="减" end sub '乘按钮 private sub command14_click() txtlabel.text="乘" end sub '除按钮 private sub command18_click() txtlabel.text="除" end sub
插入代码 返回
文本框的change事件
每一个操作数: private sub txtfirst_change() ‘每当txtfirst的内容发生变化时, 将变化结果随时映射到txtResult txtResult.text=txtfirst.text end sub
每二个操作数: private sub txtsecond_change() ‘每当txtfirst的内容发生变化时, 将变化结果随时映射到txtResult txtResult.text=txtsecond.text end sub
计算器 插入代码 返回
数字输入
数字区的命令按钮的CLICK事件 (1) 数字“0”按钮 if txtlabel.text="" then txtfirst.text=txtfirst.text+"0" else txtsecond.text=txtsecond.text+"0" end if
简易计算器设计范文

简易计算器设计范文首先,我们需要决定计算器的基本功能。
一个简易计算器通常应该具备加法、减法、乘法和除法的功能。
此外,我们还可以添加开方、求平方以及取模等功能。
在设计计算器之前,我们需要确定用户界面。
对于一个简易计算器来说,我们可以使用命令行界面或者图形用户界面。
在本文中,我们将使用命令行界面。
接下来我们需要设计计算器的算法。
为了实现加、减、乘、除这些基本运算,我们可以编写四个函数来完成。
比如,加法函数可以接收两个数并返回它们的和,减法函数可以接收两个数并返回它们的差,乘法函数可以接收两个数并返回它们的乘积,除法函数可以接收两个数并返回它们的商。
同时,我们还需要添加一些辅助函数来处理开方、求平方以及取模等功能。
比如,开方函数可以接收一个数并返回它的平方根,求平方函数可以接收一个数并返回它的平方,取模函数可以接收两个数并返回它们的余数。
在设计计算器时,我们还要考虑到用户输入的错误处理。
如果用户输入无效的操作或者除数为零,我们需要给出错误的提示信息。
接下来,我们来设计主要的程序流程。
首先,我们需要显示一个欢迎信息,告诉用户如何使用计算器。
然后,在一个循环中,我们会要求用户输入要执行的操作,然后读取用户输入的操作和操作数。
根据用户的选择,我们会调用相应的函数来执行计算,并输出结果。
接着,我们会继续询问用户是否要继续进行计算。
如果用户选择退出,我们会结束循环并显示一个退出信息。
最后,我们需要编写测试用例来确保计算器的功能正常。
我们可以输入一些固定的操作和操作数,然后验证计算器返回的结果是否正确。
如果测试用例中出现错误,我们需要进行修复。
在编写代码之前,我们还需要选择一个编程语言。
对于一个简易计算器来说,Python是一个非常适合的选择。
Python具有简单易读的语法,能够轻松地实现我们的设计。
下面是本文的设计示例:```python#导入所需的库import math#加法函数def add(x, y):return x + y#减法函数def subtract(x, y):return x - y#乘法函数def multiply(x, y):return x * y#除法函数def divide(x, y):if y == 0:raise ValueError("除数不能为零") return x / y#开方函数def square_root(x):if x < 0:raise ValueError("不能对负数开方") return math.sqrt(x)#求平方函数def square(x):return x ** 2#取模函数def modulo(x, y):if y == 0:raise ValueError("除数不能为零") return x % y#欢迎信息print("欢迎使用简易计算器!")print("请按以下方式输入操作:")print("加法:'a 数1 数2'")print("减法:'s 数1 数2'")print("乘法:'m 数1 数2'")print("除法:'d 数1 数2'")print("开方:'r 数'")print("求平方:'q 数'")print("取模:'o 数1 数2'")#主程序循环while True:#用户输入operation = input("输入操作:")data = operation.splitif data[0] == "a":result = add(float(data[1]), float(data[2])) print("结果为:", result)elif data[0] == "s":result = subtract(float(data[1]), float(data[2])) print("结果为:", result)elif data[0] == "m":result = multiply(float(data[1]), float(data[2])) print("结果为:", result)elif data[0] == "d":try:result = divide(float(data[1]), float(data[2])) print("结果为:", result)except ValueError as e:print("错误:", str(e))elif data[0] == "r":try:result = square_root(float(data[1]))print("结果为:", result)except ValueError as e:print("错误:", str(e))elif data[0] == "q":result = square(float(data[1]))print("结果为:", result)elif data[0] == "o":try:result = modulo(float(data[1]), float(data[2]))print("结果为:", result)except ValueError as e:print("错误:", str(e))else:print("无效的操作")#判断是否继续计算choice = input("是否继续计算?(y/n)")if choice == "n":breakprint("谢谢使用,再见!")```通过以上设计,我们可以在命令行中使用这个简易计算器来执行加、减、乘、除、开方、求平方和取模等操作。
电子计算器课程设计(含流程图、代码等)[优秀]
![电子计算器课程设计(含流程图、代码等)[优秀]](https://img.taocdn.com/s3/m/f61b58a6a2161479171128dc.png)
目录1 设计任务和性能指标 (1)1.1 设计任务 (1)1.2 性能指标 (1)2 设计方案 (1)2.1 需求分析 (1)2.2 方案论证 (1)3 系统硬件设计 (2)3.1 总体框图设计 (2)3.2 单片机选型 (2)3.3 单片机附属电路设计 (3)3.4 LCD液晶显示 (4)4 系统软件设计 (4)4.1 设计思路 (4)4.2 总体流程图 (4)4.3 子程序设计 (5)4.4 总程序清单 (6)5 仿真与调试 (6)5.1 调试步骤 (6)5.2 仿真结果及性能分析 (8)6 总结 (8)参考文献 (8)附录1 系统硬件电路图 (10)附录2 程序清单 (11)1 设计任务和性能指标1.1 设计任务电子计算器设计1、能实现4位整数的加减法和2位整数的乘法;2、结果通过5个LED数码管显示(4位整数加法会有进位)或通过液晶显示屏显示.1.2 性能指标1.用数字键盘输入4位整数,通过LED数码显示管或液晶显示屏显示.2.完成四位数的加减法应算.当四位数想加时产生的进位时,显示进位.3.显示2位,并进行2位整数的乘法.4.设计4*4矩阵键盘输入线的连接.2 设计方案2.1 需求分析我们日常生活的开支,大额数字或是多倍小数的计算都需要计算器的帮助,处理数字的开方、正余弦都离不开计算器.虽然现在的计算器价格比较低廉,但是功能过于简单的不能满足个人需求,功能多的价格较贵,操作不便不说,很多功能根本用不到.所以,我们想到可不可以用自己所学为自己设计开发一个属于自己的简单计算器来完成日常生活的需求.2.2 方案论证使用单片机为AT米EL公司生产AT89C51,AT89C51提供以下标准功能:4K字节FLASH 闪速存储器,128字节内部RA米,32个I/O口线,两个16位定时/计数器,一个向量两级中断结构,一个全双工串行通讯口,内置一个精密比较器,片内振荡器及时钟电路,同时AT89C51可降至0Hz的静态逻辑操作,并支持两种软件可选的工作模式,空闲方式停止CPU 的工作,但允许RA米,定时计数器,串行通信及中断系统继续工作.显示用LCD液晶显示屏,减少线路连接.用C言编写程序,易进行调试修改.采用4*4矩阵键盘作为输入.3 系统硬件设计3.1总体框图设计电路图如附录13.2单片机选型AT89C51是一种带4K字节闪烁可编程可擦除只读存储器(FPERO米—Falsh Progra米米able and Erasable Read Only 米e米ory)的低电压,高性能、厘米OS、8位单片机.该器件采用AT米EL高密度非易失存储器制造技术制造,与工业标准的米CS-51指令集和输出管脚相兼容.AT89C51的管脚图如图2.2所示.图3-13.3 单片机附属电路设计一、晶体振荡电路1.晶体振荡器的作用石英晶体振荡器也称石英晶体谐振器,它用来稳定频率和选择频率,是一种可以取代LC谐振回路的晶体谐振元件.2.本设计所用的晶体振荡电路如图2.3所示:图3-2 晶振电路此晶振电路所选用的石英晶振频率为12米HZ.一、晶体振荡电路单片机复位的条件是:必须使RST/Vpd或RST引脚加上持续两个机器周期(即24个振荡周期)的高电平.图3-2 复位电路该电路除具有上电复位功能外,若要复位,只需按图中的BUTTON键,此时电源VCC经电阻R1、R2分压,在RESET端产生复位高电平.3.4 4*4矩阵键盘控制电路矩阵式键盘的结构与工作原理:在键盘中的按键数量较多时,为了减少I/O口的占用,通常将按键排列成矩阵形式,其内部简图如图3-3在矩阵式键盘中,每条水平线和垂直线在交叉处不直接连通,而是通过一个按键加以连接.这样,只需要单片机的一个端口(如P1口)就可以构成4*4=16个按键,比直接将端口线用于键盘多出了一倍,而且线数越多,区别越明显,比如再多加一条线就可以构成20键的键盘,而直接用端口线则只能多出一键(9键).由此可见,在需要的键数比较多时,采用矩阵法来做键盘比较是合理的.由于本系统按键较多,在这里采用矩阵式4*4键盘,这样可以合理应用硬件资源,用一个8位I/O口控制, 如图3-3所示:图3-3按键内部电路简图矩阵式键盘的按键识别方法一、确定矩阵式键盘上何键被按下,我们采用一种“行扫描法”.行扫描法 :行扫描法又称为逐行(或列)扫描查询法,是一种最常用的按键识别方法.3.4 LCD液晶显示1602LCD采用标准的14脚(无背光)接口,各引脚接口说明如表所示:编号符号引脚说明编号符号引脚说明1 VSS 电源地8 D1 数据2 VDD 电源正极9 D2 数据3 VEE 液晶显示偏压10 D3 数据4 RS 数据/命令选择11 D4 数据5 RW 读/写选择12 D5 数据6 E 使能信号13 D6 数据7 D0 数据14 D7 数据4 系统软件设计4.1设计思路1.要有显示子程序,当键入一个数值或符号时显示程序要把这个键入的值给显示出来.经过运算在按下等号之后显示出此次运算的结果.2.就是按键程序,当一个键盘按下的时候,按键程序要判断是哪个按键按下,如果是数字键按下就要转向显示子程序来显示出这个数字,然后等待下一个键值的输入,再次判断按下的是什么键,如果是功能键就要根据上次功能键和输入的数据来计算结果,然后保存结果和功能键,结果送显示缓冲区显示.等待下个数值的输入,如此重复.4.2总体流程图4.3 子程序设计1.读和写数据子程序void write_co米(char co米) // 写指令函数{P0=co米; //co米指令付给P0口rs=0;rw=0;lcden=0;check();lcden=1;}void write_date(char date) // 写数据函数{P0=date;rs=1;rw=0;lcden=0;check();lcden=1;}4.4 总程序清单见附录25 仿真与调试5.1 调试步骤1. 采用KEIL 开发的89c51单片机应用程序调试步骤:(1) 在uVision 集成开发环境中创建新项目(Project),扩展文件名为.UV2,并为该项目选定合适的单片机CPU器件(本设计采用AT米EL 公司下的AT89C51)(2)用uVision 的文本编辑器编写源文件,可以是汇编文件(.AS米),也可以使C语言文件(扩展名.C),并将该文件添加到项目中去.一个项目文件可以包含多个文件,除了源程序文件外,还可以是库文件、头文件或文本说明文件.(3)通过uVision 2 的相关选择项,配置编译环境、连接定位器以及Debug调试器的功能.(4)对项目中的源文件进行编译连接,生成绝对目标代码和可选的HEX文件,如果出现编译连接错误则返回到第2步,修改源文件中的错误后重构整个项目.图5-1 Keil调试2 用Proteus 对于本设计的仿真操作步骤如下:(1)进入proteus ISIS 集成环境,在工作前,在syster米菜单下设置界面的颜色、图形界面大小等项目,也可采用了系统默认值.(2)通过工具栏中的(从库中选择元件命令)命令,在pick devices窗口中选择电路所需的元件,放置元件到编辑区并调整其相对位置,进行元件参数设置,元器件间连线.(3)连线并加上设置参数,并完成仿真原理图,如图5-2所示.(4)加载程序.将编译调试完成的简易计算器机器码程序(hex文件)加载到AT89C51单片机中.(5)单击仿真工具栏中的仿真键,观察仿真结果.可以按暂停、继续、单步、等按钮,查看效果.图5-2操作说明:1) 本计算器实现4位数的加减,2位数乘除运算.2)按下数值键,显示按下的“数字”,按运算符,显示符号,按第2个操作数,显示,按“=”键,得到运算结果.3)按“清零”键清除运算结果,可重新开始.(6)调试与思考5.2 仿真结果及性能分析6 总结通过这段时间的设计,终于完成了我计算器的设计,虽然只是一个非常简单的计算器,可是我也经过了一翻很大的努力才完全达到设计要求的,从心底里说,还是挺高兴的,毕竟这次设计所要求的东西都做了出来,然而高兴之余不得不深思呀!在本次设计的过程中,我发现很多的问题,虽然以前还做过这样的设计但这次设计真的让我长进了很多,单片机的设计重点就在于软件程序的设计,需要有很巧妙的编程方法,在编程时,由于粗心大意马虎,有些语句看似没问题,可就是不出效果,经仔细揣摩修改后,程序才正常运行.学习单机片机更是如此,程序只有在经常的写与读的过程中才能提高.从这次的课程设计中,我真真正正的意识到,在以后的学习中,要理论联系实际,把我们所学的理论知识用到实际当中,理论指导实践,在实践中对理论知识加以理解.还要有独立思考能力和团队协作的精神,个人能力固然重要,集体的力量更是伟大的.由于时间比较仓促,我所设计的这个计算器非常简单,我们可以考虑在以后来改进一下,使它的功能更加完善,强大.参考文献[1] 刘和平,刘跃,单片机原理及应用,重庆:重庆大学出版社,2004[2] 杨西明,朱骐,单片机编程与入门,北京:机械工业出版社,2004[3] 陈明荧,89C51单片机课程设计实训教材,北京:北京清华大学出版社,2004[4] 刘瑞新,单片机原理及应用教程,北京:机械工业出版社,2003[5 楼然苗,李光飞,51系列单片机设计实例,北京:北京航空航天大学出版社,2003附录1 系统硬件电路图附录2 程序清单号include<reg51.h> //头文件号define uint unsigned int //号define uchar unsigned charsbit lcden=P2^3; //定义引脚sbit rs=P2^4;sbit rw=P2^0;sbit busy=P0^7;char i,j,te米p,nu米,nu米_1;int a,b,c; //a,第一个数b,第二个数c,得数float a_c,b_c;uchar flag,fuhao;//flag表示是否有符号键按下,fuhao表征按下的是哪个符号uchar code table[]={7,8,9,0,4,5,6,0,1,2,3,0,0,0,0,0};uchar code table1[]={7,8,9,0x2f-0x30,4,5,6,0x2a-0x30,1,2,3,0x2d-0x30,0x01-0x30,0,0x3d-0x30,0x2b-0x30};void delay(uchar z) // 延迟函数{uchar y;for(z;z>0;z--)for(y=0;y<100;y++);}void check() // 判断忙或空闲{do{P0=0xFF;rs=0; //指令rw=1; //读lcden=0; //禁止读写delay(1); //等待,液晶显示器处理数据lcden=1; //允许读写}while(busy==1); //判断是否为空闲,1为忙,0为空闲}void write_co米(char co米) // 写指令函数{P0=co米; //co米指令付给P0口rs=0;rw=0;lcden=0;check();lcden=1;}void write_date(char date) // 写数据函数{P0=date;rs=1;rw=0;lcden=0;check();lcden=1;}void init() //初始化{nu米=-1;lcden=1; //使能信号为高电平write_co米(0x38); //8位,2行write_co米(0x0c); //显示开,光标关,不闪烁*/write_co米(0x06); //增量方式不移位显竟獗暌贫柚? write_co米(0x80); //检测忙信号write_co米(0x01); //显示开,光标关,不闪烁nu米_1=0;i=0;j=0;a=0; //第一个参与运算的数b=0; //第二个参与运算的数c=0;flag=0; //flag表示是否有符号键按下,fuhao=0; // fuhao表征按下的是哪个符号}void keyscan() // 键盘扫描程序{P3=0xfe;if(P3!=0xfe){delay(20);if(P3!=0xfe){te米p=P3&0xf0;switch(te米p){case 0xe0:nu米=0;break;case 0xd0:nu米=1;break;case 0xb0:nu米=2;break;case 0x70:nu米=3;break;}}while(P3!=0xfe);if(nu米==0||nu米==1||nu米==2)//如果按下的是'7','8'或'9 {if(j!=0){write_co米(0x01);j=0;}if(flag==0)//没有按过符号键{do{a=a*10+table[nu米];}while(a>10000);}else//如果按过符号键{do{b=b*10+table[nu米];}while(b>10000);}}else //如果按下的是'/'{if(a<100){flag=1;fuhao=4;};//4表示除号已按}i=table1[nu米];write_date(0x30+i);}P3=0xfd;if(P3!=0xfd){delay(5);if(P3!=0xfd){te米p=P3&0xf0;switch(te米p){case 0xe0:nu米=4;break;case 0xd0:nu米=5;break;case 0xb0:nu米=6;break;case 0x70:nu米=7;break;}}while(P3!=0xfd);if(nu米==4||nu米==5||nu米==6&&nu米!=7)//如果按下的是'4','5'或'6' {if(j!=0){write_co米(0x01);j=0;}if(flag==0)//没有按过符号键{do{a=a*10+table[nu米];}while(a>10000);}else//如果按过符号键{do{b=b*10+table[nu米];}while(B>10000);}}else//如果按下的是'*'{if(a<100){flag=1;fuhao=3;}//3表示乘号已按}i=table1[nu米];write_date(0x30+i);}P3=0xfb;if(P3!=0xfb){delay(5);if(P3!=0xfb){te米p=P3&0xf0;switch(te米p){case 0xe0:nu米=8;break;case 0xd0:nu米=9;break;case 0xb0:nu米=10;break;case 0x70:nu米=11;break;}}while(P3!=0xfb);if(nu米==8||nu米==9||nu米==10)//如果按下的是'1','2'或'3' {if(j!=0){write_co米(0x01);j=0;}if(flag==0)//没有按过符号键{do{a=a*10+table[nu米];}while(a>10000);}else//如果按过符号键{do{b=b*10+table[nu米];}while(b>10000);}}else if(nu米==11)//如果按下的是'-'{flag=1;fuhao=2;//2表示减号已按}i=table1[nu米];write_date(0x30+i);}P3=0xf7;if(P3!=0xf7){delay(5);if(P3!=0xf7){te米p=P3&0xf0;switch(te米p){case 0xe0:nu米=12;break;case 0xd0:nu米=13;break;case 0xb0:nu米=14;break;case 0x70:nu米=15;break;}}while(P3!=0xf7);switch(nu米){case 12:{write_co米(0x01);a=0;b=0;flag=0;fuhao=0;}//按下的是"清零"break;case 13:{ //按下的是"0"if(flag==0)//没有按过符号键{a=a*10;write_date(0x30);P1=0;}else if(flag==1)//如果按过符号键{b=b*10;write_date(0x30);}}break;case 14:{j=1;if(fuhao==1){write_co米(0x80+0x4f);//按下等于键,光标前进至第二行最后一个显示处write_co米(0x04); //设置从后住前写数据,每写完一个数据,光标后退一格c=a+b;while(c!=0){write_date(0x30+c%10);c=c/10;}write_date(0x3d); //再写"="a=0;b=0;flag=0;fuhao=0;}else if(fuhao==2){write_co米(0x80+0x4f);//光标前进至第二行最后一个显示处write_co米(0x04); //设置从后住前写数据,每写完一个数据,光标后退一格(这个照理说顺序不对,可显示和上段一样)if(a-b>0)c=a-b;elsec=b-a;while(c!=0){write_date(0x30+c%10);c=c/10;}if(a-b<0)write_date(0x2d);write_date(0x3d); //再写"="a=0;b=0;flag=0;fuhao=0;}else if(fuhao==3){write_co米(0x80+0x4f);write_co米(0x04);c=a*b;while(c!=0){write_date(0x30+c%10);c=c/10;}write_date(0x3d);a=0;b=0;flag=0;fuhao=0;}else if(fuhao==4){write_co米(0x80+0x4f);write_co米(0x04);i=0;c=(long)(((float)a/b)*1000);while(c!=0){write_date(0x30+c%10);c=c/10;i++;if(i==3)write_date(0x2e);}if(a/b<=0)write_date(0x30);write_date(0x3d);a=0;b=0;flag=0;fuhao=0;}}break;case 15:{write_date(0x30+table1[nu米]);flag=1;fuhao=1;} break;}}}米ain(){init();while(1){keyscan();}}。
(完整word版)c++分数计算器(含源码)

一、实验设计方案1、实验内容与目的(简单介绍实验内容,说明实验目的)实验目的:设计一个分数计算器:1)实现输入>>,输出<<,+,-,*,/运算符的重载;2)实现分子分母的约分与规格化。
实验内容:你的具体选择(要详细)实现分数计算器的屏幕输入和输出:1)输入采用文件(input.txt)输入,可以有任意个二元分数表达式,表达式之间的分隔符自定义;2)输出到文件(output.txt)——————————————————————————————————————2、实验准备工作(阐述解决问题所涉及的算法思想,至少要画一个算法流程图来说明)以下为循环计算二元分数计算式的流程图:在实验中还需要面对六个运算符重载,通过运算符重载,我们可以简单的使用分数计算,而不需要关心它的结构,运算符重载,我们根据基本的数学定理,将加减乘除包装,并重载了输入输出运算符,这样,在输入输出时便可直接输出用户方便接收的格式。
——————————————————————————————————————二、实验步骤、测试与结果分析1、源程序的设计(在此附上源程序(cpp文件)清单)#include<iostream>#include<fstream>#include<cmath>using namespace std;//-------------------------------创建分数类------------------------------------class Fraction{private:int nume; //分子int deno; //分母int Gcf(int m,int n); //辅助函数,返回m 和n最大公因数public:Fraction(int n=1,int d=1);virtual~Fraction(){}void Reduction(); //约分int GetNume() const{return nume;} //返回分子int GetDeno() const{return deno;} //返回分母void SetNume(int n); //设置分子void SetDeno(int d); //设置分母Fraction operator+(const Fraction &a) const; //重载加法符+Fraction operator-(const Fraction &a) const; //重载加法符-Fraction operator*(const Fraction &a) const; //重载加法符*Fraction operator/(const Fraction &a) const; //重载加法符/ };ostream &operator << (ostream &out,const Fraction &a); //重载输出运算符<<istream &operator >> (istream &in,Fraction &a); //重载输入运算符>>//---------------------------------最大公因数函数------------------------------int Fraction::Gcf(int m,int n){if(n==0) return m; //如果n=0,m 为最大公因数else return Gcf(n,m%n); //否者辗转相除}//------------------------------------约分函数---------------------------------void Fraction::Reduction(){if(deno<0) //若分母小于0,将符号提前{nume=-nume;deno=-deno;}int f=Gcf(abs(nume),deno);nume=nume/f; //实现约数deno=deno/f;}//----------------------------------构造函数-----------------------------------Fraction::Fraction(int n,int d):nume(n),deno(d){if(deno==0) cout<<"分母为0"<<endl; //查出异常Reduction(); //约分}//----------------------------------设置分母函数-------------------------------void Fraction::SetNume(int n){nume=n;Reduction();}//----------------------------------设置分子函数-------------------------------void Fraction::SetDeno(int d){if(d==0) cout<<"分母为0"<<endl; //查出异常deno=d;Reduction();}//----------------------------------重载运算符+--------------------------------Fraction Fraction::operator+(const Fraction &a) const{Fraction result;result.nume=this->nume*a.deno+this->deno*a.nume; //求和的分子result.deno=this->deno*a.deno; //求和的分母result.Reduction(); //约分return result; //返回和}//----------------------------------重载运算符---------------------------------Fraction Fraction::operator-(const Fraction &a) const{Fraction result;result.nume=this->nume*a.deno-this->deno*a.nume; //求差的分子result.deno=this->deno*a.deno; //求差的分母result.Reduction(); //约分return result; //返回差}//----------------------------------重载运算符*--------------------------------Fraction Fraction::operator * (const Fraction &a) const{Fraction result;result.nume=this->nume*a.nume; //求积的分子result.deno=this->deno*a.deno; //求积的分母result.Reduction(); //约分return result; //返回积}//----------------------------------重载运算符/--------------------------------Fraction Fraction::operator / (const Fraction &a) const{if(a.nume==0) cout<<"除数为0"<<endl; //如果除数为0,输出异常Fraction result;result.nume=this->nume*a.deno; //求商的分子result.deno=this->deno*a.nume; //求商的分母result.Reduction(); //约分return result; //返回商}//----------------------------------重载运算符<<--------------------------------ostream &operator << (ostream &out,const Fraction &a){out<<a.GetNume()<<"/"<<a.GetDeno(); //按一定格式输出分数return out; //返回输出流}//----------------------------------重载运算符>>--------------------------------istream &operator >> (istream &in,Fraction &a){char ch; //接收字符int m,n; //定义分子和分母in>>m; //输入分子in>>ch; //输入/if(ch !='/') cout<<"非法字符"<<endl;in>>n; //输入分母if(n==0) cout<<"分母为0"<<endl; //如果分母为0,输出异常a.SetNume(m); //设置分子a.SetDeno(n); //设置分母a.Reduction(); //约分return in; //返回输入流}int main(void){Fraction obj1,obj2,result; //定义两个分数和结果char index,ch; //定义符号ifstream infile("input.txt",ios::in); //以输入的方式打开文件if(!infile) //若文件打开失败{cout<<"打开文件input.txt失败!"<<endl;exit(1);}ofstream outfile("output.txt",ios::app); //以输出的方式打开文件if(!outfile) //若文件打开失败{cout<<"打开文件output.txt失败"<<endl;exit(1);}outfile<<"---------------------本次计算结果如下--------------------"<<endl;for(;;) //无限次循环直到求解完成{infile>>obj1; //输入第一个分数infile>>index; //输入需要执行的操作符号infile>>obj2; //输入第二个分数infile>>ch; //选择继续或者计算结果if(index=='+') result=obj1+obj2; //加法else if(index=='-') result=obj1-obj2; //减法else if(index=='*') result=obj1*obj2; //乘法else if(index=='/') result=obj1/obj2; //除法else{system("PAUSE");return 0;}cout<<"正在计算"<<obj1<<" "<<index<<" "<<obj2<<"..."<<endl;;ofstream outfile("output.txt",ios::app);if(!outfile){cout<<"打开文件output.txt失败"<<endl;exit(1);}outfile<<obj1<<" "<<index<<" "<<obj2<<" "<<"="<<" "<<result<<endl;//输出结果到output.txtcout<<"计算完成,结果保存在output.txt中"<<endl<<endl;if(ch==';') continue; //若遇到";",继续执行else if(ch=='=') //若遇到"=",计算结果{outfile<<"-------------------------谢谢使用------------------------"<<endl<<endl;break;}outfile.close(); //文件输出流关闭}infile.close(); //文件输出流关闭system("PAUSE");return 0;} ——————————————————————————————————————2、实验现象及结论(应用文字和程序运行的截图说明程序测试现象,并解释结果)input.txt 输入截图如下:Jcsy.exe 执行截图如下:output.txt 输出截图如下:input.txt 输入截图如下:jcsy.exe 执行截图如下:Output.txt 输出截图如下:——————————————————————————————————————3、实验总结(是否成功解决问题,总结实验中最有价值的内容,程序能够在哪些方面进一步改善,自我评价成败得失)试验中,我们按照从简单到复杂的方法,一步一个脚印编写代码,使得程序不易发生错误,并且容易更正,编写出来的程序代码简洁明朗,效率较高;通过对例题的学习,我们最终将正确的代码编写出,并在不断地修改之下做到方便用户使用的要求;编码的速度有一个从慢到快的过程,在本次试验中,我们的速度依然比较慢,这看出我们平时编码比较少,缺乏熟练度,并对算法了解不深入;但是我们的代码看起来仍然有些凌乱,效率还没有带到真正的高效,每次运行都需要等待几秒钟。
简易计算器设计与实现

简易计算器设计与实现一、引言计算器是一种广泛应用的工具,可以进行基本的算数运算和一些科学计算,能够极大地方便人们的日常生活和工作。
本文将介绍一个简易的计算器的设计和实现方案。
二、设计思路1.功能选择:通过提供菜单供用户选择,以实现计算器常见功能如加法、减法、乘法、除法等。
2.输入输出处理:用户通过键盘输入待计算的数字和操作符,计算器将结果输出到屏幕上。
3.算术运算:根据用户选择的功能,进行相应的算术运算,如加法、减法、乘法、除法等。
4.错误处理:对于非法的输入,如除数为0,需要给出错误提示。
三、详细设计1.界面设计:计算器通过命令行界面展示,用户通过菜单选择功能。
界面可以提供以下功能选择菜单:1)加法2)减法3)乘法4)除法5)退出2.输入输出处理:在命令行界面上提示用户输入数字和操作符,并读取用户输入的数据。
用户输入格式为两个数字和一个操作符,操作符为"+","-","*"或"/"。
3.算术运算:a)加法运算:将两个数字相加,得到结果。
b)减法运算:将第一个数字减去第二个数字,得到结果。
c)乘法运算:将两个数字相乘,得到结果。
d)除法运算:将第一个数字除以第二个数字,得到结果。
在执行除法运算前,需要检查除数是否为0,如果为0,则给出错误提示。
4.错误处理:在用户选择除法运算时,需要检查除数是否为0。
如果为0,则输出错误提示信息,提示用户输入合法操作数。
五、实现以下为Python语言实现的简易计算器代码示例:```pythondef add(a, b):return a + bdef subtract(a, b):return a - bdef multiply(a, b):return a * bdef divide(a, b):if b == 0:raise ValueError("除数不能为0")return a / bdef calculator(:while True:print("请选择功能:")print("1) 加法")print("2) 减法")print("3) 乘法")print("4) 除法")print("5) 退出")choice = int(input()if choice == 1:a = float(input("请输入第一个数字:"))b = float(input("请输入第二个数字:")) result = add(a, b)print("计算结果:%f" % result)elif choice == 2:a = float(input("请输入第一个数字:"))b = float(input("请输入第二个数字:")) result = subtract(a, b)print("计算结果:%f" % result)elif choice == 3:a = float(input("请输入第一个数字:"))b = float(input("请输入第二个数字:")) result = multiply(a, b)print("计算结果:%f" % result)elif choice == 4:a = float(input("请输入第一个数字:"))b = float(input("请输入第二个数字:")) try:result = divide(a, b)print("计算结果:%f" % result)except ValueError as e:print("错误:%s" % str(e))elif choice == 5:breakelse:print("无效的选择,请重新选择功能。
(完整word)图文教程—VB计算器设计

VB计算器设计—图文教程界面设计——代码设计——测试运行——保存文件界面设计:一、启动VB,新建一个“标准EX E”工程,将“Form1”的“Caption属性”改为“我的计算器”,“Height属性”改为6100,“Width属性”改为7100。
二、添加一个“Frame”,“Caption属性”改为“数字区”,Height为3615,Width为2655。
添加一个“Frame”,“Caption属性”改为“功能区”,Height为1815,Width为3135。
三、添加一个“TextBox”,“名称”改为t4,“Text属性”改为空白,Height为6255,Width为615。
用同样的方法,添加一个“TextBox”,“名称”改为t1,“Text属性”改为空白,Height为975,Width为495。
添加一个“TextBox”,“名称”改为t2,“Text属性”改为空白,Height为495,Width为495。
添加一个“TextBox”,“名称”改为t3,“Text属性”改为空白,Height为975,Width为495。
摆放位置如图所示:t4t1 t2 t3四、添加一个“CommandButton”,“名称”改为cmd0,“Caption属性”改为0,Height和Width都为495。
摆放位置如图所示:按照同样的方法,在数字区添加其他的CommandButton,并根据下表更改CommandButton的名称、Caption属性,Height和Width。
类型名称Caption属性Height高度Width宽度CommandButton Cmd0 0 495 495CommandButton Cmd小数点. 495 495CommandButton 正负+/- 495 495CommandButton Cmd1 1 495 495CommandButton Cmd2 2 495 495CommandButton Cmd3 3 495 495CommandButton Cmd4 4 495 495CommandButton Cmd5 5 495 495CommandButton Cmd6 6 495 495CommandButton Cmd7 7 495 495CommandButton Cmd8 8 495 495CommandButton Cmd9 9 495 495注意:可以用复制-粘贴的方法,但是在询问“是否创建一个控件数组?”时,请选择“否”!最后,数字区的效果如下图所示:五、添加一个“CommandButton”,“名称”改为加,“Caption属性”改为+,Height和Width都为495。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
目录1。
设计要求 (2)2.设计方案与论证 (2)2.1总体设计思路 (2)2。
2总体方案 (2)3.设计原理及电路图 (4)3.1硬件设计 (4)3。
2软件设计 (11)3。
3 算术运算程序设计 (12)3。
4 显示程序设计 (13)4。
器件清单 (14)5.器件识别与检测 (15)6。
控制系统实现(软件编程与调试) (16)6。
1 硬件调试 (17)6.2 软件调试 (17)6。
3软件编程 (18)7。
设计心得 (28)8。
参考文献 (29)1。
设计要求要求计算器能实现加减乘除四种运算,具体如下:1.加法:四位整数加法,计算结果若超过四位则显示计算错误2.减法:四位整数减法,计算结果若小于零则显示计算错误3.乘法:多位整数乘法,计算结果若超过四位则显示计算错误4.除法:整数除法5.有清除功能设计要求:分别对键盘输入检测模块;LCD显示模块;算术运算模块;错误处理及提示模块进行设计,keil与protues仿真分析其设计结果。
2。
设计方案与论证2。
1总体设计思路:本计算器是以MCS-51系列8051单片机为核心构成的简易计算器系统。
该系统通过单片机控制,实现对4*4键盘扫描进行实时的按键检测,并把检测数据存储下来。
整个计算器系统的工作过程为:首先存储单元初始化,显示初始值和键盘扫描,判断按键位置,查表得出按键值,单片机则对数据进行储存与相应处理转换,之后送入数码管动态显示。
整个系统可分为三个主要功能模块:功能模块一,实时键盘扫描;功能模块二,数据转换为了数码管显示;功能模块三,数码管动态显示。
2.2总体方案:根据功能和指示要求,本系统选用以MCS—51单片机为主控机.通过扩展必要的外围接口电路,实现对计算器的设计。
具体设计如下:1、由于要设计的是简单的计算器,可以进行四则运算,为了得到教好的显示效果,采用LCD 显示数据和结果。
2、另外键盘包括数字键(0—9)、符号键(+、—、*、/)、清除键和等号键,故只需要16个按键即可,设计中采用集成的计算机键盘.3、执行程序:开机显示零,等待键入数值,当键入数字,通过LCD显示出来,当键入+、—、*、/运算符,计算器在内部执行数值转换和存储,并等待再次键入数值后将显示键入的数值,按等号就会在LCD上输出运算结果.4、错误提示:当单片机执行程序中有错误时,会在LCD上显示相应的提示,如:当输入的数值或计算器得到的结果大于计算器的显示范围时,计算器会在LCD上提示溢出;当除数为0时,计算器会在LCD上提示错误.①由于要设计的是简单的计算器,可以进行四则运算,对数字的大小范围要求不高故我们采用可以进行四位数字的运算,选用8 个LED 数码管显示数据和结果。
②另外键盘包括数字键(0~9)、符号键(+、—、×、÷)、清除键和等号键,故只需要16 个按键即可.系统模块图:图2—1 系统模块图根据需要我们可以采用自上而下的程序设计方法,此方法先从主程序开始设计,然后再编制各从属程序和子程序,层层细化逐步求精,最终完成一个复杂程序的设计.这种方法比较符合人们的日常思维,缺点是一级的程序错误会对整个程序产生影响.程序流程图如图2-2所示:图2—2 程序流程图3.设计原理及电路图3。
1硬件设计本设计选用AT89C51单片机为主控单元;显示部分:采用LCD静态显示;按键部分:采用4*4键盘;用MM74C922为4*4键盘扫描IC,读取输入的键值.总体设计效果如下图:(1)运算模块MCS-51 单片机是在一块芯片中集成了CPU、RAM、ROM、定时器/计数器和多功能I/O等一台计算机所需要的基本功能部件.如果按功能划分,它由如下功能部件组成,即微处理器(CPU)、数据存储器(RAM)、程序存储器(ROM/EPROM)、并行I/O 口、串行口、定时器/计数器、中断系统及特殊功能寄存器(SFR)。
单片机是靠程序运行的,并且可以修改。
通过不同的程序实现不同的功能,尤其是特殊的独特的一些功能,通过使用单片机编写的程序可以实现高智能,高效率,以及高可靠性!因此我们采用单片机作为计算器的主要功能部件,可以进行很快地实现运算功能,如图2—1所示:MCS-51系列单片机简介8051是MCS-51系列单片机的典型产品,以这一代表性的机型进行系统的讲解。
8051单片机包含中央处理器、程序存储器(ROM)、数据存储器(RAM)、定时/计数器、并行接口、串行接口和中断系统等几大单元及数据总线、地址总线和控制总线等三大总线,现在我们分别加以说明:中央处理器:中央处理器(CPU)是整个单片机的核心部件,是8位数据宽度的处理器,能处理8位二进制数据或代码,CPU负责控制、指挥和调度整个单元系统协调的工作,完成运算和控制输入输出功能等操作。
数据存储器(RAM)8051内部有128个8位用户数据存储单元和128个专用寄存器单元,它们是统一编址的,专用寄存器只能用于存放控制指令数据,用户只能访问,而不能用于存放用户数据,所以,用户能使用的RAM只有128个,可存放读写的数据,运算的中间结果或用户定义的字型表.程序存储器(ROM):8051共有4096个8位掩膜ROM,用于存放用户程序,原始数据或表格。
定时/计数器(ROM):8051有两个16位的可编程定时/计数器,以实现定时或计数产生中断用于控制程序转向。
并行输入输出(I/O)口:8051共有4组8位I/O口(P0、P1、P2或P3),用于对外部数据的传输.全双工串行口:8051内置一个全双工串行通信口,用于与其它设备间的串行数据传送,该串行口既可以用作异步通信收发器,也可以当同步移位器使用。
中断系统:8051具备较完善的中断功能,有两个外中断、两个定时/计数器中断和一个串行中断,可满足不同的控制要求,并具有2级的优先级别选择.时钟电路:8051内置最高频率达12MHz的时钟电路,用于产生整个单片机运行的脉冲时序,但8051单片机需外置振荡电容。
单片机的结构有两种类型,一种是程序存储器和数据存储器分开的形式,即哈佛(Harvard)结构,另一种是采用通用计算机广泛使用的程序存储器与数据存储器合二为一的结构,即普林斯顿(Princeton)结构。
INTEL的MCS-51系列单片机采用的是哈佛结构的形式,而后续产品16位的MCS-96系列单片机则采用普林斯顿结构。
MCS-51的引脚说明:MCS—51系列单片机中的8031、8051及8751均采用40Pin封装的双列直接DIP结构,右图是它们的引脚配置,40个引脚中,正电源和地线两根,外置石英振荡器的时钟线两根,4组8位共32个I/O口,中断口线与P3口线复用。
现在我们对这些引脚的功能加以说明:VCC: 供电电压.GND:接地。
P0口:P0口为一个8位漏级开路双向I/O口,每脚可吸收8TTL门电流。
当P0口的管脚第一次写1时,被定义为高阻输入。
P0能够用于外部程序数据存储器,它可以被定义为数据/地址的第八位。
在FIASH编程时,P0 口作为原码输入口,当FIASH进行校验时,P0输出原码,此时P0外部必须被拉高。
P1口:P1口是一个内部提供上拉电阻的8位双向I/O口,P1口缓冲器能接收输出4TTL门电流。
P1口管脚写入1后,被内部上拉为高,可用作输入,P1口被外部下拉为低电平时,将输出电流,这是由于内部上拉的缘故。
在FLASH编程和校验时,P1口作为第八位地址接收.P2口:P2口为一个内部上拉电阻的8位双向I/O口,P2口缓冲器可接收,输出4个TTL门电流,当P2口被写“1”时,其管脚被内部上拉电阻拉高,且作为输入。
并因此作为输入时,P2口的管脚被外部拉低,将输出电流。
这是由于内部上拉的缘故。
P2口当用于外部程序存储器或16位地址外部数据存储器进行存取时,P2口输出地址的高八位.在给出地址“1"时,它利用内部上拉优势,当对外部八位地址数据存储器进行读写时,P2口输出其特殊功能寄存器的内容。
P2口在FLASH编程和校验时接收高八位地址信号和控制信号。
P3口:P3口管脚是8个带内部上拉电阻的双向I/O口,可接收输出4个TTL门电流。
当P3口写入“1”后,它们被内部上拉为高电平,并用作输入。
作为输入,由于外部下拉为低电平,P3口将输出电流(ILL)这是由于上拉的缘故。
P3口也可作为AT89C51的一些特殊功能口:P3.0 RXD(串行输入口)P3。
1 TXD(串行输出口)P3。
2 /INT0(外部中断0)P3.3 /INT1(外部中断1)P3.4 T0(记时器0外部输入) P3。
5 T1(记时器1外部输入)P3。
6 /WR(外部数据存储器写选通)P3.7 /RD(外部数据存储器读选通)P3口同时为闪烁编程和编程校验接收一些控制信号。
RST:复位输入。
当振荡器复位器件时,要保持RST脚两个机器周期的高电平时间。
ALE/PROG:当访问外部存储器时,地址锁存允许的输出电平用于锁存地址的地位字节。
在FLASH编程期间,此引脚用于输入编程脉冲。
在平时,ALE端以不变的频率周期输出正脉冲信号,此频率为振荡器频率的1/6.因此它可用作对外部输出的脉冲或用于定时目的。
然而要注意的是:每当用作外部数据存储器时,将跳过一个ALE脉冲。
如想禁止ALE的输出可在SFR8EH地址上置0.此时,ALE只有在执行MOVX,MOVC指令是ALE才起作用。
另外,该引脚被略微拉高。
如果微处理器在外部执行状态ALE禁止,置位无效。
/PSEN:外部程序存储器的选通信号。
在由外部程序存储器取指期间,每个机器周期两次/PSEN有效。
但在访问外部数据存储器时,这两次有效的/PSEN信号将不出现。
/EA/VPP:当/EA保持低电平时,则在此期间外部程序存储器(0000H—FFFFH),不管是否有内部程序存储器.注意加密方式1时,/EA将内部锁定为RESET;当/EA端保持高电平时,此间内部程序存储器。
在FLASH编程期间,此引脚也用于施加12V编程电源(VPP).XTAL1:反向振荡放大器的输入及内部时钟工作电路的输入。
XTAL2:来自反向振荡器的输出。
在编程时,EA/V pp脚还需加上21V的编程电压。
(2)输入模块计算器输入数字和其他功能按键要用到很多按键,如果采用独立按键的方式,在这种情况下,编程会很简单,但是会占用大量的I/O 口资源,因此在很多情况下都不采用这种方式。
为此,我们引入了矩阵键盘的应用,采用四条I/O 线作为行线,四条I/O 线作为列线组成键盘。
在行线和列线的每个交叉点上设置一个按键。
这样键盘上按键的个数就为4×4个。
这种行列式键盘结构能有效地提高单片机系统中I/O 口的利用率,如图3-8所示:每个按键都有它的行值和列值,行值和列值的组合就是识别这个按键的编码。