计算器设计.docx
- 文档编号:11216534
- 上传时间:2023-02-25
- 格式:DOCX
- 页数:20
- 大小:127.39KB
计算器设计.docx
《计算器设计.docx》由会员分享,可在线阅读,更多相关《计算器设计.docx(20页珍藏版)》请在冰豆网上搜索。
计算器设计
[内容摘要]在今天的中国,一切都是在高速发展着。
因此,计算的效率也必须是高速度的,这样才可能与世界接轨。
否则,中国就会落后于其他国家。
如果想要高速发展,就必须发展数学,因为数学的基础是计算。
当基本计算能够高速而有效,我们就可以高速发展。
从另一方面来说,在生活中我们也会碰到各种各样的计算。
但是当我们拥有一个计算器之后,我们就可以用它来进行加、减、乘、除等运算,也不会为碰到各种各样的计算时而束手无策。
现在我用C语言编写一个计算器的程序,此设计是通过c++在VC++6.0的版本下编缉的一款计算器。
该款计算器除了可以进行一些基本的计算之外,还可以进行带括号的计算。
[关键词]栈;四则运算;计算器
[ABSTRACT]Intoday'sChina.Everythingisdevelopingathighspeed.Therefore,theefficiencyofcalculationalsomustsbehighspeed.Thisjustmaybeinlinewithworld.Otherwise,Chinawilllagbehindothercountries.Ifyouwanthigh-speeddevelopment,wemustdevelopmath,becausemathisbasedonthecalculations.Whenthebasiccalculationscanbefastandeffective,wecandevelopmentAthighspeed。
Ontheotherhand,wewillcomeintocontactwithavarietyofcalculationsinlife.Butwhenwehaveacalculator,wecanuseittoadd,subtract,multiply,divideandotheroperations,andwecan'tfeelhelplessformeetwithallkindsofcalculations,either.NowIuseClanguagetowriteacalculatorprogram.thedesignisamodelofcalculatorthroughc++whileeditsundertheVC++6.0edition.Thecalculatorexceptforsomebasiccalculations,butalsoitcanbecalculatedwiththebrackets
[KEYWORDS]shed;arithmetic;Calculator
计算器设计
数与计算是人们生活、学习、科学研究和生产实践中应用最广泛的一种数学方法。
在当今科学技术迅猛发展的时代,科学中各个领域都有非常巨大的变化,但是,基本的计算方法却没有多大的变化。
这充分说明计算的基础性和工具性。
对于每个人来说,仅在小学阶段学习整数、小数和分数四则计算及其混合运算,就可以运用一生了。
因此,在小学阶段学好以上计算,并形成一定的计算能力,这是终身有益的事情。
但是在以后的人生中,我们虽说是运用这些简单的运算,但是我们的数据不在是那么简单了,我们的数据可能是成千上万了,这是我们靠口算与笔算,远远是不够的,所以我们就要借助工具了,这就需要计算器。
一、本文的主要研究工作
(一)研究方法
通过VC6.0进行编写代吗。
(二)研究目的
用C语言编写一个简单的计算器,解决生活中的不时之需。
(三)任务描述
本次设计的计数器是在dos下的,没有独立的界面。
除了可以进行常用的四则运算,其还拥有着带括号的四则运算功能,还拥有带三角函数等函数计算的功能。
因为是dos界面下,所以能够准确快速的输入数据。
二、设计具体过程
(一)问题分析
根据本次程序设计的目的和要求,设计相应的函数,并设计程序结构,合理的选择程序的结构,在具体细节方面,要一步一步处理,总之,在分析时,要将大的化小,小的化了
(二)设计思路
总体思路:
通过按键盘上的选项,输入数字保存起来,然后按符合键,把符合保存,再输入另一个数字,保存起来,最后按等于号键,系统按你所输入的符号键来判断所以进行的运算,计算出来的结果显示在dos界面中,按键的过程是通过电脑键盘上键来输入数据,最后按回车键来得到结果。
具体思路:
根据程序设计的要求,按模块分步骤来编写程序。
第一歩,写出此计算器程序所需的编译预处理命令。
第二步,构建一个空栈,用来分配空间。
第三步,判断优先级。
第四步,写出函数,包括子函数和主函数。
最后,进行完化其他细节。
(三)模块设计
为了程序实现,我把整个算法分成三大模块,第一块进行栈和栈处理的定义,以便在实现数据处理时运用。
第二块优先级的判断,这是程序的重点,一旦优先级错误就将导致整个算法的错误。
第三块就是数据的处理,调用前两个模块,进行运算。
图1程序整体结构图
(四)数据结构
表1栈
typedefstruct{***}SqStack
建栈顶指针与栈底指针,栈长三个变量
voidInitStack(SqStack&S)
构造一个空栈S
doubleClearStack(SqStack&S)
将栈置为空栈
doubleGetTop(SqStackS,double&e)
用e返回S的栈顶元素
voidPush(SqStack&S,doublee)
插入元素e为新的栈顶元素
doublePop(SqStack&S,double&e)
删除S的栈顶元素,用e返回其值
表2函数
SElemTypePrecede(***)
判断两个数符号的优先关系
switch(){***}
选择
printf(***)
scanf(***)
getchar(***)
输入输出函数
doubleOperate1(***)
四则运算
doubleOperate2(***)
三角函数运算
doubleIn(***)
判断运算符号
main()
主函数
While()
dowhile()
for()
循环
循环
if()
if()else
判断语句
(五)函数的实现
这个系统最为重要的就是实现函数,只有这样才能运行,整个系统的函数最为重要的就是优先级函数的判断,另外还有就是计算,为了函数的调用与实现,所以在函数开头就要将所有的头文件都包括进,这样就可以在计算时调用。
头文件如下:
typedefcharSElemType;
#include"string.h"
#include"stdio.h"
#include"stdlib.h"
#include"math.h"
#include"process.h"
#include"iostream.h"
#defineTURE1
#defineFALSE0
#defineOK1
#defineERROR0
#defineOVERFLOW-2
#defineSTACK_INIT_SIZE10/*存储空间初始分配量*/
#defineSTACK_INCREMENT2/*存储空间分配增量*/
所有头文件进行声明之后,就可以进行各样的初始化,初始化之后就是函数的实现,在这里我们构建两个栈,一个是OPTR,一个是OPND。
OPTR进行符号的储存,OPND进行数据的储存。
SqStackOPTR,OPND;
InitStack(OPTR);
InitStack(OPND);
得用这两个栈进行计算,不过在计算时我们调用SElemTypePrecede(SElemTypet1,SElemTypet2)进行优先级的判断和doubleIn(SElemTypec)运算符的判断,然后运用doubleOperate1(doublea,SElemTypetheta,doubleb)和doubleOperate2(SElemTypetheta,doublea)两个函数进行计算。
(六)程序流程图
图2程序流程图
三、运行
开始界面:
图3开始界面
简单的运算:
图4简单运算实例
继续运算:
图5继续运算实例
高级运算:
图6高级运算实例
复合运算:
图7复合运算实例
四、小结
本程序是通过c语言编程的,有其缺点,没有什么界面,但是它是能过键盘输入的,快了很多,同时也能运行复合的运算,提高了正确率,能很好的做日常生活用。
五、本文主要工作及需要进一步研究的问题
一、主要研究工作总结
将程序运行后,很多都是由于在编写时没注意而造成的,例如该写分号的语句没有写,不该写的又写了,还要就是漏写程序符合,如#。
有时也会忽略了定义变量。
或把些字写错,而造成错误,其次就是有些其他的语法错误,如有些与前面不匹配,也有些比较大的错误,像逻辑上的错误,一般电脑也不易发现。
有些错误,虽然电脑提示你错误的位置,但那些提示都是英语写的,有些单词根本就不懂,更不要说去修改程序了。
通过多次修改与请教,终于完成了这个程序,可能不尽如人意,但是我才疏学浅,不能尽善尽美,但是通过这次的编写,我学到许多东西,如:
不要因为一个标点符号,而轻心。
二、需进一步研究的问题
这个程序是简单实用的,有许多功能没有,而且也没有进制转换。
对于生活中常用的计算是够用了,但是如果稍微太复杂的就不能够计算了,或者是其他的功能就无能为力了,这是它的局限。
参考文献
[1]谭浩强C程序设计(第三版)[M]清华大学出版社2008
[2]马靖善C语言程序设计[M]清华大学出版社2005
[3]郭翠英C语言课程设计案例精编[M]中国水利水电出版社2004
[4]严蔚敏吴伟民数据结构(C语言版)[M]清华大学出版社2008
附录
typedefcharSElemType;
#include"string.h"
#include"stdio.h"
#include"stdlib.h"
#include"math.h"
#include"process.h"
#include"iostream.h"
#defineTURE1
#defineFALSE0
#defineOK1
#defineERROR0
#defineOVERFLOW-2
#defineSTACK_INIT_SIZE10/*存储空间初始分配量*/
#defineSTACK_INCREMENT2/*存储空间分配增量*/
typedefstructSqStack
{
double*base;/*在栈构造之前和销毁之后,base的值为NULL*/
double*top;/*栈顶指针*/
intstacksize;/*当前已分配的存储空间,以元素为单位*/
}SqStack;/*顺序栈*/
voidInitStack(SqStack&S)
{//构造一个空栈S
if(!
(S.base=(double*)malloc(STACK_INIT_SIZE*sizeof(double))))
exit(OVERFLOW);//存储分配失败
S.top=S.base;
S.stacksize=STACK_INIT_SIZE;
}
doubleClearStack(SqStack&S)
{//将栈置为空栈
S.top=S.base;
returnOK;
}
doubleGetTop(SqStackS,double&e)
{//若栈不空,则用e返回S的栈顶元素,并返回OK;否则返回ERROR
if(S.top>S.base)
{
e=*(S.top-1);
returnOK;
}
else
returnERROR;
}
voidPush(SqStack&S,doublee)
{//插入元素e为新的栈顶元素
if(S.top-S.base>=S.stacksize)//栈满,追加存储空间
{
S.base=(double*)realloc(S.base,(S.stacksize+STACK_INCREMENT)*sizeof(double));
if(!
S.base)
exit(OVERFLOW);//存储分配失败
S.top=S.base+S.stacksize;
S.stacksize+=STACK_INCREMENT;
}
*(S.top)++=e;
}
doublePop(SqStack&S,double&e)
{//若栈不空,则删除S的栈顶元素,用e返回其值,并返回OK;否则返回ERROR
if(S.top==S.base)
returnERROR;
e=*--S.top;
returnOK;
}
SElemTypePrecede(SElemTypet1,SElemTypet2)
{//根据表3.1,判断t1,t2两符号的优先关系
charf;
switch(t2)
{
case'+':
case'-':
if(t1=='('||t1=='=')
f='<';//t1 else f='>';//t1>t2 break; case'*': case'/': if(t1=='*'||t1=='/'||t1==')'||t1=='s'||t1=='l'||t1=='g'||t1=='c'||t1=='q'||t1=='t') f='>';//t1>t2 else f='<';//t1 break; case'(': if(t1==')') { printf("Error! \n"); exit(ERROR); } else f='<';//t1 break; case')': switch(t1) { case'(': f='=';//t1=t2 break; case'=': printf("Error! ! \n"); exit(ERROR); default: f='>';//t1>t2 } break; case'=': switch(t1) { case'=': f='=';//t1=t2 break; case'(': printf("Error! ! ! \n"); exit(ERROR); default: f='>'; } break;//t1>t2 case'^': if(t1=='('||t1=='^'||t1=='=') f='<'; else f='>'; break; case's': case'c': case'g': case'l': case'q': case't': switch(t1) { case')': case't': case'q': case'l': case'g': case'c': case's': printf("Error! ");exit(ERROR); case'(': case'=': case'+': case'-': case'*': case'/': case'^': f='<';break; } break; } returnf; } doubleOperate1(doublea,SElemTypetheta,doubleb) {//做四则运算和乘方运算 doublec; switch(theta) { case'+': c=a+b;break; case'-': c=a-b;break; case'*': c=a*b;break; case'/': c=a/b;break; case'^': c=pow(a,b);break; } returnc; } doubleOperate2(SElemTypetheta,doublea) {//做sin、cos、lg、ln的运算 doublec; switch(theta) { case's': c=sin(a);break; case'c': c=cos(a);break; case'l': c=log(a);break; case'g': c=log10(a);break; case'q': c=exp(a);break; case't': c=tan(a);break; } returnc; } doubleIn(SElemTypec) {//判断c是否为7种运算符之一 switch(c) { case'+': case'-': case'*': case'/': case'(': case')': case'=': case'^': case's': case'l': case'g': case'q': case'c': case't': return1; default: return0; } } voidmain() {printf("\nwedefined: s()=sin(),c()=cos(),l()=ln(),g()=lg(),q()=exp(),t()=tan()\n"); SqStackOPTR,OPND; inte; doublea,b,x,theta; doubled,f; charc; charz[60]; inti; InitStack(OPTR); InitStack(OPND); do { Push(OPTR,'='); printf("PleaseEnter: \n"); c=getchar(); GetTop(OPTR,theta); while(c! ='='||theta! ='=')//判断c和栈顶元素是否为等号 { if(In(c)) { switch(Precede(theta,c)) { case'<': //栈顶元素优先权底 Push(OPTR,c); c=getchar(); GetTop(OPTR,theta); break; case'=': //脱括号并接收下一字符 Pop(OPTR,theta); GetTop(OPTR,theta); if(theta=='s'||theta=='l'||theta=='c'||theta=='g'||theta=='q'||theta=='t')//对特殊运算符号的处理 { Pop(OPND,f); Pop(OPTR,theta); Push(OPND,Operate2(theta,f)); GetTop(OPTR,theta); c=getchar(); break; } else { c=getchar(); break; } case'>': //退栈并将运算结果入栈 if(theta=='+'||theta=='-'||theta=='*'||theta=='/'||theta=='^') { Pop(OPTR,theta); Pop(OPND,b); Pop(OPND,a); f=Operate1(a,theta,b); Push(OPND,f); GetTop(OPTR,theta); break; } elsebreak; } } elseif(c>='0'&&c<='9'||c=='.')//对数字的处理 { i=0; do { z[i]=c;i++; c=getchar(); } while((c<='9'&&c>='0')||c=='.'); z[i]=0; d=atof(z); Push(OPND,d); } else//c为非法字符 { printf("error\n"); exit(ERROR); } } GetTop(OPND,x); printf("%f",x); ClearStack(OPTR); ClearStack(OPND); printf("\nWanttouseitagain? Yes: 1,No: 0"); scanf("%d",&e); x=getchar(); } while(e);//循环使用以上程序或者出程序的判断点 printf("\nThanksforusingthecalulatingdevice! ! ! "); printf("\npressanykeytocontinue..."); x=getchar(); x=getchar(); }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 计算器 设计