1. 程式人生 > 實用技巧 >第二章 結構化程式和自定義函式

第二章 結構化程式和自定義函式

第二章 結構化程式和自定義函式

邏輯運算子

運算子 意義
< 小於
<= 小於或等於
> 大於
>= 大於或等於
== 等於
~= 不等於
&&
||

流程控制語句

流程控制語句 作用
if, elseif, else if語句為真,則執行子句
switch, case, otherwise 根據switch語句內容判斷執行哪個子句
while 重複執行子句直到while中的條件為假
for 執行子句固定次數
try, catch 執行子句並捕獲執行過程中的異常
break
跳出迴圈
continue 直接進入下一次迴圈
end 結束子句
pause 暫停程式
return 返回到呼叫函式處

if語句

  1. 單分支if語句

    1. 語句格式

      if 條件
          語句組
      end
      
    2. 關於條件

      • 條件是標量時,非零表示條件成立,零表示條件不成立
      • 條件是矩陣時,矩陣為非空,且不含零元素,則條件成立,反之,條件不成立
  2. 雙分支if語句

    • 語句格式

      if 條件
          語句組1
      else
          語句組2
      end
      
  3. 多分支if語句

    • 語句格式

      if 條件1
          語句組1
      elseif 條件2
          語句組2
          ···
      elseif 條件m
          語句組m
      else
          語句組n
      end
      

switch語句

  1. 語句格式

    switch 表示式
        case 結果表1
            語句組1
        case 結果表2
            語句組2
            ···
        case 結果表m
            語句組m
        otherwise
            語句組n
    end
    
  2. switch表示式應該是一個其值可以列舉的表示式

  3. case結果表為switch表示式的取值,當取值有多個時,用單元資料表示

    c = input('請輸入一個單詞:','s');
    switch c(1)
        case {'A','E','I','O','U','a','e','i','o','u'}
            disp([c,'以母音字母開頭']);
        otherwise
            disp([c,'以子音字母開頭']);
    end
    %結果
    請輸入一個單詞:book
    book以子音字母開頭
    

for語句

  1. 格式

    for 迴圈變數=初值表示式:步長表示式:終值表示式
        迴圈體語句
    end
    for 迴圈變數=矩陣表示式
        迴圈體語句
    end
    
  2. 問題

    for k=[1,2,3,4]
    end
    for j=[1;2;3;4]
    end
    
    • 這兩個迴圈執行的次數相同嗎?
      不同!
    • for迴圈中的矩陣表示式是按列迴圈,如果是多行多列的話,會把每一列看作一個元素,所以第一個迴圈了4次,第二個迴圈了1次

while語句

  1. 格式

    while 條件
        迴圈體語句
    end
    
  2. while語句多用於迴圈次數不確定的情況

需要注意的地方

迴圈語句

使用迴圈語句應儘量預先分配記憶體空間

若一個變數所需要的記憶體空間是一個可預測的定值,我們應儘量提前為其分配記憶體空間.

以下面兩段程式為例,演示這一點:

  • 程式一:

    tic
    for ii = 1:2000
        for jj = 1:2000
            A(ii,jj) = ii + jj;
        end
    end
    toc
    1234567
    

    程式輸出Elapsed time is 4.616199 seconds.

    tic和toc這組命令用於給程式碼塊計時

  • 程式二:

    tic
    A = zeros(2000, 2000);		% 預先為變數分配記憶體空間
    for ii = 1:size(A,1)
        for jj = 1:size(A,2)
            A(ii,jj) = ii + jj;
        end
    end
    toc
    12345678
    

    程式輸出Elapsed time is 2.786401 seconds.

可以看到,程式一比程式二所用的時間更長.這是因為: 對於程式一,沒有預先為變數A分配記憶體,因此每當A的形狀發生改變時,都需要重新為A分配記憶體地址,這花費了更多的時間

省略號的使用

使用省略號...拼接多行語句

在MATLAB中,省略號...可以將多行語句拼接為一行,靈活使用該語句可以提高程式碼可讀性

自定義函式

  1. 函式可以被存入函式名.m檔案中,也可以以函式控制代碼的形式定義在記憶體中

    函式檔案的基本結構

funtion 輸出形參表=函式名(輸入形參表)
註釋說明部分
函式體語句
end
  • function是一個關鍵字,宣告該檔案中儲存的是一個函式.
  • 輸入變數輸出變數是非必須的,函式既可以沒有輸入變數,也可以沒有輸出變數.
  • 函式名應與.m檔名相同,且不包含特殊字元(最好不要有中文).
  • 例子

    function [C,S] = circle(r)
    %circle 求半徑為r的圓的周長和麵積
    C = 2.*pi.*r;
    S = pi.*r.*r;
    end
    

    函式的呼叫

    • 格式:

      [輸出實參表]=函式名(輸入實參表)
      
    • 例子

      >> [C,S]=circle(1)
      C =
      6.2832
      S =
      3.1416
      
  1. 匿名函式
    • 格式

      函式控制代碼變數=@(匿名函式輸入引數)匿名函式表示式
      函式控制代碼變數=@函式名
      
    • 例子

      >> f = @(x,y)x+y
      >> f(1,2)
      ans =
          3
      

函式的引數和作用域

  1. 函式引數的可調性

    nargin:輸入實參的個數
    nargout:輸出實參的個數
    
    • 可以通過控制輸入實參的個數,經過判斷輸出不同的結果
  2. 全域性變數和區域性變數

    • 全域性變數的定義格式

      global 變數名
      
      • 多個變數名通過空格隔開