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
总之很烦就是了
植入部分
如果您觉得文章不错,可以通过赞助支持我。
如果您不希望打赏,也可以通过关闭广告屏蔽插件的形式帮助网站运作。