259201 Computer Programming for Engineers การเขียนโปรแกรมเบื้องต้น 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 #include "stdio.h" void main() { int a[10] ,n; for ( n=0 ; n<10 ; n++ ) { printf("Enter your data:"); scanf("%d", &a[n]); } for i=1:10 a(i)=input('Enter a data entry:'); end
การคำนวณค่า Standard Deviation (SD) กิจกรรมที่ 2 ให้นักศึกษาทำการแก้ไขโปรแกรมจากกิจกรรมที่ 1 ให้คำนวณค่าเฉลี่ย หลังจากที่รับข้อมูลทั้ง 10 เสร็จแล้ว โดยกำหนดให้ตัวแปรสำหรับเก็บค่าเฉลี่ยชื่อ avg #include "stdio.h" void main() { int a[10], n; float csum(0) for ( n=0 ; n<10 ; n++ ) { printf("Enter your data:"); scanf("%d", &a[n]); csum +=a[n]; } avg=csum/10.; คำถาม 1. ถ้าไม่มีการกำหนดค่าเริ่มต้นตัวแปร csum ให้เป็น 0 จะเกิดอะไรขึ้น?
การคำนวณค่า Standard Deviation (SD) จากสูตรที่ 1 เราจะต้องนำข้อมูลทีละหนึ่งข้อมูลมาลบโดยค่าเฉลี่ยจากนั้นยกกำลังสอง ถ้าต้องการนำข้อมูลแรกมาลบโดยค่าเฉลี่ยและยกกำลังสอง จะเขียนเป็นโปรแกรมใน MATLAB อย่างไร? (1) pow((a[1]-avg),2)
การคำนวณค่า Standard Deviation (SD) ถ้าต้องการหาค่าผลบวกรวมของค่าดังกล่าว จำนวน 10 ค่า วิธีการหนึ่งคือการใช้ for loop จำนวน 10 ครั้ง กิจกรรมที่ 3 ให้นักศึกษาทำการแก้ไขโปรแกรมจากกิจกรรมที่ 2 เพื่อหาค่าผลบวกรวมโดยกำหนดให้ตัวแปรสำหรับเก็บค่าผลบวกรวมชื่อ sq_sum #include "math.h“ …. float sq_sum(0); sq_sum=0.; for ( n=0 ; n<10 ; n++ ) { sq_sum +=pow((a[n]-avg),2); }
การคำนวณค่า Standard Deviation (SD) จากนั้นนำค่า sq_sum มาหารด้วย 10 และถอดรากที่ 2 #include "math.h“ …. float sq_sum(0); sq_sum=0.; for ( n=0 ; n<10 ; n++ ) { sq_sum +=pow((a[n]-avg),2); } sd=sqrt(sq_sum/10.);
การคำนวณค่า Standard Deviation (SD) #include "stdio.h" #include "math.h" void main() { float csum(0), avg, sq_sum(0), sd; int a[10], n; //get data and compute avg for ( n=0 ; n<10 ; n++ ) { printf("Enter your data:"); scanf("%d", &a[n]); csum +=a[n]; } avg=csum/10.; //compute SD sq_sum=0.; sq_sum +=pow((a[n]-avg),2); sd=sqrt(sq_sum/10.); fprintf(“SD = %.2f\n”, sd);
ตัดเกรดนักเรียนโดยใช้ SD ค่า SD สามารถนำมาใช้ในการตัดเกรดนักเรียนแบบอิงกลุ่มได้ เช่น ให้ค่าคะแนนในช่วงมากกว่า avg+sd ได้เกรด A, ช่วง avg-sd ได้เกรด F นอกนั้นให้เกรด C ซึ่งการตัดเกรดแบบนี้ การคิดค่าเกรดจะต้องเกิดขึ้นหลังจากมีการคำนวณ SD แล้ว
เกมทายตัวเลข (อีกครั้ง) อ้างอิงจากโค๊ดเกมทายเลขเดิมดังนี้ #include "stdio.h" #include "stdlib.h" void main() { int n, i, g; n = rand() % 11; // generate a random number 0-10 for ( i=1 ; i<=5 ; i++ ) { printf("Guess a number[0,10]:"); scanf("%d", &g); if (g==n) { printf("You got it"); return; } printf("You failed. Please try again");
เกมทายตัวเลข (อีกครั้ง) เราจะทำการปรับปรุงให้โปรแกรมนี้ทำการบอกใบ้ให้กับผู้ใช้ เช่น ถ้าเลขที่สุ่มได้เป็น 8 แต่ผู้ใช้กรอกเลข 3 โปรแกรมก็จะบอกว่าให้ทายตัวเลขที่มากกว่านี้ แต่ถ้าผู้ใช้กรอกเลข 9 โปรแกรมก็จะบอกว่าให้ทายตัวเลขที่น้อยกว่านี้ ดังรูปด้านล่าง 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 เราสามารถเขียนโค๊ดส่วนดังกล่าวได้ดังนี้ if (g==n) { printf("You got it."); return; } else if (g>n) printf("Less than this.\n"); else printf("Greater than this.\n");
เกมทายตัวเลข (อีกครั้ง) #include "stdio.h" #include "stdlib.h" void main() { int n, i, g; n = rand() % 11; // generate a random number 0-10 for ( i=1 ; i<=5 ; i++ ) { printf("Guess a number[0,10]:"); scanf("%d", &g); if (g==n) { printf("You got it."); return; } else if (g>n) printf("Less than this.\n"); else printf("Greater than this.\n"); printf("You failed. Please try again"); เกมทายตัวเลข
สรุป นอกจากเราจะใช้ Flowchart ในการสื่อสารระหว่างผู้พัฒนาโปรแกรมแล้ว Flowchart ยังช่วยให้ผู้พัฒนาโปรแกรมเข้าใจ Flow หรือลำดับของการทำงานได้ดีขึ้น เมื่อนักศึกษาเขียนโปรแกรมที่ค่อนข้างซับซ้อน ควรเริ่มต้นด้วยการคิดวิเคราะห์จากจุดเล็ก ๆ ที่ทำความเข้าใจได้ง่ายก่อน จากนั้นค่อยขยายการคิดไปสู่จุดที่ใหญ่มากขึ้น จนกระทั่งเขียนโปรแกรมได้ทั้งโปรแกรม