计算器设计思路.docx
《计算器设计思路.docx》由会员分享,可在线阅读,更多相关《计算器设计思路.docx(12页珍藏版)》请在冰豆网上搜索。
计算器设计思路
“语言课程设计”报告
姓名
程序
优良中及格不及格
学号
文档
优良中及格不及格
专业
计算机
平时
优良中及格不及格
起始日期
2010年7月
总评
终止日期
2010年9月
设计文档
设计任务
计算器
任务分析
1.实现具有加,减,乘,除基本四则运算功能
2.设计基于MFC框架的,具有友好界面的Windows应用程序
3.科学计算器要求具有运算优先级别,包括运算符号的优先级判断,实现基于括号的优先级控制
设计思路与流程
首先设计出一个计算器的对话框,通过在对话框中输入计算式,然后使用相关的类对计算器进行解析计算,再将计算结果输出在对话框中。
具体步骤:
1.弹出对话框,提示输入算式
2.用户单击按钮后调用相应的函数进行计算
3.函数首先判断计算式是否合法
4.如果合法的话则去除算式中全部的空白
5.函数将依次递归判断,根据第一个字符来确定下一步的动作
6.如果是一个左括号,则表示括号内是一个表达式,递归调用自身
7.如果是一个数字,则读取后面的全部字符直到不是数字
8.如果是一个运算符,如果是乘或者除则直接对运算符两边的数字进行运算,然后返回结果,因为乘除的优先级最高
9.如果是一个运算符,且为加、减、取模,则先递归调用自身进行下一步运算,然后对返回的结果进行运算,最后返回结果,这样可以保证比加减运算高的操作能率先执行
10.如果是一个字母,则可能是一次函数调用,或者一个变量,继续读取余下的字母,如果剩余一个括号,表明是一个函数,则进行函数运算
11.如果剩余字符是一个运算符,则表明读取的是一个变量,则从符号表中读取该变量并转化为数字
12.如果读到了一个右括号,表明表达式结束,直接返回运算结果
13.如果算式为“字母串=表达式”的形式,说明这是一个给变量赋值的表达式,先读取变量名,然后给其赋予表达式的结果
14.全部表达式运算完毕后,如果还剩余字符,说明要么该字符不合法,要么表达式有语法错误,抛出异常
15.最后将运算结果返回给对话框,然后将其转换为字符串显示出来
其中,为了实现错误检测,采用了C++的异常机制,一旦发现语法错误或者语义错误便抛出异常,然后由对话框捕捉异常并提示错误。
另外保存变量的符号表直接由std:
map实现,进行函数调用时同样使用map将函数名和函数指针关联起来。
功能介绍
该计算器可以进行基础的加减乘除运算,能够判断运算符的优先级和判断括号,并且能够判断所有的语法错误和语义错误。
除此以外,计算器还能使用变量,能在表达式中直接使用变量名,并且能够使用表达式对变量进行复制。
同时,计算器还能进行函数运算,目前支持一元函数和二元函数。
一元函数包括acos,sin,atan,ceil.cos,cosh,exp,abs,floor,log,log10,sin,sinh,sqrt,tan,pow,atan,rand,round,acosh,atanh,cbrt,asinh。
二元函数包括dim,max,min,mod。
同时计算器能够生成随机数进行运算,该计算器可以使用C函数库中全部的数学函数。
文件与对象描述
cal.h:
包括计算器全部函数的声明
cal.cpp:
计算器全部函数的实现
cal_exception.h:
用于表示计算错误的异常类的声明于实现
cal_private.h:
一些计算器自身使用的内部函数
cal_number_type.h:
用于定义数字的类型,此处直接为double
cal_functions.h:
表达式中使用的函数的声明
cal_functions.cpp:
表达式中使用的函数的实现
Calculator.cpp:
计算器的对话框使用的类
Calculator.h:
计算器对话框类的定义
CalculatorDlg.cpp:
计算器的主程序,包括消息循环的响应菜单
CalculatorDlg.h:
对话框的定义
DialogAbout.cpp:
关于对话框的声明
DialogAbout.h:
关于对话框的定义
测试报告
1.计算器的界面
1.进行运算并保存历史记录
2.进行变量的赋值,并更新变量列表
总结
虽然计算器这个项目比较简单,但仍能考验出实际编程的能力,在简单的计算器上进行拓展并保证日后二次开发的拓展性仍然是一个不简单的任务。
设计文档
设计任务
1.要求能够随机产生矩阵。
2.要求实现两矩阵相加,相减,相乘,以及数乘基本运算功能
3.设计基于MFC框架的,具有友好界面的Windows应用程序
4.能够使用单选按钮,选择矩阵,并将其转置。
任务分析
由于矩阵的输入本身就是一个繁杂的过程,如果使用鼠标点击的方式来输入矩阵,操作将异常繁杂,所以矩阵的输入决定依旧采用手工输入的方式,考虑到矩阵运算本身和计算器就有共通之处,所以决定将矩阵运算加入计算器的功能当中,这样可以直接实现矩阵的表达式运算。
设计思路与流程
首先计算器中表示数字的类型需要进行包装,将原有的double置换成矩阵类,同时在计算器读取数字的本分进行拓展,使其能够分析并读取矩阵。
另外矩阵本身的类也依旧需要进行大量的实现,加减乘除等运算需要进行重载,使其既能够实现矩阵之间的运算,还要能实现矩阵与数字之间的运算。
具体步骤:
1.用户输入表达式
2.程序分析出用户输入的矩阵
3.程序利用计算器使用的语法分析函数对矩阵进行运算
4.将矩阵转化为字符串输出
功能介绍
本程序除了可以计算矩阵与矩阵之间的+、-、*、/运算,还能计算矩阵与数字之间的运算,同时能够计算包含矩阵的复杂表达式。
同时还能够对矩阵进行函数运算,可以进行转置,左除,右除等操作。
文件与对象描述
cal_number_type.h:
矩阵类的定义
cal_number_type.cpp:
矩阵类的实现
DialogViewMatrix.cpp:
查看矩阵的窗口类
DialogViewMatrix.h:
查看矩阵窗口类的定义
NewMatrixDlg.cpp:
新建矩阵的窗口
NewMatrixDlg.h:
新建矩阵窗口类的定义
矩阵对象描述:
number_t(double=0.0);使用数字初始化
number_t(number_t*,int,int,constchar*);//initialmatrix
number_t(constnumber_t&);
~number_t();//析构函数
number_t&operator=(constnumber_t&);//赋值构造器
number_toperator+(constnumber_t&)const//重载加法运算符;
number_toperator-(constnumber_t&)const//重载减法运算符;
number_toperator*(constnumber_t&)const//重载乘法运算符;
number_toperator/(constnumber_t&)const//重载除法运算符;
number_toperator%(constnumber_t&)const//重载取模运算符;
number_toperator^(constnumber_t&)const//重载异或运算符;
number_toperator-()const//重载一元取负运算符;
number_toperator[](intindex)//取得某一项元素;
number_t&operator[](intindex)//取得并修改某一项元素;
booloperator==(constnumber_t&rhs)const;
booloperator!
=(constnumber_t&rhs)const;
number_t&operator+=(constnumber_t&rhs);
number_t&operator-=(constnumber_t&rhs);
number_t&operator*=(constnumber_t&rhs);
number_t&operator/=(constnumber_t&rhs);
测试报告
新建矩阵的窗口:
输入矩阵:
矩阵进行转置运算:
矩阵进行表达式运算:
总结
矩阵运算的实现采取了在计算器上进行扩展的方式,一方面说明了原有计算器代码的健壮性和拓展性,另一方面也将C++强大的运算重载发挥到了机制,在计算器代码不变动的情况下就能加入强大的矩阵运算功能。