Label & Loop & Array

Arvin Liu

Label

在程式上的小小提醒點。

Label in general

#include <stdio.h>
int main(){

   /* do somthing */
   Hi_This_is_Label_1:
   /* do something else */
}

Code Line

宣告

#include <stdio.h>
int main(){

   /* do somthing */
   Hi_This_is_Label_1:
   /* do something else */
}

Goto

宣告

#include <stdio.h>
int main(){

   /* do somthing */
   Hi_This_is_Label_1:
   /* do something else */

  goto Hi_This_is_Label_1;
}

Label 在function內是可以直接goto

Exercises - goto 

Infinite Loop

無窮迴圈

#include <iostream>
using namespace std;
int main(){
  OAO:
  cout << "Hi" << endl;
  /*
    DO SOMETHING
  */
  goto OAO;
}

請將 /*DO SOMETHING*/ 處加code,

讓Loop跳出。

Counter

計數器

#include <iostream>
using namespace std;
int main(){
  int i=0;
  OAO:
  i++;
  cout << i << endl;

  if(/* Condition */){
      goto OAO;
  }
}

請將 /*Condition*/ 補完,讓程式從0輸出到100。

DO NOT USE GOTO

除非你很有想法....

Speghitti Code

Loop

就是個迴圈。

A Realistic Example
你媽叫你去掃地

這個時候你會有兩種選擇

  • 真的認真去打掃,乖小孩。
  • 死小孩。

認真打掃

什麼事情也沒有,
繼續你一天的生活。

偷懶玩耍

你媽會叫你再去掃一次。

Event Line

你媽叫你動作去打掃。

打掃要做還是不做

你媽檢查房子,看是要叫你重掃還是滿足了。

宣告

做事

檢查

Code-lize! - goto

Event Line - goto-loop

做事

檢查

宣告

Sweep:
  // do something
  
  if(house_is_not_clean){
  
   
     goto Sweep;
  
  }

goto with condition

label: // 宣告這一件事情
  // do something
  if (條件)
    goto label;

Code-lize! - do-while

很像goto-loop

label: // 宣告這一件事情
  // do something
  if (條件)
    goto label;
do{ // 宣告這一件事情
    // do something
  }while(條件);

Counter: goto vs do-while

#include <iostream>
using namespace std;
int main(){
  int i=0;
  
  OAO:
  i++;
  cout << i << endl;
  if(i < 100){
      goto OAO;
  }
}
#include <iostream>
using namespace std;
int main(){
  int i=0;
  
  do{
    i++;
    cout << i << endl;

  }while(i < 100);
}

goto

do-while

Example - Sigma(1)

請給出N=100時是多少?

\sum^N_{i=1} i
int main(){
  int sum=0, i=0;
  do{
    i++;
    sum += i;
  }while(i < 100);
  cout << sum << endl;
}

請給出N=100時是多少?

Homework

 

一直輸入數字,當所有輸入的數字加總=0時,結束程式整個程式。

1
2
3
-3
-4
1
/*YOU CANNOT TYPE ANYMORE*/

等等...

不是應該要先檢查嘛?

你媽叫你動作去打掃。

打掃要做還是不做

你媽檢查房子,看是要叫你重掃還是滿足了。

宣告

做事

檢查

????

????????????

Event Line - ver.2

你媽檢查房子,
髒了叫你去打掃。

打掃要做還是不做

回去重新檢查就好。

宣告/檢查

做事

回溯

Code-lize! - while

Event Line - while-like

while(house_is_not_clean){

// Do something;

}

宣告/檢查

做事

回溯

while

while(條件){
  // do somthing
}

如果不符合條件

Example - Sigma(2)

Example - while-like

宣告/檢查

做事

回溯

int sum=0, i=1;
while(i<=100){
  sum += i;
  i++;
}
cout << sum << endl;

我們用i在控制迴圈!

在用i控制迴圈時,
哪些必要的呢?

Where is Necessary?

int sum=0, i=1;
while(i<=100){
  sum += i;
  i++;
}
cout << sum << endl;

Change Form - FOR

for - 用;來分成三段!

for(初始狀態;條件;累進運算){
  // do somthing
}

int i=1

;i<=100

;i+=1

int sum=0, i=1;
while(i<=100){
  sum += i;
  i++;
}
cout << sum << endl;
int sum=0;
for(int i=1;i<=100;i+=1){
  sum += i; 
}

累加運算放後面!

int sum=0, i=1;
while(i<=100){
  sum += i;
  i+=1;
}
cout << sum << endl;
\sum^N_{i=1} i

 - while vs for

for

for(初始狀態;條件;累進運算){
  // do something
}

如果不符合條件

int i=0

i<=10000

i+=1

;

;

"for-loop" details

1. 三段都可以省略。

第二段(條件)省略時,預設值是永遠都是True。

while(1){}
for(;;){}

2. i++;

i=i+1; 和 i++; 接近一樣,所以for迴圈通常會像下面這樣

for(int i=0; i<n; i++){}

break / continue

會不會有突發狀況呢?

讓你需要在還沒完成迴圈的時候結束迴圈?

Maybe a solution

int no_fire = true;
while(house_is_not_clean && no_fire){
	// Do something
    if(on_fire){
    	no_fire = false;
    }
}

break: 強制終止迴圈

while(house_is_not_clean && no_fire){
	// Do something
    if(on_fire){
    	break;
    }
}

continue?

for(int i=1; i<10; i++){
  cout << "start " << i << endl;
  if(i%3==0){
    continue;
  }
  cout << "end " << i << endl;
}
for(int i=1; i<10; i++){ 
  cout << "start " << i << endl;
  if(i%3==0){
    break;
  }
  cout << "end " << i << endl;
}
start 1
end 1
start 2
end 2
start 3
start 1
end 1
start 2
end 2
start 3
start 4
end 4
start 5
end 5
start 6
start 7
end 7
start 8
end 8
start 9

Exercise

3n+1 problem

給定一個數字n,請模擬過程。
ex:
 22 11 34 17 52 26 13 40 20 10 5 16 8 4 2 1

9x9 table

1 2 3 4 5 6 7 8 9
2 4 6 8 10 12 14 16 18
3 6 9 12 15 18 21 24 27
4 8 12 16 20 24 28 32 36
5 10 15 20 25 30 35 40 45
6 12 18 24 30 36 42 48 54
7 14 21 28 35 42 49 56 63
8 16 24 32 40 48 56 64 72
9 18 27 36 45 54 63 72 81

輸出這樣的一個表格。
不要用手打

d649 - 數字三角形

輸入一個數字n,輸出一個靠右的直角三角形
(如右圖)

Array

一種情境:

現在有n隻怪物,你要負責記錄他們的血量。

But...

1. 你不知道n是多少。
2. 就算知道,你可能會這樣寫:

int hp_a, hp_b, hp_c, hp_d, hp_e;
int hp_f, hp_g, hp_h, hp_i, hp_j;
...

So you can...

// 有最多10隻怪物。
int monster_hp[10];
// 你可以用變數monster_hp[0]~monster_hp[9]

def

monster_hp[1] = 10;
monster_hp[1]++;

usage

就跟一般的變數一樣。

Exercise

// 有10隻怪物。
int monster_hp[10];

宣告

將所有怪物的血量都初始成100。

2-D Array

很像是座標平面的東西?

宣告

(0, 0) (0, 1) (0, 2)
(1, 0) (1, 1) (1, 2)
(2, 0) (2, 1) (2, 2)
// 現在有3x3的地圖。
int table[3][3];
// 你可以用變數
// table[0][0]~table[3][3]

def

table[1][1] = 2;
table[1][1] = table[0][0]+1;

usage

還是跟一般的變數一樣。

Loop

By Arvin Liu

Loop

  • 498