课程设计报告一元多项式计算VS迷宫求解.docx
- 文档编号:26384745
- 上传时间:2023-06-18
- 格式:DOCX
- 页数:33
- 大小:59.77KB
课程设计报告一元多项式计算VS迷宫求解.docx
《课程设计报告一元多项式计算VS迷宫求解.docx》由会员分享,可在线阅读,更多相关《课程设计报告一元多项式计算VS迷宫求解.docx(33页珍藏版)》请在冰豆网上搜索。
课程设计报告一元多项式计算VS迷宫求解
课程设计报告--一元多项式计算VS迷宫求解
课程设计报告
一元多项式计算VS迷宫求解
系别:
专业年级:
学生姓名:
学号:
任课老师:
二○一二年三月
一、题目内容描述
(一)、实验二一元多项式计算**
1、任务:
能够按照指数降序排列建立并输出多项式;能够完成两个多项式的相加、相减、相乘,并将结果输出;
2、在上交资料中请写明:
存储结构、多项式相加的基本过程的算法(可以使用程序流程图)、源程序、测试数据和结果、算法的时间复杂度、另外可以提出算法的改进方法;
(二)、实验四迷宫求解
1、任务:
可以输入一个任意大小的迷宫数据,用非递归的方法求出一条走出迷宫的路径,并将路径输出;
2、要求:
在上交资料中请写明:
存储结构、基本算法(可以使用程序流程图)、源程序、
测试数据和结果、算法的时间复杂度、另外可以提出算法的改进方法。
二、解题分析
(一)、一元多项式计算分析:
1、一元稀疏多项式简单计算器的功能是:
1.1输入并建立多项式;
1.2输出多项式,输出形式为整数序列:
n,c1,e1,c2,e2,………cn,en,其中n是多项式的项数,ci和ei分别是第i项的系数和指数,序列按指数降序排列;
1.3求多项式a、b的导函数;
1.4计算多项式在x处的值;
1.5多项式a和b相加,建立多项式a+b;
1.6多项式a和b相减,建立多项式a-b。
2、设计思路:
2.1定义线性表的动态分配顺序存储结构;
2.2建立多项式存储结构,定义指针*next
2.3利用链表实现队列的构造。
每次输入一项的系数和指数,可以输出构造的一元多项式
2.4演示程序以用户和计算机的对话方式执行,即在计算机终站上显示“提示信息”之后,由用户在键盘上输入演示程序中规定的运行命令;最后根据相应的输入数据(滤去输入中的非法字符)建立的多项式以及多项式相加的运行结果在屏幕上显示。
多项式显示的格式为:
c1x^e1+c2x^e2+…+cnx^en
3、设计思路分析:
要解决多项式相加,必须要有多项式,所以必须首先建立两个多项式,在这里采用链表的方式存储链表,所以我将结点结构体定义为:
序数coef
指数expn
指针域next
运用尾插法建立两条单链表,以单链表polynp和polynh分别表示两个一元多项式a和b,a+b的求和运算等同于单链表的插入问题(将单链表polynp中的结点插入到单链表polynh中),因此“和多项式”中的结点无须另生成。
为了实现处理,设p、q分别指向单链表polya和polyb的当前项,比较p、q结点的指数项,由此得到下列运算规则:
①若p->expn
②若p->expn=q->expn,则将两个结点中的系数相加,当和不为0时修改结点p的系数。
③若p->expn>q->expn,则结点q所指的结点应是“和多项式”中的一项,将结点q插入在结点p之前,且令指针q在原来的链表上后移。
(二)、迷宫求解分析:
1、迷宫形状由0表示可通过,用1表示是障碍。
为方便用0,1输入。
并把迷宫图形保存在二维数组grid中。
而打印出的图形中‘0’表示能过‘1’表示障碍。
2、对探索过的位置加以标记,输入起点终点后可由相应函数来完成搜索。
到目的点就可退出该调用程序。
把每步路径保存到二维数组中,通过反向进行退步可把完整的路径保存在相应结构体数组内,通过标记的路径可将串作相应的改变就能输出的带路径的图。
3、根据二维字符数组和加标记的位置坐标,输出迷宫的图形。
4、该程序在获取迷宫图结构后,可对迷宫任意入口到出口的路线进行搜索,主要由广度优先搜索完成该操作。
它可以是30以内大小的迷宫,有自行提供的迷宫图,本课程设计是以二维数组作为迷宫的存储结构。
而广度优先搜索用的队列一步一步完成的,从而找到的是最短路径,并能输出打印。
三、所用数据结构的描述(用伪代码)
(一)、一元多项式计算:
1、元素类型、结点类型和指针类型:
typedefstructPolynomial{floatcoef;//系数
intexpn;//指数
structPolynomial*next;}*Polyn,Polynomial;
2、建立一个头指针为head、项数为m的一元多项式,建立新结点以接收数据,调用Insert函数插入结点:
PolynCreatePolyn(Polynhead,intm){inti;
Polynp;
p=head=(Polyn)malloc(sizeof(structPolynomial));
head->next=NULL;
for(i=0;i printf("请输入第%d项的系数与指数: ",i+1); scanf("%f%d",&p->coef,&p->expn); Insert(p,head);} returnhead;} 3、调用关系图: (二)、迷宫求解: 1、各个函数说明: intInitStack(Stack*s)//制造空栈 intStackEmpty(Stack*s)//若s为空返回TURE,否则返回FALSE intStackIsFull(Stack*s)//判断栈是否为满 intPush(Stack*s,MazeNodemn)//插入元素e为新的栈顶元素 intPop(Stack*s,MazeNode*mn)//若栈不空删除栈顶元素用e返回OK,否则返回ERROR intDestroyStack(Stack*s)//销毁栈s intMazeInit(MazeType*maze)//初始化迷宫 intPass(MazeType*maze,Coordinatepos)//判断n指定坐标是否可通过 intMarkerPass(MazeType*maze,Coordinatepos)//标记可通过 CoordinateNextCoord(Coordinatepos,inti)//获取下一位置 intMarkerNoPass(MazeType*maze,Coordinatepos)//曾走过但不是通路标记并返回OK intMazePath(MazeType*maze,Coordinatestart,Coordinateend)//从迷宫maze的入口到出口查找路径 voidPrintMaze(MazeType*maze)//输出迷宫 四、部分算法的描述(用伪代码) (一)、一元多项式计算: 1、加法: PolynAddPolyn(Polynpa,Polynpb){//求解并建立多项式a+b,返回其头指针 Polynqa=pa->next; Polynqb=pb->next; Polynheadc,hc,qc; hc=(Polyn)malloc(sizeof(structPolynomial));//建立头结点 hc->next=NULL; headc=hc; while(qa||qb){ qc=(Polyn)malloc(sizeof(structPolynomial)); switch(compare(qa,qb)){ case1: { qc->coef=qa->coef; qc->expn=qa->expn; qa=qa->next; break;} case0: { qc->coef=qa->coef+qb->coef; qc->expn=qa->expn; qa=qa->next; qb=qb->next; break;} case-1: { qc->coef=qb->coef; qc->expn=qb->expn; qb=qb->next; break;} } if(qc->coef! =0){ qc->next=hc->next; hc->next=qc; hc=qc;} elsefree(qc);//当相加系数为0时,释放该结点 } returnheadc;} 2、减法: PolynSubtractPolyn(Polynpa,Polynpb){//求解并建立多项式a-b,返回其头指针 Polynh=pb; Polynp=pb->next; Polynpd; while(p){//将pb的系数取反 p->coef*=-1; p=p->next;} pd=AddPolyn(pa,h); for(p=h->next;p;p=p->next)//恢复pb的系数 p->coef*=-1; returnpd;} 3、求解x: floatValuePolyn(Polynhead,intx){//输入x值,计算并返回多项式的值 Polynp; inti,t; floatsum=0; for(p=head->next;p;p=p->next){ t=1; for(i=p->expn;i! =0;){ if(i<0){t/=x;i++;}//指数小于0,进行除法 else{t*=x;i--;}//指数大于0,进行乘法 } sum+=p->coef*t;} returnsum;} 4、求导: PolynDerivative(Polynhead){//求解并建立导函数多项式,并返回其头指针 Polynq=head->next,p1,p2,hd; hd=p1=(Polyn)malloc(sizeof(structPolynomial));//建立头结点 hd->next=NULL; while(q){ if(q->expn! =0){//该项不是常数项时 p2=(Polyn)malloc(sizeof(structPolynomial)); p2->coef=q->coef*q->expn; p2->expn=q->expn-1; p2->next=p1->next;//连接结点 p1->next=p2; p1=p2;} q=q->next;} returnhd;} 5、乘法: PolynMultiplyPolyn(Polynpa,Polynpb){//求解并建立多项式a*b,返回其头指针 Polynhf,pf; Polynqa=pa->next; Polynqb=pb->next; hf=(Polyn)malloc(sizeof(structPolynomial));//建立头结点 hf->next=NULL; for(;qa;qa=qa->next){ for(qb=pb->next;qb;qb=qb->next){ pf=(Polyn)malloc(sizeof(structPolynomial)); pf->coef=qa->coef*qb->coef; pf->expn=qa->expn+qb->expn; Insert(pf,hf);//调用Insert函数以合并指数相同的项 } } returnhf;} (二)、迷宫求解: 1、初始化: intMazeInit(MazeType*maze){//初始化迷宫 intm,n,i,j; printf("输入迷宫的行数和列数: "); scanf("%d%d",&maze->row,&maze->column);//迷宫行和列数 for(i=0;i<=maze->column+1;i++){//迷宫行外墙 maze->grid[0][i]='1';//设置为障碍墙 maze->grid[maze->row+1][i]='1';} for(i=0;i<=maze->row+1;i++){//迷宫列外墙 maze->grid[i][0]='1';//设置为障碍墙 maze->grid[i][maze->column+1]='1';} for(i=1;i<=maze->row;i++)//初始化迷宫 for(j=1;j<=maze->column;j++) maze->grid[i][j]='0';//设置为可通过 printf("输入障碍墙的坐标(输入坐标0,0结束): "); while (1){scanf("%d%d",&m,&n);//接收障碍的坐标 if(m==0)//输入0 break;//结束坐标的输入 if(m<=0||n<=0||m>maze->row||n>=maze->column){//越界 printf("坐标越界,重新输入! \n"); continue;} maze->grid[m][n]='1';//迷宫障碍用‘1’标记 } return1;} 2、获取下一位置: CoordinateNextCoord(Coordinatepos,inti){//获取下一位置 switch(i){//1,2,3,4分别代表东南西北方向 case1: //向右查找 pos.column+=1; break; case2: //向下查找 pos.row+=1; break; case3: //向左查找 pos.column-=1; break; case4: //向上查找 pos.row-=1; break; default: exit(0);} returnpos;} 3、路径查找: intMazePath(MazeType*maze,Coordinatestart,Coordinateend){//从迷宫maze的入 口到出口查找路径 Stacks;//定义栈 Coordinatepos; intcurstep;//当前序号1,2,3,4分别表示东南西北方向 MazeNodee; InitStack(&s);//初始化栈 pos=start;//从入口位置开始查找路径 curstep=1;//探索第一步 do{if(Pass(maze,pos)){//若指走位置可通过 MarkerPass(maze,pos);//标记能通过 e.ord=curstep;//保存步数 e.seat=pos;//保存当前坐标 e.di=1;//向右探测 Push(&s,e);//将节点添加到栈中(保存路径) if(pos.row==end.row&&pos.column==end.column){//若当前位置是出口坐标 DestroyStack(&s);//释放栈已用空间 return1;//返回查找成功 } else{//与出口坐标不同 pos=NextCoord(pos,1);//向右探测 curstep++;//增加前进步数 } } else{//若指定位置不通(为障碍墙或已走过) if(! StackEmpty(&s)){//若栈不为空(之前有走过的位置) Pop(&s,&e);//出栈(返回上一步的位置) while(e.di==4&&! StackEmpty(&s)){//上一步4个方向都得测完,且栈不为空 MarkerNoPass(maze,e.seat);//标记该位置不为空 Pop(&s,&e);//出栈(返回上一步) } if(e.di<4)//若为探测完4个方向 e.di++;//准备探测下一个方向 Push(&s,e);//将当前节点入栈(保存当前位置,准备下一位置的探测) pos=NextCoord(e.seat,e.di);//查找下一个应该探测位置的坐标 } } }while(! StackEmpty(&s));//程序运行到这里,表示没有能通达的路径 DestroyStack(&s);//释放栈占用的空间 return0;//返回失败 } 五、算法复杂度的简单分析 (一)、一元多项式计算: 1、加法: O(n) 2、减法: O(n+m) 3、求解x: O(n^2) 4、求导: O(n) 5、乘法: O(n^2) (二)、迷宫求解: 1、初始化: O(n^2) 2、获取下一位置: O(n) 3、路径查找: O(n) 六、程序测试数据 (一)、一元多项式计算: 1、(2x+5x^8-3.1x^11)+(7-5x^8+11x^9)=(-3.1x^11+11x^9+2x+7); 2、(6x^-3-x+4.4x^2-1.2x^9+1.2x^9)-(-6x^-3+5.4x^2-x^2+7.8x^15 )=(-7.8x^15-1.2x^9+12x^-3-x); 3、(1+x+x^2+x^3+x^4+x^5)+(-x^3-x^4)=(1+x+x^2+x^5); 4、(x+x^3)+(-x-x^3)=0; 5、(x+x^100)+(x^100+x^200)=(x+2x^100+x^200); 6、(x+x^2+x^3)+0=x+x^2+x^3. (二)、迷宫求解: 5 00000 11110 00000 01111 00000 路径: 七、出现问题及解决方法 1、我编程时最常见的问题就是马虎,常常丢三落四,如: 经常忘记语句后的分号,经常忘记地址符号,经常丢一半括号等一些细小的问题没有注意好。 我的解决方法是反复检查或编译检查,写代码时多多提醒自己,注意小问题的发生。 2、刚拿到题时急于完成作业,没有对题仔细分析就忙于做,结果在编程过程中思路不清晰,思维不连贯,想到哪里就做到哪里,常忽略一些细节上的问题和整体连贯的问题,并且对题意理解不够全面。 我的解决方法是静下心来,仔细读题审题,分析题意,做出大体设计,条理清晰,不要慌忙编写代码。 3、我对书中链表,文件等部分掌握的都不够好,所以写程序时遇到不少问题。 我的解决方法是: 边编程边看书;找学长学姐请教;参考有关方面的书籍等。 4、在函数编写过程中也遇到了或大或小的问题,对各类函数掌握的不是很熟练,运行时常常出现问题。 我的解决方法是: 上网查找相关内容参考研究;问学长学姐;查找课本类似函数加以修改等。 5、在写迷宫求解程序的时候发现,求出起点到终点的路径的函数,经过反复运行求出的结果总是无任何现象。 我的解决方法是查找资料,询问学姐后发现原因是把相关重要的变量重复定义以至赋过的值被覆盖,改正后运行正确。 八、设计总结 通过本次课程设计,我对《数据结构(c语言版)》这门课程有了很深入的理解。 数据结构是计算机程序设计的重要理论技术基础,它不仅是计算机科学的核心课程,而且已成为其他理工专业的热门专业热门选修课程。 因此熟练掌握数据结构知识对我们计算机专业的学习非常必要,为以后我们对编程、软件设计等打下坚实的基础。 经过本次课程设计,我深刻地明白了理论与实践应用相结合的重要性,并努力克服自己在分析复杂问题的弱点。 这次课程设计同时也考验我的综合运用所学知识的能力和操作能力。 虚心求教,敢于怀疑,敢于发现问题,并及时动脑解决问题,提出自己新的见解和构思思想。 个人的力量是薄弱的,集体的力量是强大的。 独立思考问题的同时也要适当合作,相互交流意见,让你我在编程方面都有所进步,有所收获。 在发现彼此各自优缺点时,吸取各自的优点,克服缺点,善于发挥自己的长处。 一开始写一元多项式计算的程序时调理不清晰,遇到了一些问题,在看书查资料或是问同学之后都能解决,在查资料时发现了题目要求以外的功能,尝试了一下,效果还好。 可是迷宫求解的程序就没那么简单了,曾一度让我想放弃,就算看书查资料还是有好些不懂得,还好有位同专业的学姐,找她询问了好多次,才有所了解,在她的帮助下完成了迷宫求解程序的编写。 最后要将两个程序写到一起,这个以前接触过所以写起来还比较容易。 就这样我的程序在历经艰辛后终于诞生了。 虽然写程序的道路崎岖并艰辛,但经过努力得到收获时的喜悦却又无与伦比。 总之---痛并快乐着,这是此次写程序我最大的感受。 这次写程序也同样提醒着我在以后的学习中要更努力,更细心,更刻苦,这样才会快乐多一点,痛苦少一点。 九、参考文献 1、C语言大学实用教程(第2版)苏小红等著电子工业出版社 2、数据结构(C语言版)秦锋著清华大学出版社 3、《数据结构》(C语言版)严蔚敏、吴伟民著清华大学出版社 十、附录: 源程序 #include #include #include #include #defineMAXLEN30//迷宫包括外墙最大行列数目 #defineINIT_SIZE100//存储空间初始分配量 typedefstruct{introw;//迷宫的行数 intcolumn;//迷宫的列数 chargrid[MAXLEN][MAXLEN];//1表示障碍,0表示空,2表示可通,3表示已经走过但不通 }MazeType;//迷宫类型 typedefstruct{//迷宫中的坐标 introw;//行号 intcolumn;//列号 }Coordinate; typedefstruct{intord;//当前位置在路径上的序号 Coordinateseat;//当前坐标 intdi;//往下一坐标的方向 }MazeNode;//栈元素类型 typedefstruct{MazeNodebase[INIT_SIZE];//迷宫节点信息 inttop;//栈顶元素 }Stack; typedefstructPolynomial{//定义多项式的项 floatcoef;//系数 intexpn;//指数 structPolynomial*next; }*Polyn,Polynomial; voidInsert(Polynp,Polynh){if(p->coef==0)free(p);//系数为0的话释放结点 else{Polynq1,q2; q1=h; q2=h->next; while(q2&&p->expn q1=q2; q2=q2->next;} if(q2&&p->expn==q2->expn){//将指数相同相合并 q2->coef+=p->coef; free(p); if(! q2->coef){//系数为0的话释放
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 课程设计 报告 一元 多项式 计算 VS 迷宫 求解