科学计算器设计(C语言版)

  • 格式:doc
  • 大小:75.50 KB
  • 文档页数:11

下载文档原格式

  / 11
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

科学计算器设计(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;