C语言简易计算器的设计与实现方法_第1页
C语言简易计算器的设计与实现方法_第2页
C语言简易计算器的设计与实现方法_第3页
C语言简易计算器的设计与实现方法_第4页
C语言简易计算器的设计与实现方法_第5页
已阅读5页,还剩26页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

课程名称:C语言程序设计

课题名称:简易计算器

80S

00

00S

00

班级:

学号:

姓名:

指导老师:

成绩:

一、课程设计目的

1.通过这次的课程设计,巩固此前所学的知识:

1)深入熟悉了多种语句,如宏定义语句,语句的嵌套等等。

2)对次序,选择,循环构造的综合运用。

3)深入巩固了某些算法,如求四则混合运算,三角函数,指对数H勺算法。

2.在课程设计的过程中,拓展了自己的知识面,懂得我们所学过H勺C语言知识不过

是很少H勺一部分。尚有诸多知识等待我们自己去学习。

3.为了完善自己的程序,通过上网,查阅图书等途径学到了某些新的知识,如对C

语言中某些常用图形函数口勺应用。

4.通过课程设计,加深对构造化程序设计思想的理解,能进行一种系统功能需求分

析,并设计合理的I模块化构造。

5.通过课程设计,提高程序开发能力,能运用合理日勺控制流编写清晰高效的程序。

二、设计内容

我设计口勺是一款简易计算器,界面清晰,操作以便,它能实现如下功能:

1.查询当时时间

2.简朴的四则混合运算(支持小括号、优先级)

3.正弦、余弦函数计算

4.指对数计算

三、总体设计

简朴计算器由六大模块构成,模块调用图如下:

Main()

1.主函数voidmain()

功能:调用各个重要模块,实现简朴计算器日勺整体功能。

2.主界面函数voidZhuJicMianO

功能:使用有关图形函数模拟出可视化H勺计算器外观界面,并提供顾客输入窗口。

3.时钟函数intTimeO

功能:在模拟的可视化计算器中显示当时的时间。

4.四则混合运算函数voidSiZeHunHeYunSuan0

功能:实现简朴附加减乘除混合运.算,并支持优先级和带括号的运算。

5.三角运算函数voidSanJiaoYunSuanO

功能:实现基本的三角函数运算:sin(x)和8s(x)。

6.指对数函数voidZhiDuiShuYunSuan()

功能:实现基本的指数和对数运算。

四、详细设计

a)数据构造设计:

包括附子函数的函数原型:

voidSiZchunhcYunSuanJicMian();用「制作界面

char*readstrO;将输入的持续单个字符整合成一种完整的串,并返回其首

地址

doubleyunsuan(doubleshul,doubleshu2,charoption);对shul和shu2

的简朴加减乘除运算,并返回运算成果

Intpriority(charleft,charright);判断左符、右符区I优先级谁高,若右

不小于左,返回正值,否则返回负值

doublecompute(char*p);传入体现式串的首地址,返回体现式之值

3.三角运算:voidSanJiaoYunSuan()

包括附子函数的函数原型;

voidSanJiaojieMian();用于制作界面。

doubleiiudu(doublex);把接受到的实数粒化为弧度返回。

doubletodouble(char*p);将字符串转化为实数。

doubleread();将持续输入的字符整合成一种浮点数并在屏

幕上逆向输出将其返回。

doublesin(doublex);求sinx,实数型参数,返回实数型值。

doublecos(doublex);求cosx,实数型参数,返【口I实数型值。

4.指对数运算:voidZhiDuiShuYunSuanO

包括的子函数U勺函数原型:

voidZhiDuiShuJieMianO;用于制作界面。

doubleread();将持续输入的字符整合成•种浮点数

在屏幕上逆向输出将其返回。

doubleexp(doublex);求e『Jx次方,返回双精度实数值。

doubleInx(doublex);求InxH勺值,返回双精度实数值。

c)流程图:

1.主函数的流程图:

调用主界面函数

2.优先级:

intl[J={4,4,6,6,2,10,0}:

yes

yno

yes

xiang=sign*(fz/fm);

4.In函数:

yes

no

五、调试与测试

碰到日勺问题:

1.计算器的)界面不会做,有时数字显示在边框外面。

2.时钟显示不出来。

3.编写In函数碰到困难。

采用的处理措施:

1.去图书馆借有关图书,上网查资料,通过自己的阅读,研究,不停的尝试,运行,修改,

最终做出了简朴H勺界面,但仍存在诸多局限性H勺地方,只能模拟出大体口勺外观,没能模拟出

计算器中的各个键。

2.查在界面显示的函数原型,对比自己口勺程序,不停修改,对比,调试,检查,反思,最终

发现是语句次序错误,显示写在了判断口勺背面,修改成功。

3.在编写In函数的时候,碰到很大困难,最终通过查阅资料,向他人请教编写出了函数。

界面截图及有关阐明:

主界面:

NeleoneToUseThisCaculator:

Itsfunctionsisasfo1lows:

1CurrentTine

2Sizehunhe<junsuan

3Sanjiaouunsuan

4Zhiduishu<junsuan

5Quit

Pleasechooseanorder:

按1:进入时钟界面按2:进入四则混合运算界面按3:进入三角函数运算界面

按4:进入指对数运算界面按5:退出程序

时钟界面械图:

先按一下s键,并输入体现式之后U勺四则混合运算界面截图:

inputexpressions

representstart

spaserepresent

drepresentQUit

Pleasechooseanorder

运算成果截图:

先按一下S键,并输入数字的三角函数界面截图:

Pleasechooseanorderandthen

inputdatas:

srepresentsinx

crepresentcosx

representto__zero

qrepresentQUit

Pleasechooseanorder:

运算成果截图:

先按一下e键,并输入数字的指对数运算界面截图:

Pleasechooseanorderandthen

inputdatas:

0represent€SXR<x>

1representln<x)

spaserepresentto_zero

qrepresentQUit

Pleasechooseanorder:

运算成果截图:

按空格键,再按1键,并输入数字H勺指对数运算界面截图:

Pleasechooseanorderandthen

inputdatas:

eexp<x)

1ln<x>

spaseto_zero

qquit

Pleasechooseanorder:

成果界面截图:

#includc<math.h>

#include<dos.h>

#include<stdio.h>

#include<string.h>

#include<graphics.h>

#include<conio.h>

#defineQINGLINGsetfillstyle(l,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(l,7);bar(l65,40,475,400);/*底板*/setfillstyle(l,15);

bar(195,80,445,130);/*工作区*/

#definePI3.1415926

doublehudu(doublex);/*把输入时数转化为弧度*/

voidZhuJieMian();

voidTimeJieMianO;

voidSiZehunheYunSuanJieMian();

voidSanJiaoJieMian();

voidZhiDuiShuJicMian();

doubleto_double(char*p);

doubleread();/*将读到口勺数字整和成实数*/

doublesin(doublex);

doublecos(doublex);

doubleexp(doublex);/*e口勺次方*/

floatlnx(floalx);

char*readstr();

doubleyunsuan(doubleshuI,doubleshu2,charoption);

intpriority(charleft,charright);

doublecompute(char*p);

intTinic();

voidSiZchunhcYunSuanO:

doublesqrt(doublcx);

voidSanJiaoYunSuan();

voidZhiDuiShuYunSuan();

voidmain()

{charc;

ZhuJieMian();

c=getch();

while(c!='5')

{switch(c)

{caseT:Timc();break;

case'2':SiZehunheYunSuan();break;

case'3':SanJiaoYunSuan();break;

case'4':ZhiDuiShuYunSuan();break;

)

ZhuJieMian();

c=getch();

}

}

doublehudu(doublcx)

{return(x*PI/180.0);

voidZhuJieMian()

{intgdriver=DETECT.gmode;

initgrapli(&gdriver,&gmode,"");

JIEMIAN;

outtcxtxy(200,160,"WelcomeToUseThisCaculator:")

outtcxtxy(200,170,"Itsfunctionsisasfollows:");

outtcxtxy(2()(),21(),"lCurrentTime");

outtextxy(200,230,"2Sizehunheyunsuan");

oultex(xy(200,250,"3Sanjiaoyunsuan");

outtextxy(200,270,"4Zhiduishuyunsuan");

outtextxy(200,290,"5Quit");

outtextxy(200,310,"Pleasechooseanorder:");

voidTinicJieMianO

{intgdrivcr=DETECT,ginodc;

initgraph(&gdrivcr,&gmodc,"");

JIEMIAN;

outtcxtxy(20(),200,"qrepresentQuit");

voidSiZehunheYunSuanJieMian()

{intgdriver=DETECT,gmode;

inilgraph(&gdriver,&gmode,"");

setfillstyle(1,LIGHTGRAY);

JIEMIAN;

outtcxtxy(200,160,"Pleaseinputexpressions");

outtextxy(200,215/'sstart");

outtextxy(200,240,"spaseto_zero");

outtextxy(200,265/'qquit");

ouitextxy(200,310,"Pleasechooseanorder");}

voidSanJiaoJieMianO

{intgdriver=DETECT,gmode;

initgraph(&gdriver,&gmode,"");

setfillstyle(1,LIGHTGRAY);

JIEMIAN;

outtcxtxy(2()(),160/'Pleasechooseanorderandthen");

outtextxy(200,170,"inputdatas:");

outtcxtxy(2(X),210,”ssinx");

outtextxy(200,230,"ccosx");

oultexixy(200,250,"spaseto_zero");

outtextxy(200,270,"qquit");

outtextxy(200,310,"Pleasechooseanorder:");

}

voidZhiDuiShuJieMian()

{intgdrivcr=DETECT,gmodc;

initgraph(&gdriver,&gn】ode,"");

JIEMIAN;

oullextxy(200,160,"Pleasechooseanorderandthen");

outtexixy(200,170,"inpuidatas:");

oultex(xy(200,210,"eexp(x)");

outtextxy(200,230,"1ln(x)");

outtextxy(200,250,"spaseto_zero");

outtextxy(200,270,"qquit");

outtextxy(200.310,"Pleasechooseanorder:");

doubleto_doublc(char*p)

{inti,sign=l;

floati;

doublenum;

i=0;

if(p[i]==*-'){sign=-l;i++;J

num=0.0;

for(;p[i]<='9'&&p[i]>=,0*;i++)

num=num*lO.O+pliJ-'O';

for(i++,t=10.0;pliJ>='0'&&pli]<='9,;i++)

{num+=(p[iJ-,0')/t;

t*=10;)

retum(sign*num);

)

doubleread()/*将读到的数字整和成实数*/

{charc,a[81],ch[34];/*将读到的串先保留在a中*/

inti=0;

c=gctch();

while(c!=V)/*gctch(i只读取回车键『、J第一种回车符*/

{a[i++]=c;a[i]-\O';

setfillstyle(l,WHITE);

bar(l95,80,445,130);

sprintf(ch,"%28s,',a);

setcolor(BLACK);

outtextxy(220.120xh);/*不停刷系刷新屏幕以显现出逆向输出*/

c=getch();

)

rcturn(to_double(a));

)

doublesin(doublex)

{doublefz,l'ni,sinx=x,xiang;

intsign=-l,l;

xiang=x,fz=x,fm=l,t=l;

while(fabs(xiang)>1e-8)

{fz*=x*x;

fm*=(t+l)*(t+2);t+=2;

xiang=sign*(fz/fm);

sinx+=xiang;

sign=sign*(-l):

retum(sinx);

doublecos(doublex)

{doublefz,fm,cosx=l.xiang;

intsign="l,t;

xiang=x,fz=1,fm=1,t=0;

whilc(fabs(xiang)>1c-8)

{fz*=x*x;

fm*=(t+l)*(t+2);t+=2;

xiang=sign*(fz/fm);

cosx+=xiang;

sign=sign*(-l);

retuni(cosx);

doubleexp(doublex)/*e时次方*/

{doubles=1.(),xiang=1.0;

intt=l;

do{

xiang*=x/(t++);

s+=xiang;}

while(fabs(xiang)>le-6);

retuni(s);}

floatlnx(floatx)/*ln(x)*/

{ints=-1,n=0;

floaty=0,t=0,m=l;

if(x>0&&x<=l)

{do

{y+=t;

n++;

s=-s;

m*=(x-l);

l=m*s/n;

}while(fabs(t)>1e-6);

)

if(x>l)

{x=l/x;

do

{y+=t;

n++;

s=-s;

m*=(x-D;

t=m*s/n;

}while(fabs(t)>1e-6);

return0-y;

char*readstr()

{charc,a[81],ch[34];/小将读到W、J串先保留在a中V

inti=0;

c=getch();

while(c!=V)/*getch。只读取回车键的第一种回车符刃

{a[i++]=c;a[i]='=';a[i+1]-'\0';

setfillstyle(l,WHITE);

bar(l95,80,445,130);

sprintf(ch,"%28s,',a);

sctcolor(BLACK):

outtcxtxy(220,120,ch);

c=getch();

)

retum(a);

I

doubleyunsuan(doubleshukdoubleshu2,charoption)

{doublere=0;

switch(option)

{case'+':re=shu1+shu2;break;

case'-':re=shuI-shu2;break;

case'*':re=shu1*shu2;break;

case'/":re=shul/shu2;break;

)

returnre;

I

intpriority(charleft,charright)

{charoption[]={V;-'/*,X,(,,')',,=,);

inti,le,ri;

intl[]=<4,4,6,6,2,IO,O};

int川={3,3,5,5,9,30};

for(i=0;i<=7;i++)

{if(op(ion[i]==lef()le=l[i];

if(option[i1==right)ri=r[i];

)

retuni(ri-le);

)

doublecomputc(char*p)

{inti=0,j=0;

doubleshu[20],num=0;

charop[20],c;

int1=0;

c=p[l++];

while(c)

{if(c<=,9'&&c>='0'||c==7)

{while(c<='9'&&c>='0')

{num二num"0+(c-O);

c=p[l++];

if(c=='.')

{intt=10;

c=pll++J;

while(c<=,9'&&c>='01)

{num=num+(c-'O,)/t;

t*=10;

c=p[l++];

)

)

shu[i++]=nu:n;

num=O;/*截取一种数字*/

)

elseif(j==0){op[j++j=c;c=pll++];}

else

{if(

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论