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

合集下载

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

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

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

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

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

数据结构课程设计- 算术表达式求值

数据结构课程设计- 算术表达式求值

课程设计报告课程名称数据结构课程设计题目算术表达式求值指导教师设计起始日期 4.18~4.25学院计算机学院系别计算机科学与工程学生姓名班级/学号成绩一、需求分析设计一个算术表达式四则运算的程序,要求完成包括加、减、乘、除运算,包含括号的基本整数表达式的运算。

在这里运算数可以1位长度,也可以多位长度。

在运算之后输出的正确运算结果,输入表达式后演示在求值中运算数栈内的栈顶数据变化过程,最后得到运算结果。

(1)输入:3*(7-2)(2)输出:数据栈栈顶元素:3,7,2,7,5,3,15结果:15(3)自选数据二、概要设计1、使用栈的数据结构表示数据的存储。

2、设计算法将中缀表达式转换成后缀表达式,用栈的数据结构实现表达式的运算。

3、把中缀表达式转换为后缀表达式算法的基本思路是从头到尾地扫描中缀表达式中的每个字符,对于不同类型的字符按不情况进行处理。

三、详细设计数据结构:字符类型栈/* 定义字符类型栈*/typedef struct{char stackname[20];char *base;char *top;} Stack;算法:将中缀表达式转换为后缀表达式void Change(char* s1, char* s2)// 将字符串s1中的中缀表达式转换为存于字符串s2中的后缀表达式{Stack R; // 定义用于暂存运算符的栈InitStack(R); // 初始化栈Push(R,'#'); // 给栈底放入’#’字符,它具有最低优先级0int i,j;i=0; // 用于指示扫描s1串中字符的位置,初值为0j=0; // 用于指示s2串中待存字符的位置,初值为0char ch=s1[i]; // ch保存s1串中扫描到的字符,初值为第一个字符while( ch!='#'){ // 顺序处理中缀表达式中的每个字符if(ch==' ')// 对于空格字符不做任何处理,顺序读取下一个字符ch=s1[++i];else if(ch=='('){ // 对于左括号,直接进栈Push(R,ch);ch=s1[++i];}else if(ch==')'){ // 对于右括号,使括号内的仍停留在栈中的运算符依次// 出栈并写入到s2中while(Peek(R)!='(')s2[j++]=Pop(R);Pop(R); // 删除栈顶的左括号ch=s1[++i];}else if(ch=='+'||ch=='-'||ch=='*'||ch=='/'){ // 对于四则运算符,使暂存在栈中的不低于ch优先级// 的运算符依次出栈并写入到s2中char w=Peek(R);while(Precedence(w)>=Precedence(ch)){ // Precedence(w)函数返回运算符形参的优先级s2[j++]=w;Pop(R); w=Peek(R); }}四、调试分析调试:在设计过程中出现程序不能运行,发现不能找到结束标识符,因此在设计的时候需要人为动态添加结束标识符‘#’,顺利运行算法时间和空间分析:算法的运行时间主要花在while循环上,它从头到尾扫描后缀表达式中的每一个数据(每个操作数或运算符均为一个数据),若后缀表达式由n个数据组成,则此算法的时间复杂度为O(n)。

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

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

算法设计综合实训题目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)。

【数据结构与数据库-实验报告】表达式求值(栈)

【数据结构与数据库-实验报告】表达式求值(栈)

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 所有
数据结构与数据库 实验报告
题 院 姓 学

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

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

中北年夜学之迟辟智美创作数据结构 课程设计说明书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语言,还是其它的语言,以及其它的计算机方面的知识都要重在实践,所以后在学习过程中,我会更加注重实践把持能力的培养,无论学习什么,亲自入手去做了才华获得最深刻的体会.。

栈设计:表达式求值设计

栈设计:表达式求值设计

数据结构课程设计报告栈的应用:表达式求值的设计目录1设计内容.................................................................................... 错误!未指定书签。

2设计分析.................................................................................. 错误!未指定书签。

2.1后缀表达式设计 .................................................................. 错误!未指定书签。

2.2中缀到后缀的转换设计 ....................................................... 错误!未指定书签。

3设计实践 .................................................................................. 错误!未指定书签。

3.1实现要求 ............................................................................... 错误!未指定书签。

3.2中缀表达式求值 .................................................................. 错误!未指定书签。

3.3后缀表达式求值 .................................................................. 错误!未指定书签。

3.4 中缀表达式转换成后缀表达式 ......................................... 错误!未指定书签。

数据结构课程设计--表达式求值问题

数据结构课程设计--表达式求值问题

课程设计(论文)题目名称表达式求值问题课程名称数据结构课程设计学生姓名 XXX学号xxxxxxxxx系、专业信息工程系、信息工程类指导教师 xxxxxx2010年 1 月 3 日目录1 问题描述 (2)2 需求分析 (2)3 概要设计 (2)3.1抽象数据类型定义 (2)3.2模块划分 (3)4 详细设计 (4)4.1数据类型的定义 (4)4.2主要模块的算法描述 (4)5 测试分析 (7)5.1程序运行结果 (7)5.2程序调试与体会 (8)6 课程设计总结 (8)参考文献 (8)附录(源程序清单) (9)1 问题描述编写一个表达式求值程序,使输入一个四则运算表达式后,能够返回正确的结果。

该表达式由数字0~9、+、-、*、/、括号组成,且表达式必须正确无误。

程序的编写可用到栈或队列的基本算法,求出该表达式的值,并分析算法的时间复杂度和运算的结果。

2 需求分析(1)为实现算符优先算法,可以使用两个工作栈。

一个称做OPTR,用以寄存运算符;另一个称做OPND;用以寄存操作数或运算结果。

算法的基本思想是:①首先置操作数栈为空栈,表达式起始符“#”为运算符栈的栈底元素;②依次读入表达式中每个字符,若是操作数则OPND栈,若是运算符,则和OPTR栈的栈顶运算符比较优先权后做相应操作,直至整个表达式求值完毕(即OPTR栈的栈顶元素和当前读入的字符均为"#")。

(2)该程序实现表达式的求值问题:从键盘读入一个合法的算术表达式,利用算符优先关系,实现对算术四则混合运算的求值,输出正确的结果。

3 概要设计3.1抽象数据类型定义设定栈抽象数据类型的定义采用两个栈的入栈与出栈的操作来进行“运算符和操作数的配对”。

程序中主要用到以下抽象数据类型:1)ADT Stack {数据对象:D={ ai | ai∈ElemSet, i=2,...,n,n≥0 }数据关系:R1={ <ai-1, ai >| ai-1, ai∈D, i=2,...,n }约定an端为栈顶,a1端为栈底。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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附录。

源代码及程序见光盘。

相关文档
最新文档