C语言设计从键盘输入10个数存入数组A,将A数按升序排列存入数组B,用二分法在B中查找元素X,输出X在B中的位置,如果未找到,给出相应提示信息
设计思路:
1.采用升序法和折半查找法。首先定义大小为10的整型数组a和b,再定义整型变量i,j,k,temp,min,x,n,m并且给n,m赋初值0,9。
2. 通过for循环将键盘输入的数依次赋给a的10个元素。
3.采用for循环,i+1赋值给k,数组下标i赋值给min。再用for循环嵌套,把k赋值给j,如果下标为j的值小于下标为min的值,则下标j赋值给min,下标为i的值赋值给temp,下标为min的值赋值给下标为i的值,然后再将temp赋值给a[min],即下标为j的值赋给a[min],以此方法找到新的最小值;如果下标为j的值大于下标为min的值,则新的最小值还是a[min]。每循环一次,就排好一个元素的顺序,以此循环直到循环结束,则10个元素会从小到大排序。
4.把数组中的元素赋值给b数组中。通过键盘输入想要查找的数x,当n<=m时执行循环,首先查数组的中项,即(n+m)/2的值赋给i。如果下标为i的值恰好等于x,则结束循环,输出要查找的数x的位置;如果下标位i的值小于x,则i+1赋值给n;如果下标为i的值大于x,则i-1赋值给m。当n>m时,循环体语句不执行。重复以上循环步骤直到循环结束。
5.如果下标为i的值不等于x,则输出No found;否则,输出要查找的数x的位置。
代码如下:
#include<stdio.h>
void main()
{
int i,j,k,a[10],b[10],temp,min,x,n=0,m=9;
printf("输入10个整数:\n");
for(i=0;i<10;i++)
scanf("%d",&a[i]);
for(i=0;i<9;i++)
{
k=i+1;
min=i;
for(j=k;j<10;j++)
if(a[j]<a[min])
min=j;
temp=a[i];
a[i]=a[min];
a[min]=temp;
}
for(i=0;i<10;i++)
b[i]=a[i];
printf("请输入你想找的数:");
scanf("%d",&x);
while(n<=m)
{
i=(n+m)/2;
if(b[i]==x)
break;
if(b[i]<x)
n=i+1;
if(b[i]>x)
m=i-1;
}
if(b[i]!=x)
printf("No found");
else
printf("这是第%d个数\n",i+1);
}