7-39 龟兔赛跑 (20 分) 乌龟与兔子进行赛跑,跑场是一个矩型跑道,跑道边可以随地进行休息。T分钟后乌龟和兔子谁跑得快?PTA:中M2021春C、Java入门练习第I段—变量、表达式、分支、循环

乌龟与兔子进行赛跑,跑场是一个矩型跑道,跑道边可以随地进行休息。乌龟每分钟可以前进3米,兔子每分钟前进9米;兔子嫌乌龟跑得慢,觉得肯定能跑赢乌龟,于是,每跑10分钟回头看一下乌龟,若发现自己超过乌龟,就在路边休息,每次休息30分钟,否则继续跑10分钟;而乌龟非常努力,一直跑,不休息。假定乌龟与兔子在同一起点同一时刻开始起跑,请问T分钟后乌龟和兔子谁跑得快?

输入格式:

输入在一行中给出比赛时间T(分钟)。

输出格式:

在一行中输出比赛的结果:乌龟赢输出@@,兔子赢输出^^,平局则输出-_-;后跟1空格,再输出胜利者跑完的距离。

输入样例:

242
输出样例:

@_@ 726

最近在学C语言,碰到这个题目,自己思考了不少,希望可以给刚开始学习C的同学一点帮助。

碰到这个题目刚开始呢我是想是不是跑着跑着就会有一定的规律呢,反正用高中学的vt图像做做呗,见下图

然后做到这里我就在想果然是初学者的题目呢,然后就以为一定是兔子跑,然后再乌龟跑,然后就一直这样交替下去了,天真!我的思考局限于这张图片,没有将循环中的其他部分给作出。

现在也确实是作出循环了,找到运动周期,两者领先情况与具体时间的对应关系,但是这种情况要用if写也太多了。然后我就想到自己在看The C Programming language中的word counting 例子中state变量,这种用变量来表示一种状态,用来将自然语言写成程序,然后经过几番调试,最终的代码是这样

#include<stdio.h>
int main()
{
int time, disrab = 0, distur = 0;
int i, rest,run;
scanf("%d", &time);
rest = 0;
run =10;
for(i = 0; i<time; i++){
if(run == 0){
run = 10;
if(disrab>distur){
rest = 30;
}
}
distur += 3;
if(rest == 0 ){
disrab += 9;
run--;
}
if(rest>0){
rest--;
}
}
if(disrab<distur){
printf("@_@ %d",distur);
}
else if(disrab > distur){
printf("^_^ %d",disrab);
}
else{
printf("-_- %d",disrab);
}
return 0;
}
这种用自然语言写的好处在于可以当量足够大的时候,直接通过机器自己反复地判断(其实这也是计算机的essence吧)

但是自己写出这个代码不是一帆风顺的,逻辑上调试了很多次。现在觉得处理问题时利用流程图确实蛮重要的。

其实在写流程图的时候是对题目进一步加深的过程,不仅把题目读得更清晰,也在完善代码的逻辑或者说Pseudocode,此处的休息30分钟再循环我之前不写这个流程图是没有去思考的,我之前想当然地认为休息完再判断是否领先再休息或者奔跑,但其实题目说清楚了,每次休息30分钟(而且其实这道题目中根据我已经列举出的循环也能很清晰的看到这样的情况是不会发生的)。

对,首先是自己确定自己根据题目写出来的逻辑是对的,然后再谈怎么去实现它,这里先确定有多少个变量,有兔子跑的距离,有乌龟跑的距离,还有时间,然后还有10分钟的奔跑,30分钟的休息,然后可能还有什么状态(但是当我刚开始想的时候,甚至只想用一个时间就把剩下的这些都搞定,就不用搞这么多的变量了,但是,依我目前写代码的经验、学习到的计算机知识,我发现解决问题最好要能多利用变量,然后将那些分开,就是尽可能地用各自单个的变量来表达一样东西,这样的好处在于逻辑会清晰,自己在改动代码的时候不会牵涉到太多的东西)

还有就是在自己的代码实现过程中,各个逻辑的实现都要确保是在那个条件下才能这么做的,比方说上面的判断是基于你已经跑了10分钟的!

总结一下:
1.复杂一点的问题,先画流程图写出伪代码pseudocode
2.然后实现过程的变量尽量给分开,使得逻辑清晰,改动方便
3.逻辑实现的各项弄清楚其先决条件
4.下次记录探索过程,改动,为什么不可以的过程


————————————————
版权声明:本文为CSDN博主「Practice_njust」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_34211471/article/details/52771599

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值