C 猜数字讲讲输入输出

题目:

用两分搜索策略来猜数字(1-100),比如程序最初猜50,让其询问用户该猜测是大还是小,如果猜测值小,那么下一次猜测值为50-100的中值。

两分法查找的思路+练习输入输出,为了作为一个游戏增强一下卖萌性所以……还是先来看看源码吧

#include <stdio.h>

int main(void)
{
    int num, guess, yoo, size;
    int hlimit = 100, llimit = 1;

    while (1) {
        printf("1到100之间你想的是哪个数字。(放心我不会偷看的哟,只是让你mark一下): ");
        while (1) {
            if (scanf("%d", &num) == 1 && num >= 1 && num <= 100)
                break;
            else
                printf("魂淡都说了是1到100的整数了,重来: ");
            while (getchar() != '\n');
        }

        guess = 50;
        printf("我猜是 %d ,对吧(请输入Y或N): ", guess);

        while ((yoo = getchar()) != 'Y') {
            if (yoo == '\n')
                continue;
            if (guess == num) {
                printf("你骗人,我明明猜对了!\n");
                break;
            }
            if (yoo != 'N') {
                printf("你输入的我不认识啦(请输入Y或N): ");
                continue;
            }
            printf("唔,猜错了吗……那是大了还是小了(请输入L或S): ");
            size = getchar();
            size = getchar();
            if (size == 'S') {
                llimit = guess;
                guess = (llimit + hlimit) / 2;
            }
            else if (size == 'L') {
                hlimit = guess;
                guess = (guess + llimit) / 2;
            }
            else {
                printf("唉不是让你输入L或者S吗: ");
                size = getchar();
            }

            printf("我猜是 %d ,对吧(请输入Y或N): ", guess);
        }

        if (guess != num)
            printf("呜呜呜 好感度下降了啦明明我猜错了\n");
        else
            printf("机智的我!\n");
        printf("要再来一发吗?按任意键继续 输入q退出游戏: ");
        getchar();
        if (getchar() == 'q')
            break;
}
    return 0;

}

两分法的设定是:

            if (size == 'S') {
                llimit = guess;
                guess = (llimit + hlimit) / 2;
            }
            else if (size == 'L') {
                hlimit = guess;
                guess = (hlimit + llimit) / 2;
            }

两分法查找数字之前要先把数字排好序。

遇到了好多个难题,首先是scanf()getchar()的混用,我在判断输入的数字是否是1-100的时候:

        while (1) {
            if (scanf("%d", &num) == 1 && num >= 1 && num <= 100)
                break;
            else
                printf("魂淡都说了是1到100的整数了,重来: ");
            while (getchar() != '\n');
        }

刚开始用的是scanf()然后判断是否是<1 > 100,结果发现死循环了,就算改条件到num >= 1 && num <= 100还是死循环,这是因为scanf()虽然输出不对了,但是这个数据还是放在缓冲区里不动……然后就无法继续下去了。
getchar()时因为会读取scanf()输入空格读到的回车,于是

while (getchar() != '\n');

或者

            if (yoo == '\n')
                continue;

以及

            size = getchar();
            size = getchar();

两次的话第一次获取的getchar()就被吃掉了,第二种同理,第一种也是为了避免多运行接下来的代码QvQ

总之很烦就是了

植入部分

如果您觉得文章不错,可以通过赞助支持我。

如果您不希望打赏,也可以通过关闭广告屏蔽插件的形式帮助网站运作。

标签: 成品, 源码, 知识, 代码段, 语法

添加新评论