การเขียนโปรแกรมด้วย SCILAB
ในส่วนนี้จะอธิบายการใช้งานคำสั่งวนซ้ำและคำสั่งทดสอบเงื่อนไข เพื่อให้ผู้อ่านสามารถเขียนโปรแกรมอย่างง่ายขึ้นมาใช้งานได้อย่างรวดเร็วและมีประสิทธิผล
7.1 คำสั่งวนซ้ำ บ่อยครั้งในการเขียนโปรแกรมมีความจำเป็นที่จะต้องคำนวณชุดคำสั่งบางอย่างซ้ำเป็นจำนวนหลายๆ รอบซึ่งในกรณีนี้การใช้คำสั่งวนซ้ำจึงมีความจำเป็นมาก โดยโปรแกรม SCILAB ได้เตรียมคำสั่งสำหรับการวนซ้ำไว้อยู่สองรูปแบบ คือ คำสั่ง for และคำสั่ง while ซึ่งมีหลักการใช้งานดังนี้
7.1.1 คำสั่ง for
คำสั่ง for เหมาะสำหรับการใช้งานที่ต้องการให้โปรแกรมทำซ้ำชุดคำสั่งเดิมที่อยู่ภายในลูป (loop) เป็นจำนวนรอบตามที่กำหนดไว้ในนิพจน์ (expression) คำสั่ง for มีรูปแบบการใช้งาน ดังนี้
กล่าวคือโปรแกรมจะทำซ้ำคำสั่ง (instruction) ทั้งหมดภายในลูปเป็นจำนวนรอบตามที่กำหนดโดยตัวแปรที่เป็นไปตามเงื่อนไขของนิพจน์
ตัวอย่างการใช้งานคำสั่ง for ตัวอย่างเช่น
-->L = 5;
-->x = [];
-->for i = 1:L
--> x(i) = i;
-->end
ชุดคำสั่งนี้หมายความว่าเมื่อเริ่มต้นใช้งาน ตัวแปร L จะมีค่าเท่ากับ 5 และกำหนดให้ x เป็นเมทริกซ์ว่าง
(empty matrix) จากนั้นก็ทำการวนซ้ำโดยใช้ตัวแปร i เป็นตัวนับจำนวนซ้ำ นั่นคือตัวแปร i จะเริ่มจากค่า 1
แล้วเพิ่มขึ้นทีละ +1 จนไปถึงค่า 5 โดยที่ค่าของตัวแปร i แต่ละค่าจะถูกบรรจุไว้ในสมาชิกลำดับที่ i
ของเวกเตอร์ x ผลลัพธ์ของการประมวลผลชุดคำสั่งนี้คือ
-->x'
ans =
1. 2. 3. 4. 5.
7.1.2 คำสั่ง while
คำสั่ง while มีลักษณะการทำงานคล้ายกับคำสั่ง for เพียงแต่คำสั่ง while จะมีการทดสอบเงื่อนไขที่ผู้เขียนโปรแกรมกำหนดไว้ในนิพจน์ทุกๆ รอบของการวนซ้ำ กล่าวคือถ้าผลการทดสอบให้ค่าตรรกะเป็นค่า 1 (เป็นจริง) โปรแกรมก็จะทำซ้ำชุดคำสั่งภายในลูปนั้น
ต่ออีกหนึ่งรอบ แต่ถ้าผลการทดสอบให้ค่าตรรกะเป็นค่า 0 (เป็นเท็จ)
โปรแกรมก็จะยกเลิกการทำงานชุดคำสั่งภายในลูปนั้นทันที คำสั่ง while มีรูปแบบการใช้งานดังนี้
ตัวอย่างเช่น
-->L = 5;
-->x = [];
-->i = 1;
-->while i <= L
--> x(i) = i;
--> i = i + 1;
-->end
ชุดคำสั่งนี้ให้ผลลัพธ์เหมือนกับตัวอย่างของการใช้คำสั่ง for เพียงแต่การใช้คำสั่ง while จะต้องกำหนดค่าเริ่มต้นของตัวแปร i ก่อนที่จะนำค่า i ไปทำการเปรียบเทียบกับค่า L
ตามเงื่อนไขที่กำหนด
7.2 คำสั่งทดสอบเงื่อนไข คำสั่งทดสอบเงื่อนไขมีความจำเป็นมากสำหรับการเขียนโปรแกรมคอมพิวเตอร์ที่ซับซ้อน คำสั่งทดสอบเงื่อนไขที่ใช้บ่อยคือ คำสั่ง if ซึ่งมีหลักการใช้งานดังนี้
กล่าวคือถ้าผลการทดสอบเงื่อนไขในนิพจน์เป็นจริง โปรแกรม SCILAB ก็จะทำคำสั่งทั้งหมดที่อยูู่่ระหว่างคำว่า then และ end แต่ถ้าผลการทดสอบเป็นเท็จ โปรแกรม SCILAB จะไม่ทำคำสั่งทั้งหมด
ที่อยู่ระหว่างคำว่า then และ end
นอกจากนี้คำสั่ง if ยังสามารถนำไปใช้งานกับการตัดสินใจที่ซับซ้อนมากขึ้นได้โดยการใช้งานร่วมกับ else
ซึ่งมีรูปแบบการใช้งานคือ
if expression then
instructions_set1;
else
instructions_set2;
end
นั่นคือถ้าผลการทดสอบเงื่อนไขในนิพจน์เป็นจริง โปรแกรม SCILAB จะทำคำสั่งทั้งหมดที่อยู่ระหว่างคำว่า then และ else แต่ถ้าผลการทดสอบเป็นเท็จ โปรแกรม SCILAB จะทำคำสั่งทั้งหมด
ที่อยู่ระหว่างคำว่า else และ end แทน
ในการใช้งานที่มีการตัดสินใจที่ซับซ้อนมากยิ่งขึ้น ผู้ใช้ก็สามารถใช้งานคำสั่ง if ร่วมกับ elseif ได้ โดยมีรูปแบบการใช้งานดังนี้
if expression_1 then
instructions_set1;
elseif expression_2 then
instructions_set2;
else
instructions_set3;
end
นั่นคือถ้าผลการทดสอบเงื่อนไขในนิพจน์ expression_1 เป็นจริง โปรแกรม SCILAB จะทำชุดคำสั่ง instructions_set1 แต่ถ้าผลการทดสอบเป็นเท็จ โปรแกรม SCILAB ก็จะทำการทดสอบเงื่อนไขในนิพจน์ expression_2 ต่อไปทันที โดยที่ถ้าผลการทดสอบในนิพจน์ expression_2 เป็นจริง โปรแกรม SCILAB ก็จะทำชุดคำสั่ง instructions_set2 แต่ถ้าผลการทดสอบเป็นเท็จ ก็จะทำชุดคำสั่ง instructions_set3
พิจารณาตัวอย่างโปรแกรมการสร้างเมทริกซ์จัตุรัสขนาด N x N (ถ้ากำหนดให้ N = 3 ) โดยสมาชิกทุกตัวที่อยู่ใต้เส้นทแยงมุมหลักมีค่าเท่ากับ 1 ส่วนสมาชิกทุกตัวที่อยู่ในแนวเส้นทแยงมุมหลัก
มีค่าเท่ากับ 2 และสมาชิกทุกตัวที่อยู่เหนือเส้นทแยงมุมหลักมีค่าเท่ากับ 3 นั่นคือการสร้างเมทริกซ์
ซึ่งสามารถทำได้โดยใช้ชุดคำสั่งดังนี้
-->N = 3;
-->A = [];
-->for i = 1:N
--> for j = 1 : N
--> if i < j then
--> A(i, j) = 3;
--> elseif i == j then
--> A(i, j) = 2;
--> else
--> A(i, j) = 1;
--> end
--> end
-->end
เมื่อทำการประมวลผลชุดคำสั่งนี้แล้วจะพบว่าผลลัพธ์ที่ได้คือ เมทริกซ์ตามที่กำหนด นั่นคือ
-->A
A =
2. 3. 3.
1. 2. 3.
1. 1. 2.
7.3 การเขียนฟังก์ชันแบบอินไลน์ โปรแกรม SCILAB อนุญาตให้ผู้ใช้สามารถ สร้างฟังก์ชันใหม่ๆ ขึ้นมาใช้งานร่วมกับโปรแกรม SCILAB ได้ ในที่นี้จะอธิบายเฉพาะ การเขียนฟังก์ชันแบบอินไลน์ (in-line function) ซึ่งมีลักษณะการใช้งานดังนี้
function [ เอาต์พุต ] = function_name( อินพุต ) , ชุดคำสั่ง , endfunction |
นั่นคือจะต้องเริ่มต้นด้วยคำว่า function และปิดท้ายด้วยคำว่า endfunction โดยที่ภายในฟังก์ชันจะมีคำสั่งแต่ละคำสั่งจะต้องคั้นด้วยเครื่องหมายคอมม่า ตัวอย่างเช่นถ้าต้องการสร้างฟังก์ชันแบบอินไลน์ที่ชื่อว่า MyMax เพื่อใช้ในการหาค่าสูงสุดของเลขจำนวนจริงสองจำนวน ก็สามารถทำได้ดังนี้
-->function [y] = MyMax(x1, x2), if x1 >= x2 then y = x1, ...
-->else y = x2; end; endfunction;
-->y = MyMax(1, 5) // เรียก ฟังก์ชัน MyMax ขึ้นมาใช้งาน
y =
5.
นอกจากนี้ยังสามารถใช้คำสั่ง deff ในการสร้างฟังก์ชันแบบอินไลน์ได้เช่นกัน โดยมีรูปแบบการใช้งานคือ
deff('[ เอาต์พุต ] = function_name( อินพุต )', ' ชุดคำสั่ง ') |
ตัวอย่างเช่น
-->deff('y = MyMax(x1, x2)', 'if x1 > x2 then y = x1; ...
-->else y = x2; end');
-->y = MyMax(1,5)
y =
5.
ซึ่งให้ผลลัพธ์เท่ากัน
7.4 ข้อแนะนำในการพัฒนาโปรแกรมให้มีประสิทธิภาพ โดยทั่วไปผู้พัฒนาโปรแกรมพยายามที่จะทำให้โปรแกรมสามารถทำงานได้อย่างถูกต้องและรวดเร็ว
เนื่องจากโปรแกรม SCILAB เป็นโปรแกรมที่ทำงานบนพื้นฐานของเมทริกซ์ ดังนั้นการเขียนโปรแกรมที่ดีควรใช้ประโยชน์จากโครงสร้างของเมทริกซ์และพยายามหลีกเลี่ยงการใช้
คำสั่งวนซ้ำต่างๆ ให้มากที่สุด ตัวอย่างเช่น การคำนวณหาค่าของฟังก์ชัน
สามารถเขียนเป็นชุดคำสั่งเพื่อหาค่า y โดยใช้คำสั่งวนซ้ำได้ดังนี้
-->y = 0;
-->tic // คำสั่งสำหรับเริ่มจับเวลา
-->for i=1:200000
--> y = y + (3*i^2 + 2*i - 1)/(5*i^2);
-->end
-->toc // คำสั่งสำหรับหยุดจับเวลา และแสดงเวลาทั้งหมดที่ใช้
ans =
2.937
-->y
y =
120004.78
ชุดคำสั่งนี้มีการใช้คำสั่งวนซ้ำทำให้ใช้เวลาในการประมวลผลรวมทั้งสิ้น 2.937 วินาที อย่างไรก็ตามผู้ใช้สามารถที่จะพัฒนาชุดคำสั่งใหม่ให้มีผลลัพธ์เท่าเดิม แต่ใช้ความเร็วในการประมวลผลน้อยลงได้โดยใช้ประโยชน์จากโครงสร้างของเมทริกซ์ ดังต่อไปนี้
-->tic
-->i = 1:200000;
-->y = sum((3*i.^2 + 2*i - 1)./(5*i.^2)); // เขียนโปรแกรมโดยใช้โครงสร้างของเมทริกซ์
-->toc
ans =
0.234
-->y
y =
120004.78
จะเห็นได้ว่าชุดคำสั่งนี้จะใช้เวลา ในการประมวลผล เพียง 0.234 วินาที ซึ่งเร็วกว่าชุดคำสั่งเดิมมาก |