科学计算器设计(C语言版)
- 格式:doc
- 大小:75.50 KB
- 文档页数:11
科学计算器设计(C语言版)
学校:江西师范大学
学院:计算机信息工程学院
语言:C语言
平台:VC6.0
作者:王文
日期:2009年10月14日
一、背景和目的
计算器是现代日常生活中使用较为频繁的工具之一,常用的计算器有简易版和科学计算器两种模式。简易版的计算器不支持表达式运算,每次只能输入一个数据或者运算符来计算,而科学计算器除了容纳简易版计算器的功能外,还支持表达式运算,用户可以输入一个合法的算术表达式来得到所需的结果。
常用的算术表达式有三种,前缀表达式,中缀表达式和后缀表达式。
中缀表达式:我们平时书写的表达式就是中缀表达式,形如(a+b)*(c+d),事实上是运算表达式形成的树的中序遍历,特点是用括号来描述优先级。
后缀表达式:也叫逆波兰表达式,事实上是算数表达式形成的树的后序遍历。中缀表达式(a+b)*(c+d)的后缀表达式是ab+cd+*,它的特点就是遇到运算符就立刻进行运算。
前缀表达式:算数表达式形成的树的前序遍历。
日常所书写的是中缀表达式,但是计算机内部是用后缀表达式计算,所以此程序的用户使用中缀表达式作为输入,程序将中缀表达式转化为后缀表达式后再进行运算并输出结果。
由于今后工作将使用C语言进行开发,而C语言是一个功能强大并且很灵活的语言,为复习和巩固C编程,故决定用C语言编写一个科学计算器。
本次开发采用C语言,以面对过程思想进行开发,使用的数据结构有队列和栈。
二、模块设计
本次开发,使用的控制台输入,并直接在控制台输出。
科学计算器的功能组件如下:
三、详细设计
宏:
#define TEST //表示测试阶段#define MAX_SIZE 100 //表达式长度
#define LBRACKET 0 //左括号
#define RBRACKET 1 //右括号
#define ADD 2 //加
#define SUB 3 //减
#define MUL 4 //乘
#define DIV 5 //乘
#define INT 6 //整数
#define DOUBLE 7 //浮点数
数据结构:
表达式节点
struct ExprNode{
int n; //表达式节点类型
double p; //表达式节点数据
};
中缀表达式:
struct ExprNode infixExpr[MAX_SIZE];
int infixLen;
后缀表达式:
struct ExprNode suffixExpr[MAX_SIZE];
int suffixLen;
后缀转换栈:
int transStack[MAX_SIZE];
int transTop;
后缀表达式运算栈:
struct ExprNode calcuStack[MAX_SIZE];
int calcuTop;
函数过程:
__inline int get_char( char *c )
缓冲变量无字符则读入字符
读入成功返回0,否者返回-1
int input_expr( void )
读入表达式
若输入非法字符则返回-1,否则返回0
int pri( int a, int b )
优先级计算
若a优先于b则返回-1,否则返回0
int trans_expr( void )
中缀表达式转换为后缀表达式
括号不匹配返回-1,否则返回0
__inline int maxn( int a, int b )
求最大值
struct ExprNode calcu( struct ExprNode *a, struct ExprNode *b, int c )
计算a和b做c运算的结果
int calcu_expr( void )
计算后缀表达式
表达式计算失败返回-1,否则为0
void show( void )
输出运算结果
代码:
#include
//#define TEST //表示测试阶段
#define MAX_SIZE 100 //表达式长度
#define LBRACKET 0 //左括号
#define RBRACKET 1 //右括号
#define ADD 2 //加
#define SUB 3 //减
#define MUL 4 //乘
#define DIV 5 //乘
#define INT 6 //整数
#define DOUBLE 7 //浮点数
struct ExprNode{
int n; //表达式节点类型
double p; //表达式节点数据
};
struct ExprNode infixExpr[MAX_SIZE]; //中缀表达式
int infixLen;
struct ExprNode suffixExpr[MAX_SIZE]; //后缀表达式
int suffixLen;
int transStack[MAX_SIZE]; //后缀转换栈
int transTop;
struct ExprNode calcuStack[MAX_SIZE]; //后缀表达式运算栈int calcuTop;
//缓冲变量无字符则读入字符
//读入成功返回0,否者返回-1
__inline int get_char( char *c )
{
if ( *c == '\0' ) return scanf( "%c", c );
return 0;