226101 Computer Programming การเขียนโปรแกรมคอมพิวเตอร์ สัปดาห์ที่ 7 แถวลำดับ
วัตถุประสงค์ เข้าใจหลักการสร้างแถวลำดับ เข้าใจประโยชน์ของการสร้างแถวลำดับ สามารถนำแถวลำดับไปใช้แก้ปัญหาได้
แถวลำดับ (Array) เขียนโปรแกรมรับข้อมูลนักเรียน 10 คน โดยรับค่า คำนำหน้า ชื่อ นามสกุล รหัส เกรดเฉลี่ย แล้วถ้าเปลี่ยนคำสั่งเป็น จงเขียนโปรแกรมรับข้อมูลนักเรียน 1000 คน โดยรับค่าดังโจทย์ข้างต้นจะใช้เวลาเขียนเสร็จนานแค่ไหน
แถวลำดับ (Array) ทำให้เกิดโครงสร้างข้อมูลประเภทแถวลำดับ เพื่อเรียกใช้งานตัวแปร เป็นลักษณะของแถวลำดับ ขึ้นกับพารามิเตอร์หรือตัวแปรที่ใช้เป็นตัวชี้ลำดับ ตัวอย่างการประกาศตัวแปร ประเภทตัวอักษร(character) char name = 't'; char name = 'e'; ตัวอย่างการประกาศตัวแปร ประเภทชุดตัวอักษร(string) char name[10] = "name"; char major[10] = "ELECTRICAL"; char faculty[20] = "Engineering"; หมายเหตุ จะแสดงผลอย่างไรถ้า char major[10] = "Engineering ";
แถวลำดับ (Array) ตัวอย่างการประกาศตัวแปร ประเภทชุดตัวอักษร(string) char t[10] = "Test"; char t[10] char major[10] เลข 0 – 9 เราเรียกว่าตัวชี้ตำแหน่ง อาร์เรย์(index) t[0] t[1] t[2] t[3] t[4] t[5] t[6] t[7] t[8] t[9] T e s t E L E C สังเกตว่า ค่าตำแหน่ง(index) เริ่มต้นที่ 0 เสมอ ไม่ใช่ 1 ICT, University of Phayao
แถวลำดับ (Array) การประกาศตัวแปรและกำหนดค่าให้กับแถวลำดับ 1. ประกาศตัวแปรและกำหนดค่าไปด้วย รูปแบบ {data type} {variable name}[{array size}] = “string"; กรณีเป็นตัวเลขใช้ รูปแบบ {data type} {variable name}[{array size}] = {1,2,3,…,n}; 2. ประกาศตัวแปรและกำหนดค่าทีหลัง รูปแบบ {data type} {variable name}[{ index of array at i }] ; {variable name}[i] = ‘charactor at i'; รูปแบบ {data type} {variable name}[{index of array at i }] ; {variable name}[i] = 10;
แถวลำดับ (Array) การประกาศตัวแปรและกำหนดค่าให้กับแถวลำดับ 1. ประกาศตัวแปรและกำหนดค่าไปด้วย เช่น char name[10] = "Test"; int digit[10] = {1,2,3,4,5,-1,-5,-3-,2,0}; int i[3] = {-1,0,1}; 2. ประกาศตัวแปรและกำหนดค่าทีหลัง เช่น char name[10] ; int i[3] ; i[0] = 1,i[1] = 1, i[2] = 3; ICT, University of Phayao
แถวลำดับ (Array) 2. ประกาศตัวแปรและกำหนดค่าทีหลัง เช่น char name[10] ; name[0] = 'T', name[1] = 'e', name[2] = 's', name[3] = 't'; int digit[5]; digit[0] = 1, digit[1] = 2, digit[2] = 3, digit[3] = 4, digit[4] = 5; int i[3]; i[2] = 1, i[0] = -1, i[1] = 0; ICT, University of Phayao
แถวลำดับ (Array) ตัวอย่างที่ 1 แสดงผลตัวอักษรในแนวตั้ง char faculty[50] = "School of Information and Communication Technology"; Int j; for (j=0; j<50; j++) { printf(" %c \n ",faculty[j] ); } ICT, University of Phayao
แถวลำดับ (Array) ตัวอย่างที่ 2 int i[5] = { 1,2,3,4,5 }; for (int j=0; j<5; j++) { printf(" i[%d] = %d \n ", j, i[j] ); // %d ตัวแรก คือค่าของ j และ %d ตัวที่สองคือแถวลำดับของ i ตัวที่ j } ICT, University of Phayao
ตัวอย่างที่ 3 กำหนดค่าทีละค่า และแสดงผล แถวลำดับ (Array) ตัวอย่างที่ 3 กำหนดค่าทีละค่า และแสดงผล int i[5] ; for ( int j=0; j<5; j++) i[j] = j; for ( j=0; j<5; j++) printf(" i[%d] = %d \n", j, i[j]); ตัวอย่างที่ 4 รับค่าทีละค่า และแสดงผล int i[5] ; for ( int j=0; j<5; j++) scanf(“%d”,&i[j]); for ( j=0; j<5; j++) printf(" i[%d] = %d \n", j, i[j]); ICT, University of Phayao
แถวลำดับ (Array) ตัวอย่างที่ 5 โปรแกรมรับคะแนน แสดงผลทีละค่าและสรุปค่าเฉลี่ย ถ้าเปลี่ยนเป็น sum/5 ? ICT, University of Phayao
ข้อควรระวังเรื่อง data type ไม่สามารถแสดงผลด้วย %f สำหรับ ตัวแปรประเภท int ตัวแปรประเภท int*float จะได้ float เสมอ(รวมไปถึง บวก ลบ หาร ) พึงระวัง ค่าน้อยหรือมากสุดของ data type นั้นๆ พึงระวังการใช้ float และ double (สังเกตค่าต่อไปนี้) interest ให้ผลที่แตกต่างกันอย่างไร ทำไมถึงได้ 79.449996948242188 ทำไมไม่ใช่ 79.450000000000000
แถวลำดับ (Array) แบบฝึกหัด ให้เขียนโปรแกรม รับค่าคะแนนของนักเรียน ทำการหาค่า mean และ sd แล้วทำการแสดงผลค่า mean และ sd ออกมา mean(ค่าเฉลี่ยของคะแนนทั้งหมด) sd = standard deviation(ค่าเบี่ยงเบนมาตรฐาน) แบบฝึกหัด ICT, University of Phayao
แถวลำดับ (Array) char major[10] = “ELEC"; int score[5] = {1,2,3,4,5}; จาก array ที่ผ่านมา เรียกว่าเป็น array 1 มิติ ซึ่งในการเขียนโปรแกรมจริงนั้น อาจมีการใช้งาน array ที่มากกว่า 1 มิติ เรียกอีกอย่างว่า Multidimensional arrays ICT, University of Phayao
แถวลำดับ (Array) array 2 มิติ การประกาศตัวแปร มี 2 วิธี คือ 1. ประกาศแบบไม่กำหนดค่า int i[5][10] ; 2. ประกาศแบบกำหนดค่า int i[2][2] = { {1,2} , {3,4} }; char data[2][100] = { {"Electricity Engineering"},{"School of Engineering"} }; ICT, University of Phayao
แถวลำดับ (Array) ตัวอย่าง array 2 มิติ
การประยุกต์ใช้แถวลำดับ จงเขียนโปรแกรมโดยมีเงื่อนไขต่อไปนี้ รับค่าตัวเลขทีละค่าแล้วเก็บค่าไว้ ถ้าตัวเลขมากกว่า 100 ให้แจ้งผู้ใช้พิมพ์ค่าใหม่เข้ามา รับค่าตัวเลขไปจนกว่าตัวเลขที่พิมพ์เข้ามาน้อยกว่า 0 หรือจำนวนตัวเลขที่เก็บไว้เกิน 5 ค่า ทำการเปรียบเทียบตัวเลขทั้ง 5 ค่าแล้วแสดงผลค่าน้อยไปมาก
การประยุกต์ใช้แถวลำดับ 3 ตัวเปรียบเทียบน้อยสุด 3! = 6 โจทย์เดิม เขียนโปรแกรมเรียงลำดับตัวเลข 3 ตัว a b c ลำดับ เงื่อนไข แสดงผล 1 a >= b && b >= c a b c 2 a >= c && c >= b a c b 3 b >= a && a >= c b a c 4 b >= c && c >= a b c a 5 c >= a && a >= b c a b 6 c >= b && b >= a c b a
การประยุกต์ใช้แถวลำดับ โจทย์สอบแลป โปรแกรมเรียงลำดับตัวเลข 5 ตัว 5 ตัวเปรียบเทียบน้อยสุด 5 ! = 120 ลองคิดวิธีนี้ a b c d e a[0] a[1] a[2] a[3] a[4]
การประยุกต์ใช้แถวลำดับ โจทย์สอบแลป โปรแกรมเรียงลำดับตัวเลข 5 ตัว a[0] a[1] a[2] a[3] a[4]
Insertion Sort อัลกอริทึม โจทย์สอบแลป โปรแกรมเรียงลำดับตัวเลข 5 ตัว ตัวอย่าง -> 9 2 5 3 4 i = 2 for i = 2 to n for j = i-1 to 1 if a[j] > a[i] swap(a[j],a[i]) else break; end if end for j = 1 9 2 5 3 4 2 9 5 3 4 i = 3 j = 2 2 9 5 3 4 2 5 9 3 4 j = 1 2 5 9 3 4 2 5 9 3 4 swap(a[j],a[i]) หมายถึง การสลับตำแหน่ง a[j] และ a[i]
Insertion Sort อัลกอริทึม โจทย์สอบแลป โปรแกรมเรียงลำดับตัวเลข 5 ตัว ตัวอย่าง -> 9 2 5 3 4 i = 4 for i = 2 to n for j = i-1 to 1 if a[j] > a[i] swap(a[j],a[i]) else break; end if end for j = 3 2 5 9 3 4 2 5 3 9 4 j = 2 2 5 3 9 4 2 3 5 9 4 j = 1 2 3 5 9 4 2 3 5 9 4
Insertion Sort อัลกอริทึม โจทย์สอบแลป โปรแกรมเรียงลำดับตัวเลข 5 ตัว ตัวอย่าง -> 9 2 5 3 4 2 3 4 5 9 i = 5 for i = 2 to n for j = i-1 to 1 if a[j] > a[i] swap(a[j],a[i]) else break; end if end for j = 4 2 3 5 9 4 2 3 5 4 9 j = 3 2 3 5 4 9 2 3 4 5 9 j = 2 2 3 4 5 9 2 3 4 5 9 ตัวอย่างในชีวิตประจำวัน เรียงไพ่ตาม เรียงหนังสือ ตามลำดับอักษร
การประยุกต์ใช้แถวลำดับ แบบฝึกหัด เขียนโปรแกรมรับค่า n ตัว แสดงผลตัวเลขที่เรียงลำดับจากมากไปน้อย ออกจากโปรแกรมเมื่อตัวเลขน้อยกว่าหรือเท่ากับ 0