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;
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语言的难度,但是通过自学和向同学们请教和自己查找资料,终于基本上完成了设计任务,在这个过程中我收获了许多,各方面的能力都得到了加强和提高,感谢这次综合性程序设计!