标题:求助,C语言谭浩强习题6-9关于折半查找法查找一个数是数组中的第几个元素
只看楼主
anduoba
Rank: 2
等 级:论坛游民
帖 子:36
专家分:44
注 册:2018-4-27
结帖率:100%
已结贴  问题点数:20 回复次数:10 
求助,C语言谭浩强习题6-9关于折半查找法查找一个数是数组中的第几个元素
有15个数按由大到小排序,输入一个数,要求用折半查找法找出改数是数组中第几个元素的值。如果没有,输出“无此数”,并询问是否重新输入。
我已经写好了,而且运行正常,代码如下:
#include<stdio.h>
int main()
{
    int i,f[15]={15,14,13,12,11,10,9,8,7,6,5,4,3,2,1};
    for(i=0;i<15;i++)
        printf("%5d",f[i]);
    printf("\n");//输出数组中的15个数


    int k,mid,min,max,flag;
    int c=1;//c=1开始循环
    while(c==1)
    {
        
        printf("请输入要查找的数:\n");
        scanf("%d",&k);
        if(k>f[0]||k<f[14]) flag=1;
        else
        {
            min=0,max=14;
            while(min<=max)
            {
                mid=(max+min)/2;
                if(k==f[mid]) {flag=0;break;}
                else if(k>f[mid]) max=mid-1;
                else min=mid+1;
            }
            if(min>max) flag=1;  //min>max意味着一直到min=max都没有k==f[mid]
        }

        if(flag) { printf("查无此数,继续查找输入1,退出输入2:\n"); scanf("%d",&c);}
        else     { printf("a[%d]=%d\n",mid+1,f[mid]); c=2; }
    }
    printf("结束\n");
    return 0;
}

运行如下:
[local]1[/local]

但是,当我想把“继续查找输入1,退出输入2”改为“继续查找输入y,退出输入n”,并同时将相应c的值用y和n表达时;
如果第一次没查出来,后面询问“继续查找输入y,退出输入n”时,无论我输入y还是n还是别的;
运行后都会无限循环:
int k,mid,min,max,flag;
    int c='y';//c=y开始循环
    while(c=='y')

    {
        
        printf("请输入要查找的数:\n");
        scanf("%d",&k);
        if(k>f[0]||k<f[14]) flag=1;
        else
        {
            min=0,max=14;
            while(min<=max)
            {
                mid=(max+min)/2;
                if(k==f[mid]) {flag=0;break;}
                else if(k>f[mid]) max=mid-1;
                else min=mid+1;
            }
            if(min>max) flag=1;  //min>max意味着一直到min=max都没有k==f[mid]
        }

        if(flag) { printf("查无此数,继续查找输入y,退出输入n:\n"); scanf("%d",&c);}
        else     { printf("a[%d]=%d\n",mid+1,f[mid]); c='n'; }
    }
    printf("结束\n");
    return 0;

这是为什么啊?
搜索更多相关主题的帖子: 输入 printf mid min max 
2018-04-27 13:58
anduoba
Rank: 2
等 级:论坛游民
帖 子:36
专家分:44
注 册:2018-4-27
得分:0 

第一个程序的
2018-04-27 13:59
anduoba
Rank: 2
等 级:论坛游民
帖 子:36
专家分:44
注 册:2018-4-27
得分:0 


第二个程序的
2018-04-27 14:00
dzy123
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:5
帖 子:379
专家分:820
注 册:2013-4-18
得分:5 
字符要用strcmp作比较吧
程序代码:
#include<stdio.h>
#include<string.h>
int main(void) {
    int i,f[15]= {15,14,13,12,11,10,9,8,7,6,5,4,3,2,1};
    for(i=0; i<15; i++)
        printf("%5d",f[i]);
    printf("\n");
    char str[2]={'y'};
    int k,mid,min,max,flag;
    while(strcmp(str,"y")==0) {
        printf("请输入要查找的数:\n");
        scanf("%d",&k);
        if(k>f[0]||k<f[14]) flag=1;
        else 
        {
            min=0,max=14;
            while(min<=max)
            {
                mid=(max+min)/2;
                if(k==f[mid]) {flag=0;break;}
                else if(k>f[mid]) max=mid-1;
                else min=mid+1;
            }
            if(min>max) flag=1;  //min>max意味着一直到min=max都没有k==f[mid]
        }

        if(flag) { printf("查无此数,继续查找输入y,退出输入n:\n"); scanf("%s",str);}
        else     { printf("a[%d]=%d\n",mid+1,f[mid]); str[0]={'n'}; }
    }
    printf("结束\n");
    return 0;
}


[此贴子已经被作者于2018-4-27 15:23编辑过]

2018-04-27 14:36
anduoba
Rank: 2
等 级:论坛游民
帖 子:36
专家分:44
注 册:2018-4-27
得分:0 
回复 4楼 dzy123
谢谢~您这个办法也可以~
我找到我的问题了,我在
if(flag) { printf("查无此数,继续查找输入1,退出输入2:\n"); scanf("%d",&c);}
这个地方应该把scanf("%d",&c)改为 scanf("\n%c",&c)
因为我前面在:
        printf("请输入要查找的数:\n");
        scanf("%d",&k);
这个时候,我输入数之后按了一下回车;
程序scanf("%d",&c)把那个回车读进去了,然后
        printf("请输入要查找的数:\n");
        scanf("%d",&k);又接着读取了回车,然后就一直死循环
改了就好了
if(flag) { printf("查无此数,继续查找输入y,退出输入n:\n"); scanf("\n%c",&c);printf("您输入了:%c\n",c);}



[此贴子已经被作者于2018-4-27 15:55编辑过]

2018-04-27 15:50
anduoba
Rank: 2
等 级:论坛游民
帖 子:36
专家分:44
注 册:2018-4-27
得分:0 
回复 4楼 dzy123

改了就像这样了
浪费我大半天时间
2018-04-27 15:51
anduoba
Rank: 2
等 级:论坛游民
帖 子:36
专家分:44
注 册:2018-4-27
得分:0 
回复 4楼 dzy123
然后我发现教材答案上面的做法其实,也在scanf("%c",&c)加了一个空格变成scanf(" %c",&c)
但是不小心根本看不出来
气死
2018-04-27 15:55
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:507
帖 子:8890
专家分:53117
注 册:2011-1-18
得分:10 
scanf 中出现空白字符( \t \n \v \f \r 及 空格 ),表示略过接下来的所有连续空白字符(0到无穷个)
所以 scanf("\n%c",&c) 行为结果和 scanf(" %c",&c) 一样
但前者不但输入麻烦,而且还很令人迷惑。
2018-04-27 16:06
anduoba
Rank: 2
等 级:论坛游民
帖 子:36
专家分:44
注 册:2018-4-27
得分:0 
回复 8楼 rjsp
嗯嗯~
2018-04-28 22:49
anduoba
Rank: 2
等 级:论坛游民
帖 子:36
专家分:44
注 册:2018-4-27
得分:0 
回复 8楼 rjsp

程序代码:
#include<stdio.h>
int main()
{
    float i,j;
    float fac(float n);

    printf("请输入整数n:\n");
    scanf("%f",&i);
    j=fac(i);
    printf("%f的阶乘为:%.0f\n",i,j);
    printf("%d的阶乘为:%f\n",i,j);//为什么这里i,j的输出都变成了0?

    return 0;
}
float fac(float n)
{
    float f;
    if(n<0) printf("n<0,data error!\n");
    else if(n==0||n==1) f=1;
    else f=n*fac(n-1);
    return f;
}


这个又是怎么回事?
为什么总是碰见这种问题....
2018-04-28 22:55



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-486440-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.241461 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved