330 likes | 490 Views
ทบทวน แถวลำดับ และสายอักขระ. ที่ อ.บุญทรัพย์ ไวคำ สอนในค่าย 1 วิทยาการคอมพิวเตอร์ มหาวิทยาลัยขอนแก่น. แถวลำดับหรืออาร์เรย์ ( array).
E N D
ทบทวนแถวลำดับ และสายอักขระ ที่ อ.บุญทรัพย์ ไวคำ สอนในค่าย 1 วิทยาการคอมพิวเตอร์ มหาวิทยาลัยขอนแก่น
แถวลำดับหรืออาร์เรย์ (array) • การเก็บข้อมูลหลายจำนวนที่เป็นระเบียบบนหน่วยความจำของคอมพิวเตอร์สามารถทำได้โดยการกำหนดตัวแปรชนิดพิเศษที่เรียกว่า อาร์เรย์ ที่ครอบคลุมหน่วยความจำหลายตำแหน่ง โดยแต่ละตำแหน่งจะถูกกำกับด้วยหมายเลยของตำแหน่งตั้งแต่ตำแหน่งที่ 0 1 2 3 ...ไปเรื่อยๆจนครบจำนวนตำแหน่งทั้งหมด • ตัวอย่าง ถ้ามีข้อมูลตัวเลขใดๆ 10 20 30 40 50 60 70 80 90 00 เราจำเป็นต้องสร้างตัวแปรที่เป็นชนิด int เพื่อเก็บข้อมูลเหล่า โดยปกติ ตัวแปรหนึ่งสามารถเก็บได้หนึ่งจำนวนเท่านั้น แต่ด้วยตัวแปรแบบอาร์เรย์หนึ่งตัวแปรสามารถเก็บข้อมูลได้หลายจำนวนดังนี้
ตำแหน่ง ต่าข้อมูล การประกาศตัวแปรแถวลำดับ รูปแบบชนิดข้อมูล ชื่อตัวแปร[n]; โดยที่ ชนิดข้อมูล คือชนิดของข้อมูลที่จะทำการเก็บไว้ในตัวแปรแถวลำดับ n คือ จำนวนสมาชิกของตัวแปรแถวลำดับ หรือจำนวนข้อมูลที่ตัวแปรสามารถเก็บได้สุงสุดนั้นเอง ตัวอย่าง int n[10]; char a[20]; float g[5];
การอ้างถึงสมาชิก • รูปแบบชื่อตัวแปร[ตำแหน่งของข้อมูลหรือดรรชณี] โดย ชื่อตัวแปรเป็นตัวแปรที่ประกาศเป็นแถวลำดับ ตำแหน่งของข้อมูล โดยเริ่มที่ตำแหน่งที่ 0 1 2 ...แต่ต้องไม่เกินหรือเท่ากับจำนวนที่ประกาศไว้ ตัวอย่าง int n[5]; n[0] = 0; n[4] = 4;// จะไม่สามารถอ้างถึง n[5] ได้
การใช้งานอาร์เรย์ 1. การประกาศตัวแปร โดยระบุชื่อตัวแปรพร้อมจำนวนข้อมูลที่สามารถเก็บได้สูงสุด int number[10];// number คือซื่อตัวแปร 10 คือจำนวนตำแหน่งเก็บข้อมูล 2. การกำหนดค่าเริ่มต้นให้กับตัวแปรอาร์เรย์ for (i = 0; i < 10; i++) number[i]=0;// 0.0 ถ้าเป็น float หรือ double 3. การใส่คำข้อมูลลงในอาร์เรย์ (สามารถรับค่ามาจาก file หรือจากฟังก์ชันสุ่มค่า) for (i = 0; i < 10; i++) scanf(“%d”,&number[i]);// รับค่าผ่านแป้นพิมพ์
ตัวอย่าง • ตัวอย่าง 5.4 โปรแกรมอ่านข้อมูลเป็นจำนวนเต็ม 10 จำนวน แล้วหาผลรวมของเลขเหล่านั้น int num[10]; • ตัวอย่าง 5.5 โปรแกรมอ่านข้อมูลจำนวนจริง 50 จำนวน หาค่าเฉลี่ย และจำนวนข้อมูลที่มีค่าสูงกว่าค่าเฉลี่ย • ตัวอย่าง 5.7 โปรแกรมอ่านข้อมูลเข้าเป็นคะแนนสอบ ซึ่งเป็นจำนวนจริงแล้วเก็บไว้ในตัวแปรแถวลำดับ score[] อ่านจนกว่าข้อมูลเข้าจะมีค่าน้อยกว่าศูนย์ แล้วพิมพ์จำนวนนักเรียนที่เข้าสอบทั้งหมด ซึ่งมีได้ไม่เกิน 500 คน
ตัวอย่างที่ 5.4 int num[10]; for(i=0;i<10;i++) scanf(“%d”, &num[i]); sum=0; for(i=0;i<10;i++) sum = sum + num[i]; printf(“sum is %d\n”, sum); int suma(int a[], int n) { int sum = a[n]; for(;n>=0;--n) sum = sum + a[n]; return sum; }
ตัวอย่างที่ 5.5 avg = sum/n; k=0; for(i = 0; i < n; i++) if(list[i] > avg) k = k + 1; printf(“number above average is %d”,k);
ตัวแปรแถวลำดับแบบ String • การเก็บข้อมูลแบบสายอักขระ (String) สามารถเก็บเป็นตัวแปรชนิดอาร์เรย์ของชนิดข้อมูลแบบตัวอักษร (char) ที่มีขนาด 1 ไบต์ หรือ 1 ตัวอักษร และปิดท้ายชุดข้อมูลด้วยตัวอักษรพิเศษ ‘\0’ เพื่อบอกจุดสิ้นสุดของสายอักขระ • ตัวอย่าง สายอักขระคำว่า ‘string’ ที่เก็บในหน่วยความจำ ตำแหน่ง ข้อมูล
การประกาศตัวแปรสายอักขระการประกาศตัวแปรสายอักขระ • รูปแบบ char ชื่อตัวแปรลำดับ[n]; • n คือจำนวนตัวอักษรที่ตัวแปรสามารถเก็บได้สูงสุด ส่วนการรับค่าผ่าน scanf() และ แสดงผลผ่าน printf() ให้ใช้ %s ตัวอย่าง char msg[6]; scanf(“%s”,msg); printf(“%s”, msg);
ตัวแปรแถวลำดับสองมิติตัวแปรแถวลำดับสองมิติ • เป็นตัวแปรที่สามารถเก็บข้อมูลได้มากขึ้น โดยเหมาะสำหรับข้อมูลที่สามารถจัดรูปแบบในลักษณะตารางข้อมูล ดังนั้นจึงมีตัวบอกตำแหน่งแถว และตำแหน่งสดมภ์กำกับ การประกาศ ชนิดข้อมูล ชื่อตัวแปร[nrow][ncol]; โดย nrow เป็นจำนวนแถวทั้งหมด ncol เป็นจำนวนสดมภ์ทั้งหมด และ nrow*ncol เป็นจำนวนข้อมูลที่เป็นไปได้ทั้งหมด
ตัวอย่าง อาร์เรย์สองมิติ • float a[3][5]; • เป็นการประกาศตัวแปร a แบบ float ที่มีขนาดข้อมูลเป็นตาราง 3*5 ซึ่งสามารถเก็บข้อมูลสุงสุดได้ 15 ตัว column row
แบบฝึกหัด อาร์เรย์สองมิติ • ตัวอย่าง 5.14 ให้อ่านข้อมูลจำนวนเต็มเก็บไว้ในตัวแปร b[][] ที่มีการจองเนื้อที่ 5 แถว 4 สดมภ์แล้วหาผลรวมของข้อมูลทั้งหมด • ตัวอย่าง 5.15 ให้อ่านคะแนนสอบ 5 ครั้ง ของนักเรียน 10 คน หลังจากนั้นให้หาคะแนนรวมของการสอบทุกครั้งของแต่ละคน แล้วแสดงผล
แบบฝึกหัด อาร์เรย์สองมิติ • ตัวอย่าง 5.16 ให้เขียนโปรแกรมการสำรวจจำนวนคนในแต่ละช่วงอายุของบ้าน 6 หลัง ซึ่งให้แสดงผลดังนี้ ช่วงอายุ 0-5 6-12 13-19 20 ขึ้นไป หลังที่1 - - - - หลังที่2 - - - - . หลังที่6 - - - - รวม - - - -
การบ้าน ข้อ 1 - จงเขียนโปรแกรมที่สามารถรับข้อมูลนำเข้าที่เป็นตัวเลขได้ไม่เกิน 5 จำนวน เพื่อคำนวณหาค่าเฉลี่ย ค่าสูงสุด ค่าต่ำสุด ของข้อมูลนำเข้านั้น โดยเก็บข้อมูลไว้ในแถวลำดับ
กำหนดให้ผลจากการรวมอักขระสองตัวเป็นไปตามตาราง ให้เขียนโปรแกรมเพื่อหาผลรวมของสองข้อความดังต่อไปนี้ ข้อ 1 ข้อความที่1: ABCABCABCABCAB ข้อความที่2: ATTACK_AT_DAWN ผล BVWBENACWAFDXP ข้อ 2 ข้อความที่1: SHINESHINES ข้อความที่2: HOW_ARE_YOU ผล AWFNFKMIMTN
ตัวแปรแถวลำดับสามมิติตัวแปรแถวลำดับสามมิติ • เป็นตัวแปรที่สามารถเก็บข้อมูลเป็นชุด โดยเหมาะสำหรับข้อมูลที่สามารถจัดรูปแบบในลักษณะหลายตารางข้อมูล ดังนั้นจึงมีตัวบอก ตำหแหน่งตาราง ตำแหน่งแถว และตำแหน่งสดมภ์กำกับ การประกาศ ชนิดข้อมูล ชื่อตัวแปร[ntab][nrow][ncol]; โดย ntab เป็นจำนวนตารางทั้งหมด nrow เป็นจำนวนแถวทั้งหมด ncol เป็นจำนวนสดมภ์ทั้งหมด และ ntab*nrow*ncol เป็นจำนวนข้อมูลที่เป็นไปได้ทั้งหมด
int t[2][3][4]; เป็นการประกาศตัวแปรแถวลำดับ t ที่มีจำนวน 2 ตาราง และแต่ละตารางมีขนาด 3 แถว 4 สดมภ์ โดยมีตำแหน่งอ้างอิงข้อมูลดังนี้
แบบฝึกหัด อาร์เรย์สามมิติ • ตัวอย่าง 5.18 เขียนโปรแกรมเพื่ออ่านข้อมูลชนิดจำนวนเต็ม แล้วเก็บไว้ในตัวแปร tab[][][] แล้วหาผลรวมของข้อมูลในแถวลำดับทั้งหมด
การกำหนดค่าเริ่มต้นแก่แถวลำดับการกำหนดค่าเริ่มต้นแก่แถวลำดับ • การกำหนดค่าเริ่มต้นให้กับแถวลำดับ สามารถทำได้หลายวิธี ซึ่งขึ้นอยู่กับวัตถุประสงค์ ได้แก่ การกำหนดค่าเริ่มต้นเมื่อประกาศตัวแปร การกำหนดค่าเริ่มต้นโดยอ่านข้อมูลจากแฟ้ม หรือการกำหนดค่าเริ่มด้วยผ่านแป้นพิมพ์ รูปแบบการกำหนดค่าผ่านการประกาศตัวแปร ชนิดข้อมูล ชื่อตัวแปร[][].. = {{ค่าเริ่มต้น},{ค่าเริ่มต้น},..}; หมายเหตุ ค่าเริ่มต้นแต่ละตัวขั้นด้วย , และค่าเริ่มอาจจะมีน้อยกว่าจำนวนของข้อมูลในตัวแปรแถวลำดับก็ได้
ตัวอย่าง • int num[10] = {0,1,2,3,4,5,6,7,8,9}; ดังนั้น num[0] มีค่า 0 num[1] มีค่า 1 num[2] มีค่า 2 num[3] มีค่า 3 num[4] มีค่า 4 num[5] มีค่า 5 ... • int num[10] = {0,1,2,3}; ดังนั้น num[0] มีค่า 0 num[1] มีค่า 1 num[2] มีค่า 2 num[3] มีค่า 3 num[4] มีค่า 0 num[5] มีค่า 0 ...
ตัวอย่าง ให้เขียนโปรแกรมเพื่อกำหนดค่าเริ่มต้นให้กับตัวแปรแถวลำดับ แล้วให้แสดงผลออกทางหน้าจอ 1. char fname[10] = {‘s’,’w’,’e’,’e’,’t’,’\0’}; char last[10] = “Honey”; char paint[2][5] = {“red”, “pink”}; 2. int guess[] = {1,2,5,7,9}; //ตำแหน่ง 0-9 int emp[3][5] = {{10,20,30,40,50}, // แถว 0 {11,21,31,41,51}, // แถว 1 {12,22,32,42,52}}; // แถว 2
ฟังก์ชันเพื่อทำงานกับสายอักขระฟังก์ชันเพื่อทำงานกับสายอักขระ • ฟังก์ชันของภาษาซีที่ใช้กับตัวแปรแบบสายอักขระจะอยู่ใน string.h ดังนั้นเมื่อต้องถูกเรียกใช้งานเราต้องประกาศการเรียกใช้ฟังก์ชันเหล่านี้ โดย #include <string.h> ตัวอย่าง strcat(), strcmp(), strcpy(), strlen()
strcat() • strcat() – ใช้สำหรับนำสายอักขระ 2 สายมีต่อกัน รูปแบบstrcat(สายอักขระ1, สายอักขระ2); โดยที่ สายอักขระ1 ตัวแปรแถวลำดับแรก และเป็นที่เก็บผลลัพธ์ สายอักขระ2 ตัวแปรที่สองที่นำมาต่อ ตัวอย่าง char str1[21]=“What school do ”; char str2[] = “you go to?”; strcat(str1, str2); // str1 “What school do you go to?”
strcmp() • strcmp() – ใช้เปรียบเทียบสายอักขระ 2 สาย ว่าเท่ากัน หรือไม่เท่ากัน โดยถ้าสายอักขระ 2 สายเท่ากัน จะให้ผลเป็น 0 ถ้าสายอักขระแรกมากกว่า จะให้ผลมากกว่า 0 และถ้าสายอักขระแรกน้อยกว่า จะให้ผลเป็นลบ รูปแบบ strcmp(str1, str2); ตัวอย่าง char str1 = “name1”; strcmp(str1, “name2”); // -1 strcmp(str1, “name1); // 0
strcpy() • strcpy() – ใช้คัดลอกสายอักขระไปสู่ตัวแปร รูปแบบstrcpy(สายอักขระปลายทาง, สายอักขระต้นทาง); โดย สายอักขระปลายทาง คือ ตัวแปรแถวลำดับเพื่อเก็บผลลัพธ์ สายอักขระต้นทาง เป็นข้อมูลที่ต้องการคัดลอก ตัวอย่าง char str[20]; strcpy(str, “What’s your name?”); // str What’s your name?
strlen() • strlen() – ใช้นับจำนวนอักขระทั้งหมดในสายอักขระ • รูปแบบstrlen(str); ตัวอย่าง char str[10] = “01234”; strlen(str); // 5 strlen(“”); // 0
แบบฝึกหัด ให้เขียนโปรแกรมเพื่อ 1. หาความยาวของสายอักขระ แล้วต่อสายอักขระ 2 สายแล้วหาความยาวของสายอักขระใหม่ 2. เปรียบเทียบสายอักขระ 2 สาย แล้วทำสำเนาสายอักขระ และเปรียบเทียบอีกครั้ง ข้อมูลนำเข้าคือ สายอักขระ 2 สาย ให้แสดงผลความยาวของสายอักขระ และผลของการเปรียบเทียบ
การบ้าน 1. ให้เขียนโปรแกรมเพื่อแปลงสายอักขระโรมันเป็นเลขฐาน 10 โดยสัญลักษณ์ที่ใช้แทนเลขโรมัน มีดังนี้ เลขโรมัน เลขฐาน 10เลขโรมัน เลขฐาน 10 I 1 II 2 V 5 III 3 X 10 XXX 30 L 50 XL 40 C 100 CL 150 D 500 DX 510 M 1000 CMXC 990
การบ้าน 2. ในการหาความเหมือนของ 2 สายอักขระใดๆ มีเกณฑ์การให้คะแนนดังนี้ ถ้าตัวอักขระเหมือนกัน 5 คะแนน, ไม่เหมือนกัน -4 คะแนน, ถ้าความยาวของสายอักขระไม่เท่ากัน แล้วต้องเลื่อนตำแหน่งทำให้เกิดช่องว่าง -7 คะแนน ตัวอย่าง m=“GAAGGCA” n=“GCAGAGCA” ดังนั้น คะแนนความเหมือนกัน 5(4)55(7) 555=19 Sequence m: G A A G G C A Sequence n: G C A G A G C A
ข้อมูลที่แสดง The query string: ACGGG The most similar strings are: ACGGGG The similarity score is: 18 ข้อมูลนำเข้าคือ 1 query string ต่อ หลาย data string >query ACGGG >seq1 ACGGT >seq2 ACGGGG >seq3 TCCGGTT
สรุป • ต้องฝึกฝนการใช้เขียนโปรแกรมโดยใช้ • 1. แถวลำดับ 1, 2, และ 3 มิติ • 2. การใช้ loop for, while, etc. • 3. การใช้ตัวแปรสายอักขระ และ function ที่ใช้กับ string • boonsup@kku.ac.th • Waikham@msn.com