作者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)
→ game0416:是說沒特別編,大概會少分號什麼的小東西(跑遠 11/26 11:38
※ 編輯: game0416 來自: 120.127.36.173 (11/26 11:39)
推 linjrming:用Sleep() 11/26 12:03
推 dosomethnig:好球 11/26 12:25
→ Arashinoon:話說我用for做 而且沒有輸入秒這個動作 我GG了? 11/26 16:44
推 gcobc12632:老師沒有說要輸入秒0.0 不過你爽輸入也可以 吧 11/26 17:33
推 didi12252001:鳳狼大神阿..... 11/26 20:24
推 Arashinoon:是說都沒人來看這篇的樣子 11/29 19:01