259201 Computer Programming for Engineers Week 7 การเขียนโปรแกรม MATLAB เบื้องต้น 2
Outline การคำนวณค่า Standard Deviation (SD) เกมทายตัวเลขแบบซับซ้อน
การคำนวณค่า Standard Deviation (SD) ถ้าเราต้องการคำนวณค่า SD ของกลุ่มประชากร (Population) จำนวน 10 ข้อมูล ตามสูตร (1) จะเห็นได้ว่า เราต้องนำข้อมูลแต่ละข้อมูลมาลบโดยค่าเฉลี่ย หรือ เราจะหาค่าเฉลี่ยได้อย่างไร? จากปฏิบัติการที่ 6 การคำนวณค่าเฉลี่ยนั้น เราจำเป็นต้องบวกข้อมูลทั้งหมดเข้าด้วยกัน จากนั้นทำการหารด้วยจำนวนข้อมูลทั้งหมด (1)
การคำนวณค่า Standard Deviation (SD) ดังนั้น เราจะทำการเขียนโปรแกรมเพื่อรับข้อมูลจำนวน 10 ข้อมูลเป็นขั้นตอนแรก กิจกรรม 1 ให้นักศึกษาเขียนโปรแกรมรับค่าข้อมูลจำนวน 10 ข้อมูล กำหนดให้ตัวแปรที่ใช้ในการรับข้อมูลชื่อ a โดยข้อมูลแรกเก็บอยู่ใน a(1), ข้อมูลที่สองเก็บใน a(2), …, ข้อมูลที่สิบเก็บใน a(10) ให้ตั้งชื่อโปรแกรมนี้ว่า cal_sd.m for i=1:10 a(i)=input('Enter a data entry:'); end
การคำนวณค่า Standard Deviation (SD) กิจกรรมที่ 2 ให้นักศึกษาทำการแก้ไขโปรแกรมจากกิจกรรมที่ 1 ให้คำนวณค่าเฉลี่ย หลังจากที่รับข้อมูลทั้ง 10 เสร็จแล้ว โดยกำหนดให้ตัวแปรสำหรับเก็บค่าเฉลี่ยชื่อ avg csum=0; for i=1:10 a(i)=input('Enter a data entry:'); csum=csum+a(i); end avg=csum/10; คำถาม 1. ถ้าเปลี่ยนชื่อตัวแปรจาก csum เป็น sum ซึ่งสื่อความหมายกว่า จะเกิดอะไรขึ้น? 2. ถ้าไม่มีการกำหนดค่าเริ่มต้นตัวแปร csum ให้เป็น 0 จะเกิดอะไรขึ้น?
การคำนวณค่า Standard Deviation (SD) จากสูตรที่ 1 เราจะต้องนำข้อมูลทีละหนึ่งข้อมูลมาลบโดยค่าเฉลี่ยจากนั้นยกกำลังสอง ถ้าต้องการนำข้อมูลแรกมาลบโดยค่าเฉลี่ยและยกกำลังสอง จะเขียนเป็นโปรแกรมใน MATLAB อย่างไร? (1) >>(a(1)-avg)^2
การคำนวณค่า Standard Deviation (SD) ถ้าต้องการหาค่าผลบวกรวมของค่าดังกล่าว จำนวน 10 ค่า วิธีการหนึ่งคือการใช้ for loop จำนวน 10 ครั้ง กิจกรรมที่ 3 ให้นักศึกษาทำการแก้ไขโปรแกรมจากกิจกรรมที่ 2 เพื่อหาค่าผลบวกรวมโดยกำหนดให้ตัวแปรสำหรับเก็บค่าผลบวกรวมชื่อ sq_sum %continue from previous program sq_sum=0; for i=1:10 sq_sum=sq_sum+(a(i)-avg)^2; end
การคำนวณค่า Standard Deviation (SD) จากนั้นนำค่า sq_sum มาหารด้วย 10 และถอดรากที่ 2 %continue from previous program sq_sum=0; for i=1:10 sq_sum=sq_sum+(a(i)-avg)^2; end sd=sqrt(sq_sum/10);
การคำนวณค่า Standard Deviation (SD) %get data and compute avg csum=0; for i=1:10 a(i)=input('Enter a data entry:'); csum=csum+a(i); end avg=csum/10; %compute sd sq_sum=0; sq_sum=sq_sum+(a(i)-avg)^2; sd=sqrt(sq_sum/10); fprintf(‘SD = %.2f\n’, sd);
ตัดเกรดนักเรียนโดยใช้ SD ค่า SD สามารถนำมาใช้ในการตัดเกรดนักเรียนแบบอิงกลุ่มได้ เช่น ให้ค่าคะแนนในช่วงมากกว่า avg+sd ได้เกรด A, ช่วง avg-sd ได้เกรด F นอกนั้นให้เกรด C ซึ่งการตัดเกรดแบบนี้ การคิดค่าเกรดจะต้องเกิดขึ้นหลังจากมีการคำนวณ SD แล้ว
เกมทายตัวเลข (อีกครั้ง) อ้างอิงจากโค๊ดเกมทายเลขเดิมดังนี้ n=round(rand(1)*10); for i=1:5 g=input('Guess a number[0,10]:'); if (g==n) disp('You got it'); return; end disp('You failed. Please try again');
เกมทายตัวเลข (อีกครั้ง) เราจะทำการปรับปรุงให้โปรแกรมนี้ทำการบอกใบ้ให้กับผู้ใช้ เช่น ถ้าเลขที่สุ่มได้เป็น 8 แต่ผู้ใช้กรอกเลข 3 โปรแกรมก็จะบอกว่าให้ทายตัวเลขที่มากกว่านี้ แต่ถ้าผู้ใช้กรอกเลข 9 โปรแกรมก็จะบอกว่าให้ทายตัวเลขที่น้อยกว่านี้ ดังรูปด้านล่าง >>guess_no Guess a number[0,10]:2 Greater than this. Guess a number[0,10]:6 Less than this. Guess a number[0,10]:5 You got it.
เกมทายตัวเลข (อีกครั้ง) จากโค๊ดโปรแกรม เราต้องเปรียบเทียบตัวแปรสุ่มและตัวแปรที่เก็บค่าที่ถูกกรอกโดยผู้ใช้ ถ้าตัวแปรสุ่มมากกว่าตัวแปรตัวแปรที่เก็บค่าที่ถูกกรอกโดยผู้ใช้ จะต้องแสดงคำบอกใบ้ว่า? Greater than this. ถ้าตัวแปรสุ่มน้อยกว่าตัวแปรตัวแปรที่เก็บค่าที่ถูกกรอกโดยผู้ใช้ จะต้องแสดงคำบอกใบ้ว่า? Less than this. ถ้าตัวแปรสุ่มเท่ากับตัวแปรตัวแปรที่เก็บค่าที่ถูกกรอกโดยผู้ใช้ จะต้องแสดงคำบอกใบ้ว่า? ไม่ต้องบอกใบ้ เพราะเดาถูกแล้ว ตัวแปรสุ่มในโค๊ดคือ ? n ตัวแปรที่เก็บค่าที่ถูกกรอกโดยผู้ใช้คือ? g
เกมทายตัวเลข (อีกครั้ง) จากโค๊ดโปรแกรม เราต้องเปรียบเทียบตัวแปรสุ่มและตัวแปรที่เก็บค่าที่ถูกกรอกโดยผู้ใช้ กิจกรรม 4 ให้นักศึกษาทดลองเขียน Flowchart ส่วนของการเปรียบเทียบตัวแปรสุ่มและตัวแปรตัวแปรที่เก็บค่าที่ถูกกรอกโดยผู้ใช้ g==n g>n g<n return display ‘Less than this.’ display ‘Greater than this.’ display ‘You got it.’
เกมทายตัวเลข (อีกครั้ง) อย่างไรก็ตาม ถ้า g ไม่ได้เท่ากับ n และ g ไม่ได้มากกว่า n หมายความว่า g จะต้องน้อยกว่า n แน่นอน เราจึงสามารถเปลี่ยน Flowchart ได้ดังนี้ g==n g>n return display ‘Less than this.’ display ‘Greater than this.’ display ‘You got it.’
เกมทายตัวเลข (อีกครั้ง) จาก Flowchart เราสามารถเขียนโค๊ดส่วนดังกล่าวโปรแกรม MATLAB ได้ดังนี้ if (g==n) disp('You got it.'); return; elseif (g>n) disp(‘Less than this.’); else disp(‘Greater than this.’); end
เกมทายตัวเลข (อีกครั้ง) n=round(rand(1)*10); for i=1:5 g=input('Guess a number[0,10]:'); if (g==n) disp('You got it.'); return; elseif (g>n) disp(‘Less than this.’); else disp(‘Greater than this.’); end disp('You failed. Please try again');
สรุป นอกจากเราจะใช้ Flowchart ในการสื่อสารระหว่างผู้พัฒนาโปรแกรมแล้ว Flowchart ยังช่วยให้ผู้พัฒนาโปรแกรมเข้าใจ Flow หรือลำดับของการทำงานได้ดีขึ้น เมื่อนักศึกษาเขียนโปรแกรมที่ค่อนข้างซับซ้อน ควรเริ่มต้นด้วยการคิดวิเคราะห์จากจุดเล็ก ๆ ที่ทำความเข้าใจได้ง่ายก่อน จากนั้นค่อยขยายการคิดไปสู่จุดที่ใหญ่มากขึ้น จนกระทั่งเขียนโปรแกรมได้ทั้งโปรแกรม