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;ipa[i]=i+1;
i=k-1;
cout<<"出列顺序为:
"<while(n>0)
{
i=(i+m-1)%n;
cout<for(j=i+1;jpa[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
{