体会是指将学习的东西运用到实践中去,通过实践反思学习内容并记录下来的文字,近似于经验总结。好的心得体会对于我们的帮助很大,所以我们要好好写一篇心得体会下面小编给大家带来关于学习心得体会范文,希望会对大家的工作与学习有所帮助。
数据结构课程设计心得体会800字篇一
课程设计报告
学 号 姓 名 班 级 指导教师
xxx xxx xxx xxx 安徽工业大学计算机学院
2014年6月
利用栈实现迷宫问题的求解
一、问题描述
以一个m*n的长方阵表示迷宫,0和1分别表示迷宫中的通路和墙壁。设计一个程序,对任意设定的迷宫,求出一条从入口到出口的通路,或得出米有通路的结论。
二、设计思路
(1)以二维数组maze[m][n]表示迷宫,数组中元素值为0表示通路,1表示障碍。
(2)其中迷宫的入口位置和出口位置默认于maze数组的起始元素位置和最后个元素位置。
(3)以链表作存储结构的栈类型,实现求解迷宫的非递归程序。
三、数据结构定义 typedef struct{
int x; int y; }item; typedef struct{ int x,y,d; }datatype; typedef struct{ datatype data[1000]; int top; }seqstack,*pseqstack;
typedef struct{ datatype data[1000]; int top; }seqstack,*pseqstack;
四、程序清单 #include
{1,0,1,1,1,0,1,1,1,1}, {1,0,0,0,0,1,1,1,1,1}, {1,0,1,0,0,0,0,0,1,1}, {1,0,1,1,1,0,0,1,1,1}, {1,1,0,0,1,1,0,0,0,1}, {1,0,1,1,0,0,1,1,0,1}, {1,1,1,1,1,1,1,1,1,1}}; int x; int y; }item;
item move[4]={{0,1},{1,0},{0,-1},{-1,0}};
typedef struct{ int x,y,d; }datatype;
typedef struct{ datatype data[1000]; int top; }seqstack,*pseqstack;
pseqstack init_seqstack() {
} pseqstack p; p=(pseqstack)malloc(sizeof(seqstack)); if(p) p->top=-1; return p;
int empty_seqstack(pseqstack p) {
}
int push_seqstack(pseqstack p,datatype x) {
}
int pop_seqstack(pseqstack p,datatype *x) { if(p->top==999) return 0; if(p->top==-1) return 1; else return 0; else {
} p->top++; p->data[p->top]=x; return 1;
} if(empty_seqstack(p)) return 0; else {
} *x=p->data[p->top]; p->top--; return 1; void destroy_seqstack(pseqstack *p) {
}
int mazepath(int maze[][n+2],item move[],int x0,int y0) {
pseqstack s; datatype temp; int x,y,d,i,j; if(*p) free(*p); *p=null; return;
temp.x=x0; temp.y=y0; temp.d=-1; s=init_seqstack(); if(!s) {
} push_seqstack(s,temp); while(!empty_seqstack(s)) {
pop_seqstack(s,&temp); x=temp.x; y=temp.y; d=temp.d+1; while(d<4) {
i=x+move[d]。x; j=y+move[d]。y; if(0==maze[i][j]) { temp.x=x; printf(“栈初始化失败!!!”); return 0;
}
}
} temp.y=y; temp.d=d; push_seqstack(s,temp); x=i; y=j; maze[x][y]=-1; if(x==m&&y==n) {
} else d=0; while(!empty_seqstack(s)) {
} destroy_seqstack(&s); return 1; pop_seqstack(s,&temp); printf(“(%d,%d)<-”,temp.x,temp.y); else d++;
} destroy_seqstack(&s); return 0; int main() {
}
五、运行及调试分析 mazepath(maze,move,1,1); return 0;
六、课程设计总结等
在做实验前,一定要将课本上的知识吃透,因为这是做实验的基础,否则,在做设计程序实验时,这将使你做的难度加大,浪费宝贵的时间。使你事倍功半。做实验时,一定要亲力亲为,务必要将每个步骤,每个细节弄清楚,弄明白,实验后,还要复习,思考,这样,你的印象才深刻,记得才牢固,否则,过后不久你就会忘得一干二净,这还不如不做。通过这次程序设计的实验,使我们学到了不少实用的知识,更重要的是,做实验的过程,思考问题的方法,这与做其他的实验是通用的,真正使我们们受益匪浅。
大数相乘
一、问题描述
本问题中,要求输入两个相对较大的正整数,能够通过程序计算出其结果
二、设计思路
1、输入阶段采用一维数组a[],b[] 在输入阶段当大数输入时,大数a,b从高位到低位分别依次存入数组a[ ],b[ ]。
2、调用函数计算阶段采用一维数组c[ ] 在计算过程中,由个位到高位依次计算各位的结果,并依次存入数组c[ ]中。
三、数据结构定义
int x[n],y[n],z[n*n];
四、程序清单 #include 五、运行及调试分析 六、课程设计总结。 回顾起此次课程设计,至今我仍感慨颇多,的确,从从拿到题目到完成整个编程,从理论到实践,可以学到很多很多的的东西,同时不仅可以巩固了以前所学过的知识,而且学到了很多在书本上所没有学到过的知识。通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正提高自己的实际动手能力和独立思考的能力。 课程设计报告的内容 设计结束后要写出课程设计报告,以作为整个课程设计评分的书面依据和存档材料。设计报告以规定格式的电子文档书写,打印并装订,排版及图,表要清楚,工整。 装订顺序如下:封面、目录、正文。正文包括以下7个内容: 1、需求分析 陈述说明程序设计的任务,强调的是程序要做什么 ,需要什么结果、所能达到的功能。 2、概要设计 说明本程序中用到的所有抽象数据类型的定义,主程序的流程以及各程序模块之间的层次(调用)关系。3.详细设计 实现概要设计中定义的所有数据类型,对每个操作只需要写出伪码算法;对主程序和其他模块也都需要写出伪码算法(伪码算法达到的详细程度建议为:按照伪码算法可以在计算机键盘直接输入高级程序设计语言程序);可采用流程图、n s 图进行描述,画出函数和过程的调用关系图。 4、调试分析 内容包括: a.调试过程中遇到的问题是如何解决的以及对设计与实现的回顾讨论和分析; b.算法的时空分析(包括基本操作和其他算法的时间复杂度和空间复杂度的分析)和 改进设想; c.经验和体会等。5.测试结果 列出你的测试结果,包括输入和输出。这里的测试数据应该完整和严格,最好多于需求分析中所列。 6、参考文献 列出参考的相关资料和书籍。 封面格式如下: 数据结构课程设计报告 班级:_____ _____ _____ _________ 姓名:____________________ 指导教师:___________________ 成绩:__________________________ 信息工程学院 年月日 目录 1、需求分析 ……………………………………………… 22.概要设计………………………………………………2 3、详细设计 ………………………………………………2 4、调试分析 ………………………………………………2 5、测试结果… ……………………………………………2 参考文献 …………………………………………………6 附录…………………………………………………… 一、需求分析 二、概要设计 三、详细设计 四、调试分析 五、测试结果 六、参考文献 七、附录 附录为程序代码!4 一,课程题目 (算符优先法计算算数表达式)以字符序列的形式从终端输入语法正确的、不含变量的整数表达式。利用教材表3.1(p53)给出的算符优先关系,实现对于算术四则混合运算(加、减、乘、除)表达式的求值。例如:7+(4-2)*3+12/2=19。注:按照四舍五入的方式将四则运算结果取整。 二,程序设计思想 在程序中分别设立一个运算符栈(optr 栈),用于存储‘+’,‘-’,‘*’,‘/’,‘#’(‘#’用于判断算术表达式结束),和一个操作数栈(opnd 栈),用于存放整数,输入算式后,先将数字与运算符分开入i栈,若为数字则先用转换函数将char类型的数转换为int型并进入操作数栈,若为运算符则根据教材表3.1(p53)给出的算符优先级关系,判断栈顶运算符和从键盘取得的运算符作优先级比较,若取得的运算符优先级高则进栈,直到取得运算符优先级低的,则将操作数取出作operate运算后存入栈顶,反复操作知道遇到‘#’,则结束运算,输出栈顶元素即为结果。 三,程序流程图 四,程序关键代码设计 本次程序设计共调用了12个方法分别是: initnumstack,parseint,pushnum,popnum ,initcalstack,popcal ,pushcal,in,gettopcal,gettopnum,preced,operate。 其中 parseint方法 int parseint(char c[]){ int number[5],i; for(i=0;i<5;i++){ number[i]=(int)(c[i])-48; } i=10000*number[0]+1000*number[1]+100*number[2]+10 *number[3]+number[4]; return i; } 为将输入的数字字符型转换为整型的转换函数,通过ascall表的转换关系,将输入的字符型数字转换为整型。在入栈前进行此方法,以便整型数的计算。 preced,operate函数 char preced(char a , char b){ char c[7]={+,-,*,/,(,),#}; char d[7][7]={ {>,>,<,<,,>}, {>,>,<,<,,>}, {>,>,>,>,,>}, {>,>,>,>,,>}, {<,<,<,<,,>,>,>, ,>,>}, {<,<,<,<,<, ,=}, }; int operate (int a,char theta,int b){ int c ; if (theta==+){ c=a+b; return c; } if (theta==-){ c=a-b; return c; } if (theta==*){ c=a*b; return c; } if (theta==/){ c=a/b; return c; } return 0; } 其中preced是判定运算符栈的栈顶运算符c1与读入的运算符c2之间优先关系函数;opearte为进行二元运算acb的函数,如果是编译表达式,则产生这个运算的一组相应的指令并返回存放结果的中间变量名;如果是解释执行表达式,则直接进行该运算,并返回运算结果。 五,程序源代码以及运行结果 #include int in(char c,char s[]){ int i; for(i=0;i if(c==s[i]) return 1; return 0; } char gettopcal(sqlcal &s){ char c; c=*(-1); return c; } int gettopnum(sqlnum &s){ int c; c=*(-1); return c; } char preced(char a , char b){ char c[7]={+,-,*,/,(,),#}; char d[7][7]={ {>,>,<,<,,>}, {>,>,<,<,,>}, {>,>,>,>,,>}, {>,>,>,>,,>}, {<,<,<,<,,>,>,>, ,>,>}, {<,<,<,<,<, ,=}, } w w ; if(a==+){ if(b==+){ return d[0][0];} if(b==-){ return d[0][1];} if(b==*){ return d[0][2];} if(b==/){ return d[0][3];} if(b==(){ return d[0][4];} if(b==)){ return d[0][5];} if(b==#){ return d[0][6];} } if(a==-){ if(b==+){ return d[1][0];} if(b==-){ return d[1][1];} if(b==*){ return d[1][2];} if(b==/){ return d[1][3];} if(b==(){ return d[1][4];} if(b==)){ return d[1][5];} if(b==#){ return d[1][6];} } if(a==*){ if(b==+){ return d[2][0];} if(b==-){ return d[2][1];} if(b==*){ return d[2][2];} if(b==/){ return d[2][3];} if(b==(){ return d[2][4];} if(b==)){ return d[2][5];} if(b==#){ return d[2][6];} } if(a==/){ if(b==+){ return d[3][0];} if(b==-){ return d[3][1];} if(b==*){ return d[3][2];} if(b==/){ return d[3][3];} if(b==(){ return d[3][4];} if(b==)){ return d[3][5];} if(b==#){ return d[3][6];} } if(a==(){ if(b==+){ return d[4][0];} if(b==-){ return d[4][1];} if(b==*){ return d[4][2];} if(b==/){ return d[4][3];} if(b==(){ return d[4][4];} if(b==)){ return d[4][5];} if(b==#){ return d[4][6];} } if(a==)){ if(b==+){ return d[5][0];} if(b==-){ return d[5][1];} if(b==*){ return d[5][2];} if(b==/){ return d[5][3];} if(b==(){ return d[5][4];} if(b==)){ return d[5][5];} if(b==#){ return d[5][6];} } if(a==#){ if(b==+){ return d[6][0];} if(b==-){ return d[6][1];} if(b==*){ return d[6][2];} if(b==/){ return d[6][3];} if(b==(){ return d[6][4];} if(b==)){ return d[6][5];} if(b==#){ return d[6][6];} } return 0; } int operate (int a,char theta,int b){ int c ; if (theta==+){ c=a+b; return c; } if (theta==-){ c=a-b; return c; } if (theta==*){ c=a*b; return c; } if (theta==/){ c=a/b; return c; } return 0; } void main(){ sqlcal optr; sqlnum opnd; char c,d[5]={0,0,0,0,0}; int f=0; char op[]={+,-,*,/,(,),#}; initcalstack(optr); initnumstack(opnd); printf(“请输入算式并在尾部添加一个#号n”); c=getchar(); pushcal(optr,#); while(c!=#||gettopcal(optr)!=#) { if (!in(c,op)) { d[0]=d[1]; d[1]=d[2]; d[2]=d[3]; d[3]=d[4]; d[4]=c; c=getchar(); f=1; } else { if(f==1){ pushnum(opnd,parseint(d)); d[0]=0;d[1]=0;d[2]=0;d[3]=0;d[4]=0; f=0; } switch(preced(gettopcal(optr),c)) { case<: pushcal(optr,c); c=getchar(); break; case=: popcal(optr); c=getchar(); break; case>: char theta;int a;int b; theta=popcal(optr); b=popnum(opnd); a=popnum(opnd); pushnum(opnd,operate(a,theta,b)); break; } } } printf(“%dn”,gettopnum(opnd)); } 程序运行结果: 六,心得体会 通过这次编程,我发现很多编程过程中的不足与问题,很多问题由于考虑不全面,导致程序运行失败。还有一些小问题,比如字母的大小写,括号的遗漏,语法书写错误等等一些基础错误,也是让我体会很深写程序要谨慎仔细。数据结构课程设计心得体会800字篇二
数据结构课程设计心得体会800字篇三