2014040206027_刘明哲_作业1_第一篇课后作业.docx
文本预览下载声明
实验报告课程名称:计算机软件技术基础
学 院:物理电子学院
专 业:电子信息与科学技术
学生姓名:刘明哲
学 号:2014040206029日 期:2015年03月22日
1.3利用减半递推技术,写出长度为n的数组中最大元素的递归算法(用C/C++描述)。设n=2^k,其中k=1。
程序说明:
如果数组中只有一个元素,则该元素即数组中的最大元素,否则将数组对半分为前半部分和后半部分;
分别求出数组前半部分和后半部分的最大值m1、m2并比较二者大小,若m1m2,则m1为数组中的最大值,否则m2为数组中的最大值;
程序清单:
#includestdio.h
int max(int array[],int m,int n)
{
int d,d1,d2;
if(m==n)
return(array[m-1]);
else
{
d1=max(array,m,(m+n)/2);
d2=max(array,(m+n)/2,n);
if(d1d2)
d=d1;
else
d=d2;
return(d);
}
}
main()
{
int a[10]={1,2,3,4,5,6,7,8,9,10};
printf(maximum=%d\n,max(a,1,10));
return 0;
}
调试说明:
运行结果:
程序无法运行
1.4编写二分法求方程实根的减半递推算法(用C/C++描述)。
程序说明:
首先取给定区间的中点c=(a+b)/2;
然后判断f(c)是否为0.若f(c)=0,则说明c即为所求的根,求解过程结束;若f(c)!=0,则根据以下原则将区间减半;
若f(a)f(c)0,则取原区间的前半部分;若f(b)f(c)0,则取原区间的前后部分;
最后判断减半后的区间长度是否已经很小;
若|a-b|l,则过程结束,取(a+b)/2为根的近似值;若|a-b|=l,则重复上述的减半过程。
程序清单:
#includestdio.h
#includemath.h
double function(double x)
{
return(2*x*x*x-3*x*x+2*x-6);//初始化方程
}
int main()
{
double lit=0.1;
double a,b;
printf(请输入取值范围:\n);
scanf(%lf%lf,a,b);//输入二分法取值边界
double c=(a+b)/2;
double result;
while (fabs (function(c)) lit)//判断中点的函数值是否大于极限值,满足则进行递推
{
if(function(c)0)
{
b=c;
}
if(function(c)0)
{
a=c;
}
c=(a+b)/2;
}
if(fabs(function(c))lit)//判断中点的函数值是否小于极限值,满足则近似看成方程组的零点
{
result=c;
printf(the result is:%f\n,result);
}
else
{
printf(error\n);
}
getchar();
getchar();
return 0;
}
调试说明:
运行结果:
程序暂时无法实现自主输入各项系数的功能,原因不明,尚且有待改进;
程序运行结束后窗口立即自动关闭,不过在最后添加一行getchar()后问题得到初步解决;
1.5编写用回溯法求解皇后问题的算法(用C/C++描述)。
程序说明:
程序清单:
调试说明:
运行结果:
显示全部