C语言高精度计算器程序设计报告.doc

上传人:wj 文档编号:145269 上传时间:2023-04-28 格式:DOC 页数:10 大小:79KB
下载 相关 举报
C语言高精度计算器程序设计报告.doc_第1页
第1页 / 共10页
C语言高精度计算器程序设计报告.doc_第2页
第2页 / 共10页
C语言高精度计算器程序设计报告.doc_第3页
第3页 / 共10页
C语言高精度计算器程序设计报告.doc_第4页
第4页 / 共10页
C语言高精度计算器程序设计报告.doc_第5页
第5页 / 共10页
C语言高精度计算器程序设计报告.doc_第6页
第6页 / 共10页
C语言高精度计算器程序设计报告.doc_第7页
第7页 / 共10页
C语言高精度计算器程序设计报告.doc_第8页
第8页 / 共10页
C语言高精度计算器程序设计报告.doc_第9页
第9页 / 共10页
C语言高精度计算器程序设计报告.doc_第10页
第10页 / 共10页
亲,该文档总共10页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

C语言高精度计算器程序设计报告.doc

《C语言高精度计算器程序设计报告.doc》由会员分享,可在线阅读,更多相关《C语言高精度计算器程序设计报告.doc(10页珍藏版)》请在冰点文库上搜索。

C语言高精度计算器程序设计报告.doc

综合性程序设计报告

设计题目:

高精度计算器

指导教师:

班级:

学号:

设计者:

成绩:

_______________

设计时间:

2010年5月27日

高精度计算器

[题目描述]

编制一个软件用于实现高精度的计算

基本要求:

要有+,-,*,/四则运算

记录算式

输出算式

查看算式及结果

[功能模块分解]

本程序用到以下函数:

voidiPush(float);

floatiPop();

floatStaOperand[MaxSize];

charSrcexp[MaxSize];

charCapaexp[MaxSize];

charRevPolishexp[MaxSize];

floatNumCapaTab[26];

charvalidexp[]="*/+-()";

charNumSets[]="0123456789";

charStackSymb[MaxSize];

voidNumsToCapas(char[],int,char[],float[]);

intCheckExpress(char);

intPriorChar(char,char);

intGetOperator(char[],char);

voidcounterPolishexp(charINexp[],intslen,charOutexp[]);

floatCalcRevPolishexp(char[],float[],char[],int);

[数据库设计及说明]

1、变量的说明和解释:

首先定义了两个结构体类型名SqStack和dstack,分别用来定义字符栈和数字栈。

然后在主函数中定义了字符型数组E[N],A[N],B[N],E[N]用来保存用户输入的计算式,A[N]用来保存后缀表达式,E[N]用来保存从输出文件中读取的字符串。

还定义了一个字符型变量ck,用来记录用户是否要查看历史记录。

其余一些变量基本都是在各个函数中的局部变量,或者是函数的形参或实参。

2、有关的库函数说明:

程序里用到了stdio.h,和conio.h库函数,首先stdio.h我们经常用到,内部包含了我们常用的输入输出函数等等。

conio.h不是C标准库中的头文件。

conio是ConsoleInput/Output(控制台输入输出)的简写,其中定义了通过控制台进行数据输入和数据输出的函数,主要是一些用户通过按键盘产生的对应操作,

比如getch()函数等等。

[界面说明]

[主要算法说明]

#include//定义输入/输出函数

#include//字符串处理

#include//定义通过控制台进行数据输入和数据输出

#include"ctype.h"//定义bool类型

#include//定义数学函数

[代码清单及注释]

#include"stdio.h"

#include"string.h"

#include

#include"ctype.h"

#include"math.h"

//expressionevaluate

#defineiMUL0

#defineiDIV1

#defineiADD2

#defineiSUB3

#defineiCap4

//#defineLtKH5

//#defineRtKH6

#defineMaxSize100

voidiPush(float);

floatiPop();

floatStaOperand[MaxSize];

intiTop=-1;

//

charSrcexp[MaxSize];

charCapaexp[MaxSize];

charRevPolishexp[MaxSize];

floatNumCapaTab[26];

charvalidexp[]="*/+-()";

charNumSets[]="0123456789";

charStackSymb[MaxSize];

intoperands;

//

voidNumsToCapas(char[],int,char[],float[]);

intCheckExpress(char);

intPriorChar(char,char);

intGetOperator(char[],char);

voidcounterPolishexp(charINexp[],intslen,charOutexp[]);

floatCalcRevPolishexp(char[],float[],char[],int);

voidmain()

{

intilen;

inti;

charc;

floatiResult=0.0;

while

(1)

{

printf("\n请输入计算式:

\n");

memset(StackSymb,0,MaxSize);

memset(NumCapaTab,0,26);//A--NO.1,B--NO.2,etc.

gets(Srcexp);

ilen=strlen(Srcexp);

NumsToCapas(Srcexp,ilen,Capaexp,NumCapaTab);

for(i=0;i

ilen=strlen(Capaexp);

counterPolishexp(Capaexp,ilen,RevPolishexp);

ilen=strlen(RevPolishexp);

iResult=CalcRevPolishexp(validexp,NumCapaTab,RevPolishexp,ilen);

printf("\n计算结果为:

\n%s=%.6f\n",Srcexp,iResult);

printf("是否继续计算,Y/继续,N/退出");

c=getch();

if(c=='n'||c=='N')

break;

}

}

voidiPush(floatvalue)

{

if(iTop

}

floatiPop()

{

if(iTop>-1)

returnStaOperand[iTop--];

return-1.0;

}

voidNumsToCapas(charSrcexp[],intslen,charCapaexp[],floatNumCapaTab[])

{

charch;

inti,j,k,flg=0;

intsign;

floatval=0.0,power=10.0;

i=0;j=0;k=0;

while(i

{

ch=Srcexp[i];

if(i==0)

{

sign=(ch=='-')?

-1:

1;

if(ch=='+'||ch=='-')

{

ch=Srcexp[++i];

flg=1;

}

}

if(isdigit(ch))

{

val=ch-'0';

while(isdigit(ch=Srcexp[++i]))

{

val=val*10.0+ch-'0';

}

if(ch=='.')

{

while(isdigit(ch=Srcexp[++i]))

{

val=val+(ch-'0')/power;

power*=10;

}

}//endif

if(flg)

{

val*=sign;

flg=0;

}

}//endif

//writeCapaexparray

//writeNO.jtoarray

if(val)

{

Capaexp[k++]='A'+j;

Capaexp[k++]=ch;

NumCapaTab[j++]=val;//A--0,B--1,andC,etc.

}

else

{

Capaexp[k++]=ch;

}

val=0.0;

power=10.0;

//

i++;

}

Capaexp[k]='\0';

operands=j;

}

floatCalcRevPolishexp(charvalidexp[],floatNumCapaTab[],charRevPolishexp[],intslen)

{

floatsval=0.0,op1,op2;

inti,rt;

charch;

//recursivestack

i=0;

while((ch=RevPolishexp[i])&&i

{

switch(rt=GetOperator(validexp,ch))

{

caseiMUL:

op2=iPop();op1=iPop();

sval=op1*op2;

iPush(sval);

break;

caseiDIV:

op2=iPop();op1=iPop();

if(!

fabs(op2))

{

printf("overflow\n");

iPush(0);

break;

}

sval=op1/op2;

iPush(sval);

break;

caseiADD:

op2=iPop();op1=iPop();

sval=op1+op2;

iPush(sval);

break;

caseiSUB:

op2=iPop();op1=iPop();

sval=op1-op2;

iPush(sval);

break;

caseiCap:

iPush(NumCapaTab[ch-'A']);

break;

default:

;

}

++i;

}

while(iTop>-1)

{

sval=iPop();

}

returnsval;

}

intGetOperator(charvalidexp[],charoper)

{

intoplen,i=0;

oplen=strlen(validexp);

if(!

oplen)return-1;

if(isalpha(oper))return4;

while(i

=oper)++i;

if(i==oplen||i>=4)return-1;

returni;

}

intCheckExpress(charch)

{

inti=0;

charcc;

while((cc=validexp[i])&&ch!

=cc)++i;

if(!

cc)

return0;

return1;

}

intPriorChar(charcurch,charstach)

{

//栈外优先级高于(>)栈顶优先级时,才入栈

//否则(<=),一律出栈

if(curch==stach)return0;//等于时应该出栈

elseif(curch=='*'||curch=='/')

{

if(stach!

='*'&&stach!

='/')

return1;

}

elseif(curch=='+'||curch=='-')

{

if(stach=='('||stach==')')

return1;

}

elseif(curch=='(')

{

if(stach==')')

return1;

}

return0;

}

voidcounterPolishexp(charINexp[],intslen,charOutexp[])

{

inti,j,k,pr;

chart;

i=0;

j=k=0;

while(INexp[i]!

='='&&i

{

if(INexp[i]=='(')

StackSymb[k++]=INexp[i];

//iPush(*(INexp+i));

elseif(INexp[i]==')')

{

//if((t=iPop())!

=-1)

while((t=StackSymb[k-1])!

='(')

{

Outexp[j++]=t;

k--;

}

k--;

}

elseif(CheckExpress(INexp[i]))//isoparator

{

//printf("operator%ck=%d\n",INexp[i],k);

while(k)

{

//iPush(*(INexp+i));

if(pr=PriorChar(INexp[i],StackSymb[k-1]))

break;

else

{

//if((t=iPop())!

=-1)

t=StackSymb[k-1];k--;

Outexp[j++]=t;

}

}//endwhile

StackSymb[k++]=INexp[i];//commonprocess

}

else//if()变量名

{

//printf("operand%ck=%d\n",INexp[i],k);

Outexp[j++]=INexp[i];

}

i++;//

}

while(k)

{

t=StackSymb[k-1];k--;

Outexp[j++]=t;

}

Outexp[j]='\0';

}

[设计体会]

本次设计使我对c语言有了更深层的了解,C语言课程设计和现代计算机技术的实际应用相结合,是我们在本阶段学完理论课程之后对自己该方面的能力的一次很好的检验,从开始的算法思路到运行调试后的美观的图形界面以及另人兴奋的可用程序,都是一个很好的学习和锻炼的过程。

使我们巩固了原有的理论知识,培养了我们灵活运用和组合集成所学过知识及技能来分析、解决实际问题的能力。

使我们体会到自身知识和能力能在实际中的应用和发挥。

不但可以激发创新意识,还可以开发创造能力、培养沟通能力。

这次实习时间是三个星期,使我感到时间不够用,这足以说明c语言的难度,但是通过自学和向同学们请教和自己查找资料,终于基本上完成了设计任务,在这个过程中我收获了许多,各方面的能力都得到了加强和提高,感谢这次综合性程序设计!

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 经管营销 > 经济市场

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2