谭浩强吧 关注:257贴子:803
  • 2回复贴,共1

有一个程序,存疑,望解惑

只看楼主收藏回复

是谭书第六章的习题
题目:有15个数按由大到小的顺序存放在一个数组中,输入一个数,要求用折半查找法找出该数是数组中第几个元素的值。如果该数不在数组中,则输出“无此数”。
谭版的学习辅导给出的例解
#include <stdio.h>
#define N 15
int main(void)
{
int i;
int number;
int top;
int bott;
int mid;
int loca;
int a[N];
int flag = 1;
int sign;
char c;
printf("enter data:\n");
scanf("%d", &a[0]);//输入第1个数
i = 1;
while (i < N)//检查数是否已输入完毕
{
scanf("%d", &a[i]);//输入下一个数
if (a[i] >= a[i-1])//如果输入的数不小于前一个数
{
i++;//使数的序号加1
}
else
{
printf("enter this data again:\n");//要求重新输入此数
}
}
printf("\n");
for (i=0; i<N; i++)
{
printf("%5d", a[i]);//输出全部15个数
}
printf("\n");
while (flag)
{
printf("input number to look for:");//问你要查找哪个数
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))
{
mid = (bott + top) / 2;//找出中间元素的下表
if (number == a[mid])//如果要查找的数正好等于中间元素
{
loca = mid;//记下该下标
printf("Has found %d, its position is %d\n", number, loca + 1);//由于下标从0算起,而人们习惯从1算起,因此输出数的位置要加1
sign = 1;//表示找到了
}
else if (number < a[mid])//如果要查找的数小于中间元素的值
{
bott = mid - 1;//只需在下标为0~mid-1的元素中找
}
else//如果要查找的数不小于中间元素的值
{
top = mid + 1;//只需在下标为mid+1~bott的元素中找
}
}
if (!sign || loca == -1)//sign为0或loca等于-1,意味着找不到
{
printf("cannot find %d.\n", number);//输出"找不到"
}
printf("continue or not(Y/N)?");//问你是否继续查找
scanf(" %c", &c);//不想继续查找输入'N'或'n'
if (c == 'N' || c == 'n')
{
flag = 0;//flag为开关变量,控制程序是否结束运行
}
}
return 0;
}
我自己改了改代码风格。主要想问第70行 那句scanf(" %c", &c); 为什么%c前一定要有一个空格,我发现有无这个空格程序输出结果差别很大。(语言有点难以描述,可以自行尝试)
范例输入1 3 4 5 6 8 12 23 34 44 45 56 57 58 68(回车)
7(回车)
y(回车)
同样的输入,有无那个%c前面的空格会有不同结果。


IP属地:辽宁1楼2019-12-28 15:08回复
    输入7之后你实际上又输入了一个回车,回车也是字符,scanf("%c",%c)就把回车读到c里面了。加一个空格有跳过一个“空白字符”的意思。而scanf把回车也被视作空白字符的一种。


    IP属地:澳大利亚2楼2019-12-28 18:25
    回复
      铁子,不是我说→_→。谭浩强的名声这么响。你不知道吗。他是出了名的误人子弟。你去看别的书吧。看完再看他的,就可以帮他找错了


      来自手机贴吧3楼2020-04-05 03:02
      回复