程序实习报告书
起止日期:
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)# ;
包含的运算符只能有’+'、’-'、'*'、’/'、’('、')';
⑵输出的形式:运算结果,例如An swer is:14 ;
⑶程序所能达到的功能:对算术表达式求值并输出结果。
4.1需求分析
1、程序所能达到的功能:能够处理以字符序列的形式输入的不含变量的实数表达式,正 确处理负数与小数,判断表达式是还语法正确(包含分母不能为零的情况),正确实现对 算术四则混合运算表达式的求值,能够将计算中遇到的问题和结果以文件的形式予以存 储。
2、 输入的形式和输入值的范围:以字符串的形式输入表达式,以“#”结束。
3、输出的形式:在计算过程中遇到的问题或最终的答案将显示在屏幕上,同时所计算的 表达式的最终的结果也将保存在文件中。
4、测试数据:输入“ 3*(7-2)# ”时,输出“ 15.000000”,测试正确;输入“ !(9-2)# 时,输出“输入错误!”,测试正确。
4.2总体设计
421抽象数据类型定义
ADT Stack{
数据对象:
D={ ai |ai € ElemSet,i=1,2,,…n, n三 0}
数据对象:
R1={< 玄起/心二耳亡 D ,i=2,?;? n}
约定an端为栈顶,ai端为栈底。
基本操作:
In itStack(&S)
操作结果:构造一个空栈So
GetTop(S)
初始条件:栈S已存在。
操作结果:用P返回S的栈顶元素
Push(&S, ch)
初始条件:
栈S已存在。
操作结果:
插入元素ch为新的栈顶元素。
Pop(&S)
初始条件:
栈S已存在。
操作结果:
删除S的栈顶元素。
In(ch)
操作结果:
判断子符是否是运算符,运算符即返回1o
Precede(c1, c2)
初始条件:c1,c2为运算符
操作结果:判断运算符优先权,返回优先权高的。
Operate(a,op,b)
初始条件:a,b为整数,op为运算符。
操作结果:a与b进行运算,op为运算符,返回其值。
nu m( n)
操作结果:返回操作数的长度。
EvalExpr()
初始条件:输入表达式合法。
操作结果:返回表达式的最终结果。
}ADT Stack
4.2.2函数模块说明
为实现算符优先算法,可以使用两个工作栈。一个称做OPTR,用以寄存运算符;另一个
称做OPND,用以寄存操作数或运算结果。算法的基本思想是:
首先置操作数栈为空栈,表达式起始符“ #”为运算符栈底元素
依次读入表达式中每个字符,若是操作数则进 OPND栈,若是运算符则和OPTR栈的 栈顶运算符比较优先权后作相应操作,直至整个表达式求值完毕(即 OPTR栈的栈顶元素 和当前读入的字符均为“ #”)。
423主函数流程图
424函数模块调用关系
I
I
主程序模块
栈的建立及初始化模块
O
「—
判断输入是否结束模块
丿
厂▽’
r
判断字符类型模块
输入结束输岀结果
-J
匕 、,V
运算数进栈模块运算符优先级比较模块
q3
运算符进栈模块运算符运算数出栈模块
I丿P ■
~TJ~
运算模块
425运算符间的优先关系
^1^^2
+
-
*
/
(
)
#
+
>
>
>
<
<
>
>
-
>
>
>
<
<
>
>
*
>
>
>
>
<
>
>
/
>
>
>
>
<
>
>
(
<
<
<
<
<
=
)
>
>
>
>
>
>
#
<
<
<
<
<
=
4.3详细设计
431数据类型的定义及基本操作
//===== ADT Stack 的表示与实现=====
//栈的顺序存储表示
#define STACK_INIT_SIZT 100;
#define STACKINCREMENT 10
typedef struct
SEIemType *base;
SEIemType *top;
int stacksize;
} SqStacK
//-----基本操作的算法描述-----
Status In itStack(SqStack & S){
si