| 注册
home doc ppt pdf
请输入搜索内容

热门搜索

年终总结个人简历事迹材料租赁合同演讲稿项目管理职场社交

《带括号算术表达式的计算》实验报告

文***品

贡献于2021-10-01

字数:8826


四川学
数结构算法分析实验报告











实验名称 :带括号算术表达式求值
指导老师 :_______________________
学 院 :_______软件学院_______
专 业 :_______软件工程_______
姓 名 :________ _____
学 号 :_____ ____
班 级 :___________ 班________
日 期 :___2014年X月X日___


目录



实验题目 3

二 实验目求 3

三 实验环境 3

四 算法描述 3

五 源程序清单 附录

六 运行结果 6

七 实验运行情况分析 7




实验题目
l 带括号算术表达式求值
二实验目求
ü 采算符优先数算法正确求值表达式
ü 熟练掌握栈应
ü 熟练掌握计算机系统基操作方法解编辑编译链接运行C程序
ü 机调试程序掌握查错排错程序正确运行
三实验环境
² 硬件环境
联想 笔记电脑
² 软件环境
操作系统 windows 7 旗舰版
编译软件Visual C++ 60
四算法描述

开始


判断表达式否正确
键盘读入算术表
达式存入单链表中

栈计算显示算数表达式

退出程序


否继续计算?
显示错误信息

Ø 程序框图








判断表达式否正确



Ø 文字解释
1 户键盘读入算术中缀表达式结尾
2 程序判断户输入表达式否正确
3 表达式正确栈计算算术表达式
4 印输出计算程终结果
5 程序询问户否继续计算
6 继续执行第1步否定退出程序
7 表达式错误印错误信息提示户重新输入
8 返回第1步
Ø 函数结构说明
l 结构体
1) 存储算数表达式单链表
struct Expression{
char sign
struct Expression *next
}

2) 操作符操作数栈
typedef struct{
char *top
char *bottom
int stack_size
}Stack

l 构造函数
1) 栈相关操作函数
① 初始化空栈 int StackCreate(Stack *s)
② 入栈操作 int PUSH(Stack *s char c)
③ 出栈操作 int POP(Stack *s char c)
④ 获取栈顶元素 char GetTop(Stack *s)

2) 计算相关操作函数
①利栈计算算术表达式 int Calculate(struct Expression *exp)
②子式值计算 int Count(char num1 char sign char num2)
③判断字符否运算符 int IsOpOrNum(char c)
④判断运算符优先级 char JudgeLevel(char c1 char c2)
⑤判断表达式正确性 int IsExpresiion(struct Expression *exp)
⑥输出计算结果 void PrintResult(struct Expression *expint result)

3) 算术表达式输入函数
①键盘读入存单链表 struct Expression *GetExp()

符号2
l 构造操作符优先级表
符号1


+

*

(
)
(#)
+
>
>
<
<
<
>
>

>
>
<
<
<
>
>
*
>
>
>
>
<
>
>

>
>
>
>
<
>
>
(
<
<
<
<
<


)
>
>
>
>

>
>
(#)
<
<
<
<
<



五源程序清单
Ø 见附录
六运行结果
Ø 测试表
l 次测试采户键盘输入算数表达式进行16组测试

序号
测试功
测试容
输入项
预期输出
实际输出
结果
1
基计算操作
单括号运算
2*(3+4)+5*3
29
29

2
基计算操作
括号运算
3+((4+3)*6)3
17
17

3
基计算操作
整运算
6*(2+(32))
21
18
误差
4
基计算操作
整运算
(1+2+3)4
15
1
误差
5
式子正误判断
括号匹配
1+(1+3*2
输出错误信息
输出错误信息

6
式子正误判断
计算符余
1++2*3+6
输出错误信息
输出错误信息

7
式子正误判断
含非计算符
x+y*z+w
输出错误信息
输出错误信息

8
式子正误判断
未输入
1+2*3
7
7

9
容错力
数0
2+30
输出数0
输出数0

10
容错力
动空格
1+ 2 * ( 3 + 4)
15
15

11
容错力
输#
2*(3+2)#
10
10

12
拓展功
位正数计算
10*(2+13)
150
输出错误信息
未通
13
拓展功
负数计算
4+3*(4)+5
3
输出错误信息
未通
15
拓展功
数计算
1+10*012
6
输出错误信息
未通
16
全体测试
终测试
2 *(4 –(3+3) )+3 #
1
1


Ø 部分运行截图
l 基计算操作
整运算(3)
括号运算(2)

l 式子正误判断

l 容错力

l 全体测试

七实验运行情况分析
Ø 优点
l 户输入格式较增添想容错系统户未输入户错输成#户字符间输入空格程序会智识出正确算数表达式计算正确答案
l 防错报错系统较完善方面考虑输入方面错误括号匹配计算符少输输输入非计算符等方面均考虑提示户错误信息便户检查输入状况
l 存储方式较规范采单链表存储户输入算术表达式更加清晰简单头结点存储表达式中符号数方便必时候统计终结果正确性
Ø 缺点
l 实现数字间四运算实现算数功方开方等
l 仅仅局限位数间运算法运算两位数两位数字运算
l 计算数字09整数法负数者数进行计算
l 法中遇法结果保留整数部分造成终结果预期结果存误差
l 控制台系统限制户交互性较差界面太简单单调
Ø 感受
通次带括号算数表达式计算实验光复前学单链表相关知识加采巩固关栈相关操作实现题目求基功基础增加拓展容期两周实验中刚开始整理思路接里编写代码填写实验报告步步完成唯独惜知识掌握够全面导致实现基功法进行进步扩展完善致户输入运算式未预期结构较遗憾方面
附录(源程序代码)
*
*实验:带括号算数表达式求值
*实现:栈
*语言:C
*作者:马健
*
#include
#include
#include

#define STACK_SIZE_FIRST 100 栈初始空间
#define STACK_SIZE_INCREASE 20 栈增加空间

*算术表达式单链表*
struct Expression{
char sign
struct Expression *next
}

*操作符操作数栈*
typedef struct{
char *top
char *bottom
int stack_size 栈空间
}Stack

struct Expression *GetExp() 键盘读入表达式存入单链表

*栈相关操作函数*
int StackCreate(Stack *s) 初始化空栈函数
int PUSH(Stack *s char c) 入栈函数
int POP(Stack *s char c) 出栈函数
char GetTop(Stack *s) 取出栈顶元素

*计算相关操作函数*
int Calculate(struct Expression *exp) 带括号算数表达式计算函数
int Count(char num1 char sign char num2) 两数计算
int IsOpOrNum(char c) 判断字符运算符
char JudgeLevel(char c1 char c2) 判断两运算符优先级
void PrintResult(struct Expression *expint result) 印终结果
int IsExpresiion(struct Expression *exp) 判断否正确算术表达式



void main()
{
struct Expression *head
int Result 0 定义终计算结果
int temp 0 定义循环参数
char select
while(temp 0)
{
head GetExp() 创建算术表达式单链表
if(IsExpresiion(head) 0 || head NULL) 算术表达式错误重新输入
{
printf(算术表达式错误请认真检查重新输入)
getch()
system(cls)
}
else
{
Result Calculate(head) 计算算术表达式
PrintResult(headResult) 输出终计算结果
printf(否继续计算 (y) 否(n)\n) 否继续
select getch()
if(select 'n' || select 'N')
temp 1
else
system(cls)
}
}
}

读入算术表达式存储链表
struct Expression *GetExp()
{
printf(\t带括号算术表达式求值\n)
printf(请输入需计算算数表达式(''结尾)\n)
char c
int number 0
struct Expression *head NULL*p1*p2*first NULL 定义指针变量
head (struct Expression *)malloc(sizeof(struct Expression))
while((c getchar()) '\n')
{
if(c ' ') 出现空格动删
{
p1 (struct Expression *)malloc(sizeof(struct Expression))
if(c '')
c '#'
p1>sign c
if(first NULL)
first p1
else
p2>next p1
p2 p1
number++
}
}
if(p2>sign '#') 未输入''动补齐
{
p1 (struct Expression *)malloc(sizeof(struct Expression))
p1>sign '#'
p2>next p1
p2 p1
number++
}
head>next first
head>sign number + '0' 头结点存储表达式中字符数
if(head>next NULL)
p2>next NULL
return head
}

创建空栈
int StackCreate(Stack *s)
{
s>bottom (char *)malloc(STACK_SIZE_FIRST * sizeof(char))
if (s>bottom NULL)
{
printf(栈初始化失败\n)
exit(0)
}
else
{
s>top s>bottom
s>stack_size STACK_SIZE_FIRST
}
return 1
}

入栈
int PUSH(Stack *s char c)
{
if(s>top s>bottom > STACK_SIZE_FIRST)
{
s>bottom (char *)realloc(s>bottom(STACK_SIZE_FIRST+STACK_SIZE_INCREASE) * sizeof(char))
if(s>bottom NULL)
{
printf(增加栈空间失败\n)
exit(0)
}
s>stack_size s>stack_size + STACK_SIZE_INCREASE
}
*(s>top) c 赋值需入栈元素
s>top ++ 栈顶指针移
return 1
}

出栈
int POP(Stack *s char c)
{
if(s>top s>bottom)
{
printf(栈空出栈失败\n)
exit(0)
}
else
{
c *(s>top)
s>top

}
return 1
}

获取栈顶元素
char GetTop(Stack *s)
{
char c
if(s>top s>bottom)
printf(栈空法获取栈顶元素\n)
else
{
c * (s>top 1)
}
return c
}

计算算术表达式
int Calculate(struct Expression *exp)
{
exp exp>next 取表达式开始
char OpSign ' ' 存储出栈操作符
char NumSign1' 'NumSign2 ' ' 存储出栈数字符
char result 存储部分运算结果
char temp ' ' 接受出栈操作数
Stack s_operator s_number
StackCreate(&s_operator) 创建操作符栈
StackCreate(&s_number) 创建数字栈
PUSH(&s_operator'#') 先操作栈底压入'#'
printf(\n计算程\n)
while(exp>sign '#' || GetTop(&s_operator) '#')
{
操作数存入操作数栈
if(IsOpOrNum(exp>sign) 0)
{

PUSH(&s_numberexp>sign)
exp exp>next
}
操作符存入操作符栈
else if(IsOpOrNum(exp>sign) 1)
{
OpSign GetTop(&s_operator) 获取栈顶元素
switch(JudgeLevel(OpSignexp>sign)) 较栈顶元素运算符优先级
{
case '<'PUSH(&s_operatorexp>sign) exp exp>nextbreak
case ''POP(&s_operatorOpSign) exp exp>next break
case '>'
POP(&s_operatorOpSign)
NumSign1 GetTop(&s_number)
POP(&s_numbertemp)
NumSign2 GetTop(&s_number)
POP(&s_numbertemp)
result Count(NumSign2OpSignNumSign1)
PUSH(&s_numberresult)
break
default break
}
}


}
result GetTop(&s_number) 获取终计算结果
return result '0'

}
判断两运算符优先级
char JudgeLevel(char c1 char c2)
{
switch(c1)
{
case '+' switch(c2){
case '*'
case ''
case '(' return '<' break
default return '>' break
}
break
case '' switch(c2){
case '*'
case ''
case '(' return '<' break
default return '>' break
}
break
case '*' switch(c2){
case '(' return '<' break
default return '>' break
}
break
case '' switch(c2){
case '(' return '<' break
default return '>' break
}
break
case '(' switch(c2){
case ')' return '' break
default return '<' break
}
break
case ')' switch(c2){
case '+' return '>' break
default return '>' break
}
break
case '#' switch(c2){
case '#' return '' break
default return '<' break
}
break
default return '<' break
}

}

计算符号运算
int Count(char num1 char sign char num2)
{
int a0b0
a num1 '0' 取数字字符值
b num2 '0'
int result 0
switch(sign)
{
case '+'result a+bbreak
case ''result abbreak
case '*'result a*bbreak
case ''result abbreak
defaultbreak
}
printf(d c d d\nasignbresult) 输出计算程
return result + '0'


}

判断字符运算符数字符
int IsOpOrNum(char c)
{
switch(c)
{
case '+'
case ''
case '*'
case ''
case '('
case ')'
case '#'
return 1 操作符
break
case '0'
case '1'
case '2'
case '3'
case '4'
case '5'
case '6'
case '7'
case '8'
case '9'
return 0 操作数
break
default
return 1
break
}
}

输出终结果
void PrintResult(struct Expression *expint result)
{
printf(\n终计算结果\n)
exp exp>next
while(exp NULL)
{
if( exp>sign '#')
exp>sign ''
printf( cexp>sign)
exp exp>next
}
printf( d\nresult)
}

判断户输入算术表达式否正确
int IsExpresiion(struct Expression *exp)
{
int parameter 1 定义判断表达式正确否参数
int i0j0 左右括号数量
if(exp>sign '0' < 4) 判断表达式字符数否正确
parameter 0
exp exp>next

while((parameter 1) && (exp NULL))
{
switch(IsOpOrNum(exp>sign))
{
case 0 果数字必须操作符左括号
exp exp>next
if(IsOpOrNum(exp>sign) 1 || exp>sign '(')
parameter 0
break
case 1 果操作符分情况

switch(exp>sign)
{

case ')' 果右括号计算符
i++
exp exp>next
if(IsOpOrNum(exp>sign) 1)
parameter 0
if(IsOpOrNum(exp>sign) 1)
if(exp>sign '(')
{
printf(11111\n)
parameter 0
}
break
case '+' 果计算符右括号数字
case ''
case '*'
exp exp>next
if(exp>sign '(')
parameter 1
else if(IsOpOrNum(exp>sign) 0)
parameter 1
else
parameter 0
break
case ''
exp exp>next
if(exp>sign '(')
parameter 1
else if(IsOpOrNum(exp>sign) 0)
{
if(exp>sign '0') 数0
{
printf(数0\n)
parameter 0
}
}
else
parameter 0

break
case '(' 左括号数字
j++
exp exp>next
if(IsOpOrNum(exp>sign) 0)
if(exp>sign '(')
parameter 0
break
case '#' 等号等号字符
if(exp>next NULL)
parameter 0
exp exp>next
break
}
break
case 1 果非计算符数字错误
parameter 0
break
}
}
if(i j)
parameter 0
return parameter
}


文档香网(httpswwwxiangdangnet)户传

《香当网》用户分享的内容,不代表《香当网》观点或立场,请自行判断内容的真实性和可靠性!
该内容是文档的文本内容,更好的格式请下载文档

下载文档,方便阅读与编辑

文档的实际排版效果,会与网站的显示效果略有不同!!

需要 2 香币 [ 分享文档获得香币 ]

该文档为用户出售和定价!

购买文档

相关文档

语法制导四元式(算术表达式)生成器

辽宁师范大学计算机与信息技术学院综合性实验报告课程名称: 编译技术 实验题目:语法制导四元式(算术表达式)生成器 学生姓名: 专业: 计算机科学与技术 学号:

文***享 8个月前 上传178   0

材料计算实验报告

通过本课程设计,了解当代计算材料学之材料设计和计算及模拟的理论基础、发展历程。初步掌握LINUX系统的基本操作、脚本编写。熟悉常用的材料计算软件的使用,并能够通过模拟计算,获得常见的简单晶体结构的几何和电子性质。

枯***2 4年前 上传1304   0

计算机实验报告

计算机实验报告  课程:大学计算机基础         班级 : *****          学号:**       姓名:***  组别:        同组者姓名:                 仪器编号:          实验日期:     实验 windows 2000 操作  +[Print Screen]   打开“画图”程序   单击“文件/新建”菜单   在

h***n 11年前 上传624   0

数值计算方法实验报告

学 生 实 验 报 告实验课程名称 数值计算方法I 开课实验室 数学实验室 学 院 理学院 年级11专业班 信息与计算科学 学 生 姓 名 学 号 开 课 时 间 2013 至 2014 学年第 1 学期评分细则评分报告表述的清晰程度和

文***享 1年前 上传442   0

20以内带括号加减混合运算专练试题作业

20以内带括号加减混合运算专练试题作业

4***1 3年前 上传2569   0

计算机图形学实验报告

计算机图形学实验报告 一、 实验题目:利用计算机编程语言绘制图形,主要实现以下内容:(1)、中点算法生成任意斜率直线,并设置线型线宽。(2)、中点算法生成圆(3)、中点算法生成椭圆(4)、扫描算法实现任意多边形填充(5)、Cohen_Sutherland裁剪(6)、自由曲线与曲面的绘制(7)、二维图形变换(8)、三视图变换二、系统

文***品 2年前 上传445   0

计算机基本组成实验报告

电 子 科 技 大 学 实验报告   学生姓名:                           学 号:   一、     实验室名称:  计算机学院硬件实验室   二、  实验项目名称:计算机基本组成实验   三、    实验原理 在计算机中,CPU是运算中心和控制中心,系统中的所有设备都是通过三条总线(DB数据总线、AB地址总线、CB控制总线)以及相应的输入/输出接

x***8 12年前 上传12529   0

计算机应用基础实验报告

目的:理解微型计算机的结构和工作原理,掌握组装一台微型计算机所需的硬件由几分钟组成,并学会配置微机硬件配置。

z***2 6年前 上传3397   0

计算机组成原理实验报告 (2)

计 算 机 组 成 原 理 实 验 报 告Computer Organization Lab Reports______________________________________________________________________________班级: ___ 姓名:__ _ 学号:_____ 实验日期:_____________学院: ___ _ 专业:_ ___

z***u 1年前 上传488   0

计算机组成原理实验报告

计算机组织与体系结构实 验 报 告评 语:成绩教 师: 年 月 日班 级: ________学 号: ____________姓 名: ______实验地点: E-Ⅱ区 311 _实验时间: 第三批 实验一 存储器实验

z***u 1年前 上传449   0

计算机图形学实验报告(例文)

计算机图形学实验报告(例文)  计算机图形学实验报告   0900213 38 8 郭佩佩  实验一  建立计图实验环境 1. 实验目的 为了体现面向对象的程序设计思想,本实验采用基于 Visual C 十十集成环境的 MFC 编程方法,从开发 windows 应用程序的角度,来建立一个菜单交互式绘图基本环境,为后续的实验打基础。  2. 实验内容 1)  建立

z***i 2年前 上传685   0

计算机网络实验报告

1.理解电子邮件的工作原理;2.掌握电子邮件的申请方法;3.掌握电子邮件的使用方法。

一***旵 3年前 上传660   0

计算机图形学实验报告

《计算机图形学》实验报告姓 名: 学 号: 班 级: 计算机班 实验地点: 实验时间: 实验一1 实验

文***品 7个月前 上传216   0

计算机网络实验报告

(1)理解远程登录的工作原理;(2)掌握远程登录的设置方法;(3)熟悉远程桌面的使用方法;(4)理解端口的含义。

一***旵 3年前 上传638   0

DSP设计科学计算器实验报告

基于DSP的科学型计算器设计一、题目要求:基于DSP F2812利用实验箱及软件编程设计一款科学型计算器使其满足如下功能:(1) 能够实现按键数值的识别,并在数码管上显示(2) 能够进行简单的加减运算(3) 能够进行小数运算二、思路设计 1、TMS320X2812实验箱资源功能简介:●采用TMS320X2812片上的GPIOA及GPIOB作为IO口接受实验箱上的按键值进行判断。同

文***享 3年前 上传557   0

计算机网络实验报告

1、观察教学机房,了解计算机网络结构,并画出计算机网络拓扑结构图。 2、了解计算机网络中的网络设备,并了解每台计算机上使用的网络标识、网络协议。 3、制作2根直通双绞线和2根交叉线,并测试。 4、分别用制作好的直通线、交叉线以及串口线、并口线,连接两台计算机。

M***9 4年前 上传1642   0

计算机组成原理实验报告 (1)

郑州航空工业管理学院计算机科学与应用系实验报告课 程 名: 计算机组成原理 学 号: 姓 名: 指导教师: 成 绩; 计算

文***品 1年前 上传420   0

初一数学 从算术到代数

专题03 从算术到代数阅读与思考算术与代数是数学中两门不同的分科,它们之间联系紧密,代数是在算术中“数”和“运算”的基础上发展起来的.用字母表示数是代数的一个重要特征,也是代数与算术的最显著的区别.在数学发展史上,从确定的数过渡到用字母表示数经历了一个漫长的过程,是数学发展史上的一个飞跃.用字母表示数有如下特点:1.任意性即字母可以表示任意的数.2.限制性即虽然字母表示任意的

小***库 4年前 上传608   0

长度与固体密度测量实验报告带数据

XX大学实验报告实验日期:2020 实验时间:8:30-12:00姓名: 学号:实验题目:长度与固体密度测量实验一、 实验目的:1.了解游标卡尺、螺旋测微器的构造,掌握它们的原理,正确读数与使用方法。2.学会直接测量、间接测量的不确定度的计算与数据处理。3.学会物理天平的使用。4.掌握测定固体密度的方法。二、 实验仪器:

z***u 1年前 上传654   0

大学微型计算机原理及应用本科实验报告

本科实验报告课程名称: 微型计算机原理及应用 实验项目: 多位十进制数相加 实验地点: 博学馆四层微机实验室 专业班级: 学 号: 学生姓名: 指导教师:

z***u 1年前 上传411   0

XX大学计算机网络实验报告

计算机网络实验报告册实验一 交换机基本配置实验学时:2学时实验类型:验证实验要求:必修一、实验目的1.掌握桌面网络组建方法2.掌握 Quidway S系列中低端交换机几种常见配置方法二、实验内容1. 通过 Console口搭建配置环境2. 通过 Telnet搭建配置环境3. 熟悉 VRP的各种视图及各视图下的常用命令三、实验原理、方法和手段1. 交换机配置方

文***品 3年前 上传604   0

计算机操作系统内存分配实验报告

计算机操作系统内存分配实验报告一、实验目的熟悉主存的分配与回收。理解在不同的存储管理方式下,如何实现主存空间的分配与回收。掌握动态分区分配方式中的数据结构和分配算法及动态分区存储管理方式及其实现过程。二、实验内容和要求主存的分配和回收的实现是与主存储器的管理方式有关的。所谓分配,就是解决多道作业或多进程如何共享主存空间的问题。所谓回收,就是当作业运行完成时将作业或进程所占的主存空间归还

文***品 3年前 上传625   0

《计算机网络基础》课内实验报告

《计算机网络基础》课内实验学 部: 经济与管理学院 专 业: 市场营销(网络营销) 班 级: 学 号: 姓 名: 指导教师:

徐***计 2年前 上传341   0

计算机输入输出系统接口实验报告

计算机输入输出系统接口实验报告姓名:学号:二 0 16 年 X月实验一 环境熟悉与 I/O 地址译码一、实验目的掌握I/O地址译码电路的工作原理。二、实验内容将接口实验包中所带的 EX-138.DSN 文件用 ISIS 7 打开。改变 A9~A3 的接线方法,从而得到 Y0;

文***享 8个月前 上传286   0

计算机上机实验内容及实验报告要求

计算机上机实验内容及实验报告要求  一、《软件技术基础》上机实验内容  1.顺序表的建立、插入、删除。  2.带头结点的单链表的建立(用尾插法)、插入、删除。  二、提交到个人10m硬盘空间的内容及截止时间  1.分别建立二个文件夹,取名为顺序表和单链表。  2.在这二个文件夹中,分别存放上述二个实验的相关文件。每个文件夹中应有三个文件(.c文件、.obj文件和.exe文

p***0 12年前 上传788   0