作者game0416 (凤狼)
看板NTUE-CS102
标题[闲聊] 程设作业
时间Thu Nov 26 11:34:55 2009
快睡着了....找点熟悉的事情做看会不会精神好一点
是说毕竟是作业,不适合直接贴code,看看我的解释水平现在是到哪好了
这次作业目标是
input 时、分、秒
output 无限次往下输出时、分、秒,然後隔一定时间清掉一次萤幕
先去思考,这个程式会长怎样?会用到些什麽?
最少,我们会有时、分、秒的变数、然後有个输出跟清除画面的动作
然後,要能够让时、分、秒变动
这次作业主要问题就在於如何让它变动,跟正确的进位
变动很简单,就是让它不断的 "+1" ,所以原则上就使用回圈去不断执行这种相似的动作
又因为这三个的进位相近是一种连锁动作,自然就能应用巢状回圈
: 是说边写才想到好像可以只用一个回圈处理._.a
这里可以先简化题目,因为时分秒大体上都是相同的行为,
所以先把题目拆解到最基础的部分开始…将题目先变成只要影响秒,从0~59进行循环
以下有题目解题内容,想努力自己完成看到这就好
----
这种情况下就很乾脆…先举王老大建议的while,预设有个代表秒的sec
照着前面的直觉去写,就会像下面这样简单的一小段可以输出会一直改变的sec
sec =
0;
while (sec <=
60){
cout << sec++ <<endl;
sec = sec++;
}
好,编译、执行後会发现它"不会"一直循环下去
因为判断sec > 60以後就会脱离回圈,而60秒以後应该是回到0才对
因此,在60时要将它归零
: 某种角度来说,也可以称为"重新开始"
sec =
0;
while (sec <=
60){
cout << sec <<endl;
sec = sec++;
if (sec ==
60)
sec =
0;
}
像这样,就能达到让秒不断输出的行为
再来,我们要让它刷新的速度接近於真正的秒,所以要让它变慢
还有清除页面的行为
而变慢的方法很简单,也就像是一般跑游戏会lag的原因一样
让它做事,做的事情越多,速度自然越慢
通常用个回圈去做些不会显示在萤幕上的行为,或是让萤幕看起来没在动就好
先举个昨天见到的例子
sec =
0;
while (sec <=
60){
for (int i=
0;i<=
1500;i++){
cout << sec <<endl;
system(
"cls");
}
sec = sec++;
if (sec ==
60)
sec =
0;
}
这样就是一个"让萤幕看起来没在动"的做法,其实它不断的输出、清除画面
然而,这样的做法执行时都有一个问题"我的秒怎麽都不会动了?"
嗯…请稍待一会就会动了,事实上,不管是cout or system其实都很慢
另外这个cls本身其实也蛮慢的,所以重复个几千次就会过很久很久
让人有不会动的错觉
而另外一种做法,则是
sec =
0;
while (sec <=
60){
cout << sec <<endl;
for (int i=
0;i<=
1500;i++) ;
system(
"cls");
sec = sec++;
if (sec ==
60)
sec =
0;
}
像是这样的空回圈,同样可以拖慢时间
不过这次这样几千就显得好像没在停,往上设几万也一样
那是因为i++这样+1的行为非常简单,只做个几万次不痛不痒的
所以啦,几万次不够,就做几千万次,还不够就做个几亿次吧
懒散就复制贴上,不然利用巢状回圈做次方次提升次数也不错
在里面随便找个数加点取余数的%计算更好,我在这里是比较没花脑袋复制贴上就是了
到这里,你的"秒"就完成了;其次,我们将问题变大到分
在外面多包一个回圈与变数min,用类似秒的方式去写
sec =
0;
min =
0;
while (min <=
60){
while (sec <=
60){
cout <<min <<
" " << sec <<endl;
for (int i=
0;i<=
1500;i++) ;
system(
"cls");
sec = sec++;
if (sec ==
60)
sec =
0;
}
min = min++;
if (min ==
60)
min =
0
}
没什麽差,分还是不会动
所以要做些改变,比如说,把秒到归零後跳出来让min增加後重新开始下个回圈
这里要使用昨天讲
switch时提到的
break;
这个
break,能够中断并跳出一个特定的区域,比如说回圈或switch
拿code说明比较快
sec =
0;
min =
0;
while (min <=
60){
while (sec <=
60){
cout <<min <<
" " << sec <<endl;
for (int i=
0;i<=
1500;i++) ;
system(
"cls");
sec = sec++;
if (sec ==
60){
sec =
0;
break;
}
}
min = min++;
if (min ==
60)
min =
0
}
这样子的code,就能让秒在60时,归零
然後跳出我们在设定"秒"的这个子回圈、往程式下面这行min = min++;执行
要注意的是,如果那个if内容改成
if (sec ==
60){
break;
sec =
0;
}
这样的话,就会先"跳出",後面的归零就不会处理了
嗯…时的地方就不写了,不然作业都抄完了、期末考也完了
同样的做法继续写就是了
文末空白防雷
for版本的话....等作业缴交後直接贴code或晚上再说好了
拿人家电脑会发懒(滚动)
而且好像快要考微积分了wryyyyyyyyyyy
--
红白本命
○楽园の巫女
博丽 霊梦 职业:博丽神社の巫女さん
Hakurei Reimu 能力:主に空を飞ぶ程度の能力
@东方project系列
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 120.127.36.173
※ 编辑: game0416 来自: 120.127.36.173 (11/26 11:35)
1F:→ game0416:是说没特别编,大概会少分号什麽的小东西(跑远 11/26 11:38
※ 编辑: game0416 来自: 120.127.36.173 (11/26 11:39)
2F:推 linjrming:用Sleep() 11/26 12:03
3F:推 dosomethnig:好球 11/26 12:25
4F:→ Arashinoon:话说我用for做 而且没有输入秒这个动作 我GG了? 11/26 16:44
5F:推 gcobc12632:老师没有说要输入秒0.0 不过你爽输入也可以 吧 11/26 17:33
6F:推 didi12252001:凤狼大神阿..... 11/26 20:24
7F:推 Arashinoon:是说都没人来看这篇的样子 11/29 19:01