ImageVerifierCode 换一换
格式:DOCX , 页数:23 ,大小:192.36KB ,
资源ID:14465620      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/14465620.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(数据结构课程设计.docx)为本站会员(b****2)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

数据结构课程设计.docx

1、数据结构课程设计学 号201110137133武 汉 科 技 大 学 城 市 学 院课 程 设 计 报 告 课程名称 数据结构课程设计 题 目 ACM题型设计 学 部 信息工程学部 专 业 计算机科学与技术 班 级 一班 姓 名 指导教师 杨艳霞 2013年7月5日目 录题目一 喷水装置(一) 11 题目要求 12算法设计思路及步骤 23算法描述 34结果分析 4题目二 阶乘的0 51 题目要求 52算法设计思路及步骤 63算法描述 74结果分析 8题目三 找球号(一) 81 题目要求 82算法设计思路及步骤 93算法描述 104结果分析 11题目四 ASCII码排序 121 题目要求 122

2、算法设计思路及步骤 133算法描述 134结果分析 15题目五 会场安排问题 161 题目要求 162算法设计思路及步骤 173算法描述 174结果分析 19小 结 20参考文献 21 题目一 喷水装置(一)1 题目要求1.1 问题描述 现有一块草坪,长为20米,宽为2米,要在横中心线上放置半径为Ri的喷水装置,每个喷水装置的效果都会让以它为中心的半径为实数Ri(0Ri15)的圆被湿润,这有充足的喷水装置i(1i600)个,并且一定能把草坪全部湿润,你要做的是:选择尽量少的喷水装置,把整个草坪的全部湿润。时间限制:3000 ms | 内存限制:65535 KB 。1.2 输入第一行m表示有m组

3、测试数据,每一组测试数据的第一行有一个整数数n,n表示共有n个喷水装置,随后的一行,有n个实数ri,ri表示该喷水装置能覆盖的圆的半径。1.3 输出输出所用装置的个数。1.4 样例输入252 3.2 4 4.5 6 101 2 3 1 2 1.2 3 1.1 1 21.5 样例输出252算法设计思路及步骤2.1 设计思路这是一个3级难度的题,看起来着题目不知从何下手。我仔细想了想,发现,只要算出这个草地的斜边长度, 然后只要全部圆的半径合大于等于这个斜边长度的一半就可以了。不过必须舍弃半径小于等于1的装置,在草坪中线上无论怎么放,它是无法完全覆盖整个草坪的。如图2.1: x = sqrt(r*

4、r-(h/2)*(h/2), 这样半径为r的圆能够覆盖的长度为2x, 剩下w-2x, 这样遍历下去, 当w=0时,就满足了。简化一下,就是求全部圆的半径(小于等于1的不算)和大于等于这个斜边长度的一半。r=sqrt(x*x+h*h)/2;总的半径和ra = sqrt(w*w+h*h)/2图1.1 喷水装置示意图2.2 步骤1) 建立int型变量m,通过scanf接受用户输入m组测试数据,从而控制程序循环的次数。2) 建立一个double型数组buf600,用于存放每个喷水装置能覆盖圆的半径。3) 建立double型变量len,并计算出草地斜边长度的一半。4) While循环,控制测试组数,是输

5、入m组测试数据。5) 调用系统快速排序方法对半径排序,compare方法是指向函数的指针,是作为qsort的参数,用于确定快速排序的顺序。6) sum变量用于存放半径和。7) 当半径和大于等于草地斜边长度一半就满足条件了。8) printf输入所用装置个数.3算法描述#include #include #include /指向函数的指针,用于确定快速排序的顺序int compare (const void * a, const void * b) return *(double *)b *(double *)a ? 1 : -1; int main() int m; scanf(%d,&m);

6、 /输入m组测试数据 double buf600; /存放每个喷水装置能覆盖圆的半径 double len = sqrt(20*20 + 2*2)/2; /草地斜边长度的一半 while (m-) int n, i; scanf(%d,&n); /输入n个喷水装置 for (i=0; in; +i) scanf(%lf, buf+i); /输入n个喷水装置能覆盖圆的半径 qsort (buf, n, sizeof(buf0), compare); /调用系统的快速排序方法对圆半径排序 double sum = 0; /存放半径和 for (i = 0; in; +i) if (bufi = l

7、en) /半径和大于等于草地斜边长度一半就满足条件了 break; printf(%dn,i+1); return 0; return 0; 4结果分析这是一个3级的题目,初次做ACM系统的题目,在VC+ 6.0编译器里运行通过的程序,提交到ACM系统时,经常报错。多数情况是内存或时间超出题目的限制或程序的输入输出格式没严格按照题目的意思来。经过改进程序的算法和优化代码,严格按照题目要求的格式输入或输出等,再提交到ACM系统时,终于成功的通过了。图1.2 喷水装置ACM结果图1.3 喷水装置运行当然,拿下这个题目我花了不少精力,通过XX,我了解了怎样调用系统的快速排序方法,虽然它的参数很多。题

8、目二 阶乘的01 题目要求1.1 问题描述 计算n!的十进制表示最后有多少个0。时间限制:3000 ms | 内存限制:65535 KB。 1.2 输入第一行输入一个整数N表示测试数据的组数(1=N=100)每组测试数据占一行,都只有一个整数M(0=M=10000000)1.3 输出输出M的阶乘的十进制表示中最后0的个数比如5!=120则最后的0的个数为11.4 样例输入636010010242345687353731.5 样例输出0142425358612183837 2算法设计思路及步骤2.1 设计思路这个题看似简单,其实不怎么好下手。一个数 n 的阶乘末尾有多少个 0 取决于从 1 到

9、n 的各个数的因子中 2 和 5 的个数, 而 2 的个数是远远多余 5 的个数的, 因此求出 5 的个数即可. 题解中给出的求解因子 5 的个数的方法是用 n 不断除以 5, 直到结果为 0, 然后把中间得到的结果累加. 例如, 100/5 = 20, 20/5 = 4, 4/5 = 0, 则 1 到 100 中因子 5 的个数为 (20 + 4 + 0) = 24 个, 即 100 的阶乘末尾有 24 个 0. 其实不断除以 5, 是因为每间隔 5 个数有一个数可以被 5 整除, 然后在这些可被 5 整除的数中, 每间隔 5 个数又有一个可以被 25 整除, 故要再除一次,直到结果为 0,

10、 表示没有能继续被 5 整除的数了。2.2 步骤1) 建立int型变量N,并从键盘输入N,表示有N组测试数据。2) While循环,控制测试组数,由N决定循环次数。3) 循环里面要求输入测试整数M,并建立变量sum。4) 内层循环累加M除5的结果,直到M/5结果为0。5) printf输入结果。3算法描述#include int main() int N; scanf(%d,&N); /N组测试数据 while(-N) int M; scanf(%d,&M); /测试整数M int sum=0; while(M) /累加M除5的结果 sum=sum+M/5; M=M/5; printf(%dn

11、,sum); return 0; 4结果分析这个题的难度为3级,代码其实很简单,也很容易理解,但刚开始我也不知该怎么下手。然后,我就在网上找资料,发现原来与5有关。但第一次做出来,在VC+ 6.0 环境下运行没问题,提交到ACM系统提示“TimeLimitExceeded”,时间超标,题目要求时间限制:3000 ms | 内存限制:65535 KB。于是我优化代码,但效果不明显。最后,我请大神帮我优化,结果终于出来了,这题目费了九牛二虎之力啊。图2.1 阶乘的0ACM结果图2.2 阶乘的0结果题目三 找球号(一)1 题目要求1.1 问题描述 在某一国度里流行着一种游戏。游戏规则为:在一堆球中,

12、每个球上都有一个整数编号i(0=i=100000000),编号可重复,现在说一个随机整数k(0=k=100000100),判断编号为k的球是否在这堆球中(存在为YES,否则为NO),先答出者为胜。现在有一个人想玩玩这个游戏,但他又很懒。他希望你能帮助他取得胜利。时间限制:3000 ms,内存限制:65535 KB。 1.2 输入第一行有两个整数m,n(0=n=100000,0=m=1000000);m表示这堆球里有m个球,n表示这个游戏进行n次。接下来输入m+n个整数,前m个分别表示这m个球的编号i,后n个分别表示每次游戏中的随机整数k。1.3 输出输出YES或NO。1.4 样例输入6 423

13、 34 46 768 343 3432 4 23 3431.5 样例输出NONOYESYES2算法设计思路及步骤2.1 设计思路这个题目的设计思路是先调用系统的快排序,对球堆序列进行排序。然后调用系统的二分查找法,判断k的球是否在这堆球中。通过调用系统的方法,能够保证程序的时间复杂度符合ACM系统的要求。2.2 步骤1) 建立int型变量m, n,m表示这堆球里有m个球,n表示这个游戏进行n次。2) int型数字a10001, 用于存放球堆编号。3) compare方法,比较函数,用于二分查找和快速排序的参数。4) qsort调用系统的快速排序,对球堆排序,用于后面的查找,。5) for循环里

14、面的bsearch是调用系统的二分查找,判断k球是否在球堆序列。6) printf输入判断的结果。3算法描述#include#includeint compare(const void *a,const void *b) /比较函数,用于二分查找和快速排序的参数 return *(int*)a-*(int *)b; int main() int m,n; /球堆里有m个球,游戏进行n次 int a10001; int t; scanf(%d%d,&m,&n); for(int i1=0;i1m;i1+) scanf(%d,&ai1); qsort(a,m,sizeof(int),compare

15、); /快速排序,对球堆排序,用于后面的查找 for(int i2=0;i2n;i2+) scanf(%d,&t); void *p=bsearch(&t,a,m,sizeof(int),compare); /二分查找,判断k球是否在球堆序列 if(p) printf(YESn); else printf(NOn); return 0; 4结果分析要保证题目提交到ACM系统能通过,我自己写的快速排序和二分查找,怎么也通过不了,调用系统的方法才是王道啊,这样才能不超过时间限制,避免“TimeLimitExceede”。原来系统里的方法执行效率是如此之高。代码里主要就是调用系统的快速排序和二分查找

16、方法,2个方法的参数都比较多,用法好似参考的网络。图3.1 找球号ACM结果图3.2 找球号运行结果题目四 ASCII码排序1 题目要求1.1 问题描述 输入三个字符(可以重复)后,按各字符的ASCII码从小到大的顺序输出这三个字符。时间限制:3000 ms,内存限制:65535 KB。 1.2 输入第一行输入一个数N,表示有N组测试数据。后面的N行输入多组数据,每组输入数据都是占一行,由三个字符组成,之间无空格。1.3 输出对于每组输入数据,输出一行,字符中间用一个空格分开。1.4 样例输入3qweasdzxc1.5 样例输出e q wa d sc x z2算法设计思路及步骤2.1 设计思路

17、这是我做的第一个ACM系统的题目。在VC+6.0的环境下,通过的程序,提交到ACM系统,不一定能通过。ACM系统要考虑时间复杂度,空间复杂度,还有输入、输出格式,以及main方法返回值,C+的代码还得考虑命名空间的问题。这些都有严格的要求。题目思路挺简单,就是对各组字符按ASC码排序。2.2 步骤1) 建立int型变量N,使用cin来接收用户输入的测试数据组数。2) 建立2个char型指针*s,*ps,s用于存放输入的ASC码,ps用于交换数据时记录位置的指针。3) for循环判定ASC码大小并排序,循环次数由数据组数N决定。4) for循环里面的第一个if用于判断每组的第一个ASC码和第二个

18、ASC码的大小。5) for循环里面的第二个if用于判断每组的第一个ASC码和第三个ASC码的大小。6) for循环里面的第三个if用于判断每组的第二个ASC码和第三个ASC码的大小。7) for循环里的cout输出每组的结果。3算法描述#include#include#includeusing namespace std;int main() int N,i; char *s, *ps; cinN; /输入测试数据组数 s = (char *)malloc(sizeof(char)*3*N); /分配存储空间 ps = s; for(i=1;i=N;i+) /输入多组数据 scanf(%s,

19、&ps3*i-3); for(i=1;ips3*i-2) ps3*i-2=ps3*i-2ps3*i-3; ps3*i-3=ps3*i-2ps3*i-3; ps3*i-2=ps3*i-2ps3*i-3; if (ps3*i-3ps3*i-1) ps3*i-1=ps3*i-1ps3*i-3; ps3*i-3=ps3*i-1ps3*i-3; ps3*i-1=ps3*i-1ps3*i-3; if (ps3*i-2ps3*i-1) ps3*i-1=ps3*i-1ps3*i-2; ps3*i-2=ps3*i-1ps3*i-2; ps3*i-1=ps3*i-1ps3*i-2; coutps3*i-3 ps3

20、*i-2 ps3*i-1endl; /输出结果 return 0; 4结果分析这也是一个2级难度的题,在编译器里运行通过的程序,第一次提交时ACM系统却给出了错误提示:TimeLimitExceede(超时)。题目要求有时间限制:3000 ms,内存限制:65535 KB。然后改进现在必须考虑时间复杂度了。经过改进,我用的一层循环,里面用几个if语句判断,提高了时间复杂度,通过了ACM系统:图3.1 ASCII码排序ACM结果图3.2 ASCII码排序运行结果题目五 会场安排问题1 题目要求1.1 问题描述 学校的小礼堂每天都会有许多活动,有时间这些活动的计划时间会发生冲突,需要选择出一些活动

21、进行举办。小刘的工作就是安排学校小礼堂的活动,每个时间最多安排一个活动。现在小刘有一些活动计划的时间表,他想尽可能的安排更多的活动,请问他该如何安排。时间限制:3000 ms,内存限制:65535 KB。 1.2 输入第一行是一个整型数m(m100)表示共有m组测试数据。每组测试数据的第一行是一个整数n(1n10000)表示该测试数据共有n个活动。随后的n行,每行有两个正整数Bi,Ei(0=Bi,Ei10000),分别表示第i个活动的起始与结束时间(Bi=Ei)。1.3 输出对于每一组输入,输出最多能够安排的活动数量。每组的输出占一行。1.4 样例输入221 1010 1131 1010 11

22、11 201.5 样例输出122算法设计思路及步骤2.1 设计思路这是个4级难度的题目,对我来说,难度挺大的。这样的题时间复杂度总是成问题,每次提交到ACM系统,总是 TimeLimitExceede 。这个题也不例外,自己写的方法,跑起来总是时间超标。不得不调用系统的方法,看来调用系统的方法也是一个很好的方法,既不用自己写方法,也提高了效率。2.2 步骤1) 建立结构体Activity,用于存放每个活动的开始时间和结束时间,便于后边的操作。2) 建立一个int型m,表示m组测试数据,并从键盘输入。3) 使用while语句控制测试次数,由m决定。4) While里面的for循环用于接收输入的活

23、动时间。5) compare方法,用于快速排序的参数6) 调用系统的快速排序qsort,对活动按时间先后排序。7) 第二个for循环,选择安排进行的活动,并统计能安排的活动的个数。8) printf输出结果。3算法描述#include#include#includeusing namespace std;struct Activity /活动时间结构体 int begin; int end;A10000;int compare(const void *a,const void *b) /用于快速排序的参数 struct Activity *c = (Activity *)a; struct A

24、ctivity *d = (Activity *)b; return c-end - d-end;int main() int m; /m组测试数据 int i,j=0,count=1; scanf(%d,&m); while(-m) int n,i; scanf(%d,&n); for(i=0;in;i+) scanf(%d %d,&Ai.begin,&Ai.end); /将比赛时间用结构体粗放 qsort(A,n,sizeof(A0),compare); for(i=1;i Aj.end) count+; j=i; printf(%dn,count); 4结果分析 4级难度的题目与3级难度

25、的题目还是有很多区别的,对于时间的控制更加严格,一不小心时间就超标了。这个题目也花了不少时间,一开始,我没调用系统的方法,都是自己写的方法,提交到ACM系统,总是 TimeLimitExceede,最后不得不调用系统的方法,看来调用系统的方法也是一个很好的方法,既不用自己写方法,也提高了效率。图4.1 会场安排ACM结果图4.2 会场安排运行结果小 结 我们用了一周的时间做这次数据结构的课程设计,对于我来说,这时间挺紧的。我做的是南洋理工学院的ACM系统的题目。这也是我第一次接触OJ系统。上面的题目我只能做3级难度的,而且每个3级的的题目我都要花不少时间,做4级的题目时,经常是时间超过了题目的

26、规定。ACM系统的题目整体的代码都比较简短,但算法需要花费精力思考, 题目都是生活中的实际问题。在这次课程设计中,使我懂得了理论与实际相结合是非常重要的。只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能提高自己的思考和解决问题以及实际动手能力。同时也巩固和加深了我对数据结构的进一步掌握,提高综合运用本课程所学知识的能力,培养了我运用参考书,查阅手册及文献资料的能力,培养独立思考,深入研究,分析问题,解决问题的能力。通过实际对编译系统的分析设计,编程调试,掌握应用软件的分析方法和设计方法。 通过这次做ACM,我对数据结构有了更深的了解。我觉得ACM系统的要求

27、很严,刚做第一个题的时候觉得很不适应。我觉得ACM很好的提高了我们写程序时的严谨性,使得我们不能随意的书写。另外ACM里面都是对一些现实问题的抽象,不是单纯的题目,要求我们能够建立模型,然后根据简单的数据结构写出程序。我觉得我们应该加强ACM的训练,这样有利于 我们更好地掌握所学的知识,可以提高我们的综合素质。我也认识到自己还有很多很多不会的,特别是算法,都不注重时间复杂度和空间复杂度,像现在流行的Android 系统,内存有限,CPU效率也有限,时间复杂度和空间复杂度都是非常重要的。我想,我以后要经常做做ACM系统的题,掌握更多的、优秀的算法与数据结构。参考文献1 严蔚敏,吴伟民.数据结构(C语言版).清华大学出版社,2011. 2 刘振安,刘燕君.C程序设计课程设计M.北京: 机械工业出版社,2004. 3 谭浩强.C程序设计(第三版).清华大学出版社,2010.4 吴文虎.程序设计基础.清华大学出版社,2010.5 严蔚敏,陈文博.数据结构及应用算法教程.清华大学出版社,2004. 课设计评分表评分标准:1. 学生是否严格遵守课程设计纪律,按照规定时间完成设计任务(占30%)2. 程序设计的质量与规范:(占40%)(1)选题难度:ACM题目(A级或B级)、传统题目(2)是否采用了良好的设计方法

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1