scilab第五章-初階程式設計 · conférencier : prénom nom date : transparent 3 fichier :...

24
Conférencier : Prénom Nom Date : Transparent 1 Fichier : /tmp/SCILAB_Chap5.odp SC ILA B 第五章 - 初階程式設計 撰文者: 1. 中央大學大氣系 楊善文 2. ( 如對本文有貢獻者,記得在此留名。 )

Upload: hahanh

Post on 14-Sep-2018

237 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: SCILAB第五章-初階程式設計 · Conférencier : Prénom Nom Date : Transparent 3 Fichier : /tmp/SCILAB_Chap5.odp 初學者是否適合以Scilab或Matlab當作 第一個學習的程式語言?

Conférencier : Prénom Nom Date : Transparent 1

Fichier : /tmp/SCILAB_Chap5.odp

SC ILA B 第五章 - 初階程式設計

撰文者: 1. 中央大學大氣系 楊善文 2. ( 如對本文有貢獻者,記得在此留名。 )

Page 2: SCILAB第五章-初階程式設計 · Conférencier : Prénom Nom Date : Transparent 3 Fichier : /tmp/SCILAB_Chap5.odp 初學者是否適合以Scilab或Matlab當作 第一個學習的程式語言?

Conférencier : Prénom Nom Date : Transparent 2

Fichier : /tmp/SCILAB_Chap5.odp

程式語言

程式語言常分為直譯式語言與編譯式語言。 直譯式語言:程式邊讀取程式碼,邊執行程式。直到程

式碼結束或是出現語法錯誤為止。 UNIX shell script, Scilab, Matlab...... 屬之。

編譯式語言:程式碼寫完後,先經由編譯器讀取確定無誤後,並轉成執行檔 ( 機器碼 ) ,讓電腦執行。 C , C++ ,Fortran...... 屬之。

Scilab 也有程式設計的功能,多用於作矩陣的資料處理兼繪圖。

Page 3: SCILAB第五章-初階程式設計 · Conférencier : Prénom Nom Date : Transparent 3 Fichier : /tmp/SCILAB_Chap5.odp 初學者是否適合以Scilab或Matlab當作 第一個學習的程式語言?

Conférencier : Prénom Nom Date : Transparent 3

Fichier : /tmp/SCILAB_Chap5.odp

初學者是否適合以 Sc il ab 或 Matl ab 當作第一個學習的程式語言?

對於 Scilab 或 Matlab 是否適合做為初學的程式語言,筆者個人是抱持反對的看法。原因是語法不夠嚴謹,對於初學者建立寫程式的一些觀念上,會較薄弱。對於之後學習其它程式語言可能會有學習困難的情形。

依附於特定軟體,對於程式碼可攜性較弱,必須要在不同機器都安裝的相同的此軟體才能用。

執行一個程式就要開一個軟體:耗費記憶體空間。

如果只是想要處理資料但不需要繪圖,用 C 或 Fortran 寫一支外部獨立的程式來工作是比較好的方法。

先學 C 再來學 Scilab 程設會有較好的工作效果。 ( 由難而易 )

Page 4: SCILAB第五章-初階程式設計 · Conférencier : Prénom Nom Date : Transparent 3 Fichier : /tmp/SCILAB_Chap5.odp 初學者是否適合以Scilab或Matlab當作 第一個學習的程式語言?

Conférencier : Prénom Nom Date : Transparent 4

Fichier : /tmp/SCILAB_Chap5.odp

寫程式前的基本觀念

迴圈:當條件式符合你所定義的情形時,程式就會一直執行到不合為止。當程式一直無法執行到不合定義的情形時,則會無限制的執行下去 ( 假設電腦壽命夠長,也沒有外在終止程式的系統呼叫 ) ,稱為無限迴圈。

條件式:當你列出了一堆條件時,若程式當時狀態符合你其中一項條件時,它就會執行你在那個條件時,所要求它的動作。不合者程式自動忽略過此區域。

Page 5: SCILAB第五章-初階程式設計 · Conférencier : Prénom Nom Date : Transparent 3 Fichier : /tmp/SCILAB_Chap5.odp 初學者是否適合以Scilab或Matlab當作 第一個學習的程式語言?

Conférencier : Prénom Nom Date : Transparent 5

Fichier : /tmp/SCILAB_Chap5.odp

各類算符

大於: > 小於: < 大於等於: >= 小於等於: <= 是否等於: == 是否不等於: ~= AND: & (注意:是 '&',不是 '&&',跟 C 不一樣 ) OR: | (單 '|'而非雙 '|')

Page 6: SCILAB第五章-初階程式設計 · Conférencier : Prénom Nom Date : Transparent 3 Fichier : /tmp/SCILAB_Chap5.odp 初學者是否適合以Scilab或Matlab當作 第一個學習的程式語言?

Conférencier : Prénom Nom Date : Transparent 6

Fichier : /tmp/SCILAB_Chap5.odp

程式碼與 Sc il ab 的解讀

A > B :如果 A>B 條件成立,則執行該段程式碼。 A <= B : A<B和 A=B皆算是條件成立,執行該段程式

碼。 A==B :當 A 的數值等於 B 的數值時條件成立。 A==B和

A=B 是不同的, A=B主要是對它作邏輯上的判斷。 A==B則是判斷 A和 B 的內涵值。

A~=B :當 A值不等於 B值時,條件成立。 A 條件 & B 條件:當 A 條件式和 B 條件式都成立,才會執

行該段程式碼。 A 條件 | B 條件:當 A 條件或 B 條件,只要有其中一個成

立,就會執行該段程式碼。

Page 7: SCILAB第五章-初階程式設計 · Conférencier : Prénom Nom Date : Transparent 3 Fichier : /tmp/SCILAB_Chap5.odp 初學者是否適合以Scilab或Matlab當作 第一個學習的程式語言?

Conférencier : Prénom Nom Date : Transparent 7

Fichier : /tmp/SCILAB_Chap5.odp

程式中止與跳離迴圈

當程式出現無限迴圈的時候,中止程式的方式是:[Ctrl] + [ C ]

跳離迴圈的方式除了當程式不符合迴圈的判斷式而自動離開外,也可以在迴圈內插入 break指令。

Page 8: SCILAB第五章-初階程式設計 · Conférencier : Prénom Nom Date : Transparent 3 Fichier : /tmp/SCILAB_Chap5.odp 初學者是否適合以Scilab或Matlab當作 第一個學習的程式語言?

Conférencier : Prénom Nom Date : Transparent 8

Fichier : /tmp/SCILAB_Chap5.odp

for 迴圈

for和while 大概是初學程式者最常用的迴圈指令了。for 的功用是每執行一次該迴圈內程式碼,就會計數一次,直到累計的值超過宣告的范圍為止。

用法: for 變數範圍 ......... <=迴圈內要執行的程式碼 end <=迴圈之後常需跟著 end指令,來確

認迴圈內的程式碼範圍。

Page 9: SCILAB第五章-初階程式設計 · Conférencier : Prénom Nom Date : Transparent 3 Fichier : /tmp/SCILAB_Chap5.odp 初學者是否適合以Scilab或Matlab當作 第一個學習的程式語言?

Conférencier : Prénom Nom Date : Transparent 9

Fichier : /tmp/SCILAB_Chap5.odp

for 迴圈的範例程式

clear i=1 for i=1:5 i End 執行結果:右圖

Page 10: SCILAB第五章-初階程式設計 · Conférencier : Prénom Nom Date : Transparent 3 Fichier : /tmp/SCILAB_Chap5.odp 初學者是否適合以Scilab或Matlab當作 第一個學習的程式語言?

Conférencier : Prénom Nom Date : Transparent 10

Fichier : /tmp/SCILAB_Chap5.odp

另一個 for 迴圈的例子:九九乘法表

程式碼中的 printf()函式,即為在螢幕上做標準輸出。用法:printf(' 輸出字串 ',輸出變數 1,輸出變數 2,......);( 之後還會介紹到。 )

範例碼 (雙迴圈的使用 ) : clear i=1; j=1; for i=1:9 for j=1:9 printf('%d x %d = %d\n',i,j,i*j); end end

Page 11: SCILAB第五章-初階程式設計 · Conférencier : Prénom Nom Date : Transparent 3 Fichier : /tmp/SCILAB_Chap5.odp 初學者是否適合以Scilab或Matlab當作 第一個學習的程式語言?

Conférencier : Prénom Nom Date : Transparent 11

Fichier : /tmp/SCILAB_Chap5.odp

Débat

Proposez quelques idées touchant au coeur du sujet présenté

N'ayez pas peur de provoquer un peu vos auditeurs pour les inciter à prendre part au débat.

Page 12: SCILAB第五章-初階程式設計 · Conférencier : Prénom Nom Date : Transparent 3 Fichier : /tmp/SCILAB_Chap5.odp 初學者是否適合以Scilab或Matlab當作 第一個學習的程式語言?

Conférencier : Prénom Nom Date : Transparent 12

Fichier : /tmp/SCILAB_Chap5.odp

標準輸出函式 printf

printf這個函式,對於一些會 C 的讀者應該並不覺得陌生吧, Scilab 下的 printf幾乎和 C 的 printf語法完全一樣。 Printf的字串除了可以用 ' '也可以用 '' ''。

從之前範例看到 printf中含有許多 %d。 %d主要控制著在輸出字串中該變數要位於哪個位置。例如:i=1;j=2;printf('abcd%dzzzz%d',i,j);

( 第一個 %d是 i 的,第二個 %d是 j的,以此類推。 ) 輸出結果: abcd1zzzz2 %d代表以整數輸出。 %f代表以浮點數輸出。 %c 是單一字元。 %s 是輸出整個字串。

'\n'是換行符號,需放在 printf中的輸出字串區內。

Page 13: SCILAB第五章-初階程式設計 · Conférencier : Prénom Nom Date : Transparent 3 Fichier : /tmp/SCILAB_Chap5.odp 初學者是否適合以Scilab或Matlab當作 第一個學習的程式語言?

Conférencier : Prénom Nom Date : Transparent 13

Fichier : /tmp/SCILAB_Chap5.odp

範例三:修改後的九九乘法表

clear i=1;j=1; printf('\n'); for i=1:9 for j=1:9 printf('%dx%d=%d ',i,j,i*j); if i*j<10 printf(' '); end if j==9 printf('\n'); end end end

Page 14: SCILAB第五章-初階程式設計 · Conférencier : Prénom Nom Date : Transparent 3 Fichier : /tmp/SCILAB_Chap5.odp 初學者是否適合以Scilab或Matlab當作 第一個學習的程式語言?

Conférencier : Prénom Nom Date : Transparent 14

Fichier : /tmp/SCILAB_Chap5.odp

Page 15: SCILAB第五章-初階程式設計 · Conférencier : Prénom Nom Date : Transparent 3 Fichier : /tmp/SCILAB_Chap5.odp 初學者是否適合以Scilab或Matlab當作 第一個學習的程式語言?

Conférencier : Prénom Nom Date : Transparent 15

Fichier : /tmp/SCILAB_Chap5.odp

條件判斷 if.....end

if指令後面接的條件判段式,隔行開始到之後的結束句end之前,為該條件的程式碼範圍。當條件符合時,即會執行該段程式碼,不合則略過。 if也常被包入更大的迴圈內,作判斷一些細節之用。

例子:見之前的範例三。 語法: if 條件句 ........ <==程式碼 end

Page 16: SCILAB第五章-初階程式設計 · Conférencier : Prénom Nom Date : Transparent 3 Fichier : /tmp/SCILAB_Chap5.odp 初學者是否適合以Scilab或Matlab當作 第一個學習的程式語言?

Conférencier : Prénom Nom Date : Transparent 16

Fichier : /tmp/SCILAB_Chap5.odp

if 與邏輯判斷的整合範例

a=3; b=5; c=1; printf("\n"); if a>b & a>c printf('a 比較大 \n'); end if b>a & b>c <== and要全部成立才能執行 printf('b 比較大 \n'); end if c>a | b>a <== or代表多條件只要其中一個成立就會執行 printf("不知道\n"); end

Page 17: SCILAB第五章-初階程式設計 · Conférencier : Prénom Nom Date : Transparent 3 Fichier : /tmp/SCILAB_Chap5.odp 初學者是否適合以Scilab或Matlab當作 第一個學習的程式語言?

Conférencier : Prénom Nom Date : Transparent 17

Fichier : /tmp/SCILAB_Chap5.odp

Page 18: SCILAB第五章-初階程式設計 · Conférencier : Prénom Nom Date : Transparent 3 Fichier : /tmp/SCILAB_Chap5.odp 初學者是否適合以Scilab或Matlab當作 第一個學習的程式語言?

Conférencier : Prénom Nom Date : Transparent 18

Fichier : /tmp/SCILAB_Chap5.odp

while 迴圈

while 迴圈的設計是當只要符合條件句,就會一直執行下去,而不會 for 在宣告條件句時,就要宣告它的範圍了。故while 只要程式撰寫一有疏失,就很容易產生無限迴圈的現象。

用法: While 條件式 <==類似 if的條件式樣式 ....... end

Page 19: SCILAB第五章-初階程式設計 · Conférencier : Prénom Nom Date : Transparent 3 Fichier : /tmp/SCILAB_Chap5.odp 初學者是否適合以Scilab或Matlab當作 第一個學習的程式語言?

Conférencier : Prénom Nom Date : Transparent 19

Fichier : /tmp/SCILAB_Chap5.odp

whil e 的使用範例

i=8;

printf("\n");

while i>3

printf('ZZZzzz......\n');

i=i-1; <==如果這行被注解掉,程式就會無限執行下去

end

Page 20: SCILAB第五章-初階程式設計 · Conférencier : Prénom Nom Date : Transparent 3 Fichier : /tmp/SCILAB_Chap5.odp 初學者是否適合以Scilab或Matlab當作 第一個學習的程式語言?

Conférencier : Prénom Nom Date : Transparent 20

Fichier : /tmp/SCILAB_Chap5.odp

Page 21: SCILAB第五章-初階程式設計 · Conférencier : Prénom Nom Date : Transparent 3 Fichier : /tmp/SCILAB_Chap5.odp 初學者是否適合以Scilab或Matlab當作 第一個學習的程式語言?

Conférencier : Prénom Nom Date : Transparent 21

Fichier : /tmp/SCILAB_Chap5.odp

雙條件判斷: if . ... th en ... . el se

說明:當符合條件一時,則執行程式碼一,否則就執行程式碼二。也可以使用連續 if...end達到相同功能。

用法: if 條件一 then 執行程式一 else 執行程式二 end

Page 22: SCILAB第五章-初階程式設計 · Conférencier : Prénom Nom Date : Transparent 3 Fichier : /tmp/SCILAB_Chap5.odp 初學者是否適合以Scilab或Matlab當作 第一個學習的程式語言?

Conférencier : Prénom Nom Date : Transparent 22

Fichier : /tmp/SCILAB_Chap5.odp

if-then-else 的範例

clear a=1; b=2; c=3; if a>b then printf("a>b"); else printf("a<b"); end 執行結果: a<b

Page 23: SCILAB第五章-初階程式設計 · Conférencier : Prénom Nom Date : Transparent 3 Fichier : /tmp/SCILAB_Chap5.odp 初學者是否適合以Scilab或Matlab當作 第一個學習的程式語言?

Conférencier : Prénom Nom Date : Transparent 23

Fichier : /tmp/SCILAB_Chap5.odp

綜合範例:利用迴圈將資料填入矩陣

製造一個 10x10的單位矩陣: clear i=1;j=1;U=[]; for i=1:10 for j=1:10 if i==j U(i,j)=1; end if i~=j U(i,j)=0; end end end U

Page 24: SCILAB第五章-初階程式設計 · Conférencier : Prénom Nom Date : Transparent 3 Fichier : /tmp/SCILAB_Chap5.odp 初學者是否適合以Scilab或Matlab當作 第一個學習的程式語言?

Conférencier : Prénom Nom Date : Transparent 24

Fichier : /tmp/SCILAB_Chap5.odp