试编写一个程序完成:有15个数按从下到大的顺序存放在一个数组中.输入一个数,要求折半查找法找出该数是数组中第几个元素的值.如果该数不在数组中,输出“不在表。
实验要求: 输入事先已编好的程序,并运行该程序。分析运行结果是否正确。
#include<stdio.h>
#define N 15
//符号常量,用#define指令,指定用一个符号名称代表一个常量
//通常大写,句末没有分号
int main()
{
int i,number,top,bott,mid,loca,a[N],sign,flag=1;
char c;
printf("enter data:\n");
scanf("%d",&a[0]); //输入第一个数
i=1;
while(i<N) //检查数是否已经输入完毕
{
scanf("%d",&a[i]); //输入下一个数
if(a[i]>=a[i-1]) //若输入的数大于等于上一个数
i++; //使数的序号加一
else
printf("enter this data again:\n");//要求重新输入此数
}
printf("\n");
for(i=0;i<N;i++)
printf("%5d",a[i]); //输出全部十五个数
printf("\n");
while(flag) //为什么放一个flag在括号里
{
printf("input number to look for:\n"); //问要查找哪个数
scanf("%d",&number); //输入要查找的数
sign=0; //sign=0表示尚未找到
top=0; //top是查找区间的起始位置
bott=N-1;//bott是最末位置
if((number<a[0]||number>a[N-1])) //要查的数不在区间内
loca=-1; //表示找不到
while((!sign)&&(top<=bott))//不懂!sign什么意思,&&是与
{
mid=(top+bott)/2; //找出中间元素的下标
if(number==a[mid]) //若要查找的数刚好等于中间元素
{
loca=mid;
printf("Has found %d,its position is %d\n",number,loca+1);
//由于下标从0算起,所以输出的数位置要加一
sign=1; //表示找到了
}
else if(number<a[mid])
bott=mid-1;
else if(number>a[mid])
top=mid+1;
}
if((!sign)||loca==-1) //sign为0或loca为-1,意味着找不到。||或。
printf("找不到 %d.\n",number); //输出找不到
printf ("continue or not(Y/N)?"); //问是否重新查找
scanf("%c",&c);
if(c=='N'||c=='n') //不想继续查找就输入n或N
flag=0; //flag为开关变量,控制程序是否结束运行
printf("\n");
}
return 0;
}