• 沒有找到結果。

結構化程式設計

N/A
N/A
Protected

Academic year: 2022

Share "結構化程式設計"

Copied!
80
0
0

加載中.... (立即查看全文)

全文

(1)

MATLAB 7 在工程上的應用

William J. Palm III

第 4 章

MATLAB 程式設計

(2)

演算法與控制結構

演算法就是將精確定義的的指令以排序過的程序在某一段有

限的時間內進行某一項任務。排序意思是這些指令可加上編號,

但是演算法有能力使用控制結構來改變這些指令的順序。下 列是三種演算法運算的種類:

循序運算:表示依順序執行的指令。

條件運算:這種控制結構首先詢問一個一定要回答的問答,

答案是真/偽,並且接下來根據這個答案選取下一步的指令。

迭代運算(迴圈):表示重複執行某一組指令的控制結構。

(3)

結構化程式設計

結構化程式設計是設計一個程式的一個技巧,此技巧就 是使用模組的體系,每一個模組都有一個單一的入口點 以及出口點,並且在模組中控制的命令向下通過這個結 構,而不會無條件分支到此結構的更高層。

在MATLAB中,這些模組可以是內建的或者是使用者定 義的函數。

(4)

結構化程式設計的優點

1. 結構化的程式易於撰寫,因為程式設計者可先研讀整個 問題,接下來才處理細節。

2. 為了某一應用撰寫的模組(函數),亦可以使用於其他 的應用(所以也稱之為可重複使用的程式碼)。

3. 結構化程式設計易於除錯,因為每一個模組只被用來執 行一個任務,並且可以獨立於其他的模組單獨被測試。

4. 結構化程式設計對於團隊合作的環境是有效率的,因為 許多人可以共同合作同一個程式,而每一個人負責開發 一個或者一個以上的模組。

5. 結構化的程式易於了解以及修改,特別是將模組給予有 意義的名稱,以及對於每一個模組的任務有完善的使用 說明的時候。

更多相關資料請查詢課本第4-4~4-5頁

(5)

表4.1–1 開發電腦求解的步驟 1. 簡潔地敘述問題。

2. 指定程式所需要使用的資料。這些資料就是「輸入」。

3. 指定程式所需要產生的資訊。這些資訊就是「輸出」。

4. 徒手計算或者使用計算機運算整個求解步驟;若有必要,可 使用一組比較簡單的資料來測試。

5. 撰寫以及執行程式。

6. 檢查程式的輸出以及徒手計算的結果。

7. 以輸入的資料執行這個程式,並且對輸出執行真實性檢查。

8. 如果你將來會把此程式視作一個常用的工具而一直使用,記 得以某個範圍的合理資料值執行此程式來測試;並且對結果 執行真實性檢查。

(6)

有效的文件說明可以藉由下列方式完成:

1. 適當地選取變數名稱,忠實反應這些變數代表的量。

2. 在程式內加入註解。

3. 使用結構圖。

4. 使用流程圖。

5. 在程式中加入文字敘述,通常以假碼(偽碼)敘述。

(7)

以圖形作文件說明

在開發結構化的程式以及將程式以文件說明時,我們需 要兩種圖形來輔助。

這兩種圖形分別是結構圖以及流程圖。

1. 結構圖是描述此程式不同部分如何連結在一起的圖形。

2. 流程圖對於開發,以及用文件說明包含條件敘述的程 式時非常有用,因為流程圖顯示了程式根據條件敘述如 何執行所採取的各種路徑(也稱之為「分支」)。

(8)

圖4.1–1 電腦遊戲程式的結構圖。

(9)

圖4.1–2 敘述的流程圖表示法。

(10)

以假碼作文件說明

要直接避免處理電腦程式語言中可能會發生的複雜語 法,我們可以使用假碼代替,假碼使用了自然語言以 及數學算式來建立類似電腦敘述的敘述,但沒有複雜 的語法。假碼也可以使用一些簡單的MATLAB語法來 解釋程式的運作。

每一個假碼指令可以加以編號,但要明確並且可以加 以計算。

(11)

例題 1. 假碼(Pseudo-code)

1. 輸入邊長 a, b, 和 c.

2. 計算周長, p. p = a+b+c;

3. 計算半周長 s, s = p/2;

4. 計算面積, A.

5. 顯示 p 和 A.

6. 結束

( )( )( )

A

s s

a s

b s

c

問題敘述 : 計算三角形周長 p 與面積 A,三邊長各 為a, b, 和 c. 計算公式為:

( )( )( )

A

s s

a s

b s

c

, / 2

p    a b c sp

(12)

輸入a, b, c

計算p

計算A

顯示p, A

結束 流程圖

(13)

範例 1. 連續運算(Sequential operations)

a = input('Enter the value of side a: ');

b = input('Enter the value of side b: ');

c = input('Enter the value of side c: ');

p = a + b + c; % 求周邊長

s = p/2; % 二分之ㄧ周長

A = sqrt(s*(s-a)*(s-b)*(s-c)); % 求面積

disp('The perimeter is:')

p

disp('The area is:')

A

(14)

範例2. 假碼(Pseudo-code)

1. 輸入 x 和 y座標。

2. 計算斜邊長 r;

3. 計算角度 ,

If x  0, theta = atan(y/x)

else

theta = atan(y/x)+pi

4. 轉換徑度量至度單位,theta = theta*(180/pi)

5. 顯示 r 與 theta

6. 停止。

問題敘述: 輸入點座標(x, y),計算極座標(r, ),其 中

2 2

r

x

y tan ( )

1

y

 

x

2 2

r

x

y

計算角度以tan-1(對邊/底邊),

即y/x;注意是x與y是座標有正 負之分。

(15)

流程圖

輸入x, y

計算 r

x  0

theta = atan(y/x)

顯示r, theta 結束

theta = atan(y/x)+pi

轉換徑度量

theta = theta*(180/pi) Yes

No

(16)

範例 2. 條件運算(Conditional Operations)

x = input('Enter the value of x: ');

y = input('Enter the value of y: ');

r = sqrt(x^2+y^2);

if x >= 0

theta = atan(y/x);

else

theta = atan(y/x) + pi;

end

disp('The hypoteneuse is:')

disp(r)

theta = theta*(180/pi);

disp('The angle is degrees is:')

disp(theta)

(17)

範例3. 假碼(Pseudo-code)

1. 初始化 total為0, total = 0。

2.初始化counter為0,k = 0。

3. While 當total小於20,000則計算total

counter 增量值為1,k = k + 1

更新total值 total = 10*k^2-4*k+2+total

4. 顯示目前k 的值。

5. 顯示目前total的值。.

6. 停止。

問題敘述 : 求 級數和需要多少

項次不會超過20,000。在此項次下的級數和為多少?

10k2  4k  2,k 1,2,3,....

(18)

流程圖 初始化total 初始化 k

total<2e+4

結束

顯示k, total

k = k+1;

total = 10*k^2 - 4*k + 2 + total;

Yes

No

(19)

範例 3. 迭代運算(Iterative)

total = 0;

k = 0;

while total < 2e+4

k = k+1;

total = 10*k^2 - 4*k + 2 + total;

end

disp('The number of terms is:')

disp(k)

disp('The sum is:')

disp(total)

(20)

找出錯誤

將程式除錯的意思就是找出並且除去這些在程式中的「臭

蟲」,或者錯誤。這樣的錯誤通常可以歸類於以下幾種類別。

1. 語法的錯誤,例如忽略了括號或者逗號、或者將指令名稱拼 字錯誤。MATLAB通常可以偵測明顯的錯誤並且顯示出描述 此錯誤內容與所在位置的訊息。

2. 錯誤通常肇因於不正確的數學程序之錯誤。這些錯誤稱做執 行時的錯誤。當程式執行的時候並不一定每次都發生;只 有在某些特殊的資料輸入時才會發生。一個常見的例子是除 以零。

(21)

要找出執行時的錯誤,嘗試下列方法:

1. 永遠都先以此問題的簡單版本來測試,這種簡單的版本 可以徒手計算來驗證。

2. 移除各敘述末尾的分號,顯示出中間的執行結果。

3. 要測試使用者定義之函數,先暫時以註解排除function 列,並且以腳本檔的方式來執行這個檔案。

4. 使用編輯器除錯器的除錯功能,關於這部分我們會在 4.7 節中討論。

(22)

開發大型程式

1. 撰寫以及測試個別的模組(單元測試階段)。

2. 撰寫使用到這些模組的最上層程式(增長階段)。並非 所有的模組在初始測試的階段都被涵蓋到。隨著增長程 序的演進,越來越多的模組被包含在內。

3. 測試第一版完整的程式(α版發行階段)。這通常由組 織內與程式開發緊緊相關的技術人員來完成。可能會找 到一些α版本的錯誤並且移除之。

4. 最終α版本發行的測試由組織內相關人員以及熟悉信任 的外部人員完成,這些外部測試人員通常要簽署保密協 定。此時才為β版本發行階段,可能會發行許多次的β版。

(23)

表 4.2–1 關係運算子

運算子 意義

< 小於

<= 小或等於

> 大於

>= 大或等於

== 等於

~= 不等於

(24)

例如,假設x = [6,3,9] 以及 y = [14,2,9]。下列的 MATLAB對話說明了這些例子。

>>z = (x < y) z =

1 0 0

>>z = (x ~= y) z =

1 1 0

>>z = (x > 8) z =

0 0 1

(25)

關係運算子可以用來做陣列處理。

假設

x = [6, 3, 9]

以及

y = [14, 2, 9]

若是輸入 z = x(x<y)

可以找出x中所有比y中對應元素還要小的元素。所得到的結 果是

z = 6。

(26)

算術運算子+、-、*、/以及 \ 具有比關係運算子更高的優先權。

因此敘述 z = 5 > 2 + 7

與下列敘述是等效的 z = 5 >(2+7)

並且傳回的結果為z = 0。

我們可以使用括號來改變優先權;例如,z = (5 > 2) + 7與z = 8是等效的。

(27)

logical類別

當使用關係運算子的時候,例如 x = (5 > 2)

會建立一個邏輯變數,在這個例子中是x。

在MATLAB 6.5版之前,logical是任何一種數值資料類 型的屬性。現在logical是第一級資料類型,並且也是一 個MATLAB的類別,因此logical現在與其他例如字元以 及胞陣列的第一級的類型同等級。

邏輯變數之值只可能是1(真)以及0(偽)。

(28)

然而,如果陣列只包含 0 以及 1,並不代表它一定是邏輯 陣列。例如,下列的對話中,k 以及 w 看來相同,但是 k是 一個邏輯陣列,而w卻是一個數值陣列,因此會出現一個錯 誤訊息。

>>x = [-2:2]; k = (abs(x)>1) k =

1 0 0 0 1

>>z = x(k) z =

-2 2

>>w = [1,0,0,0,1]; v = x(w)

??? Subscript indices must either be real positive... integers or logicals.

更多相關資料請查詢課本第4-12頁

(29)

STOP

(30)

使用邏輯陣列存取陣列

當使用邏輯陣列來處理另外一個陣列時,會抓出該陣 列中對應到邏輯陣列中元素為 1 之位置的對應元素。

因此輸入A(B),其中B是一個具有與 A 相同尺寸的邏輯 陣列,則傳回 A 在 B 為 1 處的值。

給定A = [5,6,7;8,9,10;11,12,13]以及B = logical(eye(3)),

我們可以藉由輸入C = A(B)來得到 A 的對角線元素,並 且得到C = [5;9;13]。

以邏輯陣列指明陣列下標可以得到對應於邏輯陣列中 為真(1)處對應元素。

更多相關資料請查詢課本第4-13頁

(31)

表 4.3–1 邏輯運算子

運算子 名稱 定義

~ 反 ~A 傳回與 A 相同維度的陣列;新陣列在 A 為零的地 方具有 1 且在 A 不為零的地方具有 0。

& 且 A&B 傳回的陣列具有與 A 以及 B 相同的維度;A&B 在 A 以及 B 對應元素均不為零的位置傳回的是 1,而 在 A 或者 B 中對應元素有一為零的位置傳回的是 0。

| 或 A|B 傳回的陣列具有與 A 以及 B 相同的維度;在 A 以 及 B 對應元素至少有一個不為零的位置傳回的是 1,

而在 A 以及 B 中元素都為零的位置傳回的是 0。

&& 短路且 純量邏輯算式的運算子。A && B 在 A 以及 B 均為真 的情況下傳回真,其他狀況則傳回偽。

|| 短路或 純量邏輯算式的運算子。A || B 在 A 或者 B 或者兩者 都是真的情況下傳回真,其他狀況則傳回偽。

(32)

表 4.3–2 運算子類型的優先順序

優先權 運算子類型

第一 括號;由最內的一對括號開始計算。

第二 算術運算子以及邏輯反相(NOT)(~);由左至右開始 計算。

第三 關係運算子;由左至右開始計算。

第四 邏輯且(AND)。

第五 邏輯或(OR)。

(33)

邏輯函數 定義

logical(A) 將陣列 A 的元素轉換成為邏輯值。

xor(A,B) 傳回一個與矩陣 A、B 具有相同維度的陣列;若 A、B 其中一個不為零,且兩個不同時為零,則 新陣列傳回一;若 A 以及 B 均為零或者均不為 零,則新陣列傳回零。

表 4.3–4 邏輯函數

(接下頁)

(34)

find 函數

邏輯函數 find(A)

[u,v,w] = find(A)

定義

計算一個陣列,此陣列的元素是 陣列A中不為零的元素的索引。

計算陣列u以及v,u的元素是陣列 A中不為零的元素的列索引,v的 元素是陣列A中不為零的元素的行 索引,並且w包含這些不為零的元 素的值。陣列w可以省略。

(35)

邏輯運算子以及find函數

考慮下列的對話

>>x = [5, -3, 0, 0, 8];y = [2, 4, 0, 5, 7];

>>z = find(x&y) z =

1 2 5

我們注意到find函數傳回的是索引,而不是值。

(接下頁)

(36)

邏輯運算子以及find函數(承上頁)

在下列的對話中,注意區分y(x&y)所得到的結果以及在前一 頁投影片中find(x&y)所得到的結果

>>x = [5, -3, 0, 0, 8];y = [2, 4, 0, 5, 7];

>>values = y(x&y) values =

2 4 7

>>how_many = length(values) how_many =

3

更多相關資料請查詢課本第4-17~4-18頁

(37)

測試問題

T4.3-1 本練習

x = [5,-3,18,4];y = [- 9,13,7,4];

z = ~y>x

z =

0 1 0 0

z = x&y

z =

1 1 1 1

z = x|y

z =

1 1 1 1

z = xor(x,y)

z =

0 0 0 0

(38)

START

(39)

Example 4.3-1假碼

1. 設定初始速率(speed) 、重力場(gravity)和角度(angle)

%v0 = 20; g = 9.81; A = 40*pi/180;

2. 計算著地時間

%time_to_hit = 2*v0*sin(A)/g; 設為t_hit

3. 計算時間、高度和速率

%t = 0, t_hit/100, 2t_hit/100, 3t_hit/100, …..

%

%

4. 決定當高度不小於6 且速率不大於16

% u = find(h>=6&v<=16);

5. 計算相對應時間

2 0

sin( ) 1

hv t A  2 gt

v v02 2v gt0 sin( )A g t2 2

(40)

time = (n-1)*t_hit

1st 點符合h>=6&v<=16,假設為4則t_4 = (u(1)-1)*t_hit u為符合h>=6&v<=16的標的矩陣,總個數length(u)若總 數8個則末了時間為t_final = (length(u)-1)*t_hit

0 1 2 3 4 5….. 12 n

t_hit

%t_1 = (u(1)-1)*(t_hit/100) ; u符合h>=6&v<=16的第一點時間

%t_2 = u(length(u)-1)*(t_hit/100);u符合h>=6&v<=16最後一點 時間

(41)

輸入初始 V0, g, A

計算著地時間 t_hit

計算 t, h, V

find h >= 6且V <= 16

Stop Flow Chart

計算相關時間

(42)

Example 4.3-1 拋射質點的高度及速度

%設定初始速率(speed) 、重力場(gravity)和角度(angle)

v0 = 20; g = 9.81; A = 40*pi/180;

%計算著地時間

t_hit = 2*v0*sin(A)/g;

%計算時間、高度和速率

t = [0:t_hit/100:t_hit];

h = v0*t*sin(A) - 0.5*g*t.^2;

v = sqrt(v0^2 - 2*v0*g*sin(A)*t + g^2*t.^2);

%決定當高度不小於6 且速率不大於16

u = find(h>=6&v<=16);

%計算相對應時間

t_1 = (u(1)-1)*(t_hit/100)

t_2 = u(length(u)-1)*(t_hit/100)

(43)

測試問題

T4.3-2 同例題4.3-1, 但既不是 h< 4 或 V> 17;繪製h(t)與v(t) 以確認答案.

Note: 邏輯運算

| : OR ; ~ NOT

~(h<4|v>17): either h< 4 or V> 17

改變find(h>=6&v<=16) 為find(~(h<4|v>17))

(44)

測試問題

T4.3-2 程式與例題4.3-1 相 同除了

u =find(~(h<4|v>17));.

v0 = 20;g = 9.81;A = 40*pi/180;

t_hit = 2*v0*sin(A)/g;

t = [0:t_hit/100:t_hit];

h = v0*t*sin(A)-0.5*g*t.^2;

v = sqrt(v0^2-2*v0*g*

sin(A)*t+g^2*t.^2);

u = find(~(h<4|v>17));

t_1 = (u(1)-1)*(t_hit/100)

t_2 = u(length(u)- 1)*(t_hit/100)

結果為t1 = 0.5766 和t2 = 2.0443.

因為h < 4 或 v > 17 其 t <

t1 且 t > t2.

(45)

狀態敘述

If I get a raise,

I will buy a new car

. (period) %01

If I get a least a $100 per week raise,

I will buy a new car;

else

I will put the raise into savings

. (period) %02

If I get a least a $100 per week raise,

I will buy a new car;

else, If the raise is greater $50,

I will buy a new stereo;

otherwise,

I will put the raise into savings

. (period) %03

(46)

if 敘述

if敘述的基本形式為 if 邏輯算式

敘述 end

每個if敘述必須要伴隨一個end敘述。如果邏輯算式為真的 時候,end敘述標記所要執行的敘述的結束。

更多相關資料請查詢課本第4-20頁

(47)

if x >= 0

y = sqrt(x);

end

同理: if x >= 0, y = sqrt(x), end

z=0; w= 0;

if (x >= 0)&(y>=0)

z= sqrt(x) + sqrt(y); w= log(x) – 3*log(y);

end

(48)

流程圖 Figure 4.4–1 x, y

False

True

End

x  0?

Compute z, w

y  0?

True

False

(49)

else 敘述

使用else敘述其基本結構為 if 邏輯算式

敘述群組1 else

敘述群組2 end

更多相關資料請查詢課本第4-22~4-25頁

if x >= 0

y = sqrt(x);

else

y = exp(x) -1;

end

(50)

圖4.4–2 else 結構的流程圖。

(51)

當測試的時候,if這個邏輯算式被執行,其中邏輯算式 可以是一個陣列,則此測試只有在邏輯算式中所有的 元素均為真的情況之下,才會傳回一個真的值!

(52)

例如,如果我們沒有辦法看出此測試是如何進行,則下列的 敘述並不是以我們想像中的方式進行。

x = [4,-9,25];

if x < 0

disp(’Some elements of x are negative.’) else

y = sqrt(x) end

此測試if x < 0傳回的值結果是偽,當此程式被執行之後會得 到下列的結果

y =

2 0 + 3.000i 5

(53)

另外,考慮如果x為正的情形 x = [4,-9,25];

if x >= 0

y = sqrt(x) else

disp(’Some elements of x are negative.’) end

當此程式被執行之後,產生下列的結果:

Some elements of x are negative.

此測試if x < 0的結果是偽,並且因為x >= 0傳回了[1,0,1]的 向量,所以此測試if x >= 0傳回的值結果也是偽。

(54)

下列的敘述 if 邏輯算式1

if 邏輯算式2 敘述

end end

可以用下列更為簡潔的形式來取代 If 邏輯算式1 & 邏輯算式2

敘述 end

(55)

elseif 敘述

if敘述的一般形式為 if 邏輯算式1

敘述群組1 elseif 邏輯算式2

敘述群組2 else

敘述群組3 end

如果不需要else以及elseif敘述的話可以省略。然而,如果兩者 都被使用,則else敘述必須要在elseif後出現,來承擔所有未予 說明的條件。

(56)

圖4.4–3 if-elseif-else 結構的流程圖。

(57)

例如,假設x > 10 時 y = ln x,在 0 ≤ x ≤ 10 時 y = sqrt(x),

並且在x < 0 時y = exp(x) - 1 。下列的敘述會計算 y ,假 設 x 已經具有一個純量值。

if x > 10

y = log(x) elseif x >= 0

y = sqrt(x) else

y = exp(x) - 1 end

更多相關資料請查詢課本第4-24~4-25頁

(58)

圖4.4–4 用以說明巢套if敘述的流程圖。

(59)

if x > 10

y = log(x)

if y >= 3

z = 4*y;

elseif y >= 2.5

z = 2*y;

else

z = 0;

end

else

y = 5*x;

x = 7*x;

end

(60)

測試問題

T4.4-1 使用 x = 13 測試,

程式為:

x = 13;

if x>10

y = log(x)

if y >= 3

z = 4*y

elseif y > 2.5

z = 2*y

else

z = 0

end

else

y = 5*x

z = 7*x

end

(61)

T4.4-2 注意asin(x)函數回 傳正確值為徑度量,但x須 在第一及第四象限. 因須注 意可能所給的q x不相容.

例如, q 不能等於 1,假如 x

< 0. 下列程式須避免次錯 誤輸入

if x >= 0&x<1

if q==1

y = asin(x)*180/pi;

elseif q==2

y = asin(x)*180/pi +…

270;

end

if q==3|q==4

disp(‘Incompatible values of x and q’)

else

(62)

disp(y)

end

elseif x<0&x>-1

if q==4

y = asin(x)*180/pi;

else

y = asin(x)*180/pi -90;

end

if q==1|q==2

disp(‘Incompatible values of x and q’)

else

disp(y)

end

else

disp(‘The magnitude of x is greater than 1’)

end

(63)

字串

字串就是包含字元的變數。字串非常適用於建立輸入提示符 號、建立訊息,以及對於儲存與操作例如姓名以及地址這一 類的資料。

要建立一個字串變數,則將字元以單引號圍住。例如,字串 變數name可以用下列的方式建立:

>>name = ’Leslie Student’

name =

Leslie Student

(接下頁)

(64)

字串(承上頁)

下列的字串number和藉由輸入number = 123所建立出來的變數 number是不一樣的。

>>number = ’123’

number = 123

(65)

字串和input敘述

下一張投影片所列出的程式使用isempty(x) 函數,如果陣列 x為空陣列則傳回1,若是其他情況則傳回 0。

同時使用了輸入函數,其語法為 x = input(’prompt’, ’string’)

這個函數會在螢幕上顯示字串prompt ,同時等候由鍵盤的 輸入,並且將輸入的值傳回至字串變數x中。

若是沒有輸入任何東西而直接按下Enter鍵的話,則此函數 傳回一個空的矩陣。

(66)

字串與條件敘述

下列的提示程式是一個能夠讓使用者鍵入Y或者y或者直接按下 Enter鍵來回答Yes(是)的腳本檔。任何其他的回應會被當作 是No(否)這個答案。

response = input(’Want to continue? Y/N [Y]: ’,’s’);

if (isempty(response))|(response==’Y’)|(response==’y’) response = ’Y’

else

response = ’N’

end

更多相關資料請查詢課本第4-27~4-28頁

(67)

for 迴圈

一個簡單的for迴圈例子如下 for k = 5:10:35

x = k^2 end

迴圈變數 k一開始被指派成5,並且根據x = k^2來計算x。

每一次相鄰的兩個通過k會被加上一個迴圈增量10,並且 繼續計算x直到k超過35。因此k會出現的值為5、15、25以 及35,並且x會出現的值為25、225、625以及1225。此程 式接下來會繼續執行接在end敘述後面的任何敘述。

(68)

圖4.5–1 for迴圈的流程圖。

(69)

以迴圈變數表示式 k = m:s:n 使用for迴圈時,要注意下列的規 則:

步長值s可以為負值。例如,k = 10:-2:4會產生k = 10、8、

6、4。

如果s被省略,則步長值預設為”1”。

如果s是正值,當m大於n的時候迴圈不會執行。

如果s是負值,當m小於n的時候迴圈不會執行。

如果m等於n,則迴圈只會執行一次。

如果步長值s不是整數,則四捨五入誤差會使得迴圈執行 通過的次數與想像不一樣。

(70)

continue 敘述

下列的程式碼使用continue敘述來避免計算到負數的對數。

x = [10,1000,-10,100];

y = NaN*x;

for k = 1:length(x) if x(k) < 0

continue end

y(k) = log10(x(k));

end y

此結果為 y = 1, 3, NaN, 2

更多相關資料請查詢課本第4-31~4-32頁

(71)

while 迴圈

while迴圈是用於當某一特定條件滿足時,才終止迴圈的對話,

而事先我們未能知道通過的次數。一個簡單的while的迴圈例 子為

x = 5;

while x < 25 disp(x)

x = 2*x - 1;

end

此程式中disp敘述所顯示的結果為5、9以及17。

(72)

典型的while結構如下。

while 邏輯算式 敘述

end

要使得while迴圈能夠正確地運作,下面兩個條件必須要 發生:

• 迴圈變數必須在while敘述執行之前就要有一個值。

• 迴圈變數必須要在敘述中被變更。

更多相關資料請查詢課本第4-38~4-40頁

(73)

圖4.5–3 while迴圈的流程圖。

(74)

一個簡單的while的迴圈例子為 x = 5;k = 0;

while x < 25 k = k + 1;

y(k) = 3*x;

x = 2*x-1;

end

起始的時候迴圈變數 x 被指派為5,並且直到第一次遇到敘 述為 x = 2*x - 1 之前都一直保持這個值。 接下來此值變成9

。在每一次通過迴圈之前,檢查x是否小於25。如果是,則 繼續通過;如果不是,則跳過此迴圈。

(75)

switch 結構

switch結構提供了另外一種使用if、elseif,以及else指令的 替代方式。任何使用switch所撰寫出來的程式必定可以使 用if結構撰寫出來。

然而,對於某些應用而言,switch結構比if結構較具有可讀 性。

(76)

switch 結構的語法

switch 輸入算式(純量或者字串)

case 值1

敘述群組1 case 值2

敘述群組2 .

. .

otherwise

敘述群組 n end

(77)

下列的switch段落顯示羅盤上對應至該角度的點。

switch angle case 45

disp(’Northeast’) case 135

disp(’Southeast’) case 225

disp(’Southwest’) case 315

disp(’Northwest’) otherwise

disp(’Direction Unknown’) end

更多相關資料請查詢課本第4-42~4-44頁

(78)

Test Your Understanding Problems

T4.5-1 The script file is

m = 0;

for q = 0:6:18

m = m+1;

n = 0;

for r = 4:4:12

n = n+1;

A(m,n) = r+q;

end

end

T4.5-2 The script file is

[m,n] = size(A);

for c = 1:n

x = 0;

for r = 1:m

x = x + A(r,c);

end

sum_A(c) = x;

end

disp(sum_A)

T4.5-3 The script file is

x = 49;

k = 1;

while x>0

y = sqrt(x)

k = k+1;

x = 50 - k^2;

end

(79)

T4.5-4 The script file is

error = 0;

x = 0;

while error < 1

x = x + 0.01;

approx = 1 + x + x^2/2 + x^3/6;

error = 100*(exp(x) - approx)/exp(x);

end

disp(x)

(80)

Test Your Understanding Problems

T4.6-1 The script file is

angle = input(‘Enter an angle in degrees.’)

switch angle

case 45

disp(‘Angle is in first quadrant’)

case -45

disp(‘Angle is in second quadrant’)

case 135

disp(‘Angle is in third quadrant’)

case -135

disp(‘Angle is in fourth quadrant’)

otherwise

disp(‘Quadrant is unknown.’)

end

參考文獻

相關文件

private void closeBTN_Click(object sender, System.EventArgs

zCount 屬性–取得項目個數 zAdd 方法–新增項目. zRemove 方法–移除指定項目

(Web Form、Web Service Mobile Form) Windows Form ADO.NET、XML. Base Class

(2) 讚美︰小明是個電腦程 式設計愛好者。最近他參 加義工活動,為安老院設 計了一款自動開門感應

溫度轉換 自行設計 溫度轉換 自行設計 統計程式 簡單 簡單 統計程式.

進階題 5% 設計以下功能:當 Text1 輸入完數字後,直接按 Enter 後跳到 Text2 ; 當 Text2 輸入完數字後,直接跳到 Command1 ,再接 Enter

FPGA(Field Programmable Gate Array)為「場式可程式閘陣列」的簡稱,是一 個可供使用者程式化編輯邏輯閘元件的半導體晶片

創業計畫的成功,許多企業家剛開始都是用很少的資本,從小規模