1、C语言高精度计算器程序设计报告综合性程序设计报告设计题目: 高精度计算器指导教师: 班 级: 学 号: 设 计 者: 成 绩: _设计时间:2010年 5 月 27 日高精度计算器题目描述编制一个软件用于实现高精度的计算基本要求: 要有+,-,*,/四则运算 记录算式 输出算式 查看算式及结果功能模块分解本程序用到以下函数:void iPush(float); float iPop(); float StaOperandMaxSize; char SrcexpMaxSize; char CapaexpMaxSize; char RevPolishexpMaxSize; float NumCap
2、aTab26; char validexp=*/+-(); char NumSets=0123456789; char StackSymbMaxSize; void NumsToCapas(char , int , char , float ); int CheckExpress(char); int PriorChar(char,char); int GetOperator(char , char); void counterPolishexp(char INexp, int slen, char Outexp); float CalcRevPolishexp(char , float ,
3、char , int);数据库设计及说明1、变量的说明和解释:首先定义了两个结构体类型名SqStack和dstack,分别用来定义字符栈和数字栈。然后在主函数中定义了字符型数组EN,AN,BN,EN用来保存用户输入的计算式,AN用来保存后缀表达式,EN用来保存从输出文件中读取的字符串。还定义了一个字符型变量ck,用来记录用户是否要查看历史记录。 其余一些变量基本都是在各个函数中的局部变量,或者是函数的形参或实参。2、有关的库函数说明:程序里用到了stdio.h,和conio.h库函数,首先stdio.h我们经常用到,内部包含了我们常用的输入输出函数等等。 conio.h不是C标准库中的头文件。
4、 conio是Console Input/Output(控制台输入输出)的简写,其中定义了通过控制台进行数据输入和数据输出的函数,主要是一些用户通过按键盘产生的对应操作,比如 getch()函数等等。界面说明主要算法说明#include /定义输入输出函数#include /字符串处理#include/定义通过控制台进行数据输入和数据输出#include ctype.h/定义 bool 类型#include /定义数学函数代码清单及注释#include stdio.h #include string.h #include #include ctype.h #include math.h /ex
5、pression evaluate #define iMUL 0 #define iDIV 1 #define iADD 2 #define iSUB 3 #define iCap 4 /#define LtKH 5 /#define RtKH 6 #define MaxSize 100 void iPush(float); float iPop(); float StaOperandMaxSize; int iTop=-1; / char SrcexpMaxSize; char CapaexpMaxSize; char RevPolishexpMaxSize; float NumCapaTa
6、b26; char validexp=*/+-(); char NumSets=0123456789; char StackSymbMaxSize; int operands; / void NumsToCapas(char , int , char , float ); int CheckExpress(char); int PriorChar(char,char); int GetOperator(char , char); void counterPolishexp(char INexp, int slen, char Outexp); float CalcRevPolishexp(ch
7、ar , float , char , int); void main() int ilen;int i; char c; float iResult=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; ioperands; +i) ilen=strlen
8、(Capaexp); counterPolishexp(Capaexp,ilen,RevPolishexp); ilen=strlen(RevPolishexp); iResult=CalcRevPolishexp(validexp, NumCapaTab, RevPolishexp,ilen); printf(n计算结果为:n%s=%.6fn,Srcexp,iResult); printf(是否继续计算,Y/继续,N/退出);c=getch();if(c=n|c=N)break; void iPush(float value) if(iTop-1) return StaOperandiTop
9、-; return -1.0; void NumsToCapas(char Srcexp, int slen, char Capaexp, float NumCapaTab) char ch; int i, j, k, flg=0; int sign; float val=0.0,power=10.0; i=0; j=0; k=0; while (islen) ch=Srcexpi; if (i=0) sign=(ch=-)?-1:1; if(ch=+|ch=-) ch=Srcexp+i; flg=1; if (isdigit(ch) val=ch-0; while (isdigit(ch=S
10、rcexp+i) val=val*10.0+ch-0; if (ch=.) while(isdigit(ch=Srcexp+i) val=val+(ch-0)/power; power*=10; /end if if(flg) val*=sign; flg=0; /end if /write Capaexp array / write NO.j to array if(val) Capaexpk+=A+j; Capaexpk+=ch; NumCapaTabj+=val; /A-0, B-1,and C, etc. else Capaexpk+=ch; val=0.0; power=10.0;
11、/ i+; Capaexpk=0; operands=j; float CalcRevPolishexp(char validexp, float NumCapaTab, char RevPolishexp, int slen) float sval=0.0, op1,op2; int i, rt; char ch; /recursive stack i=0; while(ch=RevPolishexpi) & i-1) sval=iPop(); return sval; int GetOperator(char validexp,char oper) int oplen,i=0; oplen
12、=strlen(validexp); if (!oplen) return -1; if(isalpha(oper) return 4; while(i=4) return -1; return i; int CheckExpress(char ch) int i=0; char cc; while(cc=validexpi) & ch!=cc) +i; if (!cc) return 0; return 1; int PriorChar(char curch, char stach) /栈外优先级高于()栈顶优先级时,才入栈 /否则(=),一律出栈 if (curch=stach) retu
13、rn 0; /等于时应该出栈 else if (curch=* | curch=/) if(stach!=* & stach!=/) return 1; else if (curch=+ | curch=-) if (stach=( | stach=) return 1; else if (curch=() if (stach=) return 1; return 0; void counterPolishexp(char INexp, int slen, char Outexp) int i, j, k,pr; char t; i=0; j=k=0; while (INexpi!= & is
14、len) if (INexpi=() StackSymbk+=INexpi; /iPush(*(INexp+i); else if(INexpi=) /if(t=iPop()!=-1) while(t=StackSymbk-1)!=() Outexpj+=t; k-; k-; else if (CheckExpress(INexpi) / is oparator / printf(operator %c k=%dn,INexpi,k); while (k) / iPush(*(INexp+i); if(pr=PriorChar(INexpi,StackSymbk-1) break; else
15、/if (t=iPop()!=-1) t=StackSymbk-1; k-; Outexpj+=t; /end while StackSymbk+=INexpi; /common process else /if() 变量名 / printf(operand %c k=%dn,INexpi,k); Outexpj+=INexpi; i+; / while (k) t=StackSymbk-1; k-; Outexpj+=t; Outexpj=0; 设计体会本次设计使我对c语言有了更深层的了解,C语言课程设计和现代计算机技术的实际应用相结合,是我们在本阶段学完理论课程之后对自己该方面的能力的一次很好的检验,从开始的算法思路到运行调试后的美观的图形界面以及另人兴奋的可用程序,都是一个很好的学习和锻炼的过程。使我们巩固了原有的理论知识,培养了我们灵活运用和组合集成所学过知识及技能来分析、解决实际问题的能力。使我们体会到自身知识和能力能在实际中的应用和发挥。不但可以激发创新意识,还可以开发创造能力、培养沟通能力。这次实习时间是三个星期,使我感到时间不够用,这足以说明c语言的难度,但是通过自学和向同学们请教和自己查找资料,终于基本上完成了设计任务,在这个过程中我收获了许多,各方面的能力都得到了加强和提高,感谢这次综合性程序设计!
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1