C++ 数据排序的课程设计报告Word文件下载.docx
- 文档编号:19521134
- 上传时间:2023-01-07
- 格式:DOCX
- 页数:22
- 大小:132.25KB
C++ 数据排序的课程设计报告Word文件下载.docx
《C++ 数据排序的课程设计报告Word文件下载.docx》由会员分享,可在线阅读,更多相关《C++ 数据排序的课程设计报告Word文件下载.docx(22页珍藏版)》请在冰豆网上搜索。
在预设计的基础上,进一步查阅资料,完善设计方案,形成书面材料。
2
2009.06.1~2009.06.2
设计总体方案,构建、绘制流程框图,编写代码,上机调试。
3
2009.06.3~2009.06.4
测试程序,优化代码,增强功能,撰写设计报告。
4
2009.06.5
提交软件代码、设计报告,参加答辩,根据教师反馈意见,修改、完善设计报告。
指导教师(签章):
年月日
摘要:
所谓排序就是将已知的n个数据按关键字的大小递增或递减重新排列,排序是数据处理中经常使用的重要运算。
排序的算法很多,不同的算法有不同的优缺点,没有哪种算法在任何情况下都是好的。
按策略划分,内部排序方法可以分为五类:
插入排序.选择排序.交换排序.归并排序等。
几乎所有排序都有两个基本的操作:
(1)关键字大小的比较。
(2)改变记录的位置。
具体的处理方式依赖于记录的存储方式,对于顺序型记录,一般移动记录本身,而链式存储的记录通过改变指向记录的的指针实现重定位。
关键字:
插入排序;
选择排序;
交换排序;
归并排序;
for循环;
switchcase;
1课题综述
1.1课题来源与意义
这个课题使用循环.调用等方面的知识。
能充分调动我们对C++的学习兴趣。
排序在计算机科学中有重要的地位,我想选择它对我以后进一步学习会很有帮助。
1.2预期目标
进入界面后,自动生成100个随机数,用四种不同方法运算输出排序后的数据
1.3面对的问题及需解决的关键技术
问题关键在于如何对数据进行处理,并按照一定的大小来排序。
并且在不同界面下可以相互切换,这就要求要用到switchcase语句。
在数据的处理时要不能改变数据的大小,只能改变他们的位置,所以要用到数组来存储和转移数据而不改变他们的大小。
2系统分析与设计
2.1涉及的基础知识与解决问题的基本思路
C++知识:
循环语句、开关语句、选择语句、数组、函数、break语句
1.循环语句
(1)for()语句
for()循环语句的一般格式为:
for(<
表达式1>
;
<
表达式2>
表达式3>
)S;
其中,三个表达式都可以是C++中的任一符合语法规则的表达式;
语句S可以是任一C++的语句。
同样地将语句S称为for()的内嵌语句,并把称为循环体。
for()语句的执行过程如下;
首先计算“表达式1”(循环初值),且仅计算一次。
每一次循环之前计算“表达式2”(循环条件),如果其结果为真,则执行“语句”S,并计算“表达式3”(循环增量)。
否则,循环终止。
(2)do…while()语句
do…while()语句的一般格式为:
do
while(<
表达式>
);
do…while()语句的执行过程如下:
先执行语句S,然后再判断表达式的值;
若表达式的值不为0,则继续执行循环体,直到表达式的值为0为止。
2.开关语句
开关语句switch语句,它也称为多选择语句。
它可以根据给定的条件,从多个分支语句序列中选择执行一个分支的语句序列。
switch语句的一般格式为:
switch(表达式)
{
case常量表达式1:
语句;
case常量表达式2:
……
case常量表达式n:
default:
}
switch语句的执行过程如下:
首先计算“表达式”的值,然后,其结果值依次与每一个常量表达式的值进行匹配。
如果匹配成功,则执行该常量表达式后的语句系列。
当遇到break时,则立即结束switch语句的执行,否则,顺序执行到花括号的最后一条语句。
3.选择语句(多分支)
现实生活中的各种条件是很复杂的,在一定条件下,又需要满足其他的条件才能确定相应的动作。
为此,C++提供了if语句能够出现在另一个if语句或if-else语句里。
嵌套if语句有两种形式。
一种是嵌套在else分支中,格式为:
if(表达式1)语句1;
elseif(表达式2)语句2;
elseif…
else语句n;
第2种是嵌套在if分支中,格式为:
if(表达式1){
if(表达式2)语句1;
else语句2;
else语句3;
4.数组
数组是有限个同类型元素的有序集合,这些元素有一个共同的名字,每个元素以其在数组中的位置来区分,位置用下标表示。
数组有一维数组与多维数组之分,在程序中仅使用了二维数组。
二维数组的定义格式为:
类型说明符数组名[常量表达式1][常量表达式2];
“类型说明符“指定数组元素的类型,“数组名”的命名规则与变量一样,方括号中的“常量表达式1”代表了二维数组的行数,“常量表达式2”代表了二维数组的列数。
行列下标都是从零开始,其最大下标均比常量表达式的值小1。
5.函数
函数定义的一般形式如下:
返回类型函数名([参数表])
{
语句块
return;
}
函数定义包括以下一个部分:
函数名:
函数名与变量名的定义规则一样,但应尽可能反映函数的功能,常常由几个单词组成。
参数表:
用于向函数传送数值或从函数带回数值。
每一个参数都有自己的类型。
函数可以有一个或多个参数变量,也可以没有参数。
如果没有参数,称为:
无参“函数。
函数体:
花括号中的语句块称为函数体。
一个函数的功能,通过函数体中的语句来完成。
返回类型:
指定函数用return返回的函数值的类型。
如果函数没有返回值,返回类型应为void。
6.break语句的一般格式:
break;
该语句只能用于switch语句或循环语句中,其功能是:
第一;
在switch语句中,结束开关语句的执行,并把控制转移到该开关语句之后的第一条语句,且开始执行该语句。
第二;
在循环语句中的作用是,跳出循环,并执行循环语句后的第一个语句。
2.2总体方案和功能模块框图
利用switchcase语句根据输入的代表不同功能的数字来用不同的方法处理数据。
输入数字1时用插入排序处理数据;
输入数字2时用选择排序法处理数据;
输入数字3时用交换排序法处理数据;
输入数字4时用归并排序法处理数据;
输入数字0时退出程序。
并且利用函数调用来处理,每一种处理方法都适用一个或多个函数,处理后都要输出处理后的数据。
2.3实现方法与详细流程
1定义一个全局的a[100];
用来存储数据,又定义了6个函数通过主函数由switchcase语句调用其中的几个函数,其中的函数再调用输出函数display();
每个排序运行过之后都输出数据。
详细流程:
1.插入排序:
直接插入排序(insert)
基本思想是:
每次将一个待排序的数据记录,按其关键字大小插入到前面已经排好序的记录中集中,使记录依然有序,直到所有待排序记录全部插入完成。
假设待排序数据存放在数组a[1..n]中,则a[i]可以可以看做是一个有序数列,让i从2开始,依次将a[i]插入到有序序列a[1..i-1]中,a[1..n]成为有序序列。
1.若设待排序的对象个数为curremtsize=n,则该算法的主程序执行n-1趟。
2.关键码比较次数和对象移动次数与对象关键码的初始排列有关。
3.最好情况下,排序前对象已经按关键码大小从小到大有序,每趟只需与前面的有序对象序列的最后一个对象的关键码比较1次,移动2次对象,总的关键码比较次数为n-1,对象移动次数为2(n-1)。
4.最坏情况下,第i趟时第i个对象必须与前面i个对象都做关键码比较,并且每做1次比较就要做1次数据移动。
则总的关键码比较次数KCN和对象移动次数RMN分别为
5.若待排序对象序列中出现各种可能排列的概率相同,则可取上述最好情况和最坏情况的平均情况。
在平均情况下的关键码比较次数和对象移动次数约为n2/4。
因此,直接插入排序的时间复杂度为o(n2)。
6.直接插入排序是一种稳定的排序方法。
示例代码
voidinsert(inta[],intn)//插入排序
{
cout<
"
插入排序:
endl;
inttemp;
for(inti=1;
i<
n;
i++)
intj=i;
temp=a[i];
//先把a位置的数据存起来
while(j>
0&
&
temp<
a[j-1])
a[j]=a[j-1];
j--;
a[j]=temp;
display();
2.选择排序:
基本思想是:
每次选出第i小的记录,放在第i个位置(i的起点是0,按此说法,第0小的记录实际上就是最小的,有点别扭,不管这么多了)。
当i=n-1时就排完了。
直接选择排序
示例代码
voidselect(inta[],intn)//选择排序
选择排序:
inti,j;
for(i=0;
intmin=i;
for(j=i+1;
j<
j++)
{
intt;
if(a[j]<
a[min])
{
min=j;
if(min!
=i)
{
t=a[i];
a[i]=a[min];
a[min]=t;
}
}
}
3.交换排序:
交换排序的基本思想是:
两两比较待排序记录的关键字,发现两个记录的次序相反时即进行交换,直到没有反序的记录为止。
冒泡排序
冒泡排序的基本思想是:
依次比较相邻的两个数,将大数放在前面,小数放在后面。
即首先比较第1个和第2个数,将大数放前,小数放后。
然后比较第2个数和第3个数,将大数放前,小数放后,如此继续,直至比较最后两个数,将大数放前,小数放后,此时第一趟结束,在最后的数必是所有数中的最小数。
重复以上过程,仍从第一对数开始比较(因为可能由于第2个数和第3个数的交换,使得第1个数不再大于第2个数),将大数放前,小数放后,一直比较到最小数前的一对相邻数,将大数放前,小数放后,第二趟结束,在倒数第二个数中得到一个新的最小数。
如此下去,直至最终完成排序。
由于在排序过程中总是大数往前放,小数往后放,相当于气泡往上升,所以中冒泡排序。
用二重循环实现,外循环变量设为i,内循环变量设为j。
外循环重复9次,内循环依次重复9,8,...,1次。
每次进行比较的两个元素都是与内循环j有关的,它们可以分别用a[j]和a[j+1]标识,i的值依次为1,2,...,9,对于每一个i,j的值依次为1,2,...10-i。
voidchange(inta[],intn)//交换排序
交换排序:
inti,j,t;
//定义循环变量和交换中间变量
for(j=0;
n-i;
if(a[j]>
a[j+1])//比较大小
t=a[j];
a[j]=a[j+1];
a[j+1]=t;
}
4.归并排序:
归并操作
归并操作(merge),也叫归并算法,指的是将两个已经排序的序列合并成一个序列的操作。
算法描述
归并操作的工作原理如下:
申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列
设定两个指针,最初位置为别为两个已经排序序列的起始位置
比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置
重复步骤3直到某一指针达到序列尾
将另一序列剩下的所有元素直接复制到合并序列尾
示例代码:
voidmerge(inta[],intl,intm,intr)//归并
int*temp=newint[50];
inti=l,j=m+1,k=0;
while((i<
=m)&
(j<
=r))
if(a[i]<
=a[j])
temp[k++]=a[i++];
else
temp[k++]=a[j++];
while(i<
=m)
temp[k++]=a[i++];
while(j<
=r)
for(i=0,k=l;
k<
=r;
)
a[k++]=temp[i++];
voidMergeSort(inta[],intn)
intleft,right,mid,size=1;
while(size<
n)
left=0;
while(left+size<
mid=left+size-1;
if(mid+size>
n-1)
right=n-1;
else
right=mid+size;
merge(a,left,mid,right);
left=right+1;
size*=2;
3代码编写
#include<
iostream.h>
#include<
stdlib.h>
inta[50];
//定义一个公共数组
voiddisplay()//输出函数
intk=1;
for(inti=0;
50;
if(k!
=10)
k++;
a[i]<
"
;
else
k=1;
a[j+1])
voidmain()
intm;
a[i]=rand()%90+10;
//生成100个200以内的随机数
原数据为:
for(intj=0;
数据排序"
endl<
============"
1.插入排序"
2.选择排序"
3.交换排序"
4.归并排序"
请选择(1~4,0:
退出):
请输入排序所对应的数字:
cin>
>
m;
if(m==0)
break;
switch(m)
case1:
insert(a,50);
break;
case2:
select(a,50);
case3:
change(a,50);
case4:
MergeSort(a,50);
4程序调试与运行
程序写出来之后,便对其进行了调试。
主要是对系统规定非法的输入进行测试,以检测软件的性能。
同时对一些边界数据进行了测试,其中发现了不少问题,这对系统功能的完善,和最终的成型都有莫大的帮助。
其中常出现的就是,在调试的时候会出现只有一种方案的情况,仔细研究却是计数的问题,改进后的程序则不会出现此问题。
这使我更深的了解C++语言。
生成数据:
插入排序
选择排序
交换排序
归并排序
总结
第一次做课程设计,因此感到期待而又非常紧张,一个星期,短暂而忙碌,但却又充实、兴奋。
当我把程序写出来,并运行正确后,我有种说不出的喜悦,虽然还有许多不足,但我对未来一片憧憬。
这次我们是按照学号来选课题,我选到的是“数据排序“,开始的我是无从下手,从网上搜了一气后一无所获,一味地依赖网上现成地答案使我毫无进展。
后来,在同组同学地影响下,我开始静下心来回忆学过的知识。
终于,经过反复调试后,我终于找到了思路,经过同组同学的帮助与网上资料,我逐渐将程序设计成型,虽然还有许多缺陷,比如,设计后还是不能人性化地满足要求。
虽然与想象中的还有很大差距,但我看到了希望,并决心一直努力下去。
一个星期的程序设计虽然马上就要结束的,但是它带给我的将会影响我今后的学习。
在这次程序设计中,我不仅提高了编程的能力,也增加了我对这门课程的兴趣,虽然一周的程序设计很忙,但过得的很充实、很有意义。
但也有许多不足的地方,如界面设计的还不够完美、还有一些最基本的知识没有完全掌握等等。
这为我以后的学习提出了要求。
致谢
在这一次的课程设计中,首先要感谢的是淮阴工学院计算机工程系提供给我们这次实习的机会,并给我们提供了设有空调的机房,让我们在一个好的环境下学习。
其次要感谢的是我们的指导老师,谢谢他们的悉心指导,在做程序上机时老师总能陪在我们身旁,为我们调试程序、帮我们修改错误,并为我们讲解编程序过程中所遇到的问题与撰写实验报告的格式。
同样,在这里还要感谢我的同学,谢谢他们在遇到问题时,帮我一起找出程序中的错误,教我如何修改,在他们帮助我的同时,我发现自己在基础知识上有很多没有真正弄明白,但是他们还是在一旁不厌其烦讲给我听,对此,我很感动。
参考文献
[1]于永彦,刘作军,于长辉.C++程序设计.淮安市淮海路小学印刷厂.2007
(1):
301~333.
[2]钱能.C++程序设计教程(第二版).清华大学出版社,2005(9):
75~86.
[3]BjarneStroustrup.VisualC++程序设计语言(特别版).裘宗燕译.北京机械工业出版社.2002(6):
102~108.
[4]黄明.VisualC++信息系统开发实例.华中理工大学出版社.2005(7):
108~121.
[5]殷人昆,陶永雷等.数据结构(用面向对象方法与C++).清华大学出版社.1999(6):
48~62.
[6]徐孝凯,贺桂英.数据结构(C语言描述).清华大学出版社.2004(9):
98~112.
[7]温秀梅,刘建斌.软件工程.广东高等教育出版社.1999(11):
224~229.
[8]龚沛曾,杨志强.C/C++程序设计教程.高等教育出版社.2005(5):
99~109.
[9]窦延平,数据结构与算法.上海交大出版社.2004(12):
201~222.
[10]夏邦贵.数据库开发经典实例精解.机械工业出版社.2003(4):
12~19.
指导教师评语
学号
1081301607
姓名
巩尊宝
班级
计算机1086
选题
评价内容
权重(%)
得分
考勤记录、学习态度、工作作风与表现。
5
自学情况:
上网检索机时数、文献阅读情况(笔记)。
10
论文选题是否先进,是否具有前沿性或前瞻性。
成果验收:
是否
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- C+ 数据排序的课程设计报告 数据 排序 课程设计 报告