基于c语言的简易计算器的设计与实现(共25页).doc
精选优质文档-倾情为你奉上 课程名称: C语言程序设计课题名称: 简易计算器班级: 学号: 姓名: 指导老师: 成绩: 一、课程设计目的1. 通过这次的课程设计,巩固以前所学的知识:1) 进一步熟悉了各种语句,如宏定义语句,语句的嵌套等等。2) 对顺序,选择,循环结构的综合运用。3) 进一步巩固了一些算法,如求四则混合运算,三角函数,指对数的算法。2. 在课程设计的过程中,拓展了自己的知识面,知道我们所学过的C语言知识不过是很少的一部分。还有很多知识等待我们自己去学习。3. 为了完善自己的程序,通过上网,查阅图书等途径学到了一些新的知识,如对C语言中一些常用图形函数的应用。4. 通过课程设计,加深对结构化程序设计思想的理解,能进行一个系统功能需求分析,并设计合理的模块化结构。5. 通过课程设计,提高程序开发能力,能运用合理的控制流编写清晰高效的程序。二、设计内容我设计的是一款简易计算器,界面清楚,操作方便,它能实现以下功能:1. 查询当时时间2. 简单的四则混合运算(支持小括号、优先级)3. 正弦、余弦函数计算4. 指对数计算三、总体设计 简单计算器由六大模块组成,模块调用图如下:Main() ZhiDuiShuYunSuan()SanJiaoYunSuan()Time()SiZeYunSuan()ZhuJieMian() 1. 主函数 void main() 功能:调用各个主要模块,实现简单计算器的整体功能。 2. 主界面函数void ZhuJieMian() 功能:使用有关图形函数模拟出可视化的计算器外观界面,并提供用户输入窗口。 3. 时钟函数 int Time()功能:在模拟的可视化计算器中显示当时的时间。4. 四则混合运算函数void SiZeHunHeYunSuan()功能:实现简单的加减乘除混合运算,并支持优先级和带括号的运算。 5. 三角运算函数void SanJiaoYunSuan() 功能:实现基本的三角函数运算:sin(x)和cos(x)。 6. 指对数函数void ZhiDuiShuYunSuan() 功能:实现基本的指数和对数运算。四、详细设计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);用两个数组模拟数据结构栈,其特点是数据先进后出。用两个数组分别保存操作数和运算符。从字符串中依次分离出操作数与运算符,分别存入对应数组。当操作符串为空时,直接存入(相当与栈元素的压入)。当不为空时,与数组最后一个元素(相当于栈顶)比较优先级,若大于直接存入,否则弹出操作数最后两位进行运算,直到操作符栈顶元素优先级小于当前运算符,并将其存入。b)模块接口设计:1.时钟函数:int Time()包括的子函数的函数原型:void TimeJieMian();用于制作界面2.四则混合运算:void SiZeHunHeYunSuan()包括的子函数的函数原型:void SiZehunheYunSuanJieMian( ); 用于制作界面char* readstr(); 将输入的连续单个字符整合成一个完整的串,并返回其首地址double yunsuan(double shu1,double 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 SanJiaoJieMian(); 用于制作界面。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() 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 主函数的流程图: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=lefti<=7int l=4,4,6,6,2,10,0;int r=3,3,5,5,9,3,0;char option=+,-,*,/,(,),=;int i=0,le,ri;no yesy no le=li;yesOptioni=rightyesri=ri;i+; yesno fabs(xiang)>1e-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,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;x>0&&x<=1接受参数x;int s=-1,n=0;float y=0,t=0,m=1;startnoyesyesnoyesno五、调试与测试遇到的问题:1.计算器的界面不会做,有时数字显示在边框外面。2.时钟显示不出来。3.编写ln函数遇到困难。采取的解决措施:1.去图书馆借相关图书,上网查资料,通过自己的阅读,研究,不断的尝试,运行,修改,最终做出了简单的界面,但仍存在很多不足的地方,只能模拟出大体的外观,没能模拟出计算器中的各个键。2.查在界面显示的函数原型,对比自己的程序,不断修改,对比,调试,检查,反思,最后发现是语句顺序错误,显示写在了判断的后面,修改成功。3.在编写ln函数的时候,遇到很大困难,最后通过查阅资料,向别人请教编写出了函数。界面截图及相关说明:主界面: 按1:进入时钟界面 按2:进入四则混合运算界面 按3:进入三角函数运算界面按4:进入指对数运算界面 按5:退出程序时钟界面截图:先按一下s键,并输入表达式之后的四则混合运算界面截图:运算结果截图:先按一下s键,并输入数字的三角函数界面截图:运算结果截图:先按一下e键,并输入数字的指对数运算界面截图:运算结果截图:按空格键,再按l键,并输入数字的指对数运算界面截图:结果界面截图:#include <math.h>#include <dos.h>#include <stdio.h>#include <string.h>#include<graphics.h>#include<conio.h>#define QINGLING setfillstyle(1 ,15);bar(195,80,445,130);outtextxy(435,120,"0")#define SHUCHU setfillstyle(1,15);bar(195,80,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 ZhiDuiShuJieMian();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();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(); 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"); 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 gdriver=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=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,"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"); outtextxy(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<='9'&&pi>='0'i+) num=num*10.0+pi-'0' if(pi='.') for(i+,t=10.0;pi>='0'&&pi<='9'i+) num+=(pi-'0')/t; t*=10; return(sign*num);double read() /*将读到的数字整和成实数*/char c,a81,ch34; /*将读到的串先保存在a中*/ int i=0; c=getch(); while(c!='r') /*getch()只读取回车键的第一个回车符*/ ai+=c;ai='0' setfillstyle(1,WHITE); bar(195,80,445,130); sprintf(ch,"%28s",a); setcolor(BLACK); outtextxy(220,120,ch); /*不断刷系刷新屏幕以显现出逆向输出*/ c=getch(); return(to_double(a);double sin(double x)double fz,fm,sinx=x,xiang; int sign=-1,t; xiang=x,fz=x,fm=1,t=1; while(fabs(xiang)>1e-8) fz*=x*x; fm*=(t+1)*(t+2); t+=2; xiang=sign*(fz/fm); sinx+=xiang; sign=sign*(-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/(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(x>0 && x<=1) do y+=t; n+; s=-s; m*=(x-1); t=m*s/n; while(fabs(t)>1e-6); if(x>1) 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()只读取回车键的第一个回车符*/ 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 '*':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 shu20,num=0; char op20,c; int l=0; c=pl+; while(c) if(c<='9'&&c>='0'|c='.') while(c<='9'&&c>='0') num=num*10+(c-'0'); c=pl+; if(c='.') int t=10; c=pl+; while(c<='9'&&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-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(); 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=' ') QINGLING; 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 ;专心-专注-专业