C语言高精度计算器程序设计报告.doc
《C语言高精度计算器程序设计报告.doc》由会员分享,可在线阅读,更多相关《C语言高精度计算器程序设计报告.doc(10页珍藏版)》请在冰豆网上搜索。
综合性程序设计报告
设计题目:
高精度计算器
指导教师:
班级:
学号:
设计者:
成绩:
_______________
设计时间:
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;iilen=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;