# MDCPP 校內培訓講義 迴圈 ### 講師 楊翔宇 ---- ## 什麼是迴圈?就是能一直做同樣的事情 ---- Q:我們以往遇到的題目可能都只需要執行一遍,但假如遇到很多遍的問題呢 ? A:複製貼上就好啦 Q:那假如遇到需要做100遍的事情呢 A:哦...那就複製一百次 Q:假如他要求你用輸入的數字當作數字呢... A:... ... --- ## 由此可見,迴圈這個東西是必須的 ---- ``` 這裡有一個題目的例子: 請輸出10個'A' ``` 看到這裡大家一定會想說,阿這不就這樣 ```cpp= std::cout<<"AAAAAAAAAA"; ``` ---- ``` 那假如是這樣 請輸入100000個A ``` 相信大家絕對不會想要手寫100000個A,於是迴圈就此誕生了 --- ## for 迴圈 for迴圈可說是最常看到的迴圈形式,概念如下 ```cpp= for ( 初始狀態 ; 跳出迴圈依據 ; 每次改變的值 ) { //what you want to do } ``` #### 迴圈跟if一樣,都會用一個 { } 包起來,這樣不會與其他地方干擾 ---- ![](https://i.imgur.com/gLCMfKp.png) ---- ## 大家可以發現,利用變數的設立,我們便能依據輸入或自己想要的數字限制迴圈跑的次數拉 ~ ( 歡呼 ) ## 如此一來是不是很多問題都迎刃而解了呢 ? --- 像是剛剛的題目就可以用for迴圈解決 ```cpp= for(int i=1 ; i<=100000 ; i=i+1 ) { std::cout<<"A"; } ``` 這樣會發現for迴圈就會執行100000次,每次只要輸出一個A即可完成 ! ---- ## while 迴圈 while 迴圈可說是 for 迴圈的簡化版,他只會看什麼時候跳出 ! ```cpp= while( 跳出迴圈依據 ) { //what you want to do } ``` ---- ![](https://i.imgur.com/oF8zkHs.png) --- 剛剛那題也可以用while迴圈解決喔 ! 我們可以適當搭配變數使用 ---- ```cpp= int x=1; while( x<=100000 ) { std::cout<<"A"; x=x+1; } ``` ---- ## for 與 while 的差別 ? 大多數時候,我們在有需要變數限制迴圈次數時,我們會較常使用 for 迴圈,因為其較為方便設立變數。 而在以後我們會學到更多需要其他布林值判斷式的東西,而那時候會較常使用while迴圈 但是其實這兩個是互通的 ! 亦即兩個能做到的事情對方也都能做到 --- ## do while迴圈 這個迴圈其實不會有多少情況會使用到,大多數都還是用while跟for 但是APCS觀念題還是會考喔~ ---- do while迴圈就是在說他至少會執行一次,第一次不會理那個判斷式 ![](http://aliyunzixunbucket.oss-cn-beijing.aliyuncs.com/csdn/521c7be4-41c2-4fe3-a051-01bf9e6234c8?x-oss-process=image/resize,p_100/auto-orient,1/quality,q_90/format,jpg/watermark,image_eXVuY2VzaGk=,t_100,g_se,x_0,y_0) ---- ```cpp= do { //do what you want to do } while( 跳出迴圈依據 ) ; //很多人會沒加到這個分號w ``` --- 若要以那題進行的話,其實沒什麼必要,這樣做只是會增加coding複雜度而已 ~~所以我不喜歡用~~ ```cpp= int x=2; do { std::cout<<"A"; x=x+1; } while( x<=100000 ) ; ``` ---- ## 巢狀迴圈 巢狀迴圈是一個很常用到的技巧,我們就用以下例子吧: ``` 請輸入9*9乘法表 ``` ---- 這樣我們也不會想要直接手寫吧 ! 但大家會發現這樣似乎不是一個迴圈就能完成的事情 --- 巢狀迴圈如下 ``` 第一層迴圈 { 第二層迴圈 { 第三層迴圈 { ... } } } ``` 像是如果很多輸出的模式都是有相關性,只是參數不一樣的時候,我們就能使用這種巢狀迴圈 ---- 像是上面這題的寫法就是像這樣子 ```cpp= for ( int i=1 ; i<=9 ; i++ ) { for( int j=1 ; j<=9 ; j++) { cout<<i<<" * "<<j<<" = "<<i*j<<" "; } cout<<endl;//每行輸出完畢要換行 } ``` 大家可以寫寫看、試試看喔 ! ---- ## 小技巧教學 --- 我們常在遇到要跑N次的迴圈時,會這樣做: ```cpp= int N=100; while( N-- ) { //do what you want to do } ``` 大家會發現這樣寫真的很短,所以這是一個可以善用的方法 ---- 假如大家有看到一些code,他們的迴圈寫法可能會像這樣: ```cpp= for ( int i=0 ; i<=100 ; i++ ) cout<<"i"; ``` 這類的東西,那其實這不用 { } 的原因是因為假如不用 { },他會幫你自動讀入下一行,而第二行就不會去理他了。 ---- 這東西能在 for, while 迴圈使用到,但do_while似乎不行。 ~~再次推坑不要用do_while~~ --- 跟大家再次說,其實任何的迴圈要求都能夠被for, while, dowhile完成,其實這三者的方向是一樣的,只是在不同的方面有他比較方便用的地方喔 ! ---- ## 例題 上面有說過三種都是一樣意思,那這裡就沒有特別分類三者了 ---- ## 單層迴圈例題 --- 例題: http://mdcpp.mingdao.edu.tw/problem/A016 :::spoiler ```cpp= #include<iostream> using namespace std; int main(){ int n; cin>>n; for(int i=1;i<=n;i++){ cout<<i<<" "; } } ``` ::: ---- 例題: http://www.tcgs.tc.edu.tw:1218/ShowProblem?problemid=a026 :::spoiler ```cpp= #include<iostream> using namespace std; int main(){ int n; cin>>n; for(int i=1;i<=n;i++) cout<<"I love you.\n"; } ``` ::: ---- 例題: http://mdcpp.mingdao.edu.tw/problem/a020 :::spoiler ```cpp= for(int i=a;i<=b;i++){ cout<<i<<" "; } ``` ::: --- 例題: http://mdcpp.mingdao.edu.tw/problem/A017 :::spoiler ```cpp= #include<iostream> using namespace std; int main(){ int n,m; cin>>n>>m; for(int i=0;i<m;i++){ cout<<i%n+1<<" "; } } ``` ::: ---- ## 巢狀迴圈例題 ---- 例題: https://zerojudge.tw/ShowProblem?problemid=a005 :::spoiler ```cpp= #include <iostream> using namespace std; int main() { int t, a0, a1, a2, a3, a4; cin >> t; for (int i = 0; i < t; i++) { cin >> a0 >> a1 >> a2 >> a3; if (a3 - a2 == a2 - a1){ a4 = a3 + a3 - a2; } else { a4 = a3 * (a3 / a2); } cout << a0 << " " << a1 << " " << a2 << " " << a3 << " " << a4 << "\n"; } return 0; } ``` ::: --- ## 下禮拜就是我們的第一次模擬賽了喔 ! ## 大家要好好寫題目,好好準備 ~ ---- # 謝謝大家
{"metaMigratedAt":"2023-06-16T09:33:41.121Z","metaMigratedFrom":"Content","title":"MDCPP 校內培訓講義 迴圈","breaks":true,"contributors":"[{\"id\":\"6a375517-4167-4b7c-a983-1e595a29262c\",\"add\":5509,\"del\":1427}]"}
    150 views
   Owned this note