Try   HackMD

社課額外補充教材 : 重複結構

如果你覺得社課還算輕鬆,這裡提供你一些額外的補充教材。
這些是我們在備課的時候覺得稍微進階,或是篇幅太多,而沒有放在正式社課的內容。


這邊有目錄,左邊也有,可以跳到自己想看的地方


建議必看的地方 :

  • 詳細解說各迴圈執行順序
  • 常用功能
  • 大括號、縮排

詳細解說各迴圈執行順序

while

a; while(b){ c; } d;

執行順序:

  1. a->
  2. 判斷b->執行c->判斷b->執行c(重複直到b為否)
  3. ->d

for

a; for(b ; c ; d){ e; } f;

執行順序:

  1. a->b
    注意b只會執行一次,之後才會判斷c

  2. 判斷b->執行e->執行d(重複直到b為否)

  3. ->f

do-while

a; do{ b; }while(c); //注意分號 d;

執行順序︰

  1. a->b
    注意b在判斷c前會先執行一次

  2. 判斷c->執行b(重複直到c為否)

  3. ->d

迴圈間比較

首先,這三個迴圈有一樣的功能
也就是說,三者可以互換

  • while
    常用於無窮迴圈或是不知道確切次數的時候

  • for
    常用於指定次數時

  • do-while
    常用於至少須一次執行時(也就是不常用)


常用功能

無窮迴圈

顧名思義就是無止盡的迴圈

while(1) { } //其實只要放不為0的東西都可 for( ; 1 ; ) { } //相同概念,在條件判斷的地方放永為真的東西 do{ }while(1); //比起無窮迴圈希望各位更注意分號

執行n次

簡單明瞭控制執行次數

//下面都用n表示次數 int i = n; while(i--){ } //想想看為什麼可以這樣寫 for(int j = 0 ; j < n ; j++){ } //這最常見 int k = n-1; do{ }while(n--); //沒錯又是我,記得分號 //雖然超不常用但希望各位想想看為何可以這樣寫

大括號、縮排

在學if的時候有說到相關縮排的事情,忘記的可以回去看
上次補充講義

有關迴圈的部份

  • 只有當行程式時也可不寫大括號

while

while(1) std::cout<<"hello world\n"; //會出現無止境的hello world

for

for(int i = 0 ; i < 10 ; i++) std::cout<<"hello world\n"; //會出現十個hello world

do-while

do std::cout<<"hello world\n"; while(false); //會出現一個hello world

一些邪教

int n; while(std::cin>>n){} //重複直到eof,但不能對n進行更改 //更恐怖的改良板 int in; while(std::cin.eof()) { std::cin>>in; } //不解釋

EOF(End Of File),文件結束時回傳
可以用鍵盤上的ctrl+z 或是 ctrl+c 模擬eof


避之唯恐不急的邪教 ─ goto 語法

請千萬不要使用

語法結構

goto AAA; //AAA是標籤名稱,不須宣告

示例

#include<iostream> int main(){ AAA:; std::cout<<"不要用拜託不要那真的超恐怖\n"; goto AAA; //等同於 while(1) std::cout<<"用while不好嗎為啥要用goto?\n"; }

也就是說,goto 語法會使程式從標籤處開始執行
嚴格來說,goto 並不算迴圈結構的一種

為什麼不要用?

#include<iostream> int main(){ int a,b; a=10; b=20; for(int i=0;i<a;i++){ CHAOS:; for(int j=0;j<b;j++){ std::cout<<j<<'\n'; goto CHAOS; } std::cout<<i<<'\n'; } }

請問輸出是什麼?
答案是我也不知道

簡單來說

  • goto的標籤容易使人混亂
  • 程式碼難以預測與讀取
  • 他人(或是過了一個禮拜的你)難以閱讀

→請千萬不要使用