精華區beta NTUE-CS102 關於我們 聯絡資訊
※ 引述《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