MATLAB 7 在工程上的應用
William J. Palm III
第 4 章
MATLAB 程式設計
演算法與控制結構
演算法就是將精確定義的的指令以排序過的程序在某一段有
限的時間內進行某一項任務。排序意思是這些指令可加上編號,
但是演算法有能力使用控制結構來改變這些指令的順序。下 列是三種演算法運算的種類:
循序運算:表示依順序執行的指令。
條件運算:這種控制結構首先詢問一個一定要回答的問答,
答案是真/偽,並且接下來根據這個答案選取下一步的指令。
迭代運算(迴圈):表示重複執行某一組指令的控制結構。
結構化程式設計
結構化程式設計是設計一個程式的一個技巧,此技巧就 是使用模組的體系,每一個模組都有一個單一的入口點 以及出口點,並且在模組中控制的命令向下通過這個結 構,而不會無條件分支到此結構的更高層。
在MATLAB中,這些模組可以是內建的或者是使用者定 義的函數。
結構化程式設計的優點
1. 結構化的程式易於撰寫,因為程式設計者可先研讀整個 問題,接下來才處理細節。
2. 為了某一應用撰寫的模組(函數),亦可以使用於其他 的應用(所以也稱之為可重複使用的程式碼)。
3. 結構化程式設計易於除錯,因為每一個模組只被用來執 行一個任務,並且可以獨立於其他的模組單獨被測試。
4. 結構化程式設計對於團隊合作的環境是有效率的,因為 許多人可以共同合作同一個程式,而每一個人負責開發 一個或者一個以上的模組。
5. 結構化的程式易於了解以及修改,特別是將模組給予有 意義的名稱,以及對於每一個模組的任務有完善的使用 說明的時候。
更多相關資料請查詢課本第4-4~4-5頁
表4.1–1 開發電腦求解的步驟 1. 簡潔地敘述問題。
2. 指定程式所需要使用的資料。這些資料就是「輸入」。
3. 指定程式所需要產生的資訊。這些資訊就是「輸出」。
4. 徒手計算或者使用計算機運算整個求解步驟;若有必要,可 使用一組比較簡單的資料來測試。
5. 撰寫以及執行程式。
6. 檢查程式的輸出以及徒手計算的結果。
7. 以輸入的資料執行這個程式,並且對輸出執行真實性檢查。
8. 如果你將來會把此程式視作一個常用的工具而一直使用,記 得以某個範圍的合理資料值執行此程式來測試;並且對結果 執行真實性檢查。
有效的文件說明可以藉由下列方式完成:
1. 適當地選取變數名稱,忠實反應這些變數代表的量。
2. 在程式內加入註解。
3. 使用結構圖。
4. 使用流程圖。
5. 在程式中加入文字敘述,通常以假碼(偽碼)敘述。
以圖形作文件說明
在開發結構化的程式以及將程式以文件說明時,我們需 要兩種圖形來輔助。
這兩種圖形分別是結構圖以及流程圖。
1. 結構圖是描述此程式不同部分如何連結在一起的圖形。
2. 流程圖對於開發,以及用文件說明包含條件敘述的程 式時非常有用,因為流程圖顯示了程式根據條件敘述如 何執行所採取的各種路徑(也稱之為「分支」)。
圖4.1–1 電腦遊戲程式的結構圖。
圖4.1–2 敘述的流程圖表示法。
以假碼作文件說明
要直接避免處理電腦程式語言中可能會發生的複雜語 法,我們可以使用假碼代替,假碼使用了自然語言以 及數學算式來建立類似電腦敘述的敘述,但沒有複雜 的語法。假碼也可以使用一些簡單的MATLAB語法來 解釋程式的運作。
每一個假碼指令可以加以編號,但要明確並且可以加 以計算。
例題 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 s p
輸入a, b, c
計算p
計算A
顯示p, A
結束 流程圖
範例 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
範例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 ( )
1y
x
2 2
r
x
y
計算角度以tan-1(對邊/底邊),
即y/x;注意是x與y是座標有正 負之分。
流程圖
輸入x, y
計算 r
x 0
theta = atan(y/x)
顯示r, theta 結束
theta = atan(y/x)+pi
轉換徑度量
theta = theta*(180/pi) Yes
No
範例 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)
範例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,....
流程圖 初始化total 初始化 k
total<2e+4
結束
顯示k, total
k = k+1;
total = 10*k^2 - 4*k + 2 + total;
Yes
No
範例 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)
找出錯誤
將程式除錯的意思就是找出並且除去這些在程式中的「臭
蟲」,或者錯誤。這樣的錯誤通常可以歸類於以下幾種類別。
1. 語法的錯誤,例如忽略了括號或者逗號、或者將指令名稱拼 字錯誤。MATLAB通常可以偵測明顯的錯誤並且顯示出描述 此錯誤內容與所在位置的訊息。
2. 錯誤通常肇因於不正確的數學程序之錯誤。這些錯誤稱做執 行時的錯誤。當程式執行的時候並不一定每次都發生;只 有在某些特殊的資料輸入時才會發生。一個常見的例子是除 以零。
要找出執行時的錯誤,嘗試下列方法:
1. 永遠都先以此問題的簡單版本來測試,這種簡單的版本 可以徒手計算來驗證。
2. 移除各敘述末尾的分號,顯示出中間的執行結果。
3. 要測試使用者定義之函數,先暫時以註解排除function 列,並且以腳本檔的方式來執行這個檔案。
4. 使用編輯器除錯器的除錯功能,關於這部分我們會在 4.7 節中討論。
開發大型程式
1. 撰寫以及測試個別的模組(單元測試階段)。
2. 撰寫使用到這些模組的最上層程式(增長階段)。並非 所有的模組在初始測試的階段都被涵蓋到。隨著增長程 序的演進,越來越多的模組被包含在內。
3. 測試第一版完整的程式(α版發行階段)。這通常由組 織內與程式開發緊緊相關的技術人員來完成。可能會找 到一些α版本的錯誤並且移除之。
4. 最終α版本發行的測試由組織內相關人員以及熟悉信任 的外部人員完成,這些外部測試人員通常要簽署保密協 定。此時才為β版本發行階段,可能會發行許多次的β版。
表 4.2–1 關係運算子
運算子 意義
< 小於
<= 小或等於
> 大於
>= 大或等於
== 等於
~= 不等於
例如,假設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
關係運算子可以用來做陣列處理。
假設
x = [6, 3, 9]
以及
y = [14, 2, 9]
若是輸入 z = x(x<y)
可以找出x中所有比y中對應元素還要小的元素。所得到的結 果是
z = 6。
算術運算子+、-、*、/以及 \ 具有比關係運算子更高的優先權。
因此敘述 z = 5 > 2 + 7
與下列敘述是等效的 z = 5 >(2+7)
並且傳回的結果為z = 0。
我們可以使用括號來改變優先權;例如,z = (5 > 2) + 7與z = 8是等效的。
logical類別
當使用關係運算子的時候,例如 x = (5 > 2)
會建立一個邏輯變數,在這個例子中是x。
在MATLAB 6.5版之前,logical是任何一種數值資料類 型的屬性。現在logical是第一級資料類型,並且也是一 個MATLAB的類別,因此logical現在與其他例如字元以 及胞陣列的第一級的類型同等級。
邏輯變數之值只可能是1(真)以及0(偽)。
然而,如果陣列只包含 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頁
STOP
使用邏輯陣列存取陣列
當使用邏輯陣列來處理另外一個陣列時,會抓出該陣 列中對應到邏輯陣列中元素為 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頁
表 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 或者兩者 都是真的情況下傳回真,其他狀況則傳回偽。
表 4.3–2 運算子類型的優先順序
優先權 運算子類型
第一 括號;由最內的一對括號開始計算。
第二 算術運算子以及邏輯反相(NOT)(~);由左至右開始 計算。
第三 關係運算子;由左至右開始計算。
第四 邏輯且(AND)。
第五 邏輯或(OR)。
邏輯函數 定義
logical(A) 將陣列 A 的元素轉換成為邏輯值。
xor(A,B) 傳回一個與矩陣 A、B 具有相同維度的陣列;若 A、B 其中一個不為零,且兩個不同時為零,則 新陣列傳回一;若 A 以及 B 均為零或者均不為 零,則新陣列傳回零。
表 4.3–4 邏輯函數
(接下頁)
find 函數
邏輯函數 find(A)
[u,v,w] = find(A)
定義
計算一個陣列,此陣列的元素是 陣列A中不為零的元素的索引。
計算陣列u以及v,u的元素是陣列 A中不為零的元素的列索引,v的 元素是陣列A中不為零的元素的行 索引,並且w包含這些不為零的元 素的值。陣列w可以省略。
邏輯運算子以及find函數
考慮下列的對話
>>x = [5, -3, 0, 0, 8];y = [2, 4, 0, 5, 7];
>>z = find(x&y) z =
1 2 5
我們注意到find函數傳回的是索引,而不是值。
(接下頁)
邏輯運算子以及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頁
測試問題
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
START
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
h v t A 2 gt
v v02 2v gt0 sin( )A g t2 2time = (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最後一點 時間
輸入初始 V0, g, A
計算著地時間 t_hit
計算 t, h, V
find h >= 6且V <= 16
Stop Flow Chart
計算相關時間
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)
測試問題
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))
測試問題
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.
狀態敘述
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
if 敘述
if敘述的基本形式為 if 邏輯算式
敘述 end
每個if敘述必須要伴隨一個end敘述。如果邏輯算式為真的 時候,end敘述標記所要執行的敘述的結束。
更多相關資料請查詢課本第4-20頁
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
流程圖 Figure 4.4–1 x, y
False
True
End
x 0?
Compute z, w
y 0?
True
False
else 敘述
使用else敘述其基本結構為 if 邏輯算式
敘述群組1 else
敘述群組2 end
更多相關資料請查詢課本第4-22~4-25頁
if x >= 0
y = sqrt(x);
else
y = exp(x) -1;
end
圖4.4–2 else 結構的流程圖。
當測試的時候,if這個邏輯算式被執行,其中邏輯算式 可以是一個陣列,則此測試只有在邏輯算式中所有的 元素均為真的情況之下,才會傳回一個真的值!
例如,如果我們沒有辦法看出此測試是如何進行,則下列的 敘述並不是以我們想像中的方式進行。
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
另外,考慮如果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傳回的值結果也是偽。
下列的敘述 if 邏輯算式1
if 邏輯算式2 敘述
end end
可以用下列更為簡潔的形式來取代 If 邏輯算式1 & 邏輯算式2
敘述 end
elseif 敘述
if敘述的一般形式為 if 邏輯算式1
敘述群組1 elseif 邏輯算式2
敘述群組2 else
敘述群組3 end
如果不需要else以及elseif敘述的話可以省略。然而,如果兩者 都被使用,則else敘述必須要在elseif後出現,來承擔所有未予 說明的條件。
圖4.4–3 if-elseif-else 結構的流程圖。
例如,假設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頁
圖4.4–4 用以說明巢套if敘述的流程圖。
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
測試問題
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
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
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
字串
字串就是包含字元的變數。字串非常適用於建立輸入提示符 號、建立訊息,以及對於儲存與操作例如姓名以及地址這一 類的資料。
要建立一個字串變數,則將字元以單引號圍住。例如,字串 變數name可以用下列的方式建立:
>>name = ’Leslie Student’
name =
Leslie Student
(接下頁)
字串(承上頁)
下列的字串number和藉由輸入number = 123所建立出來的變數 number是不一樣的。
>>number = ’123’
number = 123
字串和input敘述
下一張投影片所列出的程式使用isempty(x) 函數,如果陣列 x為空陣列則傳回1,若是其他情況則傳回 0。
同時使用了輸入函數,其語法為 x = input(’prompt’, ’string’)
這個函數會在螢幕上顯示字串prompt ,同時等候由鍵盤的 輸入,並且將輸入的值傳回至字串變數x中。
若是沒有輸入任何東西而直接按下Enter鍵的話,則此函數 傳回一個空的矩陣。
字串與條件敘述
下列的提示程式是一個能夠讓使用者鍵入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頁
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敘述後面的任何敘述。
圖4.5–1 for迴圈的流程圖。
以迴圈變數表示式 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不是整數,則四捨五入誤差會使得迴圈執行 通過的次數與想像不一樣。
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頁
while 迴圈
while迴圈是用於當某一特定條件滿足時,才終止迴圈的對話,
而事先我們未能知道通過的次數。一個簡單的while的迴圈例 子為
x = 5;
while x < 25 disp(x)
x = 2*x - 1;
end
此程式中disp敘述所顯示的結果為5、9以及17。
典型的while結構如下。
while 邏輯算式 敘述
end
要使得while迴圈能夠正確地運作,下面兩個條件必須要 發生:
• 迴圈變數必須在while敘述執行之前就要有一個值。
• 迴圈變數必須要在敘述中被變更。
更多相關資料請查詢課本第4-38~4-40頁
圖4.5–3 while迴圈的流程圖。
一個簡單的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。如果是,則 繼續通過;如果不是,則跳過此迴圈。
switch 結構
switch結構提供了另外一種使用if、elseif,以及else指令的 替代方式。任何使用switch所撰寫出來的程式必定可以使 用if結構撰寫出來。
然而,對於某些應用而言,switch結構比if結構較具有可讀 性。
switch 結構的語法
switch 輸入算式(純量或者字串)
case 值1
敘述群組1 case 值2
敘述群組2 .
. .
otherwise
敘述群組 n end
下列的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頁
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
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)
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