基于c语言的简易计算器的设计与实现(共25页).doc

上传人:飞****2 文档编号:19329086 上传时间:2022-06-06 格式:DOC 页数:25 大小:2.29MB
返回 下载 相关 举报
基于c语言的简易计算器的设计与实现(共25页).doc_第1页
第1页 / 共25页
基于c语言的简易计算器的设计与实现(共25页).doc_第2页
第2页 / 共25页
点击查看更多>>
资源描述

《基于c语言的简易计算器的设计与实现(共25页).doc》由会员分享,可在线阅读,更多相关《基于c语言的简易计算器的设计与实现(共25页).doc(25页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、精选优质文档-倾情为你奉上 课程名称: C语言程序设计课题名称: 简易计算器班级: 学号: 姓名: 指导老师: 成绩: 一、课程设计目的1. 通过这次的课程设计,巩固以前所学的知识:1) 进一步熟悉了各种语句,如宏定义语句,语句的嵌套等等。2) 对顺序,选择,循环结构的综合运用。3) 进一步巩固了一些算法,如求四则混合运算,三角函数,指对数的算法。2. 在课程设计的过程中,拓展了自己的知识面,知道我们所学过的C语言知识不过是很少的一部分。还有很多知识等待我们自己去学习。3. 为了完善自己的程序,通过上网,查阅图书等途径学到了一些新的知识,如对C语言中一些常用图形函数的应用。4. 通过课程设计,

2、加深对结构化程序设计思想的理解,能进行一个系统功能需求分析,并设计合理的模块化结构。5. 通过课程设计,提高程序开发能力,能运用合理的控制流编写清晰高效的程序。二、设计内容我设计的是一款简易计算器,界面清楚,操作方便,它能实现以下功能:1. 查询当时时间2. 简单的四则混合运算(支持小括号、优先级)3. 正弦、余弦函数计算4. 指对数计算三、总体设计 简单计算器由六大模块组成,模块调用图如下:Main() ZhiDuiShuYunSuan()SanJiaoYunSuan()Time()SiZeYunSuan()ZhuJieMian() 1. 主函数 void main() 功能:调用各个主要模

3、块,实现简单计算器的整体功能。 2. 主界面函数void ZhuJieMian() 功能:使用有关图形函数模拟出可视化的计算器外观界面,并提供用户输入窗口。 3. 时钟函数 int Time()功能:在模拟的可视化计算器中显示当时的时间。4. 四则混合运算函数void SiZeHunHeYunSuan()功能:实现简单的加减乘除混合运算,并支持优先级和带括号的运算。 5. 三角运算函数void SanJiaoYunSuan() 功能:实现基本的三角函数运算:sin(x)和cos(x)。 6. 指对数函数void ZhiDuiShuYunSuan() 功能:实现基本的指数和对数运算。四、详细设计

4、a)数据结构设计:int priority(char left,char right)char option=+,-,*,/,(,),=; int i,le,ri; int l=4,4,6,6,2,10,0; int r=3,3,5,5,9,3,0; for(i=0;i=7;i+) if(optioni=left) le=li; if(optioni=right) ri=ri; return(ri-le);用两个数组模拟数据结构栈,其特点是数据先进后出。用两个数组分别保存操作数和运算符。从字符串中依次分离出操作数与运算符,分别存入对应数组。当操作符串为空时,直接存入(相当与栈元素的压入)。当不

5、为空时,与数组最后一个元素(相当于栈顶)比较优先级,若大于直接存入,否则弹出操作数最后两位进行运算,直到操作符栈顶元素优先级小于当前运算符,并将其存入。b)模块接口设计:1.时钟函数:int Time()包括的子函数的函数原型:void TimeJieMian();用于制作界面2.四则混合运算:void SiZeHunHeYunSuan()包括的子函数的函数原型:void SiZehunheYunSuanJieMian( ); 用于制作界面char* readstr(); 将输入的连续单个字符整合成一个完整的串,并返回其首地址double yunsuan(double shu1,double

6、shu2,char option); 对shu1和shu2的简单加减乘除运算,并返回运算结果Int priority(char left,char right); 判断左符、右符的优先级谁高,若右大于左,返回正值,否则返回负值double compute(char *p); 传入表达式串的首地址,返回表达式之值void SiZeHunHeYunSuan()SiZehunheYunSuanJiemian()readstr()compute() Priority()Yunsuan() 3.三角运算:void SanJiaoYunSuan()包括的子函数的函数原型:void SanJiaoJieMi

7、an(); 用于制作界面。double hudu(double x); 把接受到的实数转化为弧度返回。double to_double(char *p); 将字符串转化为实数。double read(); 将连续输入的字符整合成一个浮点数并在屏幕上逆向输出将其返回。 double sin(double x); 求sinx,实数型参数,返回实数型值。double cos(double x); 求cosx,实数型参数,返回实数型值。void SanJiaoYunSuan()Cos(double x)Hudu(double x)Sin(double x)Sanjiaojiemian() Read()

8、 to_double(char *p)4指对数运算:void ZhiDuiShuYunSuan()包括的子函数的函数原型: void ZhiDuiShuJieMian(); 用于制作界面。 double read(); 将连续输入的字符整合成一个浮点数在屏幕上逆向输出将其返回。 double exp(double x); 求e的x次方,返回双精度实数值。 double lnx(double x); 求lnx的值,返回双精度实数值。void ZhiDuiShuYunSuan()double lnx(double x)double exp(double x)read() c)流程图:1 主函数的流

9、程图:endC=getch()调用主界面函数void ZhuJieMian()调用指对数函数调用三角函数调用四则混合运算函数调用时钟函数Switch(c)C=5?C=getch();调用主界面函数void ZhuJieMian()Char cstartyesnoc=1c=2c=3c=42 优先级:start接受参数char left char rightReturn(ri-le)optioni=lefti1e-8return(sinx)fz*=x*x;fm*=(t+1)*(t+2);t+=2;int sign=-1,t;xiang=x,fz=x,fm=1,t=1;接受参数x;double fz

10、,fm,sinx=x,xiang;start3.正弦函数:noxiang=sign*(fz/fm);sinx+=xiang;sign=sign*(-1); yes4.ln函数:return (0-y)fabs(t)1e-6y+=t; n+; s=-s;m*=(x-1); t=m*s/n;x=1/xfabs(t)1e-6Y+=t; n+; s=-s;M*=(x-1); t=m*s/n;x0&x=1接受参数x;int s=-1,n=0;float y=0,t=0,m=1;startnoyesyesnoyesno五、调试与测试遇到的问题:1.计算器的界面不会做,有时数字显示在边框外面。2.时钟显示不

11、出来。3.编写ln函数遇到困难。采取的解决措施:1.去图书馆借相关图书,上网查资料,通过自己的阅读,研究,不断的尝试,运行,修改,最终做出了简单的界面,但仍存在很多不足的地方,只能模拟出大体的外观,没能模拟出计算器中的各个键。2.查在界面显示的函数原型,对比自己的程序,不断修改,对比,调试,检查,反思,最后发现是语句顺序错误,显示写在了判断的后面,修改成功。3.在编写ln函数的时候,遇到很大困难,最后通过查阅资料,向别人请教编写出了函数。界面截图及相关说明:主界面: 按1:进入时钟界面 按2:进入四则混合运算界面 按3:进入三角函数运算界面按4:进入指对数运算界面 按5:退出程序时钟界面截图:

12、先按一下s键,并输入表达式之后的四则混合运算界面截图:运算结果截图:先按一下s键,并输入数字的三角函数界面截图:运算结果截图:先按一下e键,并输入数字的指对数运算界面截图:运算结果截图:按空格键,再按l键,并输入数字的指对数运算界面截图:结果界面截图:#include #include #include #include #include#include#define QINGLING setfillstyle(1 ,15);bar(195,80,445,130);outtextxy(435,120,0)#define SHUCHU setfillstyle(1,15);bar(195,80,

13、445,130);setcolor(0);outtextxy(220,120,ch)#define JIEMIAN setfillstyle(1,7); bar(165,40,475,400); /*底板*/ setfillstyle(1,15); bar(195,80,445,130); /*工作区*/#define PI 3.double hudu(double x); /*把输入的数转化为弧度*/void ZhuJieMian();void TimeJieMian();void SiZehunheYunSuanJieMian();void SanJiaoJieMian();void Zh

14、iDuiShuJieMian();double to_double(char *p);double read(); /*将读到的数字整和成实数*/double sin(double x);double cos(double x);double exp(double x); /*e的次方*/float lnx(float x);char* readstr();double yunsuan(double shu1,double shu2,char option);int priority(char left,char right) ;double compute(char *p);int Time

15、();void SiZehunheYunSuan();double sqrt(double x);void SanJiaoYunSuan();void ZhiDuiShuYunSuan();void main()char c; ZhuJieMian(); c=getch(); while(c!=5) switch(c) case 1:Time();break; case 2:SiZehunheYunSuan();break; case 3:SanJiaoYunSuan();break; case 4:ZhiDuiShuYunSuan();break; ZhuJieMian(); c=getch

16、(); double hudu(double x)return( x*PI/180.0);void ZhuJieMian()int gdriver=DETECT,gmode; initgraph(&gdriver,&gmode,); JIEMIAN; outtextxy(200,160,Welcome To Use This Caculator:); outtextxy(200,170,Its functions is as follows:); outtextxy(200,210,1 Current Time); outtextxy(200,230,2 Sizehunheyunsuan);

17、outtextxy(200,250,3 Sanjiaoyunsuan); outtextxy(200,270,4 Zhiduishuyunsuan); outtextxy(200,290,5 Quit); outtextxy(200,310,Please choose an order: );void TimeJieMian()int gdriver=DETECT,gmode; initgraph(&gdriver,&gmode,); JIEMIAN; outtextxy(200,200,q represent Quit);void SiZehunheYunSuanJieMian()int g

18、driver=DETECT,gmode; initgraph(&gdriver,&gmode,); setfillstyle(1,LIGHTGRAY); JIEMIAN; outtextxy(200,160,Please input expressions ); outtextxy(200,215, s start); outtextxy(200,240, spase to_zero); outtextxy(200,265, q quit); outtextxy(200,310,Please choose an order );void SanJiaoJieMian()int gdriver=

19、DETECT,gmode; initgraph(&gdriver,&gmode,); setfillstyle(1,LIGHTGRAY); JIEMIAN; outtextxy(200,160,Please choose an order and then ); outtextxy(200,170,input datas:); outtextxy(200,210, s sinx); outtextxy(200,230, c cosx); outtextxy(200,250,spase to_zero); outtextxy(200,270, q quit); outtextxy(200,310

20、,Please choose an order: ); void ZhiDuiShuJieMian()int gdriver=DETECT,gmode; initgraph(&gdriver,&gmode,); JIEMIAN; outtextxy(200,160,Please choose an order and then ); outtextxy(200,170,input datas:); outtextxy(200,210, e exp(x); outtextxy(200,230, l ln(x); outtextxy(200,250,spase to_zero); outtextx

21、y(200,270, q quit); outtextxy(200,310,Please choose an order: ); double to_double(char *p)int i,sign=1; float t; double num; i=0; if(pi=-) sign=-1;i+; num=0.0; for(;pi=0;i+) num=num*10.0+pi-0; if(pi=.) for(i+,t=10.0;pi=0&pi1e-8) fz*=x*x; fm*=(t+1)*(t+2); t+=2; xiang=sign*(fz/fm); sinx+=xiang; sign=s

22、ign*(-1); return(sinx);double cos(double x)double fz,fm,cosx=1,xiang; int sign=-1,t; xiang=x,fz=1,fm=1,t=0; while(fabs(xiang)1e-8) fz*=x*x; fm*=(t+1)*(t+2); t+=2; xiang=sign*(fz/fm); cosx+=xiang; sign=sign*(-1); return(cosx);double exp(double x) /*e的次方*/double s=1.0,xiang=1.0; int t=1; do xiang*=x/(

23、t+); s+=xiang; while(fabs(xiang)1e-6) ; return(s); float lnx(float x) /*ln(x)*/ int s=-1,n=0; float y=0,t=0,m=1; if(x0 & x1e-6); if(x1) x=1/x; do y+=t; n+; s=-s; m*=(x-1); t=m*s/n; while(fabs(t)1e-6); return 0-y; char* readstr()char c,a81,ch34; /*将读到的串先保存在a中*/ int i=0; c=getch(); while(c!=r) /*getch

24、()只读取回车键的第一个回车符*/ ai+=c;ai=;ai+1=0; setfillstyle(1,WHITE); bar(195,80,445,130); sprintf(ch,%28s,a); setcolor(BLACK); outtextxy(220,120,ch); c=getch(); return(a);double yunsuan(double shu1,double shu2,char option) double re=0; switch(option) case +:re=shu1+shu2;break; case -:re=shu1-shu2;break; case

25、*:re=shu1*shu2;break; case /:re=shu1/shu2;break; return re;int priority(char left,char right)char option=+,-,*,/,(,),=; int i,le,ri; int l=4,4,6,6,2,10,0; int r=3,3,5,5,9,3,0; for(i=0;i=7;i+) if(optioni=left) le=li; if(optioni=right) ri=ri; return(ri-le);double compute(char *p) int i=0,j=0; double s

26、hu20,num=0; char op20,c; int l=0; c=pl+; while(c) if(c=0|c=.) while(c=0) num=num*10+(c-0); c=pl+; if(c=.) int t=10; c=pl+; while(c=0) num=num+(c-0)/t; t*=10; c=pl+; shui+=num; num=0; /*截取一个数字*/ else if(j=0)opj+=c;c=pl+; else if(c=)&opj-1=()c=pl+;j-; else if(priority(opj-1,c)0)opj+=c;c=pl+; else shui

27、-2=yunsuan(shui-2,shui-1,opj-1); i=i-1; j=j-1; return shu0;void SiZehunheYunSuan()char c,ch50,*exp; SiZehunheYunSuanJieMian(); c=getch(); while(c!=q) if(c= ) QINGLING; else exp=readstr(); sprintf(ch,%28f,compute(exp);SHUCHU; c=getch(); void SanJiaoYunSuan()char c,ch80; double shu; SanJiaoJieMian();

28、c=getch(); while(c!=q) if(c= ) QINGLING; c=getch();if(c=q) break; shu=hudu(read(); switch(c) case s:sprintf(ch,%28f,sin(shu);SHUCHU;break; case c:sprintf(ch,%28f,cos(shu);SHUCHU;break; c=getch(); void ZhiDuiShuYunSuan()char c,ch80; double shu; ZhiDuiShuJieMian(); c=getch(); while(c!=q) if(c= ) QINGL

29、ING; c=getch();if(c=q) break; shu=read(); switch(c) case e:sprintf(ch,%28f,exp(shu);SHUCHU;break; case l:sprintf(ch,%28f,lnx(shu);SHUCHU;break; c=getch(); int Time() struct time t; char c; char ch80; TimeJieMian(); gettime(&t); sprintf(ch,The time is: %2d:%02d:%02d now,t.ti_hour, t.ti_min, t.ti_sec); SHUCHU; c=getch(); if(c=q) return ;专心-专注-专业

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 教案示例

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁