C 猜数字讲讲输入输出
题目: 用两分搜索策略来猜数字(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)