记录——《C Primer Plus (第五版)》第八章编程练习第五题

40 篇文章 0 订阅
    修改程序清单8.4的猜测程序,使其使用更智能的猜测策略。例如,程序最初猜50,让其询问用户该猜测值是大、小还是正式。如果该猜测值小,则令其下一次猜测值为50和100的中值,也就是75,。如果75大,则下一次猜测为75和50的中值,等等。使用这种二分搜索策略,起码如果用户没有欺骗,该程序很快会获得正确答案。解:原题目是猜测1~100中的数字。
# include <stdio.h>
# include <ctype.h>

int mean(int, int);   //输值取中值
void clear(void);      //清除取值以外的字符
bool is_effective(int);   //判断要猜的整数是否有效
int get_in(void);     //取的要猜的整数

int main(void)
{
    const int MIN = 1;   //下限
    const int MAX = 100;
    int in;
    char ch;
    int low = 1;
    int high = 100;
    int cnt = 0;   //计数   用于判断是否是第一次判断

    printf("Please enter a integer,1 to 100 .\n");
    printf("You can choice L, h or y.\n");
    printf("L is low, h is high,y is yes.such as 20<50 is L, 20 is your number.\n");

    in = get_in();
    clear();

    printf("50 is yes?\n");
    while(tolower((ch = getchar())) != 'y')
    {

        if(ch == 'l' || ch == 'h')
        { 
            if(cnt == 0)
                in = 50;
            switch(ch)
            {
            case 'l': 

                high = in;
                in = mean(low, high);printf("%d is your number?\n",in);
                break;
            case 'h':
                low = in;
                in = mean(low, high);printf("%d is your number?\n",in);
                break;
            }
        }
        else
        {
            printf("error!\nyou can choice l, h, y.OK!\n");

        }
        cnt++;
    }
    printf("your number is %d\n", in);

    return 0;
}

int mean(int low, int high)
{
    int in;
    in = (high + low) / 2;
    clear();
    return in;
}

void clear(void)
{
    while(getchar() != '\n')
        continue;
}

bool is_effective(int in)
{
    if(in <= 100 || in >= 1)
        return true;
    else
        return false;

}

int get_in(void)
{
    int in;

    if(is_effective(in))
    {
        return in;
    }
    else
    {
        printf("Enter a integer :\n");
        scanf("%d", &in);
        return in;
    }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值