文档库 最新最全的文档下载
当前位置:文档库 › 算术表达式求值演示实验报告

算术表达式求值演示实验报告

算术表达式求值演示实验报告
算术表达式求值演示实验报告

实验二算术表达式求值演示

学院专业班

学号姓名

一.实习目的

1.掌握栈的基本操作;

2.掌握栈的应用;

二.实习内容

1.编写顺序栈的基本操作函数:初始化栈、入栈、出栈、得到栈顶元素,判断栈空;

2.设计一个程序,以字符串形式输入一个语法正确、不含变量的整数表达式,利用算符优

先关系,用栈模拟实现计算机中对算术四则混合运算表达式的求值。

三.实验步骤

1.顺序栈的定义:就是栈的顺序存储结构是利用一组地址连续的存储单元依次存放自栈

底到栈顶的数据元素,同时附设指针top指示栈顶元素在顺序栈中的位置。

2. 顺序栈的基本函数代码

(1)栈的初始化

void InitStack(SqStack &S)

{ S.top=0; }

(2)判断栈是否空

int StackEmpty(SqStack S)

{ // 若栈S为空栈,则返回TRUE,否则返回FALSE

if(S.top==0)

return 1;

else

return 0;

}

(3)入栈

void Push(SqStack &S,SElemType e)

{ // 插入元素e为新的栈顶元素

if(S.top>100) // 栈满,

{

printf("栈满,出错!");

}

else

S.stack[S.top++] =e; // (2 )

}

(4)出栈

int Pop(SqStack &S, SElemType &e)

{ // 若栈不空,则删除S的栈顶元素,用e返回其值,并返回OK;否则返回ERROR if(S.top==0)

return -1;

else

e=S.stack[S.top-1];

S.stack[S.top]=S.stack[S.top-1];// (3)

return 1;

}

(5)得到栈顶元素的值

int GetTop(SqStack S,SElemType &e)

{ // 若栈不空,则用e返回S的栈顶元素,并返回OK;否则返回ERROR

if(S.top>0)

{

e= S.stack[S.top-1]; // (1)

return 1;

}

else

return -1;

}

3. 用栈模拟算符优先算法--实现计算机中对算术表达式的求值

编写下列四个函数

(1)比较运算符优先级的函数precede(t1,t2)

char Precede(SElemType t1,SElemType t2)

{ // 根据教科书表3.1,判断t1,t2两符号的优先关系('#'用'\n'代替)

char f;

switch(t2)

{

case '+':

case '-':if(t1=='('||t1=='\n')

f='<'; // t1

else

f='>'; // t1>t2

break;

case '*':

case '/':if(t1=='*'||t1=='/'||t1==')')

f='>'; // t1>t2

else

f='<'; // t1

break;

case '(':if(t1==')')

{

printf("括号不匹配\n");

exit(0);

}

else

f='<'; // t1

break;

case ')':switch(t1)

{

case '(':f='='; // t1=t2

break;

case'\n':printf("缺乏左括号\n");

exit(0);

default :f='>'; // t1>t2

}

break;

case'\n':switch(t1)

{

case'\n':f='='; // t1=t2

break;

case'(' :printf("缺乏右括号\n");

exit(0);

default :f='>'; // t1>t2

}

}

return f;

}

(2) 判断是否是七种算符之一In(c)

int In(SElemType c)

{ // 判断c是否为7种运算符之一

switch(c)

{

case'+' :

case'-' :

case'*' :

case'/' :

case'(' :

case')' :

case'\n':return 1;

default :return 0;

}

}

(3) 四种运算(加、减、乘、除)Operate(a, theta, b)

SElemType Operate(SElemType a,SElemType theta,SElemType b) { // 做四则运算a theta b,返回运算结果

switch(theta)

{

case'+':return a+b;

case'-':return a-b;

case'*':return a*b;

}

return a/b;

}

(4)表达式求值函数EvaluateExpression( )

SElemType EvaluateExpression()

{ // 算术表达式求值的算符优先算法。设OPTR和OPND分别为运算符栈和运算数栈SqStack OPTR,OPND;

SElemType a,b,d,x; // 改algo3-6.cpp

char c; // 存放由键盘接收的字符,改algo3-6.cpp

char z[11]; // 存放整数字符串,改algo3-6.cpp

int i; // 改algo3-6.cpp

InitStack(OPTR); // 初始化运算符栈OPTR和运算数栈OPND

InitStack(OPND);

Push(OPTR,'\n'); // 将换行符压入运算符栈OPTR的栈底(改)

c=getchar(); // 由键盘读入1个字符到c

GetTop(OPTR,x); // 将运算符栈OPTR的栈顶元素赋给x

while(c!='\n'||x!='\n') // c和x不都是换行符

{

if(In(c)) // c是7种运算符之一

switch(Precede(x,c)) // 判断x和c的优先权

{

case'<' :Push(OPTR,c);

c=getchar();

break;// (4)

case'=' :Pop(OPTR,x);

// x='('且c=')'情况,弹出'('给x(后又扔掉)

c=getchar(); // 由键盘读入下一个字符到c(扔掉')')

break;

case'>' : Pop(OPTR,d);

Pop(OPND,b);Pop(OPND,a);

Push(OPND,Operate(a,d,b));

break; // (5)做运算a x b,并将运算结果入运算数栈}

else if(c>='0'&&c<='9') // c是操作数,此语句改algo3-6.cpp

{

i=0;

while(c>='0'&&c<='9') // 是连续数字

{

z[i++]=c;

c=getchar();

}

z[i]=0; // 字符串结束符

d=atoi(z); // 将z中保存的数值型字符串转为整型存于d

Push(OPND,d); // 将d压入运算数栈OPND

}

else // c是非法字符,以下同algo3-6.cpp

{

printf("出现非法字符\n");

exit(0);

}

GetTop(OPTR,x); // 将运算符栈OPTR的栈顶元素赋给x

}

Pop(OPND,x); // 弹出运算数栈OPND的栈顶元素(运算结果)给x(改此处) if(!StackEmpty(OPND)) // 运算数栈OPND不空(运算符栈OPTR仅剩'\n') {

printf("表达式不正确\n");

exit(0);

}

return x;

}

4 .主函数

void main()

{

printf("请输入算术表达式,负数要用(0-正数)表示\n");

printf("%d\n",EvaluateExpression());

}

(1) 程序代码

#include "stdio.h"

#include "stdlib.h"

typedef struct

{ char stack[100];

int top;

}SqStack;

typedef char SElemType;

void InitStack(SqStack &S)

{ S.top=0; }

int StackEmpty(SqStack S)

{ // 若栈S为空栈,则返回TRUE,否则返回FALSE

if(S.top==0)

return 1;

else

return 0;

}

int GetTop(SqStack S,SElemType &e)

{ // 若栈不空,则用e返回S的栈顶元素,并返回OK;否则返回ERROR

if(S.top>0)

{

e=S.stack[S.top-1]; // (1)

return 1;

}

else

return -1;

}

void Push(SqStack &S,SElemType e)

{ // 插入元素e为新的栈顶元素

if(S.top>100) // 栈满,

{

printf("栈满,出错!");

}

else

S.stack[S.top++]=e; // (2 )

}

int Pop(SqStack &S, SElemType &e)

{ // 若栈不空,则删除S的栈顶元素,用e返回其值,并返回OK;否则返回ERROR if(S.top==0)

return -1;

e=S.stack[--S.top]; // (3)

return 1;

}

char Precede(SElemType t1,SElemType t2)

{ // 根据教科书表3.1,判断t1,t2两符号的优先关系('#'用'\n'代替)

char f;

switch(t2)

{

case '+':

case '-':if(t1=='('||t1=='\n')

f='<'; // t1

else

f='>'; // t1>t2

break;

case '*':

case '/':if(t1=='*'||t1=='/'||t1==')')

f='>'; // t1>t2

else

f='<'; // t1

break;

case '(':if(t1==')')

{

printf("括号不匹配\n");

exit(0);

}

else

f='<'; // t1

break;

case ')':switch(t1)

{

case '(':f='='; // t1=t2

break;

case'\n':printf("缺乏左括号\n");

exit(0);

default :f='>'; // t1>t2

}

break;

case'\n':switch(t1)

{

case'\n':f='='; // t1=t2

break;

case'(' :printf("缺乏右括号\n");

exit(0);

default :f='>'; // t1>t2

}

}

return f;

}

int In(SElemType c)

{ // 判断c是否为7种运算符之一

switch(c)

{

case'+' :

case'-' :

case'*' :

case'/' :

case'(' :

case')' :

case'\n':return 1;

default :return 0;

}

}

SElemType Opearte(SElemType a,SElemType theta,SElemType b)

{ // 做四则运算a theta b,返回运算结果

switch(theta)

{

case'+':return a+b;

case'-':return a-b;

case'*':return a*b;

}

return a/b;

}

SElemType EvaluateExpression()

{ // 算术表达式求值的算符优先算法。设OPTR和OPND分别为运算符栈和运算数栈SqStack OPTR,OPND;

SElemType a,b,d,x; // 改algo3-6.cpp

char c; // 存放由键盘接收的字符,改algo3-6.cpp

char z[11]; // 存放整数字符串,改algo3-6.cpp

int i; // 改algo3-6.cpp

InitStack(OPTR); // 初始化运算符栈OPTR和运算数栈OPND

InitStack(OPND);

Push(OPTR,'\n'); // 将换行符压入运算符栈OPTR的栈底(改)

c=getchar(); // 由键盘读入1个字符到c

GetTop(OPTR,x); // 将运算符栈OPTR的栈顶元素赋给x

while(c!='\n'||x!='\n') // c和x不都是换行符

{

if(In(c)) // c是7种运算符之一

switch(Precede(x,c)) // 判断x和c的优先权

{

case'<' :Push(OPTR,c);

c=getchar();

break; // (4)

case'=' :Pop(OPTR,x);

// x='('且c=')'情况,弹出'('给x(后又扔掉)

c=getchar(); // 由键盘读入下一个字符到c(扔掉')')

break;

case'>' :Pop(OPTR,x);

Pop(OPND,b);

Pop(OPND,a);

printf("%d%c%d=%d\n",a,x,b,Opearte(a,x,b));

Push(OPND,Opearte(a,x,b)); // (5)做运算a x b,并将运算结果入运算数栈

}

else if(c>='0'&&c<='9') // c是操作数,此语句改algo3-6.cpp

{

i=0;

while(c>='0'&&c<='9') // 是连续数字

{

z[i++]=c;

c=getchar();

}

z[i]=0; // 字符串结束符

d=atoi(z); // 将z中保存的数值型字符串转为整型存于d

Push(OPND,d); // 将d压入运算数栈OPND

}

else // c是非法字符,以下同algo3-6.cpp

{

printf("出现非法字符\n");

exit(0);

}

GetTop(OPTR,x); // 将运算符栈OPTR的栈顶元素赋给x

}

Pop(OPND,x); // 弹出运算数栈OPND的栈顶元素(运算结果)给x(改此处)

if(!StackEmpty(OPND)) // 运算数栈OPND不空(运算符栈OPTR仅剩'\n')

{

printf("表达式不正确\n");

exit(0);

}

return x;

}

void main()

{

printf("请输入算术表达式,负数要用(0-正数)表示\n");

printf("%d\n",EvaluateExpression());

}

(2)调试程序

(3) 运行程序(截图)

四.实习小结

自己写

提示:precede(t1,t2) 如何编程?

char Precede(SElemType t1,SElemType t2)

{ // 根据教科书表3.1,判断t1,t2两符号的优先关系('#'用'\n'代替)

char f;

switch(t2)

{

case '+':

case '-': if(t1=='('||t1=='\n')

f='<'; // t1

else

f='>'; // t1>t2

break;

case '*':

case '/':if(t1=='*'||t1=='/'||t1==')')

f='>'; // t1>t2

else

f='<'; // t1

break;

case ‘(‘:

case ‘)‘:

case ‘\n‘:

}

数据结构表达式求值实验报告

竭诚为您提供优质文档/双击可除数据结构表达式求值实验报告 篇一:数据结构实验二——算术表达式求值实验报告 《数据结构与数据库》 实验报告 实验题目算术表达式求值 学院:化学与材料科学学院 专业班级:09级材料科学与工程系pb0920603 姓学 邮名:李维谷号:pb09206285箱: liwg@https://www.wendangku.net/doc/718946660.html,指导教师:贾伯琪 实验时间:20XX年10月10日 一、需要分析 问题描述: 表达式计算是实现程序设计语言的基本问题之一,它的实现是栈的应用的一个典型例子。设计一个程序,演示通过将数学表达式字符串转化为后缀表达式,并通过后缀表达式结合栈的应用实现对算术表达式进行四则混合运算。

问题分析: 在计算机中,算术表达式由常量、变量、运算符和括号组成。由于不同的运算符具有不同的优先级,又要考虑括号,因此,算术表达式的求值不可能严格地从左到右进行。因而在程序设计时,借助栈实现。 设置运算符栈(字符型)和运算数栈(浮点型)辅助分析算符优先关系。在读入表达式的字符序列的同时完成运算符和运算数的识别处理,然后进行运算数的数值转换在进行四则运算。 在运算之后输出正确运算结果,输入表达式后演示在求值中运算数栈内的栈顶数据变化过程,最后得到运算结果。 算法规定: 输入形式:一个(:数据结构表达式求值实验报告)算术表达式,由常量、变量、运算符和括号组成(以字符串形式输入)。为使实验更完善,允许操作数为实数,操作符为(、)、.(表示小数点)、+、-、*、/、^(表示乘方),用#表示结束。 输出形式:演示表达式运算的中间结果和整个表达式的最终结果,以浮点型输出。 程序功能:对实数内的加减乘除乘方运算能正确的运算出结果,并能正确对错误输入和无定义的运算报错,能连续测试多组数据。 测试数据:正确输入:12*(3.6/3+4^2-1)#

数据结构实验二——算术表达式求值实验报告

《数据结构与数据库》 实验报告 实验题目 算术表达式求值 学院:化学与材料科学学院 专业班级:09级材料科学与工程系PB0920603 姓名:李维谷 学号:PB09206285 邮箱:liwg@https://www.wendangku.net/doc/718946660.html, 指导教师:贾伯琪 实验时间:2010年10月10日 一、需要分析 问题描述:

表达式计算是实现程序设计语言的基本问题之一,它的实现是栈的应用的一个典型例子。设计一个程序,演示通过将数学表达式字符串转化为后缀表达式,并通过后缀表达式结合栈的应用实现对算术表达式进行四则混合运算。 问题分析: 在计算机中,算术表达式由常量、变量、运算符和括号组成。由于不同的运算符具有不同的优先级,又要考虑括号,因此,算术表达式的求值不可能严格地从左到右进行。因而在程序设计时,借助栈实现。 设置运算符栈(字符型)和运算数栈(浮点型)辅助分析算符优先关系。在读入表达式的字符序列的同时完成运算符和运算数的识别处理,然后进行运算数的数值转换在进行四则运算。 在运算之后输出正确运算结果,输入表达式后演示在求值中运算数栈内的栈顶数据变化过程,最后得到运算结果。 算法规定: 输入形式:一个算术表达式,由常量、变量、运算符和括号组成(以字符串形式输入)。为使实验更完善,允许操作数为实数,操作符为(、)、.(表示小数点)、+、-、*、/、^(表示乘方),用#表示结束。 输出形式:演示表达式运算的中间结果和整个表达式的最终结果,以浮点型输出。 程序功能:对实数内的加减乘除乘方运算能正确的运算出结果,并能正确对错误输入和无定义的运算报错,能连续测试多组数据。 测试数据:正确输入:12*(3.6/3+4^2-1)# 输出结果:194.4

计算机组成原理运算器实验—算术逻辑运算实验

实验报告 、实验名称 运算器实验—算术逻辑运算实验 、实验目的 1、了解运算器的组成原理。 2、掌握运算器的工作原理。 3、掌握简单运算器的数据传送通路。 4、验证运算功能发生器( 74LS181)的组合功能 三、实验设备 TDN-CM++ 计算机组成原理教学实验系统一套,导线若干四、实验原理 实验中所用的运算器数据通路如图1-1 所示。其中两片74LSl81以串行方式构成8 位字长的ALU,ALU 的输出经过一个三态门(74LS245)和数据总线相连。三态门由ALU-R 控制,控制运算器运算的结果能否送往总线,低电平有效。为实现双操作数的运算,ALU 的两个数据输入端分别由二个锁存器DR1、DR2 (由74LS273实现)锁存数据。要将数据总线上的数据锁存到DRl、DR2 中,锁存器的控制端LDDR1 和DDR2必须为高电平,同时由T4 脉冲到来。 数据开关“( INPUT DEVICE")用来给出参与运算的数据,经过三态 (74LS245) 后送入数据总线,三态门由SW—B控制,低电平有效。数据显示灯“( BUS UNIT") 已和数据总线相连,用来显示数据总线上的内容。 图中已将用户需要连接的控制信号用圆圈标明(其他实验相同,不再说明),其中除T4 为脉冲信号外,其它均为电平信号。由于实验电路中的时序信号均已连至“W/R UNIT ”的相应时序信号引出端,因此,在进行实验时,只需将“W /R UNIT"的T4接至“ STATE UNIT ”的微动开关KK2 的输入端,按动微动开关,即可获得实验所需的单脉冲。 ALU 运算所需的电平控制信号S3、S2、S1、S0 、Cn、M、LDDRl、 LDDR2 、ALU-B 、SW-B均由“ SWITCH UNIT ”中的二进制数据开关来模拟,其中Cn、ALU —B、SW 一 B 为低电平有效LDDR1 、LDDR2 为高电平有效。 对单总线数据通路,需要分时共享总线,每一时刻只能由一组数据送往总线。

数据结构算术表达式求值实验报告

软件技术基础实验报告 实验名称:表达式计算器 系别:通信工程 年级: 班级: 学生学号: 学生姓名: 《数据结构》课程设计报告 题目简易计算表达式的演示 【题目要求】 要求:实现基本表达式计算的功能 输入:数学表达式,表达式由整数和“+”、“-”、“×”、“/”、“(”、“)”组成输出:表达式的值 基本操作:键入表达式,开始计算,计算过程和结果记录在文档中 难点:括号的处理、乘除的优先级高于加减

1.前言 在计算机中,算术表达式由常量、变量、运算符和括号组成。由于不同的运算符具有不同的优先级,又要考虑括号,因此,算术表达式的求值不可能严格地从左到右进行。因而在程序设计时,借助栈实现。 算法输入:一个算术表达式,由常量、变量、运算符和括号组成(以字符串形式输入)。为简化,规定操作数只能为正整数,操作符为+、-*、/、=,用#表示结束。 算法输出:表达式运算结果。 算法要点:设置运算符栈和运算数栈辅助分析算符优先关系。在读入表达式的字符序列的同时,完成运算符和运算数的识别处理,以及相应运算。 2.概要设计 2.1 数据结构设计 任何一个表达式都是由操作符,运算符和界限符组成的。我们分别用顺序栈来寄存表达式的操作数和运算符。栈是限定于紧仅在表尾进行插入或删除操作的线性表。顺序栈的存储结构是利用一组连续的存储单元依次存放自栈底到栈顶的数据元素,同时附设指针top 指示栈顶元素在顺序栈中的位置,base 为栈底指针,在顺序栈中,它始终指向栈底,即top=base 可作为栈空的标记,每当插入新的栈顶元素时,指针top 增1,删除栈顶元素时,指针top 减1。 2.2 算法设计 为了实现算符优先算法。可以使用两个工作栈。一个称为OPTR ,用以寄存运算符,另一个称做OPND ,用以寄存操作数或运算结果。 1.首先置操作数栈为空栈,表达式起始符”#”为运算符栈的栈底元素; 2.依次读入表达式,若是操作符即进OPND 栈,若是运算符则和OPTR 栈的栈顶运算符比较优先权后作相应的操作,直至整个表达式求值完毕(即OPTR 栈的栈顶元素和当前读入的字符均为”#”)。 2.3 ADT 描述 ADT Stack{ 数据对象:D={ i a |i a ∈ElemSet,i=1,2,…,n, n ≧0} 数据对象:R1={< 1 ,-i i a a >| 1-i a ,D a i ∈,i=2,…,n}

嵌入式--计算器--实验报告

计算器设计实验报告 一、实验设计主要分工 04009320 文斌:算法设计,LCD显示。 04** 张希:界面(按钮控件)设计,文件内容读取。 共同调试、完善设计。 二、程序设计实现功能效果 (1)支持整数、小数基本加减乘除运算; (2)有优先级的判别计算。优先级由高到低一次为括号运算、乘除运算、加减运算。(3)支持键盘输入和触摸屏输入; (4)能读取指定目录下文本内容(内容为计算表达式)并计算得出结果,将内容和结果显示在LCD上。 程序任务开始后,等待键盘或触摸屏的输入。输入键有0~9数字键、+-*/()运算符、del退格键、clear清屏键、read读指定目录文本内容并计算键、enter'='键、‘.’小数点键。 每当有字符输入时,触摸屏相应键显示“AAA”,100ms后恢复原相应按键符号,同时LCD 屏幕上显示相应字符。当输入'del'键时,屏幕显示去掉最后一位字符。当输入'='号后,得出计算结果,结果显示于表达式的下一行。若是除零错误,则结果显示为“/0ERROR!”。若有非法字符(触摸点不能识别为设计按键符则视为非法字符),则结果输出为“Syntax Error!!”。若表达式有运算符连续输入,则忽略前面的运算符,只取最后一位运算符计算,正常显示数字结果。当输入'clear'键时,情况显示区域。当输入'read'键时,从指定目录文本文件中读取表达式并计算。将表达式内容和计算结果显示在LCD上。 三、程序算法实现 1、计算算法 首先将输入的0~9数字、+-*/()运算符的内容存储于一个全局变量cal[number]中, 表达为中缀表达式。用void str2repol()函数,将输入字符串cal[number]转换成逆波 兰表达式并存于全局数组char repol[maxs]中。str2repol()函数中缀表达式转成逆波兰 后缀表达式算法如下: (1)首先构造一个运算符栈stack[maxs],此运算符在栈内遵循越往栈顶优先级越高的 原则。

算术表达式求值演示程序

数理学院 课程设计报告书 课程名称数据结构课程设计 设计题目算术表达式求值演示 专业班级 学号 姓名 指导教师

2014 年12 月

4.2.2 基本操作: 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 主程序的流程:

EvaluateExpression() 函数实现了对表达式求值的功能,main() 函数直接调用EvaluateExpression() 对输入的表达式求值输出。 4.2.3 函数的调用关系图

4.3 详细设计 4.3.1 ① . Precede(char c1,char c2)判断运算符优先权,返回优先权高的 算符间的优先关系 如下: 算法伪代码如下: char Precede(char c1,char c2) { static char array[49]={ >', '>', '<', '<', '<', '>', '>', >', '>', '<', '<', '<', '>', '>', >', '>', '>', '>', '<', '>', '>', >', '>', '>', '>', '<', '>', '>', <', '<', '<', '<', '<', '=', '!', >', '>', '>', '>', '!', '>', '>', <', '<', '<', '<', '<', '!', '='}; // 用一维数组存储 49 种情况 switch(c1) { /* i 为下面 array 的横标 */ case '+' : i=0;break; case '-' : i=1;break; case '*' : i=2;break;

四则运算表达式求值实验报告

HUNAN UNIVERSITY 课程实习报告 题目:四则运算表达式求值 学生姓名: 学生学号: 专业班级: 指导老师: 完成日期:

一、需求分析 四则运算表达式求值,将四则运算表达式用中缀表达式表示,然后转换为后缀表达式,并计算结果。 本程序要求利用二叉树后序遍历来实现表达式的转换,同时可以使用实验2的结果来求解后缀表达式的值。 在字符界面上输入一个中缀表达式,回车表示结束。如果该中缀表达式正确,那么在字符界面上输出其后缀表达式,其中后缀表达式中两相邻操作数之间利用空格隔开;如果不正确,在字符界面上输出表达式错误提示。 测试数据 输入: 21+23*(12-6) 输出: 21 23 12 6 -*+ 二、详细设计 输入和输出的格式 输入 本程序可以将输入的四则运算表达式(中缀表达式)转换为后缀表达式 输出 后缀表达式为://输出结果的位置 表达式的值为://输出结果的位置 三、调试分析 本次实验的难点主要是在建立二叉树的问题上。关于如何把中缀表达式存入二叉树中,我参考了网上的一些方法,成功实现了目标,但是却遇到了一个问题,那就是不能处理小数,甚至两位或两位以上的整数。因为如果采用字符数组来存储操作数,运算符合一位整数还可以处理,但对于两位数就就会出问题,最后我改进采用字符串数组来存储操作数,成功解决了问题。 另外在处理输入的非法表达式问题中,我也费了很大功夫,但总体问题不大。 四、测试结果 五、用户使用说明(可选) 1、运行程序时 提示输入四则运算表达式 本程序可以将中缀表达式转化为后缀表达式,并计算结果 请输入四则运算表达式: 输出 后缀表达式为: 表达式的值为: 程序源代码(c++) #include #include #include #include

计算机组成原理实验报告材料

福建农林大学计算机与信息学院信息工程类实验报告系:计算机科学与技术专业:计算机科学与技术年级: 09级 姓名:张文绮学号: 091150022 实验课程:计算机组成原理 实验室号:___田405 实验设备号: 43 实验时间:2010.12.19 指导教师签字:成绩: 实验一算术逻辑运算实验 1.实验目的和要求 1. 熟悉简单运算器的数据传送通路; 2. 验证4位运算功能发生器功能(74LS181)的组合功能。 2.实验原理 实验中所用到的运算器数据通路如图1-1所示。其中运算器由两片74181

以并/串形式构成8位字长的ALU。运算器的输出经过一个三态门(74245)和数据总线相连,运算器的两个数据输入端分别由两个锁存器(74373)锁存,锁存器的输入连接至数据总线,数据开关INPUT DEVICE用来给出参与运算的数据,并经过一个三态门(74245)和数据总线相连,数据显示灯“BUS UNIT”已和数据总线相连,用来显示数据总线内容。 图1-2中已将用户需要连接的控制信号用圆圈标明(其他实验相同,不再说明),其中除T4为脉冲信号,其它均为电平信号。由于实验电路中的时序信号均已连至W/R UNIT的相应时序信号引出端,因此,在进行实验时,只需将W/R UNIT 的T4接至STATE UNIT的微动开关KK2的输出端,按动微动开关,即可获得实验所需的单脉冲,而S3,S2,S1,S0,Cn,LDDR1,LDDR2,ALU-B,SW-B各电平控制信号用SWITCH UNIT中的二进制数据开关来模拟,其中Cn,ALU-B,SW-B为低电平控制有效,LDDR1,LDDR2为高电平有效。 3.主要仪器设备(实验用的软硬件环境) ZYE1603B计算机组成原理教学实验系统一台,排线若干。 4.操作方法与实验步骤

算术表达式语法检查实验报告

中南民族大学计算机科学学院本科课程设计 任务书 设计名称:算术表达式语法检查 指导教师:下达时间: 2015-5-8 学生姓名:学号: 专业: 一、课程设计的基本要求 根据所学知识,编写指定题目的C++语言程序,并规范地完成课程设计报告。通过课程设计,加深对《C++面向对象程序设计》课程所学知识的理解,熟练掌握和巩固C++语言的基本知识和语法规范,掌握C++语言的基础知识,理解面向对象系统的封装性、继承性和多态性;熟练使用C语言中的函数、数组、指针、链表和字符串等基本知识;掌握类的定义、标准String类和向量;理解掌握友元函数和重载操作符,动态数组;理解掌握继承和多态性;掌握模版的使用;能够进行程序调试过程中的异常处理;进一步掌握利用C++进行类的定义和操作方法;进一步掌握类的继承和派生方法;进一步理解虚函数和多态;综合利用上述知识,学习设计并编写面向对象的C++简单应用程序;培养解决复杂任务功能分解方法(自顶向下逐步求精、模块化设计、信息隐藏等)。 学会编制结构清晰、风格良好、数据结构适当的C++语言程序,从而具备利用计算机编程分析解决综合性实际问题的初步能力。 具体要求如下: 1、采取模块化方式进行程序设计,要求程序的功能设计、数据结构设计及整体结构设计合理。学生也可根据自己对题目的理解增加新的功能模块(视情况可另外加分)。 2、系统以菜单界面方式(至少采用文本菜单界面,如能采用图形菜单界面更好)工作,运行界面友好,演示程序以用户和计算机的对话方式进行。 3、程序算法说明清晰,理论分析与计算正确,运行情况良好,实验测试数据无误,容错性强(能对错误输入进行判断控制)。 4、编程风格良好(包括缩进、空行、适当注释、变量名和函数名见名知意,程序容易阅读等); 5、写出规范的课程设计报告,具体要求见相关说明文档。

《数据结构课程设计》表达式求值实验报告

实验课程名称 专业班级 学生姓名 学号 指导教师 20 至 20 学年第学期第至周

算术表达式求值演示 一、概述 数据结构课程设计,要求学生在数据结构的逻辑特性和物理表示、数据结构的选择和应用、算法的设计及其实现等方面,加深对课程基本容的理解。同时,在程序设计方法以及上机操作等基本技能和科学作风方面受到比较系统和严格的训练。 在这次的课程设计中我选择的题目是算术表达式求值演示。表达式计算是实现程序设计语言的基本问题之一,也是栈的应用的一个典型例子。设计一个程序,演示用算符优先法对算术表达式求值的过程。深入了解栈和队列的特性,以便在解决实际问题中灵活运用它们,同时加深对这种结构的理解和认识。 二、系统分析 1.以字符列的形式从终端输入语确的、不含变量的整数表达式。利用已知的算符优先关系,实现对算术四则混合运算表达式的求值,并仿照教科书的例子在求值中运算符栈、运算数栈、输入字符和主要操作的变化过程。 2.一般来说,计算机解决一个具体问题时,需要经过几个步骤:首先要从具体问题抽象出一个适当的数学模型,然后设计一个解决此数学模型的算法,最后编出程序,进行测试,调试直至得到想要的答案。对于算术表达式这个程序,主要利用栈,把运算的先后步骤进行分析并实现简单的运算!为实现算符优先算法,可以使用两个栈,一个用以寄存运算符,另一个用以寄存操作数和运算结果。 3.演示程序是以用户于计算机的对话方式执行,这需要一个模块来完成使用者与计算机语言的转化。 4.程序执行时的命令: 本程序为了使用具体,采用菜单式的方式来完成程序的演示,几乎不用输入什么特殊

的命令,只需按提示输入表达式即可。(要注意输入时格式,否者可能会引起一些错误)5. 测试数据。 三、概要设计 一个算术表达式中除了括号、界限符外,还包括运算数据和运算符。由于运算符有优先级别之差,所以一个表达式的运算不可能总是从左至右的循序执行。每次操作的数据或运算符都是最近输入的,这与栈的特性相吻合,故本课程设计借助栈来实现按运算符的优先级完成表达式的求值计算。 算法设计 程序包含三个模块 (1) 主程序模块,其中主函数为 void main{ 输入表达式; 根据要求进行转换并求值; 输出结果; } (2) 表达式求值模块——实现具体求值。 (3) 表达式转换模块——实现转换。 各个函数之间的调用关系

计算机组成原理实验报告一 算术逻辑运算器

算术逻辑运算器 一.实验目的与要求 试验目的:1、掌握算术运算器单元ALU(74LS181)的工作原理。 2、掌握简单运算器的数据传送通道。 3、验算由74LS181等组合逻辑电路组成的运算功能发生器运算功能。 4、能够按给定数据,完成实验指定的算术/逻辑运算。 试验要求:按练习的要求输入数据和完成相应的操作,将实验结果填入表格二.实验方案 1、按实验连线图接好线,仔细检查正确与否,无误后才接通电源。 2、用二进制数据开关分别向DR1寄存器和DR2寄存器置数。 3、通过总线输出DR1寄存器和DR2寄存器的内容。 4、比较实验结果和理论值是否一致,如果不一致,就分析原因,然后重做。 三.实验结果 练习一表1.1.2 练习二表1.1.3

1.实验结果分析 ●实验结果和理论值一致,讲明实验操作过程正确,实验结果准确无误。 2.结论 ●要有理论基础才可以做好实验的每一步,所以,平时一定要学好理论知识。 3.问题与讨论 我们这个小组,在做第二个实验时就遇到了很多问题,就是我们我无论输入什么显示灯都不变,然后我们就互相讨论,但是还是没办法解决,后来问了老师才知道我们插错线。 4.实验总结 (1)以前没有做过这种实验,所以实验前我做了充分的预习。但预习毕竟不是实际操

作,经常会在想实际情况会是什么样,在实际操作过程中我遇到了不少的困难,例如我做第二个实验时就插错线,幸好在老师的帮助下还加上自己的思考,终于把问题解决掉了。我觉得,实验前老师应该做些示范给我们看,这样我们会学得更快。 (2)在做表1.1.4的实验时,不知道怎样查出S3、S2、S1、S0、M、Cn的值,问周围的同学,他们也不知道。因为这个很重要,直接影响到后面的实验,所以请教了老师。 经过老师的解释后,我顺利地完成了后面的实验。 5.思考题 1)写出本实验中的各控制端的作用。 答:S0 S1 S2 S3(它们共同决定运算器执行哪一种运算)M(决定是算术运算还是逻辑运算). CN(表示有无进位) SW-B(输入三态门控制“INPUT DEVICE”中的八位数据开关D7-D0的数据是否送到数据总线BUS上) ALU-B(输出三态门,控制运算器的运算结果是否送到数据总线BUS)LDDR1 LDDR2 (寄存器,寄存数据) 2)在实验中哪些控制端高电平有效,哪些低电平有效? 答:高电平有效(LDDR1 LDDR2)低电平有效(CN ALU-B SW-B) 3)在实验正常的输入和输出操作中,SW-B和ALU-B为什么不能同时为0的状态? 答:ALU-B SW-B都是低电平有效,如果同时为低电平,这将导致数据一边输入一边输出。 4)DR1置数完成后,为什么要关闭控制端LDDR1? 答:不关闭的话将导致第二次输入的数据存入DR1中,覆盖之前的数据 DR2置数完成后,为什么要关闭控制端LDDR2? 答:不关闭的话,下此操作后的数据将会存入DR2中,覆盖之前的数据 5)在练习三的表1.1.4中,要求每一次的运算结果都要存入DR2寄存器,解释该存入操作 中为什么不用SW-B置“0”和ALU-B置“1” 答:因为这时候的数据已经是存在控制器中,不必要再输入,所以不必那样做。 6)“A+B”和”A加B”这两种运算有什么不同,查找表1.1.1,分别写出这两种运算中S3、 S2、S1、S0、M、CN各控制端的状态。 答:A+B表示逻辑加11101* A加B表示算术加100101 7)CN是进位控制端,在逻辑运算和算术运算中,它与哪种运算有关? 答:算术运算 8)做减法操作DR1减DR2时,与进位CN是否有关?如有关CN是0还是1? 答:有关,因为这是算术减。与0有关 进位控制运算器 1.实验目的与要求 试验目的: 1)、验证带进位控制的算术运算发生器的功能。 2)、按给定的数据完成几种指定的算术运算。 二、实验要求: 按练习一和练习二的要求输入数据和完成相应的操作,将实验结果填入表1.2.2和1.2.3. 三. 实验方案

表达式求值实验报告

淮海工学院计算机工程学院 课程设计报告 设计名称:数据结构课程设计 选题名称:表达式求值 姓名:学号: 专业班级: 系(院):计算机工程学院 设计时间: 设计地点:软件工程实验室、教室 指导教师评语: 成绩: 签名: 年月日

1.课程设计目的 1、训练学生灵活使用所学数据结构知识,独立完成问题分析,结合数据结构理论知识,编写程序求解指定问题。 2.初步掌握软件开发过程的问题分析、系统设计、程序编码、测试等基本方法和技能; 3.提高综合运用所学的理论知识和方法独立分析和解决问题的能力; 4.训练用系统的观点和软件开发一般规范进行软件开发,巩固、深化学生的理论知识,提高编程水平,并在此过程中培养他们严谨的科学态度和良好的工作作风。 2.课程设计任务和要求: 任务 根据教材《数据结构-C语言描述》(耿国华主编)和参考书《数据结构题集(C语言版)》(严蔚敏、吴伟民主编)选择课程设计题目,要求通过设计,在数据结构的逻辑特性和物理表示、数据结构的选择使用、算法的设计及其实现等方面加深对课程基本内容的理解和综合运用。 设计题目从任务书所列选题表中选取,每班每题不得超过2人。 学生自选课题 学生原则上可以结合个人爱好自选课题,要求课题有一定的深度和难度,有一定的算法复杂性,能够巩固数据结构课程所学的知识。学生自选课题需在18周前报课程设计指导教师批准方可生效。 要求: 1、在处理每个题目时,要求从分析题目的需求入手,按设计抽象数据类型、构思算法、通过设计实现抽象数据类型、编制上机程序和上机调试等若干步骤完成题目,最终写出完整的分析报告。前期准备工作完备和否直接影响到后序上机调试工作的效率。在程序设计阶段应尽量利用已有的标准函数,加大代码的重用率。 2、.设计的题目要求达到一定工作量(300行以上代码),并具有一定的深度和难度。 3、程序设计语言推荐使用C/C++,程序书写规范,源程序需加必要的注释; 4、每位同学需提交可独立运行的程序; 5 、每位同学需独立提交设计报告书(每人一份),要求编排格式统一、规范、内容充实,不少于10页(代码不算); 6、课程设计实践作为培养学生动手能力的一种手段,单独考核。 3.课程设计说明书

计算机组成原理实验报告(运算器组成、存储器)

计算机组成原理实验报告 一、实验1 Quartus Ⅱ的使用 一.实验目的 掌握Quartus Ⅱ的基本使用方法。 了解74138(3:8)译码器、74244、74273的功能。 利用Quartus Ⅱ验证74138(3:8)译码器、74244、74273的功能。 二.实验任务 熟悉Quartus Ⅱ中的管理项目、输入原理图以及仿真的设计方法与流程。 新建项目,利用原理编辑方式输入74138、74244、74273的功能特性,依照其功能表分别进行仿真,验证这三种期间的功能。 三.74138、74244、74273的原理图与仿真图 1.74138的原理图与仿真图 74244的原理图与仿真图

1. 4.74273的原理图与仿真图、

实验2 运算器组成实验 一、实验目的 1.掌握算术逻辑运算单元(ALU)的工作原理。 2.熟悉简单运算器的数据传送通路。 3.验证4位运算器(74181)的组合功能。 4.按给定数据,完成几种指定的算术和逻辑运算。 二、实验电路 附录中的图示出了本实验所用的运算器数据通路图。8位字长的ALU由2片74181构成。2片74273构成两个操作数寄存器DR1和DR2,用来保存参与运算的数据。DR1接ALU的A数据输入端口,DR2接ALU的B数据输入端口,ALU的数据输出通过三态门74244发送到数据总线BUS7-BUS0上。参与运算的数据可通过一个三态门74244输入到数据总线上,并可送到DR1或DR2暂存。 图中尾巴上带粗短线标记的信号都是控制信号。除了T4是脉冲信号外,其他均为电位信号。nC0,nALU-BUS,nSW-BUS均为低电平有效。 三、实验任务 按所示实验电路,输入原理图,建立.bdf文件。 四.实验原理图及仿真图 给DR1存入01010101,给DR2存入10101010,然后利用ALU的直通功能,检查DR1、

C语言程序设计实验报告实验数据类型运算符和表达式

凯里学院C 语言程序设计实验报告 ×××××专业××年级××班,学号××××××姓名××成绩 合作者实验日期年月日 指导教师评阅日期年月日 实验二数据类型、运算符和表达式 一、实验目的: (1)掌握C 语言数据类型,熟悉如何定义一个整型、字符型、实型变量、以及对它们赋值的方法,了解以上类型数据输出时所用的格式转换符。 (2)学会使用C 的有关算术运算符,以及包含这些运算符的表达式,特别是自加(++)和自减(――)运算符的使用。 (3)掌握C 语言的输入和输出函数的使用 (4)进一步熟悉C 程序的编辑、编译、连接和运行的过程,学会使用stepbystep 功能。 (5)认真阅读教材数据类型,算术运算符和表达式,赋值运算符和表达式部分内容。 二、实验内容: (1)输人并运行下面的程序 #include voidmain() { charc1,c2; c1='a'; c2='b'; 装 订 线 装 订 线

printf("%c%c\n",c1,c2); } (2)按习题3.7的要求编程序并上机运行 该题的要求是: 要将“China”译成密码,密码规律是:用原来字母后面的第4个字母代替原来的字母。 例如,字母“A”后面第4个字母是“E”,用“E”代替“A”。因此,“China”应译为“Glmre"。 请编一程序,用赋初值的方法使。cl,c2,c3,c4,c5五个变量的值分别为‘C’、‘h’、‘i’、‘n’、‘a’,经过运算,使cl,c2,c3,c4,c5分别变为‘G’、‘l’、‘m’、‘r’、‘e’,并输出。 三、实验步骤: (1)输人并运行下面的程序 #include voidmain() { charc1,c2; c1='a'; c2='b'; printf("%c%c\n",c1,c2); } ①运行此程序。 程序结果为:

算术表达式求值课程设计报告

课程设计 教学院 课程名称 题目 专业 班级 姓名 同组人员 指导教师 2013 年 6 月22 日 (完成时间)

目录 一.概述 (2) 二.总体方案设计 (4) 三.详细设计 (6) 四.程序的调试与运行结果说明 (14) 五.课程设计总结 (14) 六.附录 (16) 参考文献 (3233) (“目录”要求必须自动生成)

一概述(宋体,三号,加粗,居中) 1.课程设计的目的(小标题,宋体,四号,加粗,左对齐顶格) (1).理解和掌握该课程中的有关基本概念,程序设计思想和方法。 (2).培养综合运用所学知识独立完成课题的能力。 (3).培养勇于探索、严谨推理、实事求是、有错必改,用实践来检验理论,全方位考虑问题等科学技术人员应具有的素质。 (4).掌握从资料文献、科学实验中获得知识的能力,提高学生从别人经验中找到解决问题的新途径的悟性,初步培养工程意识和创新能力。 2.课程设计的要求 算术表达式求值程序实现以下功能: (1)构造一个空栈S,初始条件:栈S已存在 (2)用P返回S的栈顶元素 (3)插入元素ch为新的栈顶元素 (4)删除S的栈顶元素 (5)判断字符是否是运算符,运算符即返回1 (6)判断运算符优先权,返回优先权高的 (7)输入表达式 (8)返回表达式的最终结果。

二总体方案设计 a)需求分析 该程序能实现算术四则运算表达式的求值,显示运算过程。 输入的形式:表达式,例如5*(3+7)#。 包含的运算符只能有'+'、 '-'、'*'、 '/'、 ' (' ') '; 程序所能达到的功能:对表达式求值并输出。 b)总体设计 本程序使用的是编程工具是Visual c++ 6.0,实现了运算器的功能和仿真界面(大体界面如下图所示)。在基本要求的基础上,运算数可以是实数类型,同时增加了乘方运算的功能;可以实现对负数的运算,例如用户输入表达式6* (-0.25),则程序会在负号的前面自动加上一个0。 1)算符包括加(+)、减(-)、乘(*)、除(/)、乘方(^);另一个称作 OPND,用以寄存操作数和运算结果,操作数可以是float型的浮点数。 算法的基本思想是: 2)首先置操作数栈为空栈,表达式起始符“#”为运算符栈的栈底元素; 依次读入表达式中的每个字符,若是操作数(浮点数)则进OPND栈, 若是运算符(+、—、*、/、^)则和OPTR栈的栈顶运算符比较优先权 后作相应操作,直至整个表达式求值完毕(即OPTR栈的栈顶元素和当 前读入的字符均为“#”)。 3)编写一个原型为void strtofloat(char str[ ],int n,int i),把一 个数字串转换为一个实型数,并压入运算数栈中。(整个程序的源代码 见附录,并有具体解释)

算术表达式求值-数据结构实验报告

清华大学数据结构课程实验报告(20 -20 学年第学期) 报告题目:算术表达式求值 任课老师: 专业: 学号: 姓名: 二0一年月日

摘要:现代科学技术高速发展,各种高科技产品频频问世,而各种技术的基础都离不开基本的表达式求值,它虽然简单,但却是任何复杂系统的基本执行操作。栈是一种重要的线性结构,从数据结构的角度看,它是一种特殊的线性表,具有先入先出的特点。而算符优先法的设计恰巧符合先入先出的思想。故我们基于栈这种数据结构,利用算符优先法,来实现简单算术表达式的求值。 关键字:算符优先法;算术表达式;数据结构;栈 一、课题概述 1、问题描述 一个算术表达式是由运算数、运算符、界限符组成。假设操作数是正整数,运算符只含有加“+”、减“-”、乘“*”、除“/”四种二元运算符,界限符有左括号“(”、右括号“)”和表达式起始、结束符“#”。利用算符优先法对算术表达式求值。 2、设计目的 (1)通过该算法的设计思想,熟悉栈的特点和应用方法; (2)通过对算符优先法对算术表达式求值的算法执行过程的演示,理解在执行相应栈的操作时的变化过程。 (3)通过程序设计,进一步熟悉栈的基本运算函数; (4)通过自己动手实现算法,加强从伪码算法到C语言程序的实现能力。3、基本要求: (1)使用栈的顺序存储表示方式; (2)使用算符优先法; (3)用C语言实现; (4)从键盘输入一个符合要求的算术表达式,输出正确的结果。 4、编程实现平台 Microsoft Visual C++ 6.0 二、设计思路及采取方案 1、设计思路: 为了实现算符优先法,可以使用两个工作栈。一个称做OPTR,用以寄存运

《计算机组成原理》实验报告---8位算术逻辑运算实验

. '. 计算机专业类课程 实验报告 课程名称:计算机组成原理 学 院:信息与软件工程学院 专 业:软件工程 学生姓名: 学 号: 指导教师: 日 期: 2012 年 12 月 15 日

电子科技大学 实验报告 一、实验名称:8位算术逻辑运算实验 二、实验学时:2 三、实验内容、目的和实验原理: 实验目的: 1.掌握算术逻辑运算器单元ALU(74LS181)的工作原理。 2.掌握模型机运算器的数据传送通路组成原理。 3.验证74LS181的组合功能。 4.按给定数据,完成实验指导书中的算术/逻辑运算。 实验内容: 使用模型机运算器,置入两个数据DR1=35,DR2=48,改变运算器的功能设定,观察运算器的输出,记录到实验表格中,将实验结果对比分析,得出结论。 实验原理: 1.运算器由两片74LS181以并/串形式构成8位字长的ALU。

. '. 2.运算器的输出经过一个三态门(74LS245)和数据总线相连。 3.运算器的两个数据输入端分别由两个锁存器(74LS273)锁存。 4.锁存器的输入连至数据总线,数据开关(INPUT DEVICE)用来给 出参与运算的数据,并经过一三态门(74LS245)和数据总线相连。 5.数据显示灯(BUS UNIT)已和数据总线相连,用来显示数据总线内 容。 实验器材(设备、元器件):模型机运算器 四、实验步骤: 1. 仔细查看试验箱,按以下步骤连线 1)ALUBUS连EXJ3 2) ALU01连BUS1 3) SJ2连UJ2 4) 跳线器J23上T4连SD 5) LDDR1,LDDR2,ALUB,SWB四个跳线器拨在左边 6) AR跳线器拨在左边,同时开关AR拨在“1”电平 2. 核对线路,核对正确后接通电源 3. 用二进制数据开关KD0-KD7向DR1和DR2寄存器置入8位运算数据。

数据结构教学规划表达式求值【完全版】

XXXXXX大学《数据结构》课程设计报告 班级: 学号: 姓名: 指导老师:

目录 一算术表达式求值 一、需求分析 二、程序的主要功能 三、程序运行平台 四、数据结构 五、算法及时间复杂度 六、测试用例 七、程序源代码 二感想体会与总结

算术表达式求值 一、需求分析 一个算术表达式是由操作数(operand)、运算符(operator)和界限符(delimiter)组成的。假设操作数是正整数,运算符只含加减乘除等四种运算符,界限符有左右括号和表达式起始、结束符“#”,如:#(7+15)*(23-28/4)#。引入表达式起始、结束符是为了方便。编程利用“算符优先法”求算术表达式的值。 二、程序的主要功能 (1)从键盘读入一个合法的算术表达式,输出正确的结果。 (2)显示输入序列和栈的变化过程。 三、程序运行平台 Visual C++ 6.0版本 四、数据结构 本程序的数据结构为栈。 (1)运算符栈部分: struct SqStack //定义栈

{ char *base; //栈底指针 char *top; //栈顶指针 int stacksize; //栈的长度 }; int InitStack (SqStack &s) //建立一个空栈S { if (!(s.base = (char *)malloc(50 * sizeof(char)))) exit(0); s.top=s.base; s.stacksize=50; return OK; } char GetTop(SqStack s,char &e) //运算符取栈顶元素 { if (s.top==s.base) //栈为空的时候返回ERROR { printf("运算符栈为空!\n"); return ERROR; } else e=*(s.top-1); //栈不为空的时候用e做返回值,返回S的栈顶元素,并返回OK return OK; } int Push(SqStack &s,char e) //运算符入栈 { if (s.top-s.base >= s.stacksize) { printf("运算符栈满!\n");

《C语言程序设计》实验报告实验

《C语言程序设计》 实验报告 2013~2014学年第二学期 班级 姓名 学号 指导教师

实验一 实验项目名称:C程序的运行环境和运行C程序的方法 所使用的工具软件及环境:Visual C++ 6.0 一、实验目的: 1.了解在Visual C++ 6.0环境下如何编辑、编译、连接和运行一个C程序; 2.通过运行简单的C程序,初步了解C源程序的特点。 二、预习内容: 教材《C语言程序设计教程》第1章。 三、实验内容: 1. 在Visual C++ 6.0环境下输入并运行下面的程序: #include int main( ) { printf("This is a C program.\n"); return 0; } 2. 在Visual C++ 6.0环境下输入下面的程序(有语法错误),编译、连接、调试该程序,直至程序无语 法错误,然后运行程序,并观察分析运行结果。 #include int main( ) { int a,b,sum a=3; b=4; sun=a+b; print(“%d+%d=%d\n”,a,b,sum); return 0; } 四、实验结果: 1. 运行结果(或截图): This is a C program. Press any key to continue 2. (1) 改正后的源程序: #include int main( ) { int a,b,sum; a=3; b=4; sum=a+b;

printf("%d+%d=%d\n",a,b,sum); return 0; } (2) 运行结果(或截图): 3+4=7 五、思考题: 1. 一个C程序上机的步骤有哪些? 答:上级输入与编辑源程序—对原程序进行编译–与库函数链接–运行可执行的目标程序。 2. 组成C程序的基本单位是函数,一个函数包括哪几个部分? 答:一个函数包括两部分:分别为函数头或函数首部和函数体。 成绩指导教师签名 实验二 实验项目名称:数据类型、运算符和表达式 所使用的工具软件及环境:Visual C++ 6.0 一、实验目的: 1.掌握整型、实型与字符型这三种基本类型的概念; 2.掌握常量及变量的使用方法; 3. 掌握基本算术运算符及其表达式的使用方法; 4. 掌握++、--运算符、赋值运算符及其表达式的使用方法。 二、预习内容: 教材《C语言程序设计教程》第2章。 三、实验内容: 1. 在Visual C++ 6.0环境下输入下面的程序,编译、连接、调试该程序。 main( ) { char m,n; m=280; n=320; printf(“%d\t%d\n”,m,n); printf(“%c\t%c\n”,m,n); } 2. 在Visual C++ 6.0环境下输入并运行下面的程序,观察分析运行结果。 #include int main( ) { int a=3,b=4,c=8; float d,e; d=a+b/c; e=a+(float)b/c;//请将此处d改为b printf("d=%f,e=%f\n",d,e);

长沙理工大学数据结构栈的实现及应用算术表达式求值实验报告

实验报告 年级班号学号姓名 实验名称:栈的实现及其应用:算术表达式的计算实验日期2016年12月2日 计算机科学与技术系 2016年制

一、实验环境 32位操作系统下的Window平台Microsoft Visual C++ 二、实验目的 掌握栈的实现及使用 三、实验内容 1.实现栈的存储结构 2.实现栈的基本操作的有关算法 3.利用栈解决*算术表达式求值问题 四、数据结构与算法思想描述 顺序读取中缀表达式: 1、当遇到数字时,将数字入数字栈 2、当遇到操作符时,与操作符栈栈顶比较: If(当前操作符优先级大于操作符栈栈顶的优先级) If(非”)”操作符) 将当前操作符进操作符栈; Else While(操作符栈栈顶不等于”(“) 取操作符栈栈顶及数字栈的两个数进行运算,并将结果压入数字栈; Else If(非(“操作符) While(操作符栈栈顶不等于”(“) 取操作符栈栈顶及数字栈的两个数进行运算,并将结果压入数字栈; Continue;(直到当前操作符比栈顶操作符优先级大) Else 将当前操作符进操作符栈; 3、While(操作符栈非空) 操作符栈栈顶及数字栈的两个数进行运算,并将结果压入数字栈; 4、在数字栈取最后结果并输出。

五、程序清单 //10*8^2+16.3+5*(5.2*5+3.01)/4-(-10)+0.1000060+4.00416-40 = 666.666666 //100+(-100)-(-10^2) = 100 //(((2016-2017+(((2015-2014)))))) = 0 //-1+(((((((((1^0))))))))+100%10^2 = 0 #include #include #include #include #include #include using namespace std; const int MAX = 105; typedef double Type; typedef struct { Type TypeStack[MAX]; char charStack[MAX];

相关文档
相关文档 最新文档