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

上传人:b****1 文档编号:131652 上传时间:2022-10-04 格式: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

《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;

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

当前位置:首页 > 自然科学 > 物理

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1