课程名称:C语言程序设计课题名称:简易计算器班级:学号:姓名:指导老师:成绩:一、课程设计目的1.通过这次的课程设计,巩固以前所学的知识:1)进一步熟悉了各种语句,如宏定义语句,语句的嵌套等等。2)对顺序,选择,循环结构的综合运用。3)进一步巩固了一些算法,如求四则混合运算,三角函数,指对数的算法。2.在课程设计的过程中,拓展了自己的知识面,知道我们所学过的C语言知识不过是很少的一部分。还有很多知识等待我们自己去学习。3.为了完善自己的程序,通过上网,查阅图书等途径学到了一些新的知识,如对C语言中一些常用图形函数的应用。4.通过课程设计,加深对结构化程序设计思想的理解,能进行一个系统功能需求分析,并设计合理的模块化结构。5.通过课程设计,提高程序开发能力,能运用合理的控制流编写清晰高效的程序。二、设计内容我设计的是一款简易计算器,界面清楚,操作方便,它能实现以下功能:1.查询当时时间2.简单的四则混合运算(支持小括号、优先级)3.正弦、余弦函数计算4.指对数计算三、总体设计简单计算器由六大模块组成,模块调用图如下:Main()ZhuJieMian()SiZeYunSuan()Time()SanJiaoYunSuan()ZhiDuiShuYunSuan()1.主函数voidmain()功能:调用各个主要模块,实现简单计算器的整体功能。2.主界面函数voidZhuJieMian()功能:使用有关图形函数模拟出可视化的计算器外观界面,并提供用户输入窗口。3.时钟函数intTime()功能:在模拟的可视化计算器中显示当时的时间。4.四则混合运算函数voidSiZeHunHeYunSuan()功能:实现简单的加减乘除混合运算,并支持优先级和带括号的运算。5.三角运算函数voidSanJiaoYunSuan()功能:实现基本的三角函数运算:sin(x)和cos(x)。6.指对数函数voidZhiDuiShuYunSuan()功能:实现基本的指数和对数运算。四、详细设计a)数据结构设计:intpriority(charleft,charright){charoption[]={'+','-','*','/','(',')','='};inti,le,ri;intl[]={4,4,6,6,2,10,0};intr[]={3,3,5,5,9,3,0};for(i=0;i=7;i++){if(option[i]==left)le=l[i];if(option[i]==right)ri=r[i];}return(ri-le);}用两个数组模拟数据结构栈,其特点是数据先进后出。用两个数组分别保存操作数和运算符。从字符串中依次分离出操作数与运算符,分别存入对应数组。当操作符串为空时,直接存入(相当与栈元素的压入)。当不为空时,与数组最后一个元素(相当于栈顶)比较优先级,若大于直接存入,否则弹出操作数最后两位进行运算,直到操作符栈顶元素优先级小于当前运算符,并将其存入。b)模块接口设计:1.时钟函数:intTime()包括的子函数的函数原型:voidTimeJieMian();用于制作界面2.四则混合运算:voidSiZeHunHeYunSuan()包括的子函数的函数原型:voidSiZehunheYunSuanJieMian();用于制作界面char*readstr();将输入的连续单个字符整合成一个完整的串,并返回其首地址doubleyunsuan(doubleshu1,doubleshu2,charoption);对shu1和shu2的简单加减乘除运算,并返回运算结果Intpriority(charleft,charright);判断左符、右符的优先级谁高,若右大于左,返回正值,否则返回负值doublecompute(char*p);传入表达式串的首地址,返回表达式之值3.三角运算:voidSanJiaoYunSuan()包括的子函数的函数原型:voidSanJiaoJieMian();用于制作界面。doublehudu(doublex);把接受到的实数转化为弧度返回。doubleto_double(char*p);将字符串转化为实数。doubleread();将连续输入的字符整合成一个浮点数并在屏readstr()Yunsuan()Priority()compute()voidSiZeHunHeYunSuan()SiZehunheYunSuanJiemian()幕上逆向输出将其返回。doublesin(doublex);求sinx,实数型参数,返回实数型值。doublecos(doublex);求cosx,实数型参数,返回实数型值。4.指对数运算:voidZhiDuiShuYunSuan()包括的子函数的函数原型:voidZhiDuiShuJieMian();用于制作界面。doubleread();将连续输入的字符整合成一个浮点数在屏幕上逆向输出将其返回。doubleexp(doublex);求e的x次方,返回双精度实数值。doublelnx(doublex);求lnx的值,返回双精度实数值。c)流程图:1.主函数的流程图:voidSanJiaoYunSuan()Sanjiaojiemian()Hudu(doublex)Sin(doublex)Cos(doublex)Read()to_double(char*p)voidZhiDuiShuYunSuan()read()doubleexp(doublex)doublelnx(doublex)startCharc调用主界面函数yesnoc=1c=2c=3c=42.优先级:noyesynoyesyesyesno3.正弦函数:start接受参数charleftcharrightcharoption[]={‘+’,’-‘,’*’,’/’,’(‘,’)’,’=’};inti=0,le,ri;intl[]={4,4,6,6,2,10,0};intr[]={3,3,5,5,9,3,0};i=7option[i]==leftle=l[i];Option[i]==rightri=r[i];i++;Return(ri-le)start接受参数x;doublefz,,fm,sinx=x,xiang;noyes4.ln函数:xiang=sign*(fz/fm);sinx+=xiang;sign=sign*(-1);noyesyesnoyesno五、调试与测试start接受参数x;ints=-1,n=0;floaty=0,t=0,m=1;x0&&x=1Y+=t;n++;s=-s;M*=(x-1);t=m*s/n;fabs(t)1e-6x=1/xy+=t;n++;s=-s;m*=(x-1);t=m*s/n;fabs(t)1e-6return(0-y)遇到的问题:1.计算器的界面不会做,有时数字显示在边框外面。2.时钟显示不出来。3.编写ln函数遇到困难。采取的解决措施:1.去图书馆借相关图书,上网查资料,通过自己的阅读,研究,不断的尝试,运行,修改,最终做出了简单的界面,但仍存在很多不足的地方,只能模拟出大体的外观,没能模拟出计算器中的各个键。2.查在界面显示的函数原型,对比自己的程序,不断修改,对比,调试,检查,反思,最后发现是语句顺序错误,显示写在了判断的后面,修改成功。3.在编写ln函数的时候,遇到很大困难,最后通过查阅资料,向别人请教编写出了函数。界面截图及相关说明:主界面:按1:进入时钟界面按2:进入四则混合运算界面按3:进入三角函数运算界面按4:进入指对数运算界面按5:退出程序时钟界面截图:先按一下s键,并输入表达式之后的四则混合运算界面截图:运算结果截图:先按一下s键,并输入数字的三角函数界面截图:运算结果截图:先按一下e键,并输入数字的指对数运算界面截图:运算结果截图:按空格键,再按l键,并输入数字的指对数运算界面截图:结果界面截图:#includemath.h#includedos.h#includestdio.h#includestring.h#includegraphics.h#includeconio.h#defineQINGLINGsetfillstyle(1,15);bar(195,80,445,130);outtextxy(435,120,0)#defineSHUCHUsetfillstyle(1,15);bar(195,80,445,130);setcolor(0);outtextxy(220,120,ch)#defineJIEMIANsetfillstyle(1,7);bar(165,40,475,400);/*底板*/setfillstyle(1,15);bar(195,80,445,130);/*工作区*/#definePI3.1415926doublehudu(doublex);/*把输入的数转化为弧度*/voidZhuJieMian();voidTimeJieMian();voidSiZehunheYunSuanJieMian();voidSanJiaoJieMian();voidZhiDuiShuJieMian();doubleto_double(char*p);doubleread();/*将读到的数字整和成实数*/doublesin(doublex);doublecos(doublex);doubleexp(doublex);/*e的次方*/floatlnx(floatx);char*readstr();doubleyunsuan(doubleshu1,doubleshu2,charoption);intpriority(charleft,charright);doublecompute(char*p);intTime();voidSiZehunheYunSuan();doublesqrt(doublex);voidSanJiaoYunSuan();voidZhiDuiShuYunSuan();voidmain(){charc;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();}}doublehudu(doublex){return(x*PI/180.0);}voidZhuJieMian(){intgdriver=DETECT,gmode;initgraph(&gdriver,&gmode,);JIEMIAN;outtextxy(200,160,WelcomeToUseThisCaculator:);outtextxy(200,170,Itsfunctionsisasfollows:);outtextxy(200,210,1CurrentTime);outtextxy(200,230,2Sizehunheyunsuan);outtextxy(200,250,3Sanjiaoyunsuan);outtextxy(200,270,4Zhiduishuyunsuan);outtextxy(200,290,5Quit);outtextxy(200,310,Pleasechooseanorder:);}voidTimeJieMian(){intgdriver=DETECT,gmode;initgraph(&gdriver,&gmode,);JIEMIAN;outtextxy(200,200,qrepresentQuit);}voidSiZehunheYunSuanJieMian(){intgdriver=DETECT,gmode;initgraph(&gdriver,&gmode,);setfillstyle(1,