CodeSky 代码之空

随手记录自己的学习过程

C 猜数字讲讲输入输出

2014-03-16 12:55分类: C评论: 0

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

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

1#include <stdio.h>
2
3int main(void)
4{
5    int num, guess, yoo, size;
6    int hlimit = 100, llimit = 1;
7
8    while (1) {
9        printf("1到100之间你想的是哪个数字。(放心我不会偷看的哟,只是让你mark一下): ");
10        while (1) {
11            if (scanf("%d", &num) == 1 && num >= 1 && num <= 100)
12                break;
13            else
14                printf("魂淡都说了是1到100的整数了,重来: ");
15            while (getchar() != '\n');
16        }
17
18        guess = 50;
19        printf("我猜是 %d ,对吧(请输入Y或N): ", guess);
20
21        while ((yoo = getchar()) != 'Y') {
22            if (yoo == '\n')
23                continue;
24            if (guess == num) {
25                printf("你骗人,我明明猜对了!\n");
26                break;
27            }
28            if (yoo != 'N') {
29                printf("你输入的我不认识啦(请输入Y或N): ");
30                continue;
31            }
32            printf("唔,猜错了吗……那是大了还是小了(请输入L或S): ");
33            size = getchar();
34            size = getchar();
35            if (size == 'S') {
36                llimit = guess;
37                guess = (llimit + hlimit) / 2;
38            }
39            else if (size == 'L') {
40                hlimit = guess;
41                guess = (guess + llimit) / 2;
42            }
43            else {
44                printf("唉不是让你输入L或者S吗: ");
45                size = getchar();
46            }
47
48            printf("我猜是 %d ,对吧(请输入Y或N): ", guess);
49        }
50
51        if (guess != num)
52            printf("呜呜呜 好感度下降了啦明明我猜错了\n");
53        else
54            printf("机智的我!\n");
55        printf("要再来一发吗?按任意键继续 输入q退出游戏: ");
56        getchar();
57        if (getchar() == 'q')
58            break;
59}
60    return 0;
61
62}
63

两分法的设定是:

1            if (size == 'S') {
2                llimit = guess;
3                guess = (llimit + hlimit) / 2;
4            }
5            else if (size == 'L') {
6                hlimit = guess;
7                guess = (hlimit + llimit) / 2;
8            }
9

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

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

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

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

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

或者

1            if (yoo == '\n')
2                continue;
3

以及

1            size = getchar();
2            size = getchar();
3

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

总之很烦就是了

评论 (0)