作者game0416 (鳳狼)
看板NTUE-CS102
標題Re: [閒聊] 程設作業
時間Fri Nov 27 00:04:57 2009
※ 引述《linjrming (風之信使)》之銘言:
: 剛吃飽飯,隨手寫了一下,幫助消化
: 我不知道老師要的是什麼,我只是隨便寫個會動的時鐘而已
差不多就是這樣的題目<(_ _)>
: 原始碼,不含注解
: 拿這份去交作業的,彥廷麻煩當掉他,謝謝
: http://stu.ntue.edu.tw/~s9516018/1.cpp
剛好有個小bug,那是我中午寫的時候沒想到怎麼表示的bug (炸)
萬分感謝QQ
這裡先推薦一個測資
23 59 55 (時 分 秒)
原則上這個題目會遇到的大部分bug都可以在這個測資找出來....取55是有時間反應
太大的洞就還是以下略,另外問比較好
以下有說好的for迴圈跟bug說明
一樣要自己寫的就不要看了,寫完再來看看有沒有這個bug
先來講這個bug...拿23 59 59當輸入
照一般時鐘應該是 0:0:0 ,因為時鐘不該有顯示 "24:60:60" 其中任一種狀況
而應該是直接歸零
這個bug主要原因是 +1 、 歸零 與 輸出時間的前後順序不當所致
以學長code判斷 分、秒 為例
順序是: (輸出 → 判斷是否>59,歸零 → +1) loop
這時候,如果輸出59……判斷就會是False則不歸零,再+1後變成60,在下一次loop中輸出
所以出現這樣子的小bug
解決方法很多,比如改變這三項行為的順序,或是改變判斷式內容都是作法
回到我們的for迴圈,一樣是一步一步來
先從設計"秒"的部分當開始,同樣要讓它能夠自己去變化、歸零
既然是for迴圈,我們可以利用for迴圈使用的三個運算式去進行之前在while的處理
sec =
0;
for (sec;
1;sec++){
cout <<sec <<endl;
sec =
59 ? sec =
0 : ;
}
這裡先來說明for那個括弧內的
1 是個什麼鬼
簡言之....是個
True,表示那裡無條件成立,原則上這麼做幾乎等同於while的寫法
: 提到這個,學長code內那個 while (1)是一樣的東西
當然也可以寫個sec<60一類的
反正以這一小段來說,一定要是個無窮回圈才能在裡面做秒的歸零與變動
用sec<60的寫法,就到寫到分的時候再來做說明吧
至於裏面那個歸零的部份是三元運算子,
老師原本想說明,想說會弄複雜就之後又不說明的東西
沒事就參考課本關於運算子的部份...我只是在吃晚餐,不想寫成if那樣好長一串
順便複習一下三元的使用(拖走)
不過寫起來感覺這東西擺在while裏面比較省行數
延續下去,一樣要做清除畫面、拖慢時間的處理
#include<windows.h>
sec =
0;
for (sec;
1;sec++){
cout <<sec <<endl;
Sleep(
1000);
system(
"cls");
sec =
59 ? sec =
0 : ;
}
嗯,既然學長教了,沒有不利用的理由
這次使用Sleep()做為拖慢時間的手段,Sleep是一個函數
這裡就先認知,函數是 一段已經被寫好的code,以一個單字代表 就好
然後,它的詳細內容被寫在windows.h裏面,所以程式最前面要多一個引用宣告
簡單來說,Sleep()的用法就是像code內一樣在()內擺上要停多久就可以了
這個"多久"使用的是微秒,1秒 = 1000微杪,我們只要停1秒,所以裡頭擺1000
好...再來我們又回到寫"分"的部份了,前面提過,用for迴圈就要與while寫點不同的
不然何必這樣用個for呢?
不過在那之前,我們還是仿照while寫一段
相對照可能比較好理解(?)
#include<windows.h>
sec =
0;
min =
0;
for (min;
1;min++){
for (sec;
1;sec++){
cout <<sec <<endl;
Sleep(
1000);
system(
"cls");
sec =
59 ? sec =
0 : ;
}
min =
59 ? min =0 : ;
}
其實整個運作邏輯等同while,所以就不多說明
要做說明的是下面這段
#include<windows.h>
sec =
0;
min =
0;
for (min;
1;min++){
for (sec;sec<
60;sec++){
cout <<min <<':' <<sec <<endl;
Sleep(
1000);
system(
"cls");
}
sec =
0;
min =
59 ? min =
0 : ;
}
做點小小的變化,去應用for迴圈三個式子
這裡的邏輯我是這樣解釋的:
比照時鐘的轉法,秒 是個在 分 底下的小循環,那就讓秒在分底下跑
當秒跑到60(也就是下一分的0秒)的時候
結束這一圈秒針運行,換到下一"分"再讓秒針運行
中間判斷式改為<
60,就能達成在秒在60秒時結束
然後,離開這一圈時直接歸零,以此確保下一圈開始時一定是0
最後一樣是有關"分"的歸零
畢竟在這段code的分之外沒有"時",不能用現在秒的處理方法
--
是說一個迴圈的解法被寫完了
所以又是個以下略的好日子(?)
--
紅白本命
○楽園の巫女
博麗 霊夢 職業:博麗神社の巫女さん
Hakurei Reimu 能力:主に空を飛ぶ程度の能力
@東方project系列
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 115.43.34.89
※ 編輯: game0416 來自: 115.43.34.89 (11/27 00:06)
※ 編輯: game0416 來自: 115.43.34.89 (11/27 00:06)
※ 編輯: game0416 來自: 115.43.34.89 (11/27 00:06)
推 linjrming:題外話,我的那個程式 把s++改成++s就OK了 11/27 01:00
→ game0416:那個我就當作是把 +1 擺到判斷前了...所以沒講明 QQ 11/27 01:12
推 j2612280:ya!!我沒有24:60:60的問題XD~ 11/27 20:44