Professional Documents
Culture Documents
──在工程上的應用
Lesson 5
使用者定義函式
Instructor:陳彥銘
好的編寫程式技巧
盡可能將大型程式分解成子計畫的函式,如此做
的好處包括:函式的獨立測試、函式的重複使用
,以及避免無心錯誤所帶來的副作用。
MATLAB程式使用傳值法(pass-by-value)進行
程式與函式之間的聯繫。當程式呼叫函式時,
MATLAB便複製實際引數並傳遞給函式使用。這
種複製行為是很關鍵的,它意味著即使函式更改
了輸入引數值,也不會影響到呼叫程式的原始資
料。這種特性可以防止在函式中無意間修改輸入
引數的錯誤,而影響到呼叫程式的原始變數值。
x r cos (6-1)
y r sin (6-2)
r x2 y 2 (6-3)
y
tan 1
(6-4)
x
x = r * cos(theta * pi/180);
y = r * sin(theta * pi/180);
% Record of revisions:
% Date Programmer Description of change
% ==== ========== =====================
% 02/01/10 S. J. Chapman Original code
5. 測試程式。
為了測試這些函式,我們將在 MATLAB 的指令視窗直
接執行這些函式。我們將使用在中學已熟悉的3-4-5直
角三角形來執行這些函式,此三角形內最小角度約為
36.87˚。我們也將在直角座標的四個象限內分別測試這
些函式,以確保正確的座標轉換。
» [x, y] = polar2rect(5,36.8699)
x =
4.0000
y =
3.0000
» [x, y] = polar2rect(5,143.1301)
x =
-4.0000
y =
3.0000
» [x, y] = polar2rect(5,-143.1301)
x =
-4.0000
y =
-3.0000
» [x, y] = polar2rect(5,-36.8699)
x =
4.0000
y =
-3.0000
提示使用者輸入資料的筆數(nvals)
讀取資料筆數的值
預先配置一個輸入陣列
for ii = 1:nvals
提示輸入下一筆資料
讀取資料
end
第6章 使用者定義函式 第308頁
範例 6.2 資料排序-解
接下來我們需使用單獨的函式來排序這些資料。我們
將需要搜尋整個資料nvals-1次,以找出每次剩餘數
值中的最小值。我們將使用一個指標來標示每次搜尋
到的最小值在數列中的位置。假如找到的最小值不在
該次搜尋數列的第一個位置,就把最小值交換到該次
搜尋數列的第一個元素。詳細的虛擬碼如下︰
for ii = 1:nvals-1
% 找出 a(ii) 到 a(nvals)之中的最小值
iptr ← ii
for jj == ii+1 : nvals
if a(jj) < a(iptr)
iptr ← jj
end
end
第6章 使用者定義函式 第308頁
範例 6.2 資料排序-解
% 現在 iptr 指到最小值
% 假如 iptr ~= ii 就交換 a(iptr) 和 a(ii)
if ii ~= iptr
temp ← a(i)
a(i) ← a(iptr)
a(iptr) ← temp
end
end
最後的步驟是輸出被排序好的資料。這個步驟的虛擬
碼不需要再進一步細分。而最後的虛擬碼就是結合這
三個步驟:讀取、排序和輸出結果。
% Record of revisions:
% Date Programmer Description of change
% ==== ========== =====================
% 02/02/10 S. J. Chapman Original code
%
% Record of revisions:
% Date Programmer Description of change
% ==== ========== =====================
% 02/02/10 S. J. Chapman Original code
%
% Define variables:
% array -- Input data array
% ii -- Index variable
% nvals -- Number of input values
% sorted -- Sorted data array
% Preallocate array
array = zeros(1,nvals);
若nargin落在min_args與max_args之外, msg為一內
建標準錯誤訊息
若nargin落在min_args與max_args之間(包含),
msg為空字串
error()若輸入標準錯誤訊息, 則程式停止並印出錯誤
訊息, 若輸入空字串, 則程式繼續執行
% Record of revisions:
% Date Programmer Description of change
% ==== ========== =====================
% 02/03/10 S. J. Chapman Original code
» mag = polar_value(1,-1)
mag =
1.4142
» [mag angle] = polar_value(1,-1)
mag =
1.4142
angle =
-45
第6章 使用者定義函式 第315頁
範例6.3 使用選擇性引數
函式對於這兩種情況也提供了正確的答案。最後,
我們將嘗試以x和y值都是0來呼叫這個函式。
一變數若宣告為全域變數,將存放在全域記憶體內
。若同一名稱的變數在別的函數內也被宣告為全
域記憶體, 則這個變數將對應到同一個記憶體位
址。因此全域變數可以用來分享不同函式間的資
料。
使用全域變數時,在函式的初始設定區塊和第一
個可執行敘述式之間,宣告所有的全域變數。
你可以使用全域記憶體,在程式的函式之間傳遞
大量資料。
ni
rani (6-7)
134456
其中,ni是由(6-6)式所產生介於0到134,455間
的數字。
function seed(new_seed)
%SEED Set new seed for function random0
% Function SEED sets a new seed for function
% random0. The new seed should be a positive
% integer.
% Define variables:
% ISEED -- Random number seed (global)
% new_seed -- New seed
% Save seed
new_seed = round(new_seed);
ISEED = abs(new_seed);
第6章 使用者定義函式 第323頁
範例6.4 亂數產生器-解
1
12
» seed(1024)
» random0(4)
ans =
0.0598 1.0000 0.0905 0.2060
0.2620 0.6432 0.6325 0.8392
0.6278 0.5463 0.7551 0.4554
0.3177 0.9105 0.1289 0.6230
» hist(arr,10)
» title('\bfHistogram of the Output of random0');
» xlabel('Bin');
» ylabel('Count');