精華區beta NTUE-CS102 關於我們 聯絡資訊
快睡著了....找點熟悉的事情做看會不會精神好一點 是說畢竟是作業,不適合直接貼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