利用栈求表达式的值,可供小学生作业,并能给出分数数据结构课程设计说明书格式
数据结构课程设计可选题目
数据结构课程设计可选题目一、课程设计的目的学习数据结构与算法的最终目的是解决实际的应用问题,特别是非数值计算类型的应用问题。
课程设计要求同学独立完成一个较为完整的应用需求分析,在完成设计和编程大型作业的过程中,深化对数据结构与算法课程中基本概念、理论和方法的理解;训练综合运用所学知识处理实际问题的能力,强化面向对象的程序设计理念;使同学的程序设计与调试水平有一个明显的提高。
二、数据结构课程设计可选题目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、判断运算符的优先级在进行中缀表达式的转换和计算时,需要判断运算符的优先级。
通常采用栈来实现这一功能。
具体实现方法是将运算符入栈,当遇到新的运算符时,将其与栈顶运算符进行比较,如果新运算符的优先级高于栈顶运算符,则将其入栈,否则将栈顶运算符弹出并输出,直到新运算符可以入栈为止。
数据结构课程设计报告-表达式求值
《数据结构》课程设计利用栈求表达式的值班级: 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)。
利用栈求表达式的值,可供小学生作业,并能给出分数 数据结构课程设计说明书格式
中北年夜学之迟辟智美创作数据结构 课程设计说明书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;}//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)FILE *fp;fp=fopen("shitiku.txt","at");if(fp==NULL){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)FILE *mp;mp=fopen("markrec.txt","at");if(mp==NULL){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)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);}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{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("成果不错.\n");else printf("很遗憾成果不及格!\n");printf("\n");RecMark(Mark,count);Mark[count]=mark;count++;//记录次数递增printf("是否继续做练习?('y'—是,'n'—否):"); g=getchar();fflush(stdin);printf("\n");if(count>=20)//超越最年夜记录次数清0count=0;}while(g=='y');RecMark(Mark,count);return count;return_confirm();}void Look_Mark(int count){//printf("是否检查历史得分?('y'—是,'n'—否):");int *Mark;int i;Mark=(int *)malloc(20*sizeof(int));system("cls");printf("****查询历史得分情况****\n");LookMark(Mark,count);for(i=0;i<count;i++)printf("****第%d次得%d分****\n", i+1, Mark[i]);if(i>1){if(Mark[i-1]>60||Mark[i-2]>60){if(Mark[i-1]>Mark[i-2])printf("有进步,还要加油哦.\n");else if(Mark[i-1]==Mark[i-2]) printf("成果还可以,但没有进步,还要多多努力呀!\n");else printf("成果有点下降,要多多练习,不要气馁!!\n");}else printf("成果很欠好!要更加努力学习!\n");}else{if(Mark[0]>=90)printf("Very Good!\n");else if(Mark[0]>=60)printf("成果不错.\n");else printf("很遗憾成果不及格!\n"); }return_confirm();}void main(){int m=0;int *RN;char ch;RN=(int *)malloc(1*sizeof(int));RN[0]=0;printf("***如果是第一次运行***\n"); printf("**请先建立 n_rec.txt**\n");printf("*****否则会犯错 !*****\n"); printf("('y'--创立**'n'--不建)\n");ch=getchar();if(ch=='y')RecN(RN,1);LookN(RN,1);RN[0]+=m;fflush(stdin);printf("是否向试题库中添加试题: "); printf("('y'--是,'n'--否)?\n");ch=getchar();if(ch=='y')Built_shitiKu();menu: page_title("把持选单");printf("请用数字键选择把持\n\n"); printf("1 开始练习\n");printf("2 检查得分记录\n");printf("0 退出\n");printf("******************\n");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;}3.3法式运行结果(拷屏)4.课程设计心得、存在问题及解决方法连续两个星期的课程设计做完了,感觉自己的能力获得了年夜年夜的提高.刚开始看见题目的时候,很不以为然,觉得这么简单.但当自己开始着手做的时候才发现其实不是那么回事.一个看似简单的问题,有时候却牵扯甚多.经过两个星期的上机实践学习,使我对C语言有了更进一步的认识和了解,要想学好它要重在实践,要通过不竭的上机把持才华更好地学习它,通过实践,我也发现我的好多缺乏之处,对C语言学习平时只是马马虎虎的过去了,真正自己去解决实际问题的时候才会发现自己学的何等糟糕,通过课程设计对自己的编程能力也有所提高;再有对C语言的文件把持这一块,真的是难了我好久.还有对函数调用的正确使用不够熟悉,还有对C语言中经常呈现的毛病也不了解,通过实践,使我在这几个方面的认识有所提高.通过实践的学习,我认到学好计算机要重视实践把持,不单仅是学习C语言,还是其它的语言,以及其它的计算机方面的知识都要重在实践,所以后在学习过程中,我会更加注重实践把持能力的培养,无论学习什么,亲自入手去做了才华获得最深刻的体会.。
数据结构课程设计说明书
车厢调度问题摘要:实现栈的基本操作,即实现类型。
程序对栈的任何存取,即更改,读取和状态判别等操作,必须借助于基本操作。
在操作过程中的任何状态下都有两种可能的操作:“入”“出”。
每个状态下处理问题的方法都是相同的,具有递归特性。
关键字:栈递归打印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[]。
数据结构课程教学大纲
《数据结构》教学大纲课程编号:课程名称:数据结构适用专业:软件工程学时/学分:64/4先修课程:C语言程序设计后续课程:算法分析与设计,操作系统一、课程说明《数据结构》是软件工程专业的专业基础课,也是计算机类专业的必修核心课程。
通过本课程的学习,学生能够理解数据结构的基本概念、理论,掌握常用数据结构及其操作,能够通过分析研究数据对象的特征,在软件开发过程中选择适当的逻辑结构、存储结构及相应算法,并分析算法的时间与空间复杂度,提高解决复杂工程问题的能力。
二、课程目标1.本课程可以使学生具备以下能力:(1)理解数据结构与算法的基本概念,掌握常用基本数据结构的逻辑结构、存储结构及其操作的实现,能进行算法的时间、空间复杂性分析;(2)掌握常用查找和排序算法,并能够理解不同算法的适用场景;(3)能够针对问题进行数据对象的抽象、分析、建模,并选择、构建合适的数据结构;(4)能够在软件开发过程中,针对特定需求综合应用数据结构、算法复杂性分析等知识设计算法。
2.课程目标与毕业要求关系三、教学内容与要求1.理论部分2.实验部分四、课程目标考核评价方式及标准1.成绩评定方法及课程目标达成考核评价方式(1)成绩评定方法成绩评定依据期末考试成绩、平时成绩(实验、作业、测试、课堂互动、自主学习等)进行核定。
期末考试成绩占总评成绩的60%,平时成绩占总评成绩的40%。
(2)课程目标达成考核评价方式2.课程目标与考核内容3.考核标准(1)课程考试考核与评价标准(2)实验考核标准(3)作业考核标准五、参考书目[1]李春葆. 数据结构C语言版(第2版)[M]. 北京: 清华大学出版社. 2017.[2]严蔚敏, 吴伟民. 数据结构C语言版[M]. 北京: 清华大学出版社. 2012.[3]Weiss M.Allen. 数据结构与算法分析:C语言描述(原书第2版). 北京: 机械工业出版社. 2017.[4]陈越. 数据结构(第2版)[M]. 北京: 高等教育出版社. 2016.[5](美)Bruno R.Preiss著; 胡广斌等译. 数据结构与算法: 面向对象的C++设计模式[M].北京: 电子工业出版社. 2003.[6](美)Thomas H.Cormen, Charles E.Leiserson, Ronald L.Rivest, et al.著; 王刚, 邹恒明, 殷建平等译. 算法导论(原书第3版)[M]. 北京: 机械工业出版社. 2013.[7]殷人昆. 数据结构: 用面向对象方法与C++语言描述(第2版)[M]. 北京: 清华大学出版社. 2016.课程负责人:专业负责人:教学院长:。
(完整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.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)的操作。
利用栈求表达式课程设计报告
《数据结构》课程设计报告专业计算机科学与技术班级(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用相应的函数。
数据结构课程设计报告-表达式求值
}
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转换成数值
关于栈的课程设计
关于栈的课程设计一、教学目标本节课的教学目标是让学生了解栈的基本概念、性质和应用,掌握栈的两种基本操作:入栈和出栈,能够使用栈解决一些实际问题,如逆序输出一个数列、判断一个数是否是回文数等。
在知识目标的基础上,培养学生逻辑思维能力、动手能力和问题解决能力。
情感态度价值观目标则是培养学生对计算机科学和编程的兴趣,增强学生自信心,培养合作精神和创新精神。
二、教学内容本节课的教学内容主要包括栈的定义和性质、栈的基本操作、栈的应用。
首先,介绍栈的基本概念,让学生理解栈是一种后进先出(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,用于存放操作符。
数据结构教案设计说明模板
一、教学目标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.前言 (2)2.问题描述 (3)3.总体设计··········································································错误!未定义书签。
3.1 概要设计 ······································································错误!未定义书签。
课程设计之利用栈求值
课程设计之利用栈求值一、教学目标本节课的学习目标为:知识目标:学生需要掌握栈的基本概念,了解栈的性质和用途,理解栈的操作原理。
技能目标:学生能够运用栈解决基本的计算问题,例如逆波兰表达式的求值。
情感态度价值观目标:通过解决实际问题,激发学生对计算机科学的兴趣,培养学生的逻辑思维能力和创新精神。
二、教学内容本节课的教学内容主要包括:1.栈的定义和性质:介绍栈的基本概念,解释栈的先进后出(FILO)特性。
2.栈的操作:讲解栈的压入(push)和弹出(pop)操作,以及栈的遍历。
3.逆波兰表达式:介绍逆波兰表达式的概念,解释其与栈的关系。
4.利用栈求值:引导学生运用栈来求解逆波兰表达式,培养学生的实际操作能力。
三、教学方法为了提高教学效果,本节课将采用以下教学方法:1.讲授法:讲解栈的基本概念、性质和操作。
2.案例分析法:通过分析具体的逆波兰表达式求值实例,引导学生掌握利用栈解决问题的一般方法。
3.实验法:安排课堂练习,让学生亲自动手操作,验证所学知识。
4.讨论法:学生进行小组讨论,分享学习心得,互相解答疑问。
四、教学资源为了支持教学内容的传授和教学方法的实施,我们将准备以下教学资源:1.教材:提供相关章节,为学生提供理论知识的学习依据。
2.多媒体资料:制作课件,以图文并茂的形式展示栈的概念和操作。
3.实验设备:提供计算机及相关设备,让学生进行课堂练习。
4.在线资源:推荐相关的学习和论坛,方便学生课后自主学习和交流。
五、教学评估本节课的评估方式包括:1.平时表现:观察学生在课堂上的参与程度、提问回答等情况,了解学生的学习态度和理解程度。
2.作业:布置相关的练习题,评估学生对栈知识掌握的情况。
3.考试:安排一次课堂小测,测试学生对逆波兰表达式求值的掌握程度。
评估方式应客观、公正,能够全面反映学生的学习成果。
通过评估,教师可以了解学生的学习情况,及时进行教学调整。
六、教学安排本节课的教学安排如下:1.进度:按照教材的章节顺序,逐步讲解栈的知识点和逆波兰表达式的求值方法。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
中北大学数据结构课程设计说明书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("成绩不错。
\n");else printf("很遗憾成绩不及格!\n");printf("\n");RecMark(Mark,count);Mark[count]=mark;count++;//记录次数递增printf("是否继续做练习('y'—是,'n'—否):");g=getchar();fflush(stdin);printf("\n");if(count>=20)//超过最大记录次数清0count=0;}while(g=='y');RecMark(Mark,count);return count;return_confirm();}void Look_Mark(int count){//printf("是否查看历史得分('y'—是,'n'—否):");int *Mark;int i;Mark=(int *)malloc(20*sizeof(int));system("cls");printf("****查询历史得分情况****\n");LookMark(Mark,count);for(i=0;i<count;i++)printf("****第%d次得%d分****\n", i+1, Mark[i]);if(i>1){if(Mark[i-1]>60||Mark[i-2]>60){if(Mark[i-1]>Mark[i-2])printf("有进步,还要加油哦。
\n");else if(Mark[i-1]==Mark[i-2]) printf("成绩还可以,但没有进步,还要多多努力呀!\n");else printf("成绩有点下降,要多多练习,不要气馁!!\n");}else printf("成绩很不好!要更加努力学习!\n");}else{if(Mark[0]>=90)printf("Very Good!\n");else if(Mark[0]>=60)printf("成绩不错。
\n");else printf("很遗憾成绩不及格!\n"); }return_confirm();}void main(){int m=0;int *RN;char ch;RN=(int *)malloc(1*sizeof(int));RN[0]=0;printf("***如果是第一次运行***\n");printf("**请先建立**\n");printf("*****否则会出错!*****\n");printf("('y'--创建**'n'--不建)\n");ch=getchar();if(ch=='y')RecN(RN,1);LookN(RN,1);RN[0]+=m;fflush(stdin);printf("是否向试题库中添加试题: ");printf("('y'--是,'n'--否)\n");ch=getchar();if(ch=='y')Built_shitiKu();menu: page_title("操作选单");printf("请用数字键选择操作\n\n");printf("1 开始练习\n");printf("2 查看得分记录\n");printf("0 退出\n");printf("******************\n");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;}程序运行结果(拷屏)4.课程设计心得、存在问题及解决方法连续两个星期的课程设计做完了,感觉自己的能力得到了大大的提高。
刚开始看见题目的时候,很不以为然,觉得这么简单。
但当自己开始着手做的时候才发现并不是那么回事。
一个看似简单的问题,有时候却牵扯甚多。
经过两个星期的上机实践学习,使我对C语言有了更进一步的认识和了解,要想学好它要重在实践,要通过不断的上机操作才能更好地学习它,通过实践,我也发现我的好多不足之处,对C语言学习平时只是马马虎虎的过去了,真正自己去解决实际问题的时候才会发现自己学的多么糟糕,通过课程设计对自己的编程能力也有所提高;再有对C语言的文件操作这一块,真的是难了我好久。
还有对函数调用的正确使用不够熟悉,还有对C语言中经常出现的错误也不了解,通过实践,使我在这几个方面的认识有所提高。
通过实践的学习,我认到学好计算机要重视实践操作,不仅仅是学习C语言,还是其它的语言,以及其它的计算机方面的知识都要重在实践,所以后在学习过程中,我会更加注重实践操作能力的培养,无论学习什么,亲自动手去做了才能得到最深刻的体会。