数据结构课程设计 利用栈求表达式的值,可供小学生作业,并能给出分数
利用栈求表达式的值,可供小学生作业,并能给出分数数据结构课程设计说明书格式
![利用栈求表达式的值,可供小学生作业,并能给出分数数据结构课程设计说明书格式](https://img.taocdn.com/s3/m/d39422b35f0e7cd18525362c.png)
中北大学数据结构课程设计说明书2011年12月20日1.设计任务概述(包括系统总体框图及功能描述)此课题是研究表达式求值的问题,以帮助小学生完成测试。
为了达到这个功能,实际我们要做的就是出题,和计算分数给出评价的工作。
整体设计都是以这个要求为轴心进行的。
为了直观和方便,现画出软件整体设计模块图。
整体设计模块图可以清晰的看出软件的几大模块。
整个系统的操作流程图可以看出操作的整体流程,如下图2. 本设计所采用的数据结构(如:链表、栈、树、图等)根据以上功能说明,设计运算信息,堆栈的存储结构,设计程序完成功能;3. 功能模块详细设计在此说明每个部分的算法设计说明(可以是描述算法的流程图),每个程序中使用的存储结构设计说明(如果指定存储结构请写出该存储结构的定义)。
详细设计思想学生要进行测试,首先要有试题。
那么我们就要先建立试题库。
这个试题库的试题是我们在程序运行过程中手动输入,存放在一个的文件中。
首先在主函数中调用创建试题库函数,将试题存入到试题库文件中,然后将该调用从主函数中删除。
创建试题库函数:创建指向xuanti类型的指针,利用循环将输入的测试题该指针的xuanti单元中,最后将该指针中的测试题写入试题库文件中。
核心代码(正文宋体小四号字,倍行距)#include <>#include <>#include <>#include<>#include <>#define STACK_INIT_SIZE 100#define STACKINCREMENT 10#define ERROR 0#define OK 1op==(*S1).base)return 0;e1=*((*S1).top-1);return e1;}op==(*S2).base) return 0;e2=*((*S2).top-1);return e2;}op++=e1;return OK;}op++=e2;return OK;}op==(*S1).base)return 0;e1=*--(*S1).top;return e1;}op==(*S2).base) return 0;e2=*--(*S2).top;return e2;};fflush(stdin);printf("\n");}WriteToFile(pstu,num);;printf("\n");}free(pstu);;printf("请输入计算结果:");scanf("%ld",&XT[KEY[i]].result);fflush(stdin);if(XT[KEY[i]].result==result(XT[KEY[i]].a,OPND,OPTR)) {mark+=10;printf("答案正确!");printf("\n\n");}else{printf("答案错误!");printf("\n\n");}}printf("****得分情况****\n");printf("最后的得分为:%d\n",mark);if(mark>=90)printf("Very Good!\n");else if(mark>=60)printf("成绩不错。
数据结构课程设计可选题目
![数据结构课程设计可选题目](https://img.taocdn.com/s3/m/6a3eb2438e9951e79b892787.png)
数据结构课程设计可选题目一、课程设计的目的学习数据结构与算法的最终目的是解决实际的应用问题,特别是非数值计算类型的应用问题。
课程设计要求同学独立完成一个较为完整的应用需求分析,在完成设计和编程大型作业的过程中,深化对数据结构与算法课程中基本概念、理论和方法的理解;训练综合运用所学知识处理实际问题的能力,强化面向对象的程序设计理念;使同学的程序设计与调试水平有一个明显的提高。
二、数据结构课程设计可选题目1. 运动会分数统计(限1 人完成)任务:参加运动会有n个学校,学校编号为1……n。
比赛分成m个男子项目,和w个女子项目。
项目编号为男子1……m,女子m+1……m+w。
不同的项目取前五名或前三名积分;取前五名的积分分别为:7、5、3、2、1,前三名的积分分别为:5、3、2;哪些取前五名或前三名由学生自己设定。
(m<=20,n<=20)功能要求:1) 可以输入各个项目的前三名或前五名的成绩;2) 能统计各学校总分,3) 可以按学校编号或名称、学校总分、男女团体总分排序输出;4) 可以按学校编号查询学校某个项目的情况;可以按项目编号查询取得前三或前五名的学校;5) 数据存入文件并能随时查询;6) 规定:①输入数据形式和范围:可以输入学校的名称,运动项目的名称;②输出形式:有中文提示,各学校分数为整形;③界面要求:有合理的提示,每个功能可以设立菜单,根据提示,可以完成相关的功能要求。
④存储结构:学生自己根据系统功能要求自己设计,但是要求运动会的相关数据要存储在数据文件中。
(数据文件的数据读写方法等相关内容在c语言程序设计的书上)请在最后的上交资料中指明你用到的存储结构;⑤测试数据:要求使用a.全部合法数据;b.整体非法数据;c.局部非法数据进行程序测试,以保证程序的稳定。
测试数据及测试结果请在上交的资料中写明。
2. 飞机订票系统任务:通过此系统可以实现如下功能:⑴录入:可以录入航班情况(数据可以存储在一个数据文件中,数据结构、具体数据自定)⑵查询:可以查询某个航线的情况(如,输入航班号,查询起降时间,起飞抵达城市,航班票价,票价折扣,确定航班是否满仓);⑶可以输入起飞抵达城市,查询飞机航班情况;⑷订票:(订票情况可以存在一个数据文件中,结构自己设定)可以订票,如果该航班已经无票,可以提供相关可选择航班;⑸退票:可退票,退票后修改相关数据文件;⑹客户资料有姓名,证件号,订票数量及航班情况,订单要有编号。
算术表达式的求解-数据结构课程设计报告
![算术表达式的求解-数据结构课程设计报告](https://img.taocdn.com/s3/m/e5e244bc85868762caaedd3383c4bb4cf7ecb781.png)
算术表达式的求解-数据结构课程设计报告数据结构》课程设计报告书题目:算术表达式的求解系别:计算机科学与应用数据结构课程设计目录一、需求分析1、设计要求:本程序需要实现对算术表达式的求解功能,可以支持基本的四则运算,包括加、减、乘、除,同时还需要支持括号的使用。
2、设计构想:我们将使用栈来实现算术表达式的求解。
具体地,我们将把中缀表达式转换为后缀表达式,然后再利用栈来求解后缀表达式。
二、概要设计1、本程序包含的模块:本程序包含两个模块:中缀表达式转后缀表达式模块和后缀表达式求解模块。
三、详细设计1、定义栈结构我们定义一个栈结构,用来存储算术表达式中的运算符和操作数。
具体地,栈中的每个元素都包含两个属性:元素的值和元素的类型。
元素的值可以是一个数字或一个运算符,元素的类型可以是数字或运算符。
我们使用一个数组来实现栈的结构。
为了方便起见,我们还需要定义一些基本的栈操作,如入栈、出栈、判断栈是否为空等。
2、栈的基本操作栈是一种常见的数据结构,具有后进先出(LIFO)的特点。
栈的基本操作包括初始化栈、入栈、出栈、取栈顶元素和运算模块。
1) 初始化栈初始化栈是指将栈的各项属性设置为初始状态。
通常包括将栈顶指针设为-1,表示栈为空。
2) 入栈入栈是指将元素压入栈顶。
入栈操作需要将栈顶指针加1,并将元素存入栈顶位置。
3) 出栈出栈是指将栈顶元素弹出。
出栈操作需要将栈顶元素取出,并将栈顶指针减1.4) 取栈顶元素取栈顶元素是指获取栈顶元素的值,但不将其弹出。
取栈顶元素操作只需要返回栈顶元素的值即可。
5) 运算模块栈可以用于实现各种运算,例如中缀表达式的转换和计算、括号匹配等。
运算模块需要根据具体需求进行设计和实现。
3、判断运算符的优先级在进行中缀表达式的转换和计算时,需要判断运算符的优先级。
通常采用栈来实现这一功能。
具体实现方法是将运算符入栈,当遇到新的运算符时,将其与栈顶运算符进行比较,如果新运算符的优先级高于栈顶运算符,则将其入栈,否则将栈顶运算符弹出并输出,直到新运算符可以入栈为止。
《算法设计综合实训》题目讲解
![《算法设计综合实训》题目讲解](https://img.taocdn.com/s3/m/70c95305a8114431b90dd8e0.png)
算法设计综合实训题目0.逆序数字(借助栈)编写一个函数,接收一个4位整数值,返回这个数中数字逆序后的结果值。
例如,给定数7631,函数返回1367.输入:第一行一个正整数T(T<=10),表示有T组测试数据; 以下T行,每行一个非负的整数N。
输出:共T行,对于每组输入数据输出一行,即数字逆序后的结果值。
样本输入:3763110185158样本输出:1367810185151.人见人爱A+B这个题目的A和B不是简单的整数,而是两个时间,A和B 都是由3个整数组成,分别表示时分秒,比如,假设A为34 45 56,就表示A所表示的时间是34小时 45分钟 56秒。
输入:输入数据有多行组成,首先是一个整数N,表示测试实例的个数,然后是N行数据,每行有6个整数AH,AM,AS,BH,BM,BS,分别表示时间A和B所对应的时分秒。
题目保证所有的数据合法。
输出:对于每个测试实例,输出A+B,每个输出结果也是由时分秒3部分组成,同时也要满足时间的规则(即:分和秒的取值范围在0-59),每个输出占一行,并且所有的部分都可以用32位整数表示。
样本输入:21 2 3 4 5 634 45 56 12 23 34样本输出:5 7 947 9 302.敲七【问题描述】输出7和7的倍数,还有包含7的数字例如(17,27,37...70,71,72,73...)【要求】【数据输入】一个整数N。
(N不大于30000)【数据输出】从小到大排列的不大于N的与7有关的数字,每行一个。
【样例输入】20【样例输出】714173.统计同成绩学生人数问题【问题描述】读入N名学生的成绩,将获得某一给定分数的学生人数输出。
【要求】【数据输入】测试输入包含若干测试用例,每个测试用例的格式为第1行:N第2行:N名学生的成绩,相邻两数字用一个空格间隔。
第3行:给定分数当读到N=0时输入结束。
其中N不超过1000,成绩分数为(包含)0到100之间的一个整数。
数据结构课程设计报告-表达式求值
![数据结构课程设计报告-表达式求值](https://img.taocdn.com/s3/m/2e1d6522dd36a32d737581a3.png)
《数据结构》课程设计利用栈求表达式的值班级: 2学号: 100171021330姓名:吴迪指导老师:王方利用栈求表达式的值1、设计思路这个程序的关键是对数字与运算符的判断和运算符优先级的判断,以及出栈的运算。
建立两个栈,分别存储数字与运算符,栈1存运算符,栈2存数字。
依次读取表达式的字符串,先判断是数字还是运算符,如果是数字不能马上压入栈2,因为可能是大于10的数字,应该继续循环,如果还是数字,则利用计算保存数值,直到指到运算符时停止,将计算后的数字压入栈2。
压入运算符之前先将要压入的与栈顶的运算符优先级相比较,如果栈顶是‘(’而当前不是‘)’,则不需比较优先级,直接压入;如果栈顶是‘(’,当前是‘)’,则抵消(弹出‘(’,指向表达式下一个字符);若当前的运算符优先级大于栈顶的,则压入;若当前的运算符优先级小于栈內时,弹出栈顶的运算符,同时弹出两组数字,经过运算符的运算后再重新压到栈内。
为了方便判断运算结束,在存储运算符之前先将‘#’压入栈1中,在输入表达式时以‚#‛结束,所以可以以运算符==‘#’并且栈1顶==‘#’来结束运算,弹出栈2的数值,即为表达式求值的最终结果。
上述操作的算法步骤:(1)初始化算符S1,数字栈S2;,将‘#’压入算符栈S1中。
(2)读表达式字符=>w。
(3)当栈顶为‘#’并且w也是‘#’时结束;否则循环做下列步骤:(3-1)如果w是数字,存储到m,再经过计算存储到num中。
m=w-‘0’;num=num*pow(10,n)+m;n++;读下一个字符=>w,如果是运算符,则跳出循环;转3-2。
(3-2)w若是运算符,则:(3-2-1)如果栈顶为‘(’并且w为‘)’则‘(’出栈,读下一个字符=>w;转(3)。
(3-2-2)如果栈顶为‘(’或者栈顶优先级小于w优先级,则w入栈,读下一个字符=>w;转(3)。
否则:从算符栈中出栈,并从数字栈中弹出两组数字进行运算,将结果重新压入数字栈,转(3)。
【数据结构与数据库-实验报告】表达式求值(栈)
![【数据结构与数据库-实验报告】表达式求值(栈)](https://img.taocdn.com/s3/m/727cbe55a8956bec0975e398.png)
8 / 20
版权归原作者 Amber 所有
break; } } return GetTop2(OPND); } int main( ) { printf("请输入正确的表达式以'#'结尾:"); do{ gets(expr); }while(!*expr); InitStack(&OPTR); /* 初始化运算符栈 */ Push(&OPTR,'#'); /* 将#压入运算符栈 */ InitStack2(&OPND); /* 初始化操作数栈 */ printf("表达式结果为:%d\n", EvalExpr()); return 0; }
6 / 20
版权归原作者 Amber 所有
case '+' : return (a+b); case '-' : return (a-b); case '*' : return (a*b); case '/' : return (a/b); } return 0; } 8、返回操作数的长度 int num(int n) { char p[10]; itoa(n,p,10);//把整型转换成字符串型 n=strlen(p); return n; } 9、主要操作函数 int EvalExpr() { char c,theta,x; int n,m; int a,b; c = *ptr++; while(c!='#'||GetTop(OPTR)!='#') {
版权归原作者 Amber 所有
数据结构与数据库 实验报告
题 院 姓 学
(完整word版)利用栈求表达式的值
![(完整word版)利用栈求表达式的值](https://img.taocdn.com/s3/m/272da7b5b307e87101f696f9.png)
数据结构课程设计姓名:王宗敏班级:软件1021111217班学号:1021111217目录:1.需求分析……………………………2.概要设计……………………………3.详细设计……………………………4.调试分析……………………………5.用户使用说明………………………6.测试结果……………………………利用栈求表达式的值,可供小学生作业,并能给出分数。
1.需求分析任务:通过此系统可以实现如下功能:此系统能够输入一个表达式,并计算该表达式的值。
可以根据计算结果给出分数。
能供小学生进行简单的四则运算,此外这里特别强调括号的匹配!要求:根据以上功能说明,设计运算信息,堆栈的存储结构,设计程序完成功能;2. 概要设计在此说明每个部分的算法设计说明(可以是描述算法的流程图),每个程序中使用的存储结构设计说明(如果指定存储结构请写出该存储结构的定义)。
3.详细代码#include "string.h"#include ”stdio.h”#include”conio.h"#define maxsize 100#include ”ctype.h"typedef char datatype;typedef struct{datatype stack[maxsize];int top;} seqstack;void stackinitiate(seqstack *s){s—>top=0;}int stacknotempty(seqstack s){if(s.top<=0)return 0;else return 1;}int stackpush(seqstack *s,datatype x) {if(s->top>=maxsize){printf(”堆栈已满无法插入!\n");return 0;}else{s—>stack[s—〉top]=x;s->top++;return 1;}}int stackpop(seqstack *s,datatype *d){if(s->top<=0){printf("堆栈已空无数据元素出栈!\n");return 0;}else{s-〉top——;*d=s->stack[s—〉top];return 1;}}int stacktop(seqstack s,datatype *d){if(s。
栈的应用:表达式求值1
![栈的应用:表达式求值1](https://img.taocdn.com/s3/m/68ead85d312b3169a451a43a.png)
《数据结构课程设计实验一:表达式求值》实验报告一、简介要求设计一个表达式求值的程序。
该程序必须可以接受包含(,),+,-,*,/,%,和^(求幂运算符,a^b=a b)的中缀表达式,并求出结果。
如果表达式正确,则输出表达式的结果;如果表达式非法,则输出错误信息。
输入要求:程序从“input.txt”文件中读取信息,在这个文件中如果有多个中缀表达式,则每个表达式独占一行,程序的读取操作在文件的结尾处停止。
输出要求:对于每一个表达式,将其结果放在“output.txt”文件的每一行中。
这些结果可能是值(精确到小数点后两位),也可能是错误信息“ERROR IN INFIX NOTATION”。
输入例子:1+2+3-44.99+5.99+6.99*1.062^2.5^3(5.6-2)%35%(3.2-2.1)3.0.2+1输出例子:2.0018.3950535.16Error in infix notation.Error in infix notation.Error in infix notation.输入的表达式是由操作数和运算符以及改变运算顺序的圆括号连接而成的式子。
由于不同的运算符间存在优先级,同一优先级的运算间又存在着运算结合顺序的问题(即左结合,还是右结合),所以简单的从左到右计算是不充分的。
而后缀表达式(后缀表达式是由一系列的运算符、操作数组成,其中运算符位于两个操作数之后,如123*+)则很容易通过应用栈实现表达式的计算,所以,我们要先把中缀表达式转换成后缀表达式,再进行计算。
二、算法说明a、定义一个栈存放运算符,将中缀表达式转化为后缀表达式。
基本过程如下:如果遇到空格,则认为是分隔符,不需处理。
●如遇到操作数,则直接输出。
●若遇到左括号,则将其压入栈中。
●若是遇到右括号,表明括号的中缀表达式已经扫描完毕,把括号中的运算符退栈,并输出。
●若遇到是运算符,当该运算符的优先级别大于栈顶运算符的优先级别时,则将它压栈;当该运算符的优先级别小于栈顶运算符的优先级别时,则将栈顶运算符退栈并输出,再次比较新的栈顶运算符,按同样方法处理,直到该运算符大于栈顶运算符的优先级为止,然后将该运算符压栈。
利用栈求表达式的值,可供小学生作业,并能给出分数
![利用栈求表达式的值,可供小学生作业,并能给出分数](https://img.taocdn.com/s3/m/2b177c25482fb4daa58d4b51.png)
//1.h#include<ctime>#include<cstring>#include<fstream>#include<iomanip>#include<iostream>using namespace std;//template<class T>struct Ti //定义一个结构体,用于存储题习题库中的每一道台?题目{char chh[30];};template<class T>struct Stack //定义栈,其中数据元素为字符型í{T data[50];int top;};template<class T>struct Stack2 //定义栈,其中数据元素为整型í{float data[50];int top;};template<class T>class link{public:void Push(Stack<T> &S,char x);char Pop(Stack<T> &S,char x);void Push2(Stack2<T> &S,float x);float Pop2(Stack2<T> &S,float x);void pingjia(int m) ;int In(char c);int change(char x);int Precede(int a,int b);float Operate(float a,char c,float b);void toEmpty(char s[],int n);void isStay(char s1[],int n1,char s2[],int n2);int isInt(char s[],int n);void xitiku(char a[],int n);float Expression();Stack<T> setStack();Stack2<T> setStack2();};//1.cpp#include<ctime>#include"1.h"#include<cstring>#include<fstream>#include<iomanip>#include<iostream>using namespace std;template<class T>void link<T>::Push(Stack<T> &S,char x) {if(S.top==49){cout<<"栈已满!?"<<endl;}elseS.top++;S.data[S.top]=x;}template<class T>char link<T>:: Pop(Stack<T> &S,char x) {if(S.top==-1){cout<<"栈空!"<<endl;}x=S.data[S.top];S.top--;return x;template<class T>void link<T>::Push2(Stack2<T> &S,float x) {if(S.top==49){cout<<"栈已满!"<<endl;}elseS.top++;S.data[S.top]=x;}template<class T>float link<T>::Pop2(Stack2<T> &S,float x) {if(S.top==-1){cout<<"栈空!"<<endl;}x=S.data[S.top];S.top--;return x;template<class T>void link<T>::pingjia(int m){switch(m/10){case 0:case 1:case 2:case 3:case 4:case 5:cout<<"对不起,你没能及格,要加油哦!\n";break;case 6:case 7:cout<<"恭喜您及格了,但离高分还有距离哦!\n";break;case 8:case 9:cout<<"哇,您居然得了这么高的分数,真棒!\n";break;case 10:cout<<"OH MY GOD!,您竟然考了满分!!\n";break;}}template<class T>int link<T>::In(char c) //判断字符是否为运算符? {int m=0,i;char OP[7]={'+','-','*','/','(',')','#'};for(i=0;i<7;i++){if(c==OP[i])m++;}if(m==0)return 0;elsereturn 1;}template<class T>int link<T>::change(char x) //将运算符转换成为数字{int a;switch(x){case'+': a=0;break;case'-': a=1;break;case'*': a=2;break;case'/': a=3;break;case'(': a=4;break;case')': a=5;break;case'#': a=6;break;}return a;}template<class T>int link<T>:: Precede(int a,int b) //比括较运算符之间的优先级{int A;int token[7][7]={{1,1,-1,-1,-1,1,1},{1,1,-1,-1,-1,1,1},{1,1,1,1,-1,1,1},{1,1,1,1,-1,1,1},{-1,-1,-1,-1,-1,0,2},{1,1,1,1,2,1,1},{-1,-1,-1,-1,-1,2,0}};switch(token[a][b]){case -1:A=-1;break;case 0:A= 0;break;case 1:A= 1;break;}return A;}template<class T>float link<T>::Operate(float a,char c,float b) //对两个数进行四则运算{float s;switch(c){case'+':s=a+b;break;case'-':s=a-b;break;case'*':s=a*b;break;case'/':s=a/b;break;}return s;}template<class T>void link<T>::toEmpty(char s[],int n) //把一个数组置空{int i;for(i=0;i<n;i++)s[i]='\0';}template<class T>void link<T>::isStay(char s1[],int n1,char s2[],int n2) //把一个表达式分成几段{int i=0,j=0;while(s1[i]==' '){if(s1[i]==' '){i++;}}if(s1[i]=='\0')exit(0);while(s1[i]!='\0'){if(In(s1[i+1])!=In(s1[i])||In(s1[i+1])*In(s1[i])==1||s1[i]=='\0 '){s2[j]=s1[i];s1[i]=' ';break;}if(In(s1[i+1])==In(s1[i])){s2[j]=s1[i];s1[i]=' ';i++;j++;}}}template<class T>int link<T>::isInt(char s[],int n){int i=0,j=0,x;while(s[i]!=' '&&s[i]!='\0'){if(s[i]>='0'&&s[i]<='9'||s[0]=='-') j++;i++;}if(i==j){x=atoi(s);return x;}elsereturn -1;}template<class T>void link<T>::xitiku(char a[],int n) //创建习题库{int TIME,T;Ti t[100]={'\0'};char ch[30]={'\0'};int i;ifstream file("TextFile1.txt",ios_base::in);if(!file){cout<<"打洙?开a习°题琣库a文?件t失骸?败悒?!?"<<endl;exit(0);}i=0;while(!file.eof()){file.getline(ch,50);strcpy(t[i].chh,ch);i++;}srand(time(0));TIME=rand()%7;T=TIME;int j=0;while(t[T].chh[j]!='#'){cout<<t[T].chh[j];j++;}cout<<'=';strcpy(a,t[T].chh);file.close();}template<class T>float link<T>::Expression() //试题测试{char x=0,theta=0;char s[30]={'\0'},shu[5]={'\0'};float a=0,b=0,n;int i,j;Stack<T> R;Stack2<T> D;R=setStack();Push(R,'#');D=setStack2();xitiku(s,30);isStay(s,30,shu,5);while((shu[0]!='#'||R.data[R.top]!='#')) {if(In(shu[0])==0){float S1=atoi(shu);Push2(D,S1);toEmpty(shu,5);isStay(s,30,shu,5);}else{i=change(R.data[R.top]);j=change(shu[0]);switch(Precede(i,j)){case -1:Push(R,shu[0]);toEmpty(shu,5);isStay(s,30,shu,5);break;case 0:Pop(R,x);toEmpty(shu,5);isStay(s,30,shu,5);break;case 1:theta=Pop(R,theta);b=Pop2(D,b);a=Pop2(D,a);n=Operate(a,theta,b);Push2(D,n);break;}}}return n;}template<class T>Stack2<T> link<T>::setStack2() {Stack2<T> s;s.top=-1;return s;}template<class T>Stack<T> link<T>::setStack() {Stack<T> s;s.top=-1;return s;}//main.cpp#include"1.cpp"#include"iostream"using namespace std;int main(){link <int> t;cout<<"---------------------------------表达式求值-------------------------------------\n";int i=0,j,geshu=0,n,m,jieguo[100],daan[100];char ch,c[6]={'\0'};cout<<"***做题请输入A,查看成绩单请输入B,结束程序请输入C***\n\n";cin>>ch;cout<<endl;while(ch){switch(ch){case'A':cout<<"-------------现在开始做题--------------\n\n";n=int(t.Expression()+0.5);cout<<"\n\n请输入你的答案?输入-1表示停止做题:";cin>>c;m=t.isInt(c,6);while(m!=-1){if(m==-1111){cout<<"\n输入错误,请重新输入您的答案!";cout<<"\n\n请输入你的答案(输入-1表示停止做题):";cin>>c;m=t.isInt(c,6);}else{i++;jieguo[i-1]=m;daan[i-1]=n;if(m==n)geshu++;cout<<endl;n=int(t.Expression()+0.5);cout<<"\n\n请输入你的答鋏案(输入-1表示停止做题):";cin>>c;m=t.isInt(c,6);}}cout<<"----------------------------------------\n\n";break;case'B':if(i==0)cout<<"成绩单为空!\n\n";else{cout<<" *********您的成绩单******* \n\n";cout<<"-----------------------------------\n";cout<<"题号你的答案正确答案结论\n";for(j=0;j<i;j++){cout<<setw(2)<<j+1;cout<<setw(11)<<jieguo[j];cout<<setw(11)<<daan[j];if(jieguo[j]==daan[j])cout<<setw(11)<<"正确!";elsecout<<setw(11)<<"错误!";cout<<endl;}cout<<"-----------------------------------\n";cout<<"共做了"<<i<<"道题,其中\n";cout<<"做对了"<<geshu<<"道题,做错了"<<i-geshu<<"道题.\n";int fenshu=geshu*100/i;cout<<"最后成绩为:"<<fenshu<<"分!"<<endl;t.pingjia(fenshu);cout<<"-----------------------------------\n";}break;case'C':cout<<"程序结束,谢谢使用!"<<endl;exit(0);default:cout<<"输入错误,请重新输入!"<<endl;break;}cout<<"\n***做题请输入A,查看历史请输入B,结束程序请输入C***\n\n";cin>>ch;cout<<endl;ch=toupper(ch);}system("pause");return 0;}。
数据结构试验:栈和队列实验——表达式求值
![数据结构试验:栈和队列实验——表达式求值](https://img.taocdn.com/s3/m/48b48f24b4daa58da0114aa6.png)
实验报告课程名称数据结构实验项目实验二--栈和队列实验系别___ _计算机学院 _ ______专业___ _计算机科学与技术___班级/学号__学生姓名 ____________实验日期成绩_______________________指导教师实验题目:实验二-----栈和队列实验一、实验目的1)掌握栈的顺序存储结构及队列的链式存储结构;2)验证栈的顺序存储结构的操作的实现;3)验证队列的链式存储结构的操作的实现;4)理解算法与程序的关系,能够将算法转换为对应程序。
二、实验内容1)建立一个顺序存储的空栈,并以此分别实现入栈、出栈、取栈顶元素;2)建立一个链式结构的空队列,并以此分别实现入队、出队、取队头等基本操作;3)尝试利用栈和队列的算法解决一些实际的应用问题。
设计与编码1)实验题目主要需求说明2)设计型题目:表达式求值(要求利用栈结构和运算符优先约定表,输入一个表达式,并计算求值)3)结合题目,说明利用栈或队列解决问题的基本算法描述4)程序源码#include<iostream>using namespace std;const int InitSize=100;const int IncreastSize=10;template<class datatype>class SqStack {private:datatype *base;datatype *top;int stacksize;public:SqStack();void DestroyStack();void ClearStack();int StackLength();bool IsEmpty();bool GetTop(datatype &e);bool Pop(datatype &e);bool Push(datatype e);};template<class datatype>SqStack<datatype>::SqStack(){base=new datatype[InitSize];if(!base)exit(1);top=base;stacksize=InitSize;}template<class datatype>void SqStack<datatype>::DestroyStack() {delete[] base;base=top=NULL;stacksize=0;}template<class datatype>void SqStack<datatype>::ClearStack() {top=base;}template<class datatype>int SqStack<datatype>::StackLength() {return top-base;}template<class datatype>bool SqStack<datatype>::IsEmpty() {if(top==base)return fasle;else return true;}template<class datatype>bool SqStack<datatype>::GetTop(datatype &e){if(top==base)return false;e=*(top-1);return true;}template<class datatype>bool SqStack<datatype>::Pop(datatype &e){if(top==base)return false;e=*(top-1);top--;return true;}template<class datatype>bool SqStack<datatype>::Push(datatype e){if(top-base>=stacksize){base=(datatype *)realloc( base , (stacksize+IncreastSize)*sizeof(int) ); if(!base)exit(1);top=base+stacksize;stacksize+=IncreastSize;}*(top)=e;top++;return true;}int com(char m,char t){if(t=='(') return -1;else if(t==')'){if(m=='+'||m=='-'||m=='*'||m=='/') return 1; else if(m=='(') return 0;else return -2;}else if(t=='*'||t=='/'){if(m=='+'||m=='-'||m=='#'||m=='(') return -1; else return 1;}else if(t=='+'||t=='-'){if(m=='#'||m=='(') return -1;else return 1;}else{if(m=='#')return 0;else if(m=='+'||m=='-'||m=='*'||m=='/') return 1; else return -2;}}void main(){SqStack <char> op;SqStack <double> re;char t,m;double result,flag=1;op.Push('#');t=getchar();while(true){if(t>='0'&&t<='9'){double s=0;s=s*10+t-'0';t=getchar();while(t>='0'&&t<='9' ){s=s*10+t-'0';t=getchar();}re.Push(s);}else if(t=='+'||t=='-'||t=='*'||t=='/'||t=='('||t==')'||t=='\n') { op.GetTop(m);while(com(m,t)==1 ){double x1,x2;op.Pop(m);if(re.Pop(x2)&&re.Pop(x1)){if(m=='+') re.Push(x1+x2);else if(m=='-') re.Push(x1-x2);else if(m=='*') re.Push(x1*x2);else if(m=='/') {if(x2!=0)re.Push(x1/x2); else flag=0;} }else flag=0;op.GetTop(m);}if(com(m,t)==-1)op.Push(t);else if(com(m,t)==0)op.Pop(m);else flag=0;if(!op.GetTop(m)) break;t=getchar();}else t=getchar();}if(re.GetTop(result)&&flag)cout<<result<<endl;else cout<<"Input error!\n";}5)运行结果三、总结与心得。
《数据结构课程设计》表达式求值实验报告
![《数据结构课程设计》表达式求值实验报告](https://img.taocdn.com/s3/m/1c7f11bc9b89680202d82544.png)
实验课程名称专业班级学生姓名学号指导教师20 至 20 学年第学期第至周算术表达式求值演示一、概述数据结构课程设计.要求学生在数据结构的逻辑特性和物理表示、数据结构的选择和应用、算法的设计及其实现等方面.加深对课程基本内容的理解。
同时.在程序设计方法以及上机操作等基本技能和科学作风方面受到比较系统和严格的训练。
在这次的课程设计中我选择的题目是算术表达式求值演示。
表达式计算是实现程序设计语言的基本问题之一.也是栈的应用的一个典型例子。
设计一个程序.演示用算符优先法对算术表达式求值的过程。
深入了解栈和队列的特性.以便在解决实际问题中灵活运用它们.同时加深对这种结构的理解和认识。
二、系统分析1.以字符列的形式从终端输入语法正确的、不含变量的整数表达式。
利用已知的算符优先关系.实现对算术四则混合运算表达式的求值.并仿照教科书的例子在求值中运算符栈、运算数栈、输入字符和主要操作的变化过程。
2.一般来说.计算机解决一个具体问题时.需要经过几个步骤:首先要从具体问题抽象出一个适当的数学模型.然后设计一个解决此数学模型的算法.最后编出程序.进行测试.调试直至得到想要的答案。
对于算术表达式这个程序.主要利用栈.把运算的先后步骤进行分析并实现简单的运算!为实现算符优先算法.可以使用两个栈.一个用以寄存运算符.另一个用以寄存操作数和运算结果。
3.演示程序是以用户于计算机的对话方式执行.这需要一个模块来完成使用者与计算机语言的转化。
4.程序执行时的命令:本程序为了使用具体.采用菜单式的方式来完成程序的演示.几乎不用输入什么特殊的命令.只需按提示输入表达式即可。
(要注意输入时格式.否者可能会引起一些错误)5. 测试数据。
三、概要设计一个算术表达式中除了括号、界限符外.还包括运算数据和运算符。
由于运算符有优先级别之差.所以一个表达式的运算不可能总是从左至右的循序执行。
每次操作的数据或运算符都是最近输入的.这与栈的特性相吻合.故本课程设计借助栈来实现按运算符的优先级完成表达式的求值计算。
利用栈求表达式值
![利用栈求表达式值](https://img.taocdn.com/s3/m/8762ee56be1e650e52ea9972.png)
课程设计课程名称数据结构题目名称利用栈求表达式的值专业班级2014级计算机科学与技术本学生姓名刘志,马健,王青星,杨文祥,王胜达学号51402011052,5140201104 2,51402011032,51402011 006,51402011046指导教师姚保峰二○一六年六月十五日目录1.设计目的: (1)2.设计要求: (2)3.设计方案: (3)4.设计内容: (4)4.1.需求分析 (4)4.2.概要设计 (4)4.3.详细设计 (7)4.4.调试分析与结果 (11)4.5:使用说明 (15)5.总结: (16)6.附录三:源代码 (18)1.设计目的:数据结构课程设计是计算机专业集中实践性环节之一,是学习完《数据结构》课程后进行的一次全面的综合练习。
其目的是:(1)要达到理论与实际应用相结合,使学生能够根据数据对象的特性,学会数据组织的方法,能把现实世界中的实际问题在计算机内部表示出来,并培养良好的程序设计技能。
(2)在实践中认识为什么要学习数据结构,掌握数据结构、程序设计语言、程序设计技术之间的关系,是前面所学知识的综合和回顾。
2.设计要求:以字符序列的形式从键盘输入语法正确的、不含变量的整数(或实数)表达式,实现对算术四则混合运算表达式的求值。
当用户输入一个合法的算术表达式后,能够返回正确的结果。
能够计算的运算符包括:加、减、乘、除、括号,对于异常表达式能给出错误提示。
3.设计方案:任何一个表达式都是由操作符,运算符组成的。
我们分别用顺序栈来寄存表达式的操作数和运算符。
栈是限定于紧仅在表尾进行插入或删除操作的线性表。
顺序栈的存储结构是利用一组连续的存储单元依次存放自栈底到栈顶的数据元素。
为了实现运算符优先算法。
可以使用两个栈。
一个称为OPF,用以寄存运算符,另一个称做OPS,用以寄存操作数或运算结果。
1.首先置操作数栈为空栈,表达式起始符”#”为运算符栈的栈底元素;2.依次读入表达式,若是操作符即进OPS栈,若是运算符则和OPF栈的栈顶运算符比较优先权后作相应的操作,直至整个表达式求值完毕(即OPF栈的栈顶元素和当前读入的字符均为”#”)。
利用栈求表达式课程设计报告
![利用栈求表达式课程设计报告](https://img.taocdn.com/s3/m/b3cc0deb5ef7ba0d4a733b61.png)
《数据结构》课程设计报告专业计算机科学与技术班级(1)姓名王昕学号20101308003指导教师顾韵华起止时间2011.10~2011.12课程设计:利用栈求表达式的值一、任务描述建立试题库文件,随机产生n个题目;题目涉及加减乘除,带括号的整数混合运算;随时可以退出;保留历史分数,能回顾历史,给出与历史分数比较后的评价。
(假设这是一个可供小学生练习算术运算的小系统)要求:根据以上任务说明,设计程序完成功能。
二、问题分析1、功能分析分析设计课题的要求,要求编程实现以下功能:(1)建立试题库文件—即创建试题库函数(2)实现整数混合运算—即建立栈实现运算(3)查看历史分数—即建立函数查看2、数据对象分析由于其中涉及了能回顾历史成绩以及随机做题等问题,所以就考虑用到了文件的打开与关闭以及文件的读写功能。
由于此设计要实现多个功能,所以为了源代码清晰明了,所有的函数不是用的嵌套方式,而是对每个功能都用一个子程序来实现,然后通过对子程序的调用来达到设计的要求三、数据结构设计有关的定义如下:typedef struct shiti /*定义表达式*/{char a[20]; /*存放表达式*/long result; /*存放用户输入的答案*/}xuanti;typedef struct SqStack1 /*建立数字栈*/{int *base;int *top;int stacksize;}SqStack1;typedef struct SqStack2 /*建立运算符栈*/{char *base;char *top;int stacksize;}SqStack2;四、功能设计(一)主控菜单设计为实现程序的操作功能,首先设计一个含有多个菜单项的主控菜单程序,然后再为这些菜单项配上相应的功能。
程序运行后,给出以下项的内容和输入提示,如下:1.输入表达式2.表达式结果3.继续输入表达式4.显示结果(二)程序模块结构由课题要求可将程序划分为以下几个模块(即实现程序功能所需的函数):1.写入函数WriteToFile()2.读出函数ReadFromFile()3.栈函数stack()(三)函数调用关系其中main()是主函数,它进行菜单驱动,根据选择项0~9用相应的函数。
数据结构实验报告-3-求解算术表达式
![数据结构实验报告-3-求解算术表达式](https://img.taocdn.com/s3/m/4412e02a87c24028915fc3a2.png)
实验3 利用栈实现算术表达式求值一、实验目的1、帮助读者复习C语言程序设计中的知识。
2、熟悉栈的逻辑结构。
3、了解算术表达式计算的逻辑过程。
4、熟悉算术表达式计算过程中优先级的运算方法。
5、了解中缀表达式和后缀表达式的区别。
二、实验内容[问题描述]1.实验目标:利用栈的特性,实现算术表达式的运算,了解算术运算的逻辑,掌握栈的特性。
2.中缀表达式与后缀表达式的含义中缀表达式就是通常所说的算术表达式,比如(1+2)*3-4。
后缀表达式是指通过解析后,运算符在运算数之后的表达式,比如上式解析成后缀表达式就是12+3*4-。
这种表达式可以直接利用栈来求解。
[基本要求](1)利用栈实现后缀表达式的计算;(2)利用栈实现中缀表达式到后缀表达式的转换。
(可选)基于程序易于设计的考虑,我们仅需要实现一位数值(0-9)的+,-,*,/,()等运算。
三、设计思路四、源代码#include<stdio.h>#include<string.h>#include<stdlib.h>#define max 100typedef struct{float data[max];int top;}seqstack;void InitStack(seqstack *s);int StackEmpty(seqstack *s);int StackFull(seqstack *s);void Push(seqstack *s,char x);int Pop(seqstack *s);float ComputeExpress(char a[]);void main(){char a[max],b[max];float f;printf("请输入一个后缀表达式:\n");gets(a);printf("后缀表达式为:%s\n",a);f=ComputeExpress(b);printf("计算结果为:%f\n",f);}void InitStack(seqstack *s){s->top=-1;}int StackEmpty(seqstack *s){return s->top==-1;}int StackFull(seqstack *s){return s->top==max-1;}void Push(seqstack *s,char x){if(StackFull(s))printf("overflow");s->data[++s->top]=x;}int Pop(seqstack *s){if(StackEmpty(s))printf("underflow");return s->data[s->top--];}float ComputeExpress(char a[]){seqstack s;int i=0;float x1,x2,value;float result;s.top=-1;while(a[i]!='\0'){if(a[i]!=' '&&a[i]>='0'&&a[i]<='9'){value=0;while(a[i]!=' '){value=10*value+a[i]-'0';i++;}s.top++;s.data[s.top]=value;}else{switch(a[i]){case'+':x1=s.data[s.top];s.top--;x2=s.data[s.top];s.top--;result=x1+x2;s.top++;s.data[s.top]=result;break;case'-':x1=s.data[s.top];s.top--;x2=s.data[s.top];s.top--;result=x2-x1;s.top++;s.data[s.top]=result;break;case'*':x1=s.data[s.top];s.top--;x2=s.data[s.top];s.top--;result=x1*x2;s.top++;s.data[s.top]=result;break;case'/':x1=s.data[s.top];s.top--;x2=s.data[s.top];s.top--;result=x2/x1;s.top++;s.data[s.top]=result;break;}i++;}}if(s.top!=-1)result=s.data[s.top];s.top--;if(s.top==-1)return result;else{printf("表达式错误");exit(-1);}}五、测试结果六、心得体会这次实验我只做了利用栈实现后缀表达式的计算熟悉栈的逻辑结构,同时了解算术表达式计算的逻辑过程。
数据结构课程设计报告-表达式求值
![数据结构课程设计报告-表达式求值](https://img.taocdn.com/s3/m/bfb10f47b307e87101f69696.png)
}
double Calculate(double a,double b,char c){ //进行二元运算
double result;
switch(c){
case '+':result=a+b;break;
case '-':result=a-b;break;
case '*':result=a*b;break;
void PushNum(OPND *OPND,double num){ //操作数进栈
OPND->top++;
OPND->array[OPND->top-1]=num;
}
void PopNum(OPND *OPND,double *num){ //操作数出栈
*num=OPND->array[OPND->top-1];
default:priority='E';
}
return priority;
}
void Process(OPND *OPND,OPTR *OPTR,char x){ //计算表达式
double a,b;char c;
static double tempnum=0.00000000;
static int len=10; //用于各数位上的值的转换
double array[N];
int top;//栈顶指针
}OPND;
typedef struct{ //定义运算符栈
char array[N];
int top;//栈顶指针
}OPTR;
int Cint(char mychar){ //将字符0-9转换成数值
课程设计之利用栈求值
![课程设计之利用栈求值](https://img.taocdn.com/s3/m/8b8bdaf0dc3383c4bb4cf7ec4afe04a1b171b016.png)
课程设计之利用栈求值一、教学目标本节课的学习目标为:知识目标:学生需要掌握栈的基本概念,了解栈的性质和用途,理解栈的操作原理。
技能目标:学生能够运用栈解决基本的计算问题,例如逆波兰表达式的求值。
情感态度价值观目标:通过解决实际问题,激发学生对计算机科学的兴趣,培养学生的逻辑思维能力和创新精神。
二、教学内容本节课的教学内容主要包括:1.栈的定义和性质:介绍栈的基本概念,解释栈的先进后出(FILO)特性。
2.栈的操作:讲解栈的压入(push)和弹出(pop)操作,以及栈的遍历。
3.逆波兰表达式:介绍逆波兰表达式的概念,解释其与栈的关系。
4.利用栈求值:引导学生运用栈来求解逆波兰表达式,培养学生的实际操作能力。
三、教学方法为了提高教学效果,本节课将采用以下教学方法:1.讲授法:讲解栈的基本概念、性质和操作。
2.案例分析法:通过分析具体的逆波兰表达式求值实例,引导学生掌握利用栈解决问题的一般方法。
3.实验法:安排课堂练习,让学生亲自动手操作,验证所学知识。
4.讨论法:学生进行小组讨论,分享学习心得,互相解答疑问。
四、教学资源为了支持教学内容的传授和教学方法的实施,我们将准备以下教学资源:1.教材:提供相关章节,为学生提供理论知识的学习依据。
2.多媒体资料:制作课件,以图文并茂的形式展示栈的概念和操作。
3.实验设备:提供计算机及相关设备,让学生进行课堂练习。
4.在线资源:推荐相关的学习和论坛,方便学生课后自主学习和交流。
五、教学评估本节课的评估方式包括:1.平时表现:观察学生在课堂上的参与程度、提问回答等情况,了解学生的学习态度和理解程度。
2.作业:布置相关的练习题,评估学生对栈知识掌握的情况。
3.考试:安排一次课堂小测,测试学生对逆波兰表达式求值的掌握程度。
评估方式应客观、公正,能够全面反映学生的学习成果。
通过评估,教师可以了解学生的学习情况,及时进行教学调整。
六、教学安排本节课的教学安排如下:1.进度:按照教材的章节顺序,逐步讲解栈的知识点和逆波兰表达式的求值方法。
【数据结构】用栈解决表达式求值问题
![【数据结构】用栈解决表达式求值问题](https://img.taocdn.com/s3/m/1b6c420b6ad97f192279168884868762caaebb27.png)
【数据结构】⽤栈解决表达式求值问题题⽬:求4+4/2-9*3的值;思路: ①:⽤⼀个字符型数组存放了表达式《4+4/2-9*3》;1char val[9] = {'4','+','4','/','2','-','9','*','3'}; ②:定义两个栈,⼀个存放数字,⼀个存放符号;1//定义存储整型的栈2 typedef struct node3 {4int data[MAXSIZE];5int top;6 }SeqStack;7//定义存储字符型的栈8 typedef struct nodeb9 {10char data[MAXSIZE];11int top;12 }SeqStackchar; ③:定义符号的优先级;1//获取优先级2int youxianquan(char c)3 {4int x;5switch(c)6 {7case'-':8case'+':9 x = 1;10break;11case'*':12case'/':13 x = 2;14break;15default: printf("error");16 }17return(x);18 } ④:确定运算思路——⾃左扫描表达式的每⼀个字符时,若当前字符是运算数值,⼊整型栈。
是运算符时,若这个运算符⽐栈顶运算符⾼则⼊栈,继续向后处理,若这个运算符⽐栈顶运算符低,则从对象栈出栈两个运算量,从运算符栈出栈⼀个运算符进⾏运算,将其运算结果⼊对象栈。
然后继续判断当前字符串是否⾼于栈顶运算符,如果⽐栈顶运算符⾼,则⼊栈,否则则继续运算。
1//表达式求值2int result(SeqStack *a, SeqStackchar *b)3 {4char val[9] = {'4','+','4','/','2','-','9','*','3'}; //创建表达式5int i,resultval;6int x,y;7char c;8int n = sizeof(val);9for(i = 0; i < n; i++)10 {11 c = val[i]; //获取表达式第i个值12if(i%2 == 0) //把数字和符号区分开来,13 {14 a->top++;15 a->data[a->top] = c - '0'; //存放数值的16 }17else//存放符号的18 {19if(b->top == -1) //如果b为空则直接存⼊符号20 {21 b->top++;22 b->data[b->top] = c;23 }24else25 {26 x = youxianquan(c); //求出当前符号的优先级27 y = youxianquan(b->data[b->top]); //求b栈顶的符号优先级28if(x > y) //如果当前优先级⼤于栈顶优先级,则进栈29 {30 b->top++;31 b->data[b->top] = c;32 }33else34 {35 resultval = abyunsuan(a,b); //否则a的前两个出栈,b的栈顶出栈,然后进⾏运算,运算结果再进栈a;36 y = youxianquan(b->data[b->top]); //继续判断表达式第i个值的优先级是否⼤于栈顶符号的优先级37if(x > y) //如果当前优先级⼤于栈顶优先级,则进栈38 {39 b->top++;40 b->data[b->top] = c;41 }42else//否则重复上⾯的操作对a的前两个出栈值和b的栈顶出栈并且运算43 {44 resultval = abyunsuan(a,b);45//由于每次循环都会对b的栈顶符号的优先级做对⽐,所以优先级的对⽐只做⼀次即可46 b->top++; //把当前的符号进b栈47 b->data[b->top] = c;48 }49 }50 }51 }52while(i == n - 1 && a->top != -1 && b->top != -1) //当运算符输⼊完时53 {54 resultval = abyunsuan(a,b);55 }56 }57return resultval;58 }1//a出栈两个值 b出栈栈顶运算符,进⾏运算2int abyunsuan(SeqStack *a, SeqStackchar *b)3 {4int fir,sec,resultval;5char topchar;6 fir = a->data[a->top];7 a->top--;8 sec = a->data[a->top];9 a->top--;10 topchar = b->data[b->top]; //b的栈顶出栈11 b->top--;12 resultval = yunsuan(sec,fir,topchar);13 a->top++;14 a->data[a->top] = resultval;15return(resultval);16 }全部代码如下:1 #include<stdio.h>2 #include<stdlib.h>3 #include<string.h>45#define MAXSIZE 102467//定义存储整型的栈8 typedef struct node9 {10int data[MAXSIZE];11int top;12 }SeqStack;13//定义存储字符型的栈14 typedef struct nodeb15 {16char data[MAXSIZE];17int top;18 }SeqStackchar;1920//创建整型栈21 SeqStack *creat_sa()22 {23 SeqStack *s;24 s = (SeqStack *)malloc(sizeof(SeqStack));25 s->top = -1;26return(s);27 }28//创建字符串栈29 SeqStackchar *creat_sb()30 {31 SeqStackchar *s;32 s = (SeqStackchar *)malloc(sizeof(SeqStackchar));33 s->top = -1;34return(s);35 }3637//函数声明38int youxianquan(char c);39int yunsuan(int a, int b, char c);40int result(SeqStack *a, SeqStackchar *b);41int abyunsuan(SeqStack *a, SeqStackchar *b);4243//获取优先级44int youxianquan(char c)45 {46int x;47switch(c)48 {49case'-':50case'+':51 x = 1;52break;53case'*':54case'/':55 x = 2;56break;57default: printf("error");58 }59return(x);60 }6162//开始运算63int yunsuan(int a, int b, char c)64 {65int result;66switch(c)67 {68case'*':69 result = a * b;70break;71case'/':72 result = a / b;73break;74case'+':75 result = a + b;76break;77case'-':78 result = a - b;79break;80 }81return(result);82 }8384//a出栈两个值 b出栈栈顶运算符,进⾏运算85int abyunsuan(SeqStack *a, SeqStackchar *b)86 {87int fir,sec,resultval;88char topchar;89 fir = a->data[a->top];90 a->top--;91 sec = a->data[a->top];92 a->top--;93 topchar = b->data[b->top]; //b的栈顶出栈94 b->top--;95 resultval = yunsuan(sec,fir,topchar);96 a->top++;97 a->data[a->top] = resultval;98return(resultval);99 }100101//表达式求值102int result(SeqStack *a, SeqStackchar *b)103 {104char val[9] = {'4','+','4','/','2','-','9','*','3'}; //创建表达式105int i,resultval;106int x,y;107char c;108int n = sizeof(val);109for(i = 0; i < n; i++)110 {111 c = val[i]; //获取表达式第i个值112if(i%2 == 0) //把数字和符号区分开来,113 {114 a->top++;115 a->data[a->top] = c - '0'; //存放数值的116 }117else//存放符号的118 {119if(b->top == -1) //如果b为空则直接存⼊符号120 {121 b->top++;122 b->data[b->top] = c;123 }124else125 {126 x = youxianquan(c); //求出当前符号的优先级127 y = youxianquan(b->data[b->top]); //求b栈顶的符号优先级128if(x > y) //如果当前优先级⼤于栈顶优先级,则进栈129 {130 b->top++;131 b->data[b->top] = c;132 }133else134 {135 resultval = abyunsuan(a,b); //否则a的前两个出栈,b的栈顶出栈,然后进⾏运算,运算结果再进栈a;136 b->top++;137 b->data[b->top] = c;138 }139 }140 }141while(i == n - 1 && a->top != -1 && b->top != -1) //当运算符输⼊完时即当所有的字符全部输⼊完时才执⾏此循环142 {143 resultval = abyunsuan(a,b);144 }145 } //也可以把上⾯的⼀个while循环注释掉,然后加上下⾯的循环; /* while(a=>top != -1 && b->top != -1) resultval = abyunsuan(a,b); */146return resultval;147 }148149void main()150 {151 SeqStack *a;152 SeqStackchar *b;153int resultval;154 a = creat_sa(); //创建链表a155 b = creat_sb(); //创建链表b156 resultval = result(a,b);157 printf("%d",resultval);158159 }。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
湖南工学院数据结构课程设计报告
班级
学号:
姓名:
目录
1需求分析 (3)
1.1问题的提出 (3)
1.2任务与分析 (3)
2 程序运行平台 (3)
3 概要设计 (4)
3.1主要技术线路............................................................................................................ 错误!未定义书签。
3.2程序运行结构图 (4)
4 详细设计 (4)
4.1详细设计思想 (4)
4.2 本程序定义的数据结构 (5)
4.3程序运行原理图 (6)
4.4测试模块 (6)
4.5历史成绩查询模块 (7)
4.6主函数与菜单函数模块 (8)
5 调试分析 (9)
6 测试结果 (10)
7 结论 (14)
8附录 (20)
摘要
设计题目:利用栈求表达式的值,可供小学生作业,并能给出分数
主要内容:设计一个小学生自测程序,能输入一个表达式后,由学生输入结果,再与正确答案对比。
1需求分析
1.1 输入形式,数值范围
直接输入数学表达式,回车。
本程序可以使用0到9以及加减乘除等运算符包括()。
1.2 任务与分析
建立试题库文件,随机产生n个题目;题目涉及加减乘除,带括弧的混合运算;随时可以退出;保留历史分数,能回顾历史,给出与历史分数比较后的评价
2 程序运行平台
Microsoft Visual C++ 6.0
具体操作如下:
1.源程序的编辑
在Visual C++ 6.0开发环境下编辑一个简单、完整的C++程序,这是开发各种软件必须进行的软件开发过程。
2.源程序的编译、连接与运行
在Visual C++ 6.0环境下,对任务1所编辑的C++源程序进行编译、连接和运行,观察程序的执行过程和个变量的值。
3.Debug调试功能
对任务1所完成的源程序设置若干断点,掌握Visual C++ 6.0环境下断点
的设置与取消方法,在Debug调试状态下,学习程序调试的各种相关方法,并通过Debug状态下的Variable窗口和Watch装口观察成粗的执行过程和结果。
3 概要设计
3.1程序运行结构图
4 详细设计
4.1详细设计思想
首先建立三个文件,分别为shujuku.txt,markrec.txt,n_rec.txt。
其中shujuku.txt中存放试题;markrec.txt存放历史分数;n_rec.txt存放总共测试次数。
①创建试题库模块:
首先在主函数中调用创建试题库函数,将试题存入到试题库文件shitiku.txt中,然后将该调用从主函数中删除。
创建试题库函数:创建指向xuanti类型的指针,利用循环将输入的测试题该
指针的xuanti单元中,最后将该指针中的测试题写入试题库文件shitiku.txt 中。
②试题测试模块:
试题计算:建立两个栈,分别存放数字、运算符,建立一个二维数组,存放任意两个运算符之间的优先级关系,通过比较符号栈中后两个运算符的优先级关系,决定数字栈中后两个数据是直接入栈还是运算之后入栈,最后在数字栈中得到最后的运算结果。
通过比较用户输入的结果与程序计算的结果来决定测试者的分数mark是否加分,测试完成时,将分数mark写入记录分数文件markrec.txt中,并将总共的测试次数记录如n_rec.txt中。
③查看历史分数模块:
通过查看n_rec.txt中总共的测试次数n,得到markrec.txt中n个历史分数,将结果显示个用户。
④随时退出模块:
测试完或将查看历史分数后,按任意键将返回到菜单,菜单中输入0即可退出。
4.2 本程序定义的数据结构
typedef struct shiti /*定义表达式*/
{
char a[20]; /*存放表达式*/
long result; /*存放用户输入的答案*/
}xuanti;
typedef struct SqStack1 /*建立数字栈*/
{
int *base;
int *top;
int stacksize;
}SqStack1;
typedef struct SqStack2 /*建立运算符栈*/ {
char *base;
char *top;
int stacksize;
}SqStack2;
4.3程序运行原理图
测试模块的流程图为图所示:
4.5 历史成绩查询模块
历史成绩查询模块的流程图为图所示:
4.6主函数与菜单函数模块
主函数与菜单函数模块的源代码为:
void main()
{
int m=0;
int *RN;
char ch;
RN=(int *)malloc(1*sizeof(int));
RN[0]=0;
system("cls"); /*清屏*/
LookN(RN,1);
RN[0]+=m;
fflush(stdin);
menu: page_title(); /*输出菜单*/
RN[0]+=m;
m=0;
switch(getch())
{
case '1' : m=excersice_begin();
break;
case '2' : Look_Mark(RN[0]);
break;
case '0' : {
RecN(RN,1);
exit(0);
}
}
system("cls");
goto menu;}
5 调试分析
本程序定义函数较多,调试时特别注意各个函数的调用。
处学会灵活的运用F10和F11的调试功能,就能达到事半功倍的效果。
6 测试结果
6.1 开始菜单
此时选择1直接开始测试,选择2则查看历史分数,选择0退出程序。
6.2 选择1 开始测试
举例如下:
填入答案221,结果如下:
接着进行完本次测试:
做完全部题目后得出得分,并有评价给出6.3 此时选Y继续测试
选N则回到主菜单:
6.4 选择2查看历史得分及评价
本次测试结果检验了该程序的功能和效果
7 结论
对本程序的总结
自己掌握的只是不是很牢固,有很多的只是都是很模糊的,都很模棱两可的,对自己的只是不是有很大信心。
做完这个程序,发现设局结构有很多东西需要自己深入学习,翻阅资料很重要。
本次使用的工具主要是Microsoft Visual C++ 6.0
8附录。
源代码及程序见光盘。