“猜数字游戏是令游戏机随机产生一个100以内的正整数,用户输入一个数对其进行猜测,需要你编写程序自动对其与随机产生的被猜数进行比较,并提示大了(“Too big”),还是小了(“Too small”),相等表示猜到了。如果猜到,则结束程序。程序还要求统计猜的次数,如果1次猜出该数,提示“Bingo!”;如果3次以内猜到该数,则提示“Lucky You!”;如果超过3次但是在N(>3)次以内(包括第N次)猜到该数,则提示“Good Guess!”;如果超过N次都没有猜到,则提示“Game Over”,并结束程序。如果在到达N次之前,用户输入了一个负数,也输出“Game Over”,并结束程序。”

输入样例:

58 4
70
50
56
58
60
-2

输出样例:

Too big
Too small
Too small
Good Guess!

原代码:

#include<stdio.h>
int main(){int cnt=0,input,N,rightguess;int sign=0;scanf("%d %d",&rightguess,&N);scanf("%d",&input);while(input>=0){cnt++;if(cnt>N)break;//printf("%d \n",cnt);if(input>rightguess)printf("Too big\n");if(input<rightguess)printf("Too small\n");if(input==rightguess){if(cnt==1){printf("Bingo!\n");sign=1;break;}else if(cnt<3){printf("Lucky You!\n");sign=1;break;}else if(cnt>=3&&cnt<=N){printf("Good Guess!\n");sign=1;break;}}scanf("%d",&input);}if(sign==0)printf("Game Over");return 0;
}

这个是第一次写这个题的程序,PTA上面得不到满分,后来才发现是自己做input==rightguess的子判断,出现问题,题目要求不超过三次答对的话输出lucky you ,我的"cnt<3"改成“cnt<=3“才对。

但同时引发了我的一个问题,关于while循环还是for循环,还有,我这代码是不是可以优化一下?


这个猜数字游戏,比如rightguess 是58 N 是 4 。我们希望如果第四次还是没对,他应该要输出一个GAME OVER。可我的程序无法输出这个,因为我的循环末尾是一个SCANF函数,不执行这一步将卡在循环里面出不来。

解决方法:思考过在不进行太多改动的条件下,使之可以实现功能且跳出循环。想了蛮久,感觉是想不出来,因为我用的while循环有个本质的矛盾,我驱动循环的条件是判断input的值,这也就导致我想跳出循环只能用做一个判断接上break或者是用scanf改变input的值,可是这都会影响我功能的实现(input和rightguess比大小,输出too small/big,etc)。

所以我仔细看了别人(月落乌啼霜月落)的代码,并对其进行一个分析,通过对代码的分析,希望可以对以后类似的问题做一个抛砖引玉,让自己写出更好的代码,我这代码可读性真的太差了。

ps:我改了别人代码的变量名,尽量使其和我原代码的变量名一致,同时做了一丝丝改动。



#include<stdio.h>
int main(){int rightguess, N;scanf("%d %d",&rightguess,&N);int i;int input;int sign = 0;for (i = 1;i <= N;i ++){scanf("%d",&input);if (input < 0)break;if (input > rightguess)printf("Too big\n");if (input < rightguess)printf("Too small\n");if (input == rightguess){if (i == 1){sign = 1;printf("Bingo!\n");break;}else if (i <=3){sign = 1;printf("Lucky You!\n");break;}else{sign = 1;printf("Good Guess!\n");break;}}}if (sign == 0)printf("Game Over\n");return 0;
}

//本代码非常简洁,可读性也很好。我将以我一个小白的理解,逐步复现这个代码的书写思路。
/*猜数字游戏的本质,就是判断,做几次判断跟N的值是息息相关的,意味着循环跟N息息相关,当循环有一个明确值,选用for循环会比较合适。当N=4的时候,意味着我们最多要猜4轮,同时意味着离开循环时候i的值应该是5,按照这个例子不难有for(i=1;i<=N;i++)。

每一轮循环我们要做什么事情?
首先必须要先有个位置,放置我们的输入input,依照题意,当用户输入负数的时候,我们不用进行比较大小了,马上输出一个gameover,这件事情本质上就是做判断并跳出循环,所以有 if(input<0).做一个break。这也指导了,在for循环之后 我们要printf一个gameover 。至此,我们有了一个总体的框架,我们要做的事情就是不断填充里面的内容,并且进行调试。回到比大小这件事情,在循环里面我们确认input不是负数的时候,依次进行判断if(input<rightguess),if(input>rightguess),if(input==rightguess),其中input==rightguess的情况中,还要进一步的判断(i=1 i<=3 i>3),这里我用的else if级联的方式。题目的要求是如果bingo 或者luckyyou、goodguess的时候只输出这几个字符串,不能输出gameover,所以我们可以用sign做一个判断,影响循环外的gameover的输出。

以上基本上就是这个代码是如何写出来的,心路历程了。


PTA-7-24猜数字游戏,比照和分析。相关推荐

  1. [PTA]练习4-6 猜数字游戏

    Spring-_-Bear 的 CSDN 博客导航 猜数字游戏是令游戏机随机产生一个 100 以内的正整数,用户输入一个数对其进行猜测,需要你编写程序自动对其与随机产生的被猜数进行比较,并提示大了(& ...

  2. 大一 PTA L1-6 猜数字游戏

    题目 猜数字游戏是令游戏机随机产生一个100以内的正整数,用户输入一个数对其进行猜测,需要你编写程序自动对其与随机产生的被猜数进行比较,并提示大了("Too big"),还是小了( ...

  3. PTA题目 猜数字游戏

    猜数字游戏是令游戏机随机产生一个100以内的正整数,用户输入一个数对其进行猜测,需要你编写程序自动对其与随机产生的被猜数进行比较,并提示大了("Too big"),还是小了(&qu ...

  4. Go-实现猜数字游戏代码

    实现猜数字游戏代码 1 package main 2 3 import ( 4 "fmt" 5 "math/rand" 6 "time" 7 ...

  5. 1到100猜数字游戏规则c语言,[C语言课程设计猜数字游戏1.doc

    [C语言课程设计猜数字游戏1 课 程 设 计 报 告 课程名称 C语言程序设计报告 课题名称 猜数字游戏 专 业 电气工程及其自动化 班 级 1104 学 号 33 姓 名 张腾 指导教师 黄晓宇 丁 ...

  6. 猜数字小c语言游戏课程任务书,C语言课程设计猜数字游戏姚成.doc

    课 程 设 计 报 告 课程名称 C语言程序设计报告 课题名称 猜数字游戏 专 业 电气工程及其自动化 班 级 1104 学 号 23 姓 名 姚成 指导教师 黄晓宇 丁敬忠 谭小兰 2012年 6月 ...

  7. python代码测试健康指数计算器_python编写的bmi体重指数计算器、出租车费用计算器、个税计算器、猜数字游戏...

    ''' 写四个函数 分别包含bmi体重指数计算器.出租车费用计算器.个税计算器.猜数字游戏 ''' #体重指数计算器 def bmi(): while 1: #声明变量 身高.体重 height=in ...

  8. php卡片猜数字游戏二进制,卡片猜数字游戏二进制码

    <卡片猜数字游戏二进制码>由会员分享,可在线阅读,更多相关<卡片猜数字游戏二进制码(21页珍藏版)>请在人人文库网上搜索. 1.猜数字 大家看到的六张填满数字的表.你可以任选其 ...

  9. 韩信点兵--求分数序列前N项和--特殊a串数列求和--猜数字游戏

    实验4-1-5 韩信点兵 (10分) 在中国数学史上,广泛流传着一个"韩信点兵"的故事:韩信是汉高祖刘邦手下的大将,他英勇善战,智谋超群,为汉朝建立了卓越的功劳.据说韩信的数学水平 ...

最新文章

  1. 和12岁小同志搞创客开发:如何选择合适的传感器?
  2. AD5933阻抗模块测量值校正
  3. Microsoft MSDN Windows 8 各版本下载
  4. php 将一个字符串转换成数组,PHP将一个字符串转换成数组
  5. ACM算法--枚举方法(指数枚举,组合枚举)模板
  6. 动态区间第k小:树状数组套权值线段树
  7. jcache_窥探JCache API(JSR 107)
  8. 在树莓派上搭建gitea
  9. 聊聊我的 2018 年
  10. 地理空间数据下载 积累
  11. 【接力题典1800记录】定积分
  12. c语言程序怎么实现模块化,【干货】教你如何对一个大的项目进行模块化编程...
  13. 第一个成功复制小米粉丝营销的屌丝案例
  14. CSS 左中右三列布局5种方式
  15. party_bid_core三种数据结构分析
  16. CUDNN历史版本下载地址,可跳过登录下载cudnn
  17. javaSE - 逻辑控制和输入输出(复习)
  18. 顶会最佳论文奖得主:初入科研领域,如何正确做科研?
  19. 小甲鱼python课后题和答案简书_【py小甲鱼笔记】-函数
  20. 视频号扩展链接一键转换

热门文章

  1. C语言常见问题(五)——字符串
  2. 工作日计算器_.NET工作日计算器
  3. 算法006:二分查找 递归、非递归
  4. depot_tools原理和实现
  5. c语言输入252则输出应该是20,[转载]计算机C语言二级上级考试套题(一)
  6. Qemu 调试内核 出错 Remote 'g' packet reply is too long:
  7. 超融合和服务器关系_什么是超融合服务器?与超融合一体机是一回事吗?
  8. python批量解压文件,python批量解压zip文件的方法
  9. 利用Python统计微信联系人男女比例以及简单的地区分布
  10. 服务器 消息 22029,解决SQL Server数据库维护计划失败的问题