编程对一个数组进行Shell排序的程序.docx

上传人:b****5 文档编号:2858751 上传时间:2022-11-16 格式:DOCX 页数:18 大小:331.50KB
下载 相关 举报
编程对一个数组进行Shell排序的程序.docx_第1页
第1页 / 共18页
编程对一个数组进行Shell排序的程序.docx_第2页
第2页 / 共18页
编程对一个数组进行Shell排序的程序.docx_第3页
第3页 / 共18页
编程对一个数组进行Shell排序的程序.docx_第4页
第4页 / 共18页
编程对一个数组进行Shell排序的程序.docx_第5页
第5页 / 共18页
点击查看更多>>
下载资源
资源描述

编程对一个数组进行Shell排序的程序.docx

《编程对一个数组进行Shell排序的程序.docx》由会员分享,可在线阅读,更多相关《编程对一个数组进行Shell排序的程序.docx(18页珍藏版)》请在冰豆网上搜索。

编程对一个数组进行Shell排序的程序.docx

编程对一个数组进行Shell排序的程序

南京邮电大学

编程实践报告

 

学号:

姓名:

 

指导老师:

周文

数理学院信息与计算科学

2014年5月

一、第016E题

1.问题描述。

设计对一个数组进行Shell排序的程序。

2.问题分析。

对于此问题要注意两个方面,一个是数组的输入、输出,另一个则是如何实现shell排序。

对于数组的输入、输出,要注意申请动态数组空间,并且最后要释放;对于实现shell排序,要注意利用循环结构实现步长变化时,数组元素的处理。

3.设计思路。

模块化设计:

1)input模块:

通过循环结构及数组实现数列的输入

2)Shellsort模块:

实现对数组的shell排序

3)output模块:

实现对排序后数组的输出

4)主函数模块:

实现各模块函数功能

4.流程图。

系统整体流程

5.源程序。

#include

voidinput(inta[],intn)

{

inti=0;

cout<<"----------请输入要排序的数----------"<

do

{

cin>>a[i];

i++;

}while(i

}//输入

voidShellSort(inta[],intn)

{

intd=n;

while(d>1)

{

d=(d+1)/2;//开始步长

for(inti=0;i

{

if(a[i+d]

{

inttemp;

temp=a[i];

a[i]=a[i+d];

a[i+d]=temp;

}//互换

}

}

}//shell排序

voidoutput(inta[],intn)

{

for(intk=0;k

cout<

cout<

}//输出

intmain()

{

intm;

cout<<"---------请输入要排序多少数--------"<

cin>>m;

int*a;

a=newint[m];//申请动态数组空间

input(a,m);

ShellSort(a,m);

cout<<"------------经shell排序后-------------"<

output(a,m);

return0;

}

6.测试:

包括测试数据、测试结果、结果分析

测试数据:

(1)82934526

(2)355744626726726

测试结果:

结果分析:

按照人工排序可验证排序结果正确

7.心得。

1.学习了第一次接触的shell排序

2.学习了如何对程序进行模块化设计,并了解c++程序的重要性

二、第008M题

1.问题描述。

编写一个子程序NewTon(floatx0,floateps,floatx1)。

它的功能是用牛顿迭代法求

f(x)=

在x=0附近的一个实根。

牛顿迭代公式为:

迭代收敛判据为:

(eps为指定的迭代精度,例如1e-6)。

若迭代成功,则返回非零值;否则,返回0。

2.问题分析。

对于子程序牛顿迭代,我们在主函数中用迭代的方法实现,应用循环结构,当达到所需精度时循环截止。

3.设计思路。

(1)计算f,(x)

(2)代入x0,计算x1

(3)计算f(x1)

(4)判断|f(x1)|是否小于eps

(4)如果小于eps,输出x1;如果大于eps,令x0等于x1,重复

(2)--(4)步

4.流程图

|f(x1)|>eps

|f(x1)|

 

5.源程序。

#include

#include

#include

floatfunction(floatx);

floatd2function(floatx);

intNewTon(floatx0,floateps,float*x1);//函数声明

intmain()

{

intn=0;

floatx0=0;/*初值*/

floatxold,xnew;

floateps=1e-6;/*精度*/

intNewTon(floatx0,floateps,float*x1);

xold=x0;

while(!

NewTon(xold,eps,&xnew))

xold=xnew;

printf("输出根为:

\n");

printf("x=%f\t",xnew);

getch();

return0;

}

floatfunction(floatx)

{

returnx*x*x-2*x*x+4*x+1;

}

floatd2function(floatx)

{

return3*x*x-4*x+4;

}

intNewTon(floatx0,floateps,float*x1)

{

*x1=x0-function(x0)/d2function(x0);

if(fabs(function(*x1))

return1;

else

return0;

}

6.测试:

包括测试数据、测试结果、结果分析

测试结果

结果分析:

当我们用printf("x=%f\tf=%f\t",xnew,function(xnew));替换printf("x=%f\t",xnew);时,

输出f,若f=0.000000,则结果正确:

7.心得

1.加深对牛顿迭代的理解

2.掌握对函数声明与函数定义

3.解决难点:

如何利用循环结构进行迭代

三、第019M题

1.问题描述。

设有n个人围坐在圆桌周围,从某个位置开始用自然数进行编号为1,2,…,n。

然后从编号为k的人从1开始报数,数到m的人便出列;下一个人(第m十1个)又从1开始报数,数到m的人便是第二个出列的人。

如此继续下去,直到最后一个人出列为止。

要求输出这个出列的顺序。

这个问题称为雅瑟夫(Josephu)问题。

具体要求如下:

(1)n、m、k由键盘输入,输入前要有提示。

(2)在输入n后,动态建立方法说明中所需要建立的数组空间;程序运行结束时释放该

存储空间。

(3)分别用n=8,m=4,k=1以及n=10,m=12,k=4调试运行你的程序。

2.问题分析。

这是一个删除数组元素的问题,关键在于把握删除的数组下标;可以通过循环结构顺序删除。

3.设计思路。

1)建立一个长度为n的整型数组a[],顺序存储1到n,表示n个人。

2)从第k个人开始报数。

3)用i=k-1表示数组元素下标,假设从i“指向”的数组元素开始数,数到m,相当于i值增加m-1。

如果在数的过程中遇到数组最后一个元素,则要从数组第一个元素继续数,即将数组想象成一个“环”,为此要用到求余运算,综合起来,被删除元素的下表计算公式为:

i=(i+m-1)%n如果删除的正好是数组最后一个元素,那么下一轮要从数组第一个元素开始数。

4)重复执行步骤(3),直到n等于1。

4.

流程图

5.源程序。

#include

#include

intmain()

{

inti,j,m,n,k,*pa;

cout<<"inputnandm"<

cin>>n>>m;

cout<<"inputk"<

do

{

cin>>k;

}while(k>n-1);//保证k符合要求

pa=newint[n];

if(pa==NULL)

{

cout<<"allocationfailure";

exit

(1);

}

for(i=0;i

pa[i]=i+1;

i=k-1;

cout<<"出列顺序为:

"<

while(n>0)

{

i=(i+m-1)%n;

cout<

for(j=i+1;j

pa[j-1]=pa[j];

n--;

if(i==n)

i=0;

}

cout<

delete[]pa;//满足题目要求二

return0;

}

6.测试:

包括测试数据、测试结果、结果分析

n=8,m=4,k=1

n=10,m=12,k=4

7.心得

1.切记动态数组空间申请后要释放

2.学习如何应用循环结构对数组元素的删除

 

四、第018H题

1.问题描述。

由n2个方块排成n行n列的正方形称为“n元棋盘”。

如果两个皇后位于n元棋盘上的同一行或同一列或同一对角线上,则称它们为互相攻击。

要求输出使n无棋盘上的n个皇后互不攻击的所有布局。

具体要求如下;

(1)n可由键盘输入。

(2)在输入n后,动态建立方法说明中所需要建立的数组空间;程序运行结束时释放该存储空间。

(3)分别用n=4,5,6运行你的程序。

2.问题分析。

皇后不能相互攻击,也就是不能处于同一条直线上,所以每一行只能有一个皇后,也不能处于同一列或斜线上。

解决问题最直接的办法,就是在逐次在每一行每一个位置上尝试放一个皇后,并且在放后必须与前面放置的不能互相攻击。

只要能够保证n个皇后都能找到正确的位置就是成功。

3.设计思路。

(1)输入皇后的总数

(2)在第一行上一次的下一列放置皇后

(3)在第下一行寻找不与前面相互攻击的位置

(4)重复第(3)步n次

(4)如果成功,输出皇后的排列

(5)重复2~4步n次

(6)结束

4.流程图。

5.源程序。

#include

#include

usingnamespacestd;

int*position;//放置的位置

intqueen;//皇后数目

intcount=0;//第N种可能性

//判断第n行放置皇后是否合法

boolSignPoint(intn)

{

for(inti=0;i

{

if(*(position+i)==*(position+n)||abs(*(position+i)-*(position+n))==abs(i-n))

returnfalse;

}

returntrue;

}

//设置皇后

voidSetQueen(intn=0)

{

if(queen==n)

{

printf("NO.%d:

",++count);

printf("\n");

for(inti=0;i

{

for(intj=0;j

{

if(j==position[i])

printf("*");

elseprintf("0");

}

printf("\n");

}

printf("\n");

//return;

}

else

{

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 表格模板 > 调查报告

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

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