利用栈求表达式的值,可供小学生作业,并能给出分数 数据结构课程设计说明书格式

合集下载

数据结构课程设计可选题目

数据结构课程设计可选题目

数据结构课程设计可选题目一、课程设计的目的学习数据结构与算法的最终目的是解决实际的应用问题,特别是非数值计算类型的应用问题。

课程设计要求同学独立完成一个较为完整的应用需求分析,在完成设计和编程大型作业的过程中,深化对数据结构与算法课程中基本概念、理论和方法的理解;训练综合运用所学知识处理实际问题的能力,强化面向对象的程序设计理念;使同学的程序设计与调试水平有一个明显的提高。

二、数据结构课程设计可选题目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. 飞机订票系统任务:通过此系统可以实现如下功能:⑴录入:可以录入航班情况(数据可以存储在一个数据文件中,数据结构、具体数据自定)⑵查询:可以查询某个航线的情况(如,输入航班号,查询起降时间,起飞抵达城市,航班票价,票价折扣,确定航班是否满仓);⑶可以输入起飞抵达城市,查询飞机航班情况;⑷订票:(订票情况可以存在一个数据文件中,结构自己设定)可以订票,如果该航班已经无票,可以提供相关可选择航班;⑸退票:可退票,退票后修改相关数据文件;⑹客户资料有姓名,证件号,订票数量及航班情况,订单要有编号。

算术表达式的求解-数据结构课程设计报告

算术表达式的求解-数据结构课程设计报告

算术表达式的求解-数据结构课程设计报告数据结构》课程设计报告书题目:算术表达式的求解系别:计算机科学与应用数据结构课程设计目录一、需求分析1、设计要求:本程序需要实现对算术表达式的求解功能,可以支持基本的四则运算,包括加、减、乘、除,同时还需要支持括号的使用。

2、设计构想:我们将使用栈来实现算术表达式的求解。

具体地,我们将把中缀表达式转换为后缀表达式,然后再利用栈来求解后缀表达式。

二、概要设计1、本程序包含的模块:本程序包含两个模块:中缀表达式转后缀表达式模块和后缀表达式求解模块。

三、详细设计1、定义栈结构我们定义一个栈结构,用来存储算术表达式中的运算符和操作数。

具体地,栈中的每个元素都包含两个属性:元素的值和元素的类型。

元素的值可以是一个数字或一个运算符,元素的类型可以是数字或运算符。

我们使用一个数组来实现栈的结构。

为了方便起见,我们还需要定义一些基本的栈操作,如入栈、出栈、判断栈是否为空等。

2、栈的基本操作栈是一种常见的数据结构,具有后进先出(LIFO)的特点。

栈的基本操作包括初始化栈、入栈、出栈、取栈顶元素和运算模块。

1) 初始化栈初始化栈是指将栈的各项属性设置为初始状态。

通常包括将栈顶指针设为-1,表示栈为空。

2) 入栈入栈是指将元素压入栈顶。

入栈操作需要将栈顶指针加1,并将元素存入栈顶位置。

3) 出栈出栈是指将栈顶元素弹出。

出栈操作需要将栈顶元素取出,并将栈顶指针减1.4) 取栈顶元素取栈顶元素是指获取栈顶元素的值,但不将其弹出。

取栈顶元素操作只需要返回栈顶元素的值即可。

5) 运算模块栈可以用于实现各种运算,例如中缀表达式的转换和计算、括号匹配等。

运算模块需要根据具体需求进行设计和实现。

3、判断运算符的优先级在进行中缀表达式的转换和计算时,需要判断运算符的优先级。

通常采用栈来实现这一功能。

具体实现方法是将运算符入栈,当遇到新的运算符时,将其与栈顶运算符进行比较,如果新运算符的优先级高于栈顶运算符,则将其入栈,否则将栈顶运算符弹出并输出,直到新运算符可以入栈为止。

利用栈求表达式的值,可供小学生作业,并能给出分数 数据结构课程设计说明书格式

利用栈求表达式的值,可供小学生作业,并能给出分数 数据结构课程设计说明书格式

中北大学数据结构课程设计说明书2011年12月20日1.设计任务概述(包括系统总体框图及功能描述)此课题是研究表达式求值的问题,以帮助小学生完成测试。

为了达到这个功能,实际我们要做的就是出题,和计算分数给出评价的工作.整体设计都是以这个要求为轴心进行的。

为了直观和方便,现画出软件整体设计模块图。

整体设计模块图可以清晰的看出软件的几大模块。

整个系统的操作流程图可以看出操作的整体流程,如下图2。

本设计所采用的数据结构(如:链表、栈、树、图等)根据以上功能说明,设计运算信息,堆栈的存储结构,设计程序完成功能;3. 功能模块详细设计在此说明每个部分的算法设计说明(可以是描述算法的流程图),每个程序中使用的存储结构设计说明(如果指定存储结构请写出该存储结构的定义).3。

1 详细设计思想学生要进行测试,首先要有试题。

那么我们就要先建立试题库。

这个试题库的试题是我们在程序运行过程中手动输入,存放在一个shujuku.txt的文件中.首先在主函数中调用创建试题库函数,将试题存入到试题库文件shitiku.txt中,然后将该调用从主函数中删除。

创建试题库函数:创建指向xuanti类型的指针,利用循环将输入的测试题该指针的xuanti 单元中,最后将该指针中的测试题写入试题库文件shitiku.txt中.3。

2 核心代码(正文宋体小四号字,1。

5倍行距)#include 〈stdio.h〉#include 〈stdlib。

h>#include 〈time。

h〉#include<string.h>#include <conio.h>#define STACK_INIT_SIZE 100#define STACKINCREMENT 10#define ERROR 0#define OK 1//定义表达式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;void WriteToFile(xuanti *pstu,int num);void ReadFromFile(xuanti *pstu,int num);void page_title(char *menu_item){//建立菜单printf(”〉〉〉数学习题库〈〈<\n\n— %s -\n\n",menu_item); }void return_confirm(){printf(”\n按任意键返回……\n");getch();}void IntInitStack(SqStack1 *S1){S1->base=(int *)malloc(STACK_INIT_SIZE*sizeof(int));if(!S1—〉base)exit(ERROR);S1—〉top=S1—〉base;S1->stacksize=STACK_INIT_SIZE;}//IntInitStackvoid CharInitStack(SqStack2 *S2){S2->base=(char *)malloc(STACK_INIT_SIZE*sizeof(char)); if(!S2—〉base)exit(ERROR);S2—>top=S2—〉base;S2—〉stacksize=STACK_INIT_SIZE;}//CharInitStacklong IntGetTop(SqStack1 *S1){ //取栈顶元素long e1;if((*S1).top==(*S1)。

《算法设计综合实训》题目讲解

《算法设计综合实训》题目讲解

算法设计综合实训题目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之间的一个整数。

数据结构课程设计报告-表达式求值

数据结构课程设计报告-表达式求值

《数据结构》课程设计利用栈求表达式的值班级: 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)。

数据结构课程设计说明书

数据结构课程设计说明书

车厢调度问题摘要:实现栈的基本操作,即实现类型。

程序对栈的任何存取,即更改,读取和状态判别等操作,必须借助于基本操作。

在操作过程中的任何状态下都有两种可能的操作:“入”“出”。

每个状态下处理问题的方法都是相同的,具有递归特性。

关键字:栈递归打印0.引言《数据结构》是计算机科学与技术、软件工程及相关学科的专业基础课,也是软件设计的技术基础。

《数据结构》课程的教学要求之一是训练学生进行复杂的程序设计的技能和培养良好程序设计的风格,其重要程度决不亚于理论知识的传授,因此课程设计环节是一个至关重要的环节,是训练学生从事工程科技的基本能力,是培养创新意识和创新能力的极为重要的环节。

基本要求如下:(1) 熟练掌握基本的数据结构;(2) 熟练掌握各种算法;(3) 运用高级语言编写质量高、风格好的应用程序。

1.需求分析(1)这个实验要求我用栈实现车厢调度.(2)车厢的个数是由用户输入的.(3)程序会自动给车厢进行从1到 n的编号.(4)用户输入车厢个数后,程序打印出所有可能的车厢出站顺序.2.数据结构设计在这个程序中存储结构是栈,对于栈的声明和定义如下:typedef struct SqStack{int *top; /*栈顶指针*/int *base;/*在栈构造之前和销毁之后.base的值为NULL*/int stacksize; /*当前分配的存储空间*/}SqStack; /*顺序栈的结构体声明和定义*/3.算法设计3.1 对算法的简单描述这个实验中, 要求用到栈. 实现栈的基本操作,即实现类型。

程序对栈的任何存取(即更改,读取和状态判别等操作)必须借助于基本操作。

在操作过程中的任何状态下都有两种可能的操作:“入”“出”。

每个状态下处理问题的方法都是相同的,具有递归特性。

栈实现是方便的无论如何调度,我们的操作都是入栈和出栈,设定入栈为1,出栈为-1,对n列车厢有2n次这样的操作,例如n=4,则有操作1111-1-1-1-1、1-11-11-11-1等.所以还要构造一个操作命令队列trainlist[]。

利用栈求表达式的值课程设计最后老师改 - 副本

利用栈求表达式的值课程设计最后老师改 - 副本

课程设计课程名称数据结构题目名称利用栈求表达式的值专业班级2014级网络工程(1)班学生姓名学号指导教师二○一六年六月十五日蚌埠学院计算机科学与技术系课程设计任务书蚌埠学院计算机科学与技术系本科课程设计成绩评定表目录1 概述 (6)1.1题目要求 (6)1.2输入要求 (6)1.3输出要求 (6)1.4实现要求 (7)2.需求分析 (8)2.1要求 (8)2.2任务描述 (8)2.3运行环境 (9)2.4开发工具 (9)3.总体设计 (10)3.1设计任务与目标 (10)3.2程序中的功能函数: (10)3.3方案设计与论证 (11)4算法说明 (12)4.1主要功能函数 (12)4.2函数间的调用关系 (13)4.4数据结构设计 (16)5 程序运行 (18)6 总结 (27)参考文献 (29)程序源代码 (30)1 概述栈是计算机中常用的一种数据结构,具有广泛的使用。

利用栈的性质及其操作原理编写一个使用栈计算表达式的程序有助于更好的掌握栈的使用规则和原理应用。

《数据结构课程设计》是理解和掌握数据结构的重要环节,主要任务是实现各种数据组织中的数据逻辑结构、存储结构以及有关操作的算法。

使学生学会分析研究计算机加工的数据结构的特性,以便为应用涉及的数据选择适当的逻辑结构、存储结构及相应的算法。

另一方面,通过团队合作、文档编制、主页设计等环节对学生进行全方位的训练,最终达到培养学生的数据抽象能力和软件设计的能力。

通过全部过程培养和锻炼学生的钻研能力、动手能力、分析问题和解决问题的实际能力。

1.1题目要求(1)按照分析、设计、编码、调试、测试的软件过程完成这个应用程序。

(2)为各项操作功能设计一个菜单,应用程序运行后,先显示这个菜单,然后用户通过菜单项选择希望进行的操作项目。

1.2输入要求(1)应用程序运行后在屏幕上显示一个菜单。

用户可以根据需求,选定相应的操作项目。

进入每个操作后,根据应用程序的提示信息,从键盘输入相应的信息。

(完整word版)利用栈求表达式的值

(完整word版)利用栈求表达式的值

数据结构课程设计姓名:王宗敏班级:软件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)姓名王昕学号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用相应的函数。

关于栈的课程设计

关于栈的课程设计

关于栈的课程设计一、教学目标本节课的教学目标是让学生了解栈的基本概念、性质和应用,掌握栈的两种基本操作:入栈和出栈,能够使用栈解决一些实际问题,如逆序输出一个数列、判断一个数是否是回文数等。

在知识目标的基础上,培养学生逻辑思维能力、动手能力和问题解决能力。

情感态度价值观目标则是培养学生对计算机科学和编程的兴趣,增强学生自信心,培养合作精神和创新精神。

二、教学内容本节课的教学内容主要包括栈的定义和性质、栈的基本操作、栈的应用。

首先,介绍栈的基本概念,让学生理解栈是一种后进先出(LIFO)的数据结构。

然后,讲解栈的两种基本操作:入栈和出栈,并通过示例让学生掌握这两种操作的实现。

接着,介绍栈的应用,如逆序输出一个数列、判断一个数是否是回文数等,让学生学会使用栈解决实际问题。

三、教学方法本节课采用讲授法、案例分析法和实验法相结合的教学方法。

首先,通过讲授法向学生介绍栈的基本概念、性质和应用。

然后,通过案例分析法,分析实际问题,引导学生学会使用栈解决问题。

最后,通过实验法,让学生动手实现栈的基本操作,巩固所学知识。

四、教学资源本节课的教学资源主要包括教材、多媒体资料和实验设备。

教材为学生提供了栈的基本概念、性质和应用的相关知识。

多媒体资料包括图片、动画和视频,用于辅助讲解栈的基本概念和性质,使抽象的知识更直观、易懂。

实验设备包括计算机和编程环境,让学生能够动手实现栈的基本操作,提高实际操作能力。

五、教学评估本节课的评估方式包括平时表现、作业和考试三个部分。

平时表现主要评估学生在课堂上的参与程度、提问回答等情况,占总评的30%。

作业包括课后练习和编程任务,占总评的40%。

考试为课堂上的实时编程测试,占总评的30%。

这种评估方式能够全面反映学生的学习成果,同时也能够激励学生在课堂上更加积极参与。

六、教学安排本节课的教学安排如下:第一节课讲解栈的基本概念和性质,时间为40分钟;第二节课讲解栈的基本操作,时间为40分钟;第三节课进行案例分析和实验操作,时间为60分钟。

数据结构课程设计说明书(表达式求值)

数据结构课程设计说明书(表达式求值)

**大学数据结构课程设计说明书学生姓名:***学号: **********学院: **********学院专业: 网络工程题目: 利用栈求表达式的值成绩指导教师******2009 年 7 月 9 日1.设计目的数据结构课程设计的目的是,通过设计掌握数据结构课程中学到的基本理论和算法并综合运用于解决实际问题中,它是理论与实践相结合的重要过程。

设计要求学会如何对实际问题定义相关数据结构,并采用恰当的设计方法和算法解决问题,同时训练学生进行复杂程序设计的技能和培养良好的程序设计习惯。

2.设计内容和要求利用栈求解表达式的值。

设计内容:1)建立试题库文件,随机产生n个题目;2)题目涉及加减乘除,带括弧的混合运算;3)利用栈求解表达式的值;4)随时可以退出;5)保留历史分数,能回顾历史,给出与历史分数比较后的评价基本要求:1)系统功能的完善;2)代码中有必要的注释3.本设计所采用的数据结构栈的数组表示方法(静态分配整型指针)typedef struct{typedef data[MAXSIZE];int top;};4.功能模块详细设计1.功能一:中缀表达式转化为后缀表达式;2.功能二:后缀表达式求值;3.功能三:文件读写;4.功能四:作业评分;5.功能五:历史成绩本次成绩比较;6.功能六:输入“~”符号退出程序4.1 详细设计思想1.首先实现表达式的求值:要用栈求解一个表达式,就要将这个表达式翻译成正确求值的一个机器指令序列,即正确解释表达式,了解算术四则混合运算的规则:(1).先乘除,后加减;(2).从左算到右;(3).先括号内,后括号外再根据这个运算优先的规定来实现对表达式的编译或解释执行.任何一个表达式都是由操作数(st)和操作符(op)组成的,根据四则运算基本法则,在运算的每一步中,任意两个相继出现的操作符op1和op2之间的优先关系最多有以下3种:(1).op1的优先级低于op2(2).op1的优先级等于op2(3).op1的优先级小于op2为实现运算符优先,可以使用两个操作栈,操作栈st,用于存放操作数及运算结果;操作栈op,用于存放操作符。

课程设计任务书6-栈的应用算法设计与实现

课程设计任务书6-栈的应用算法设计与实现
注:可以附页
2、撰写课程设计说明书一份,不少于2000字。课程设计说明书应包括封面、任务书、程序代码)等内容。
三、进程安排
12月30日:进行需求分析,确定系统的主要功能和算法思路;
12月31日~1月2日:进行详细设计,确定各模块的算法思路;
1月3日~1月6日:进行编码实现;
数据结构课程设计任务书
一、设计题目、内容及要求
1、设计题目:栈的应用算法设计与实现。
2、设计内容及要求:
(1)实现栈的基本操作,如进栈、出栈、判栈空等。
(2)实现栈的三种应用算法,如数值转换、表达式求值、括号匹配、文本编辑、迷宫求解等应用。
二、要求的设计成果(课程设计说明书、设计实物、图纸等)
1、用C语言进行程序设计,实现程序的功能。注重算法效率,代码要有适当的注释;
1月7日~1月9日:进行测试调试,完善设计;撰写设计说明书,准备答辩;
1月10日:答辩。
四、主要参考资料
1.严蔚敏,吴伟民.数据结构.清华大学出版社,2007.
2.苏仕华.数据结构课程设计.机械工业出版社,2010.
3.滕国文.数据结构课程设计.清华大学出版社,2010.
指导教师(签名):
教研室主任(签名):

数据结构教案设计说明模板

数据结构教案设计说明模板

一、教学目标1. 知识与技能目标:(1)使学生掌握数据结构的基本概念和分类。

(2)使学生了解常见的数据结构,如线性表、栈、队列、树、图等。

(3)使学生能够运用所学知识解决实际问题。

2. 过程与方法目标:(1)培养学生分析问题和解决问题的能力。

(2)提高学生的逻辑思维和编程能力。

3. 情感态度与价值观目标:(1)激发学生对数据结构学习的兴趣。

(2)培养学生严谨、求实的科学态度。

二、教学重难点1. 教学重点:(1)数据结构的基本概念和分类。

(2)线性表、栈、队列、树、图等常见数据结构的特点和操作。

2. 教学难点:(1)复杂的数据结构(如树、图)的存储结构和算法设计。

(2)数据结构的实际应用。

三、教学过程1. 导入新课(1)通过实例引入数据结构的概念,让学生了解数据结构在计算机科学中的重要性。

(2)简要介绍数据结构的分类。

2. 讲授新课(1)线性表:- 线性表的定义、特点、存储结构(顺序存储、链式存储)。

- 线性表的基本操作:插入、删除、查找、排序等。

(2)栈和队列:- 栈的定义、特点、存储结构(顺序存储、链式存储)。

- 栈的基本操作:入栈、出栈、判断栈空、求栈顶元素等。

- 队列的定义、特点、存储结构(顺序存储、链式存储)。

- 队列的基本操作:入队、出队、判断队空、求队头元素等。

(3)树和图:- 树的定义、特点、存储结构(顺序存储、链式存储)。

- 树的基本操作:遍历、查找、插入、删除等。

- 图的定义、特点、存储结构(邻接矩阵、邻接表)。

- 图的基本操作:遍历、查找、求最短路径等。

3. 课堂练习(1)针对所学知识,布置相关练习题,让学生巩固所学内容。

(2)组织学生进行小组讨论,培养学生的团队协作能力。

4. 课堂小结(1)回顾本节课所学内容,总结数据结构的基本概念、常见数据结构的特点和操作。

(2)强调重点、难点,提出课后作业。

5. 课后作业(1)完成课后习题,巩固所学知识。

(2)结合实际案例,分析数据结构在实际应用中的优势。

课程设计之利用栈求值

课程设计之利用栈求值

课程设计之利用栈求值一、教学目标本节课的学习目标为:知识目标:学生需要掌握栈的基本概念,了解栈的性质和用途,理解栈的操作原理。

技能目标:学生能够运用栈解决基本的计算问题,例如逆波兰表达式的求值。

情感态度价值观目标:通过解决实际问题,激发学生对计算机科学的兴趣,培养学生的逻辑思维能力和创新精神。

二、教学内容本节课的教学内容主要包括:1.栈的定义和性质:介绍栈的基本概念,解释栈的先进后出(FILO)特性。

2.栈的操作:讲解栈的压入(push)和弹出(pop)操作,以及栈的遍历。

3.逆波兰表达式:介绍逆波兰表达式的概念,解释其与栈的关系。

4.利用栈求值:引导学生运用栈来求解逆波兰表达式,培养学生的实际操作能力。

三、教学方法为了提高教学效果,本节课将采用以下教学方法:1.讲授法:讲解栈的基本概念、性质和操作。

2.案例分析法:通过分析具体的逆波兰表达式求值实例,引导学生掌握利用栈解决问题的一般方法。

3.实验法:安排课堂练习,让学生亲自动手操作,验证所学知识。

4.讨论法:学生进行小组讨论,分享学习心得,互相解答疑问。

四、教学资源为了支持教学内容的传授和教学方法的实施,我们将准备以下教学资源:1.教材:提供相关章节,为学生提供理论知识的学习依据。

2.多媒体资料:制作课件,以图文并茂的形式展示栈的概念和操作。

3.实验设备:提供计算机及相关设备,让学生进行课堂练习。

4.在线资源:推荐相关的学习和论坛,方便学生课后自主学习和交流。

五、教学评估本节课的评估方式包括:1.平时表现:观察学生在课堂上的参与程度、提问回答等情况,了解学生的学习态度和理解程度。

2.作业:布置相关的练习题,评估学生对栈知识掌握的情况。

3.考试:安排一次课堂小测,测试学生对逆波兰表达式求值的掌握程度。

评估方式应客观、公正,能够全面反映学生的学习成果。

通过评估,教师可以了解学生的学习情况,及时进行教学调整。

六、教学安排本节课的教学安排如下:1.进度:按照教材的章节顺序,逐步讲解栈的知识点和逆波兰表达式的求值方法。

利用栈求表达式的值,可供小学生作业,并能给出分数

利用栈求表达式的值,可供小学生作业,并能给出分数

//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;}。

数据结构课程设计之利用栈求表达式的值

数据结构课程设计之利用栈求表达式的值

**大学数据结构课程设计报告题目:利用栈求表达式的值院(系):计算机工程学院学生姓名:班级:学号:起迄日期: 2011、6、30指导教师:20XX—20XX年度第 2 学期一、需求分析1、从键盘上输入表达式。

2、分析该表达式是否合法:(1)是数字,则判断该数字的合法性。

若合法,则压入数据到堆栈中。

(2)是规定的运算符,则根据规则进行处理。

在处理过程中,将计算该表达式的值。

(3)若是其它字符,则返回错误信息。

3、若上述处理过程中没有发现错误,则认为该表达式合法,并打印处理结果。

程序中应主要包含下面几个功能函数:void initstack():初始化堆栈int Make_str():语法检查并计算int push_operate(int operate):将操作码压入堆栈int push_num(double num):将操作数压入堆栈int procede(int operate):处理操作码int change_opnd(int operate):将字符型操作码转换成优先级int push_opnd(int operate):将操作码压入堆栈int pop_opnd():将操作码弹出堆栈int caculate(int cur_opnd):简单计算+,-,*,/double pop_num():弹出操作数二、概要设计1.定义一个expression全局表达式结构体expr[1000]存放计算过的表达式(expstr[MAXSIZE])和计算结果(result)、一个计量器(i)、一个表达式字符串、一个操作码栈和一个操作数栈;2.把表达式字符串从头到尾逐一扫描,将输入的表达式进行语法检查;3.第一个字符只能是数字或“(”,最重一个字符只能是“=”;4.表达式括号必须配对,中间不能出现“=”;5.在“(”前面只能是“+、-、*、/、( ”,在“+、-、*、/、=、)”前面只能是数字或“)”;6.把表达式字符串从头到尾逐一扫描,直到表达式扫描完毕,操作码栈为空;7.把字符根据运算优先级别选择操作;8.把表达式中的数值部分字符串转成数值压入操作数栈;9.是“(”直接压入到操作码栈,级别比操作码栈顶元素高的,把运算符压入操作码栈;10.级别比操作码栈低的,弹出操作码栈的栈顶元素和操作数栈的两个栈顶元素,进行运算后再压入操作数栈;11.是“)”,若操作码栈顶是“(”,把弹出操作码栈顶元素,否则“)”视为级别最低的元素,重复7;12.最后计算出结果并将其存放在expr[i],计量器加1;13.重复计算后,将结果保存在文件里,并统计计算次数;14.查看多次计算结果,以表形式输出;15.查看本次计算记录,以表形式输出;清除计算记录,重新计算三、详细设计(一)程序总共有如下函数:主要函数:void start(opnd *op,num *nu)//程序主菜单void start2(opnd *op,num *nu)//第二层计算选择,子菜单void load()//显示所有计算记录void save()//保存计算结果void check()//显示本次计算结果void result(opnd *op,num *nu)//计算结果double caculate(opnd *op,num *nu)//简单计算+,-,*,/表达式处理函数:int make_str()//语法检查double change_num(char str[])//数字字符串转成double型数字char procede(char top,char code)//处理操作码,判断栈的操作int change_opnd(char code)//字符型操作码转换优先级,非表达式字符返回-2 栈操作函数:double get_num(num *nu)//查看操作数栈栈顶double pop_num(num *nu)//操作数栈出栈int push_num(num *nu,double da)//压入操作数栈int empty_num(num *nu)//判空void initstack(num *nu)char get_opnd(opnd *op)//查看栈顶char pop_opnd(opnd *op)//出栈int push_opnd(opnd *op,char co)//压栈int empty_opnd(opnd *op)//判空void initstack(opnd *op)//初始化栈(二)函数间的调用关系:●main():主函数→start();↗load() →start();●start()程序模式函数→清空文件→exit();↘make_str()→result(op,nu)→start2()→start();↗load →start();●start2()子菜单→save() →start2();↘check() →start2();●result(op,nu)计算结果→initstack(op) →initstack(nu) →push_opnd(op,'=') →↗push_num(nu,change_num(str2));→change_opnd(*ps) ↗push_opnd(op,*ps);↘procede(get_opnd(op),*ps) →pop_opnd(op);↘push_num(nu,caculate(op,nu)) ●caculate(op,nu)→b=pop_num(nu) →a=pop_num(nu) →pop_opnd(op)✓ main()函数:调用了一个函数start(),start()判断执行查看所有计算记录函数load(),或是清空以往的所有计算记录,或是退出程序,或是检查输入表达式语法make_str()并计算表达式result(op,nu)的操作。

数据结构课程设计说明(样板)

数据结构课程设计说明(样板)

数据结构课程设计说明(样板)摘要{在这部分内容中要以不超过300个字数的语言,向读者介绍本设计的设计内容、设计方法及设计效果。

书写中不能用第一人称,如我、我们做了什么……或本文论述了……等口气写作。

以下的黑色字的内容作为一个写作参考}设计了一个计算器软件,该计算器具有简单的四则运算以及复杂的数学表达式运算的功能。

本计算器采用VC++作为软件开发环境,采用算数表达式处理算法来实现了加、减、乘、.除四则混合运算。

操作简单,界面清晰,易于为用户所接受。

关键词:计算器; 表达式;函数(关键词部分一般采用三到五个在本篇文章中作用和地位比较重要的词汇)目录1 课题描述 ........................................................................... ............................................................ 2 2 问题分析和任务定义 ........................................................................... ........................................ 3 3 逻辑设计 ........................................................................... ............................................................ 4 4 详细设计 ........................................................................... ............................................................ 5 5 程序编码 ........................................................................... ............................................................ 6 6 程序调试与测试 ........................................................................... ................................................ 7 7 结果分析 ........................................................................... ............................................................ 8 8 总结............................................................................ ................................................................... 9 参考文献 ........................................................................... .. (10)1 课题描述{这部分根据设计任务书中的内容和要求阐述这次设计的内容、目的、要实现的功能和最后要达到的目标,作一个总括的描述}第2页共11页2 问题分析和任务定义{这部分的写作是根据设计题目的要求,充分地分析和理解问题,明确问题要求做什么?[而不是怎么做] 限制条件是什么?}第3页共11页3 逻辑设计{对问题描述中涉及的操作对象定义相应的数据类型,并按照以数据结构为中心的原则划分模块,定义主程序模块和各抽象数据类型。

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

中北大学数据结构课程设计说明书2011年12月20日1. 设计任务概述(包括系统总体框图及功能描述)此课题是研究表达式求值的问题,以帮助小学生完成测试。

为了达到这个功能,实际我们要做的就是出题,和计算分数给出评价的工作。

整体设计都是以这个要求为轴心进行的。

为了直观和方便,现画出软件整体设计模块图。

整体设计模块图可以清晰的看出软件的几大模块。

整个系统的操作流程图可以看出操作的整体流程,如下图2.根据以上功能说明,设计运算信息,堆栈的存储结构,设计程序完成功能;3. 功能模块详细设计在此说明每个部分的算法设计说明(可以是描述算法的流程图),每个程序中使用的存储结构设计说明(如果指定存储结构请写出该存储结构的定义)。

3.1 详细设计思想学生要进行测试,首先要有试题。

那么我们就要先建立试题库。

这个试题库的试题是我们在程序运行过程中手动输入,存放在一个shujuku.txt的文件中。

首先在主函数中调用创建试题库函数,将试题存入到试题库文件shitiku.txt中,然后将该调用从主函数中删除。

创建试题库函数:创建指向xuanti类型的指针,利用循环将输入的测试题该指针的xuanti单元中,最后将该指针中的测试题写入试题库文件shitiku.txt中。

3.2 核心代码(正文宋体小四号字,1.5倍行距)#include <stdio.h>#include <stdlib.h>#include <time.h>#include<string.h>#include <conio.h>#define STACK_INIT_SIZE 100#define STACKINCREMENT 10#define ERROR 0#define OK 1//定义表达式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;void WriteToFile(xuanti *pstu,int num);void ReadFromFile(xuanti *pstu,int num);void page_title(char *menu_item){//建立菜单printf(">>> 数学习题库<<<\n\n- %s -\n\n",menu_item);}void return_confirm(){printf("\n按任意键返回……\n");getch();}void IntInitStack(SqStack1 *S1){S1->base=(int*)malloc(STACK_INIT_SIZE*sizeof(int)) ;if(!S1->base)exit(ERROR);S1->top=S1->base;S1->stacksize=STACK_INIT_SIZE;}//IntInitStackvoid CharInitStack(SqStack2 *S2){S2->base=(char*)malloc(STACK_INIT_SIZE*sizeof(char ));if(!S2->base)exit(ERROR);S2->top=S2->base;S2->stacksize=STACK_INIT_SIZE;}//CharInitStacklong IntGetTop(SqStack1 *S1){ //取栈顶元素long e1;if((*S1).top==(*S1).base)return 0;e1=*((*S1).top-1);return e1;}//IntGetTopchar CharGetTop(SqStack2 *S2){ //取栈顶元素char e2;if((*S2).top==(*S2).base) return 0;e2=*((*S2).top-1);return e2;}//IntGetTopint IntPush(SqStack1 *S1,int e1){//入栈*(*S1).top++=e1;return OK;}//IntPushint CharPush(SqStack2 *S2,char e2) {//入栈*(*S2).top++=e2;return OK;}//CharPushint IntPop(SqStack1 *S1){//出栈int e1;if((*S1).top==(*S1).base)return 0;e1=*--(*S1).top;return e1;}//IntPopint CharPop(SqStack2 *S2){//出栈char e2;if((*S2).top==(*S2).base) return 0;e2=*--(*S2).top;return e2;}//CharPopchar Precede(char a,char b){int i,j;char Table[8][8]={ ' ','+','-','*','/','(',')','#','+','>','>','<','<','<','>','>','-','>','>','<','<','<','>','>','*','>','>','>','>','<','>','>','/','>','>','>','>','<','>','>','(','<','<','<','<','<','=',' ',')','>','>','>','>',' ','>','>','#','<','<','<','<','<',' ','=', }; //优先级表格for(i=0;i<8;i++)if(Table[0][i]==a) //纵坐标寻找break;for(j=0;j<8;j++) //横坐标寻找if(Table[j][0]==b)break;return Table[j][i];}//Precedeint Operate(int a,char theta,int b){ //计算表达式值:主要是将大的表达式转化成小的表达式进行逐步求值int c;if(theta=='+') c=a+b;else if(theta=='-') c=a-b;else if(theta=='*') c=a*b;else c=a/b;return c;}//Operateint IsOptr(char ch){char ptr[10]={'+','-','*','/','(',')','#'};for(int i=0;i<7;i++){if(ch==ptr[i])return true;}return false;}long result(char *a,SqStack1 *OPND,SqStack2 *OPTR){//求值char theta;int b,d,k=0,i=0,j=0,num2=0;IntInitStack(OPND);CharInitStack(OPTR);CharPush(OPTR,'#');while(a[i]!='='){if(!IsOptr(a[i])){k++;if(k<=j){num2=(int(a[i])-48);i++;}if(k>j){num2=num2*10+(int(a[i])-48);k=j=0;i++;}if(!IsOptr(a[i]))k++;if(k==j)IntPush(OPND,num2);}else if(IsOptr(a[i])){switch(Precede(a[i],CharGetTop(OPTR) )){case'<':CharPush(OPTR,a[i++]);if(a[i]!='('&&a[i]!=')')j++;break;case'=':CharPop(OPTR);i++;break;case'>':theta=CharPop(OPTR);d=IntPop(OPND);b=IntPop(OPND);IntPush(OPND,Operate(b,theta,d));break;}//switch} //else if}//whileprintf("表达式的正确结果为:");printf("%d\n",IntGetTop(OPND));return (IntGetTop(OPND));}//reslutvoid Built_shitiKu(){int i,num;xuanti *pstu;printf("输入试题数目:\n");scanf("%d",&num);fflush(stdin);pstu=(xuanti*)malloc(num*sizeof(xuanti));//动态分配内存if(pstu==NULL){printf("没有足够的内存空间!\n");return;}for(i=0;i<num;i++){//输入试题printf("第%d道试题:",i+1);gets(pstu[i].a);fflush(stdin);printf("\n");}WriteToFile(pstu,num);//将pstu所指向的学生信息写入文件中memset(pstu,0,num*sizeof(xuanti));//将pstu所指向的内存块清0ReadFromFile(pstu,num);//从文件中读取学生信息到pstu所指向的内存块中printf("试题列表:\n");for(i=0;i<num;i++){//输入试题printf("第%d道试题:",i+1);printf("%s",pstu[i].a);printf("\n");}free(pstu);//释放动态分配的内存}void WriteToFile(xuanti *pstu,int num){//将pstu所指向的试题息写入文件shitiku.txt中FILE *fp;fp=fopen("shitiku.txt","at");{printf("不能创建shitiku.txt\n");free(pstu);exit(0);}fwrite(pstu,sizeof(xuanti),num,fp);fclose(fp);}void ReadFromFile(xuanti *pstu,int num){//从试题库中提取试题FILE *fp;fp=fopen("shitiku.txt","rt");if(fp==NULL){printf("不能打开shitiku.txt\n");free(pstu);exit(0);}fread(pstu,sizeof(xuanti),num,fp);fclose(fp);}//******************************************void RecMark(int *m,int num){//把得分记录到markrec.txt中FILE *mp;mp=fopen("markrec.txt","at");{printf("不能创建markrec.txt\n");free(m);exit(0);}fwrite(m,sizeof(int),num,mp);fclose(mp);}//Recmarkvoid LookMark(int *m,int num){//查看得分记录FILE *mp;mp=fopen("markrec.txt","rt");if(mp==NULL){printf("不能打开markrec.txt\n");free(m);exit(0);}fread(m,sizeof(int),num,mp);fclose(mp);}//*************************************void RecN(int *m,int num){//把m的值记录到n_rec.txt中FILE *mp;mp=fopen("n_rec.txt","wt");if(mp==NULL){printf("不能创建n_rec.txt\n");free(m);exit(0);}fwrite(m,sizeof(int),num,mp);fclose(mp);}//Recmarkvoid LookN(int *m,int num){//查看m的值FILE *mp;mp=fopen("n_rec.txt","rt");if(mp==NULL){printf("不能打开n_rec.txt\n");free(m);exit(0);}fread(m,sizeof(int),num,mp);fclose(mp);}//*************************************int excersice_begin(){int i, j, temp, KEY[20];int mark,count=0;int *Mark;char g;SqStack1 s1,*OPND;SqStack2 s2,*OPTR;xuanti *XT;OPND=&s1;OPTR=&s2;Mark=(int*)malloc(20*sizeof(int));XT=(xuanti*)malloc(20*sizeof(xuanti));ReadFromFile(XT,20);do{mark=0;srand((unsigned)time(NULL));KEY[0] = rand()%20;for(i=1;i<20;i++){while(1){temp = rand()%20;for(j=0;j<i;j++){if(KEY[j]==temp)break;}if(j==i){KEY[i]=temp;break;}}}system("cls");printf("随机的10个练习题:\n");for(i=0;i<10;i++){printf("第%d个练习题:",i+1);printf("%s\n",XT[KEY[i]].a);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("成绩不错。

相关文档
最新文档