#define N 21
void main(void)
{
int a[N]
int i,n,num
int top,bottom,mid
int flag=1//如果在表列中找到数字,则值为1,否则为0
int loc=-1//要查找的数在表列中的位置,如果loca=-1表示表列中没有这个数如果有这个数,则它的值为所在的位置
printf("你想在多少个数中进行折半查找,请输入(1--20):")
scanf("%d",&n)
while(n<1 || n>20)
{
printf("你输入的数不正确,请重新输入。\n")
printf("你想在多少个数中进行折半查找,请输入(1--20):")
scanf("%d",&n)
}
printf("请你输入一个整数 a[1]:")
scanf("%d",&a[1])
i=2
while(i<=n) //输入从小到大的表列
{
printf("请你输入一个整数 a[%d]:",i)
scanf("%d",&a[i])
if(a[i] >a[i-1])
i++
else
printf("你输入的数不满足要求,请重新输入。\n")
}
//输出表列
printf("\n输出表列\n")
for(i=1i<=ni++)
{
printf("%6d",a[i])
}
printf("\n")
printf("请你输入要查找的数:")
scanf("%d",&num)
flag=1//假设输入的数在表列中
top=n
bottom=1
mid=(top+bottom)/2
while(flag)
{
printf("top=%d, bottom=%d, mid=%d, a[%d]=%d\n",top,bottom,mid,mid,a[mid])
if( (num>a[top]) || (num<a[bottom]) ) //输入的数 num>a[top] 或者 num<a[bottom],肯定num不在这个表列中
{
loc=-1
flag=0
}
else if(a[mid]==num) //如果num 等于找到的数
{
loc=mid
printf("找到数 %6d 的位置%2d\n",num,loc)
break
}
else if(a[mid]>num) //若 a[mid]>num,则num 一定在 a[bottom]和a[mid-1]范围之内
{
top=mid-1
mid=(top+bottom)/2
}
else if(a[mid]<num) //若 a[mid]<num,则num 一定在 a[mid+1]和a[top]范围之内
{
bottom=mid+1
mid=(top+bottom)/2
}
}
if(loc==-1)
{
printf("%d 这个数在表列中没有找到。\n",num)
}
printf("折半查找结束:")
scanf("%d",&n)
}
查找的意义是在一堆数据中,使用方法找到你想要找的数据。一般为分:顺序和折半(又叫二分)查找两种方法。
存放在数组中的数据就可以看成一堆数据,在有限数组内存放一些数据,通过使用查找方法进行查找想要找的数。
顺序方法:这种查找方法不需要数组排序,数据可以是无序的。从数组开头向后一个一个与被查找数进行比较,如果找到就做相应的操作(如输出这个数的下标或位置)等。
折半查找法:(二分查找)
前提需要把数组里的数据进行排序(升序或降序)。思路是(假设数组已按升序排序)每次只比较中间的数据(一段距离内),第一次先和中间的数组(下标是这个数组中在中间的)比较,如果相同,则说明被找数已找到。否则就要判断是在大于还是小于:如果是大于,那么就将在中间+1至最后一个数之间的中间数再进行比较。否则就将在第一个至中间-1的数进行比较;再次重复比较,直到找到数为止。
#include<stdio.h>#include<math.h>
void main()
{
void function1()//搜索法
void function2()//二分法
void function4()//牛顿法
int choice
printf("请选择求解的方法:\n\t1.搜索法\n\t2.二分法\n\t3.牛顿法\n:")
switch(1)
{
case 1:function1()
case 2:function2()
case 4:function4()
}
}
void function1()//搜索法计算非线性方程的解
{
double expression1(double)
double lpoint=1.0,rpoint=2.0,step=0.0001
while(expression1(lpoint)<-0.00001)
{
lpoint=lpoint+step
}
printf("运用搜索法所求结果:%f\n",lpoint)
}
void function2()//二分法计算非线性方程的解
{
double expression1(double)
double lpoint=1,rpoint=2,mpoint
mpoint=(lpoint+rpoint)/2
while(fabs(expression1(mpoint))>0.00001)
{
mpoint=(lpoint+rpoint)/2
if(expression1(lpoint)*expression1(mpoint)<0)
rpoint=mpoint
else
lpoint=mpoint
}
printf("运用二分法所求结果:%f\n",mpoint)
}
void function4()//牛顿法计算非线性方程的解
{
double expression1(double)
double expression2(double)
double x=1.5
while(expression1(x)>0.00001)
{
x=x-expression1(x)/expression2(x)
}
printf("运用牛顿法所求结果:%f\n",x)
}
double expression1(double x)
{
double result
result=x*x*x-x*x-1
return result
}
double expression2(double x)
{
double result
result=3*x*x-2*x
return result