程序实习报告书
起止日期: 2012 年 6月 18 日 至 2012 年 6月 29日
学 号: 2011272086 .
班 级: 通 信 113 .
姓 名: 李 成 元 .
指导教师: 赵金胜 刑延超 .
通信与电子工程学院
2012年 6月 30日
1 设计时间
2012.06.18-2012.06.29
2 设计目的
1、实习目的
⑴ 熟练掌握和系统理解C语言的基本知识点:数据类型、程序结构、函数、数组、结构体、文件等。
⑵ 学会用C语言解决实际问题的方法
⑶ 掌握较大型程序设计及调试的一般步骤和方法。
3设计任务
综合运用C语言程序设计课程的主要知识设计一个计算器程序,利用算符优先关系,实现对算术四则混合运算表达式的求值。
⑴输入的形式:算术表达式,以井号“#”结束。例如2*(3+4)#;
包含的运算符只能有'+' 、'-' 、'*' 、'/' 、'('、 ')';
⑵输出的形式:运算结果,例如Answer is:14;
⑶程序所能达到的功能:对算术表达式求值并输出结果。
4.1需求分析
1、程序所能达到的功能:能够处理以字符序列的形式输入的不含变量的实数表达式,正确处理负数与小数,判断表达式是还语法正确(包含分母不能为零的情况),正确实现对算术四则混合运算表达式的求值,能够将计算中遇到的问题和结果以文件的形式予以存储。
2、输入的形式和输入值的范围:以字符串的形式输入表达式,以“#”结束。
3、输出的形式:在计算过程中遇到的问题或最终的答案将显示在屏幕上,同时所计算的表达式的最终的结果也将保存在文件中。
4、测试数据:输入“3*(7-2)#”时,输出“15.000000”,测试正确;输入“!(9-2)#”时,输出“输入错误!”,测试正确。
4.2总体设计
4.2.1抽象数据类型定义
ADT Stack{
数据对象:D={ |∈ElemSet,i=1,2,…,n, n≧0}
数据对象:R1={<>|,,i=2,…,n}
约定端为栈顶,端为栈底。
基本操作:
InitStack(&S)
操作结果:构造一个空栈S。
GetTop(S)
初始条件:栈S已存在。
操作结果:用P返回S的栈顶元素。
Push(&S,ch)
初始条件:栈S已存在。
操作结果:插入元素ch为新的栈顶元素。
Pop(&S)
初始条件:栈S已存在。
操作结果:删除S的栈顶元素。
In(ch)
操作结果:判断字符是否是运算符,运算符即返回1。
Precede(c1, c2)
初始条件:c1,c2为运算符。
操作结果:判断运算符优先权,返回优先权高的。
Operate(a,op,b)
初始条件:a,b为整数,op为运算符。
操作结果:a与b进行运算,op为运算符,返回其值。
num(n)
操作结果:返回操作数的长度。
EvalExpr()
初始条件:输入表达式合法。
操作结果:返回表达式的最终结果。
}ADT Stack
4.2.2函数模块说明
为实现算符优先算法,可以使用两个工作栈。一个称做OPTR,用以寄存运算符;另一个称做OPND,用以寄存操作数或运算结果。算法的基本思想是:
(1)首先置操作数栈为空栈,表达式起始符“#”为运算符栈底元素
(2)依次读入表达式中每个字符,若是操作数则进OPND栈,若是运算符则和OPTR栈的栈顶运算符比较优先权后作相应操作,直至整个表达式求值完毕(即OPTR栈的栈顶元素和当前读入的字符均为“#”)。
4.2.3主函数流程图
4.2.4函数模块调用关系
4.2.5运算符间的优先关系
θ1 θ2
+
-
*
/
(
)
#
+
>
>
>
<
<
>
>
-
>
>
>
<
<
>
>
*
>
>
>
>
<
>
>
/
>
>
>
>
<
>
>
(
<
<
<
<
<
=
)
>
>
>
>
>
>
#
<
<
<
<
<
=
4.3详细设计
4.3.1数据类型的定义及基本操作
//===== ADT Stack的表示与实现 =====
//----- 栈的顺序存储表示 -----
#define STACK_INIT_SIZT 100;
#define STACKINCREMENT 10
typedef struct{
SElemType *base;
SElemType *top;
int stacksize;
}SqStack;
//----- 基本操作的算法描述 -----
Status InitStack(SqStack &S){
S.base = (SElemType * )malloc(STACK_INIT_SIZE