算法与数据结构.docx
- 文档编号:28185603
- 上传时间:2023-07-09
- 格式:DOCX
- 页数:28
- 大小:209.77KB
算法与数据结构.docx
《算法与数据结构.docx》由会员分享,可在线阅读,更多相关《算法与数据结构.docx(28页珍藏版)》请在冰豆网上搜索。
算法与数据结构
*
数据结构与算法课程设计
题目:
求素数问题;数据删除问题;最短字符串问题;随机走步问题
目录
摘要
一、求素数问题………………………………………………………………4
1、采用类语言定义相关类型…………………………………………4
2、算法设计……………………………………………………………4
3、函数的调用关系图…………………………………………………5
4、调试分析……………………………………………………………5
5、测试结果……………………………………………………………6
6、源程序……………………………………………………………….7
二、数据删除问题………………………………………………………….....8
1、采用类语言定义相关类型………………………………………….8
2、算法设计…………………………………………………………….8
3、函数的调用关系图………………………………………………….9
4、调试分析…………………………………………………………….9
5、测试结果…………………………………………………………….10
6、源程序…………………………………………………………….....11
三、最短字符串问题………………………………………………………….12
1、采用类语言定义相关类型………………………………………….12
2、算法设计…………………………………………………………….12
3、函数的调用关系图………………………………………………….13
4、调试分析…………………………………………………………….13
5、测试结果…………………………………………………………….14
6、源程序……………………………………………………………….15
四、随机走步问题……………………………………………………………..17
1、采用类语言定义相关类型…………………………………………..17
2、算法设计……………………………………………………………..17
3、函数的调用关系图…………………………………………………..19
4、调试分析……………………………………………………………..20
5、测试结果……………………………………………………………..20
6、源程序………………………………………………………………..21
五:
总结…………………………………………………………………………...25
六:
参考文献………………………………………………………………………25
七:
致谢……………………………………………………………………………26
摘要:
1、求素数问题:
实现求所有小于N的素数,建立一个整数2~N的表着手,寻找i˂
的整数的功能。
2、数据删除问题:
删除具有N个数据项的数组A中所有重复项的程序,返回A中仍有的数据项。
运行时间复杂度为O(NlogN)。
3、最短字符串问题:
从输入中读取字符串,并按长度顺序,最短字符串优先的原则输出它们。
如果有若干字符串具有相同的长度,就按字母顺序输出它们。
实现以上的功能。
4、随机走步问题:
从原点(0,0)开始,每次迭代都是由向左、向上、向右和向下一个单位的随机步构成。
当行走者返回原始点时,行走结束,编写一个进行100次独立随机行走程序,并计算每个方向的步数的平均数。
关键词:
求素数,数据删除,最短字符串,随机走步,C语言
一、求素数问题
1、采用类语言定义相关类型
利用顺序表存储结构:
{
int*elem;
intlength;
intlistsize;
}Sqlist;
{
inta[10000];
longn,i,j;
}
2、算法设计
用一个循环结构判断是否为素数,如果是素数则返回1,负责返回0。
for(i=2;i { n=sqrt(L.data[l++]); for(j=2;j<=n;j++) { if(i%j==0) break; 判断2~N之间的整数是否是素数,算法的时间复杂度为O(n^2) 3、函数的调用关系图 4、调试分析 开始设计的是N=100,也就是100以内的所有素数,然后阅读题目改善了原程序,设计了可以自己设定m,也就是m以内的所有素数都可以求出来。 在调试中因为逻辑判断条件的混乱导致结果输出的错误,但经过多次的思考和调试,把顺序思路思考清楚,才得出正确结果。 5、测试结果 图1(求100以内的所有素数) 图二(1000以内的所有素数) 6、源程序 构建线性表 typedefstruct { intdata[MaxSize]; intlength; }SeqList; SeqListL,Q; 建立一个整数2~N的线性表 SeqListInList(SeqListL,intm) { inti,j; L.length=0; if((m<2)||(m>MaxSize)) { printf("error! \n"); } else { for(i=2,j=0;i { L.data[j]=i; L.length++; } returnL; } } 判断素数 SeqListJudgePrimeNumber(SeqListL,SeqListQ,intm) { inti,j,l=0,a=0,b=0; doublen; for(i=2;i { n=sqrt(L.data[l++]); for(j=2;j<=n;j++) { if(i%j==0) break; } 二、数据删除问题 1、采用类语言定义相关类型 TypedefstructDnode { DateTypedate; StructDnode*prior,*link; }Dnode,*DoubleList; 2、算法设计 先输入数据,然后按照顺序依次排列 for(i=0;i<10;i++) { for(j=i+1;j<10;j++) { if(a[i]>a[j]) { t=a[i]; a[i]=a[j]; a[j]=t; } } } 如果后一个数等于前一个数,就把后一个数删掉,这里用的删除是直接覆盖。 for(i=0;i<9;i++) { if(a[i]==a[i+1]) { for(j=i+1;j<9;j++) } } 3、 函数的调用关系图 4、调试分析 之前是用遍历的方法每个数据都两两比较,然后删除重复的数据,这样算法比较复杂,然后经过改善,先排序,然后用覆盖的方法删除重复的数据。 5、测试结果 图三(测试结果) 图四(测试结果) 6、源程序 排序 for(i=0;i<10;i++){ for(j=i+1;j<10;j++) { if(a[i]>a[j]) { t=a[i]; a[i]=a[j]; a[j]=t; } } for(i=0;i<9;i++)//删除重复数字 { if(a[i]==a[i+1])//如果后一个数等于前一个数,就把后一个数删掉(ps: 这里已经排过序,所以可以这样做来删除重复数字) { for(j=i+1;j<9;j++)//这里的删除用的直接覆盖 a[j]=a[j+1]; } } printf("删除重复数字后: "); for(i=0;i<10;i++) { if(i>0&&a[i-1]==a[i])//只输出前面不重复的数 break; printf("%d",a[i]); } printf("\n"); } 三、最短字符串问题 1、采用类语言定义相关类型 字符串类型 intnum; intinput(char*str1[]) {intcount=0; intsort(char*str2[]) { inti,j; chartemp[MaxSize]; { inti; intmain() { intkey,flag1=0,flag2=0; char*str1[Max]; 2、算法设计 (1)构造一个二维数组A[i][j]和一个一维数组B[k],输入字符串组存储到二维数组中; (2).利用函数strlen()计算字符串的长度,比较字符串的长度,长度不同,利用函数strcpy()和一维数组B[k]交换二维数组中字符串的存储位置,按长度由短到长输出; (3)如若字符串长度相等,按字母的先后顺序比较,交换位置,按字母先后顺序输出。 for(i=0;i { for(j=i+1;j { if(strlen(str2[j]) if(strlen(str2[j])==strlen(str2[i])) if(strcmp(str2[j],str2[i])<0) } } if(key==1) flag1=input(str1); elseif(key==2) if(flag1) flag2=sort(str1); elseif(key==3) if(flag1==1&&flag2==0) elseif(flag1==1&&flag2==1) { show(str1); } else elseif(key==4) 3、 函数的调用关系图 4、调试分析: 开始的时候没有设计如果没有字符串怎么处理,后来添加了这些功能,还设计了清屏功能,让界面更美观友。 时间复杂度为O(n)空间复杂度为O(n^2)。 5、调试结果 图五(主界面) 图六(输入字符串) 图七(输出字符串) 6、源程序 //字符串排序函数 for(i=0;i { for(j=i+1;j { if(strlen(str2[j]) { strcpy(temp,str2[j]); strcpy(str2[j],str2[i]); strcpy(str2[i],temp); } if(strlen(str2[j])==strlen(str2[i])) if(strcmp(str2[j],str2[i])<0) {strcpy(temp,str2[j]); strcpy(str2[j],str2[i]); strcpy(str2[i],temp); } } } //字符串显示函数 for(i=0;i } voidmenu() } while (1) { system("cls");//清屏 fflush(stdin); menu(); printf("请选择(1/2/3): \n"); scanf("%d",&key); if(key==1) flag1=input(str1); elseif(key==2) if(flag1) flag2=sort(str1); elseif(key==3) if(flag1==1&&flag2==0) show(str1); } elseif(flag1==1&&flag2==1) elseif(key==4) return0; else printf("对不起,没有这个选项! \n"); system("pause"); 四、随机走步问题 1、采用类语言定义相关类型 采用java的Random产生随机数,来判断下一步行走的方向,利用两个数组来存贮行走对应方向的行走距离,利用java的多线程机制来控制行走,实现独立行走。 intupNumber=0; intdownNumber=0; intleftNumber=0; intrightNumber=0; typedefstructpositionOfWalker { intx; inty; }Point; intstart() { intsuccess=0; intdirection=-1; initParemter(); 2、算法设计 使用srand((unsigned)time(NULL));初始化随机数种子,用rand()%4;产生随0到3的机数代表四个方向。 每产生一个随机方向,将相应的坐标修改。 在MAXNUMBER步之内返回原地则称之为走步成功,否则称之为走步失败。 成功时累加总次数。 最后计算出成功率及在每个方向上的平均步数。 for(i=0;i { direction=rand()%4;//产生随机数0到3 switch(direction) { caseup: { upNumber++;//向上方向的总数+1 point.y++;//纵坐标+1 break; } casedown: { downNumber++; point.y--; break; } caseleft: { leftNumber++; point.x--; break; } caseright: { rightNumber++; point.x++; break; } } if(point.x==0&&point.y==0)//判断是否走回原地 { success=1;//标志赋值为1 break; 3、 函数的调用关系图 4、调试分析 运行结果是否符合预测,产生随机走步,其概率是否合理 在调试中遇到的主要问题是如何实现上下左右四个方向的随机。 解决方法是: 定义了四个方法分别用来表示四个方向的随机动作,再通过一个判断来计数四个方向的随机步数。 算法的时间复杂度和空间复杂度 算法的时间复杂度为O(100),空间复杂度为O (1). 5、测试结果 程序结果符合预测,产生随机走步。 图八(执行结果) 图九(计算结果) 6、源程序 intupNumber=0;//每次走步时向上的总数 intdownNumber=0;//每次走步时向下的总数 intleftNumber=0;//每次走步时向左的总数 intrightNumber=0;//每次走步时向右的总数 enum//方向 { up,//上 down,//下 left,//左 right,//右 }; typedefstructpositionOfWalker { intx;//横坐标 inty;//纵坐标 }Point; Pointpoint={0,0};//初始位置 voidinitParemter()//初始化各个参数 { point.x=0; point.y=0; leftNumber=0; rightNumber=0; upNumber=0; downNumber=0; } /*开始走步,返回值为是否在100步之内返回原地*/ intstart() { intsuccess=0;//success==1表示返回原地 inti; intdirection=-1;///随机数产生的方向 initParemter();//每次走步时初始化各个参数 for(i=0;i { direction=rand()%4;//产生随机数0到3 switch(direction) { caseup: { upNumber++;//向上方向的总数+1 point.y++;//纵坐标+1 break; } casedown: { downNumber++; point.y--; break; } caseleft: { leftNumber++; point.x--; break; } caseright: { rightNumber++; point.x++; break; } } if(point.x==0&&point.y==0)//判断是否走回原地 { success=1;//标志赋值为1 break; } } return(success==1);//返回是否走回来 } intmain(intargc,char**argv) { inttotalleft=0;//每次走成功时在向左的方向上走步的总数记录 inttotalright=0;//每次走成功时在向右的方向上走步的总数记录 inttotalup=0;//每次走成功时在向上的方向上走步的总数记录 inttotaldown=0;//每次走成功时在向下的方向上走步的总数记录 intsuccessTotal=0;//记录在MAXNUMBER次行走中,成功返回原地的次数 inti=0,result=0; printf("开始位置: (0,0)\n"); srand((unsigned)time(NULL));//初始化随机数种子 printf("注: 结果1表示成功返回原地,0表示%d步之内没有返回原地\n",MAXNUMBER); printf("次数\t上\t下\t左\t右\t结果\n"); for(i=0;i { result=start();//result为每次走步的结果,成功与否 printf("%d\t%d\t%d\t%d\t%d\t%d\n",i+1,upNumber,downNumber,leftNumber,rightNumber,result); if(result)//走步成功(返回原地)时 { totaldown+=downNumber;//向下总数+1 totalleft+=leftNumber;//向左总数+1 totalright+=rightNumber;//向右总数+1 totalup+=upNumber;//向上总数+1 successTotal++;//成功次数+1 } } 五: 总结 通过对C语言、数据结构与算法的学习,尤其是经过这几次的课程设计,我学到了很多东西,可能有一些学的不够理想,但这些知识为我的下一步学习打下了坚实的基础。 做这样一个课程设计,让我进一步的掌握和运用了平时课堂上学习的知识,同时也让我认识到自己的不足之处和薄弱环节,加以弥补和加强。 通过这次课程设计,对我们的逻辑思维和编程能力是一个很大的锻炼,加强了我们的系统思考问题的能力。 此次课程设计让我更加熟练地掌握了表达式的一些基本操作,是一次知识的大汇总,并且在这个讨论的过程中,还更正了不少我们各自对于某个知识点的误区。 这学期的课程设计,加深了我对数据结构基本知识的理解,提高了综合运用的能力;培养了参考书籍,查阅手册、图表和文献资料的能力;初步掌握了简单软件的分析方法和设计方法。 课本上不针对特定的数据元素操作,只是讲了操作实现的理论,因此,这次的实际操作还是遇到了很多问题。 最多的还是各种数据结构的初始化的问题。 由于初始化不当,花了大量时间去找问题。 总之,这次的课程设计让我获益良多。 最关键的还是动手操作。 六、参考文献 1.严蔚敏,吴伟民.数据结构(C语言版)[M].北京: 清华大学出版社,2011 2.严蔚敏,吴伟民.数据结构题集(C语言版)[M].北京: 清华大学出版社,2011. 3.WilliamFord,WilliamTopp.DATASTRUCTUREWITHC++(M).北京: 清华大学出版社(影印版).2005 4.谭浩强.c语言程序设计(M).北京: 清华大学出版社,2008. 5.张铭,刘晓丹译.数据结构与算法分析(Java版),APracticalIntroductiontoDataStructuresandAlgorithmAnalysisJavaEditionCliffordA.Shaffer(M), 北京: 电子工业出版社,2001. 七、致谢 在这次课程设计中,我得到了许多人的帮助。 首先,我要感谢我的老师在课程设计上给予我的指导,提供给我的帮助,这是我能顺利完成这次报告的主要原因,更重要的是老师帮我解决了许多技术上的难题,让我能把系统做得更加完善。 在此期间,我不仅学到了许多新的知识,而且也开阔了视野,提高了自己的设计能力。 其次,我要感谢帮助过我的同学,他们也为我解决了不少我不太明白的设计上的难题。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 算法 数据结构
![提示](https://static.bdocx.com/images/bang_tan.gif)