วันอังคารที่ 17 มีนาคม พ.ศ. 2552

เรื่อง set and string

เนื้อหา
- โครงสร้างข้อมูลแบบเซต
- โครงสร้างข้อมูลแบบสตริง
โครงสร้างข้อมูลแบบเซตเป็นโครงสร้างข้อมูลที่ข้อมูลแตละตัวไม่มีความสัมพันธ์กันในภาษาซีจะไม่มีประเภทข้อมูลแบบเซตนี้เหมือนกับในภาษาปาสคาล แต่สามารถใช้หลักการของการดำเนินงาน แบบเซตมาใช้ได้ตัวดำเนินการของเซต (Set operators) ประกอบด้วย
- set intersection
- set union
- set difference เป็นต้น

โครงสร้างข้อมูลแบบสตริงสตริง(String)หรือ สตริงของอักขระ (CharacterString)เป็นข้อมูลที่ประกอบไปด้วย ตัวอักษร ตัวเลขหรอ เครื่องหมายเรียงติดต่อกันไป รวมทั้งช่องว่างการประยุกต์ใช้คอมพิวเตอร์ที่เกี่ยวกับข้อมูลที่เป็นสตริงมีการนำไปใช้สร้างโปรแกรมประเภทบรรณาธิการข้อความ(text editor) หรือโปรแกรมประเภทประมวลผลคำ (word processing) ซึ่งมีการทำงานที่อำนวยความสะดวกหลายอย่าง เช่น การตรวจสอบข้อความ การจดแนวข้อความในแต่ละย่อหน้าและการค้นหาค่า เป็นต้น

สตริงกับอะเรย์สตริง คือ อะเรย์ของอักขระ เช่น char a[6] อาจจะเป็นอะเรย์ขนาด 6 ช่องอักขระ หรือ เป็นสตริงขนาด 5 อักขระก็ได้ โดยจุดสิ้นสุดของ string จะจบดวย \0 หรือ null character เช่น
char a[ ]={‘H’, ‘E’, ‘L’, ‘L’, ‘O’, ‘\0’};
char a[ ]=“HELLO”;

ความยาวของสตริงจะถูกกำหนดโดยขนาดของสตริง การกำหนดขนาดของสตริง นั้นต้องจองเนื้อที่ในหน่วยความจำให้กับ \0ด้วยเช่น “This is String !” จะเป็นข้อมูลแบบสตริงยาว 16 อักขระ

การกำหนดสตริงการกำหนดสตริงทำได้หลายแบบ คือ
1. กำหนดเป็นสตริงที่มีค่าคงตัว(String Constants)
2. กำหนดโดยใช้ตัวแปรอะเรย์หรือพอยเตอร์

การกำหนดค่าคงตัวสตริงสามารถกำหนดได้ทั้งนอกและในฟังกชั่น เมื่อกำหนดไว้นอกฟังกชั่น ชื่อค่าคงตัวจะเป็นพอยเตอร์ชี้ไปยังหน่วยความจำที่เก็บสตริงนั้นเมื่อกำหนดไว้ในฟังกชั่นจะเป็นพอยเตอร์ไปยังหน่วยความจำที่เก็บตัวมันเองการกำหนดค่าให้กับสตริงนั้น เราจะใช้เครื่องหมาย doublequote (“ ”) เช่น “abc” คือ ชุดของอักขระที่มีขนาด 4 (รวม \0 ด้วย)

ข้อสังเกต
string constant are different from characterconstant
#define NME “Semi”
main ( ){char *cpntr;
cpntr=NME;
printf(“con\n”);
printf(“%s, %u, %c\n”, “con”, “duc”,*“tor”);
printf(““%s, %u, %c\n”, NME, NME,*NME);
printf(““%s, %u, %c\n”, cpntr, cpntr,*cpntr);
}
ผลการรันโปรแกรม
con
con, 37, t
Semi, 16, S
Semi, 16, S


จากตัวอย่าง กำหนดค่าคงตัว NME ขึ้น โดยให้มีค่าเป็น Semi ทำให้ MNE เป็นพอยเตอร์ชี้ไปที่ข้อมูล Semi จากคำสั่ง printf(“con\n”);คำว่า conจะอยู่ในฐานะข้อมูล แต่จากคำสั่ง printf(“%s, %u, %c\n”, “con”, “duc”, *“tor”); ค่าคงตัว con duc และ tor จะอยู่ในฐานะพอยเตอร์เพราะรูปแบบการพิมพ์ของ printf( ) ได้กำหนดไว้ว่าถ้าให้พิมพ์สตริงจะต้องผ่านค่าพอยเตอร์
การกำหนดค่าคงตัวสตริงให้แก่ตัวแปรพอยตเตอร์ และอะเรย์สามารถกำหนดค่าคงตัวสตริงให้พอยเตอร์ หรืออะเรย์ได้ในฐานะค่าเริ่มต้น เช่น
main ( ) {
char ary[ ] = “This is the house. ”;
char *cpntr=“This is the door.”;
printf(“%s %s”,ary,cpntr);
}

ผลการรันโปรแกรมThis is the house. This is the door. จะเห็นได้ว่าการใช้งานดูไม่แตกต่างกันแต่ aryเป็นตัวแปรอะเรย์ ค่าที่ให้จะต้องเป็นค่าข้อมูลในอะเรย์ ส่วน cpntrเป็นพอยเตอร์ ค่าที่ให้นั้นไม่ใช่ค่าข้อมูล แต่ เป็นค่าแอดเดรสเริ่มต้นของสตริง (ค่าคงตัวสตริงเป็นทั้ง ข้อมูลสตริงและพอยเตอร์)นอกจากนี้ยังสามารถเพิ่มลดค่าตัวแปรพอยเตอร์ได้ แต่สาหรับอะเรย์ทำไม่ได้ เช่น
while (*cpntr !=‘\0’)
putch(*cpntr++);
เป็นการให้พิมพ์ข้อความ This is the door ทีละอักขระ จนกว่าจะสุดสตริง คือ เมื่อ *cpntr มีค่าเป็น null character

การกำหนดตัวแปรสตริงในการกำหนดตัวแปรของสตริง อาศัยหลักการของอะเรย์ เพราะ สตริงก็คืออะเรย์ของอักขระที่ปิดท้าย ด้วย null character (\0) และมีฟังกชั่นพิเศษสำหรับ ทำงานกับสตริงโดยเฉพาะ เช่น ต้องการสตริงสำหรับเก็บชื่อบุคคลยาวไม่เกิน 30 อักขระ ต้องกำหนดเป็นอะเรย์ขนาด 31 ช่อง เพื่อเก็บ null character อีก 1 ช่อง

main ( ) {
char name[31];
printf(“Hi, What’s your name?\n”);
gets(name);
printf(“Nice to meet you, %s\n”);
}

ผลการรันโปรแกรม
Hi, What’s your name?
Jame Smith
Nice to meet you, Jame Smith

ในการกำหนดตัวแปร name เท่ากับเป็นการกำหนดอะเรย์ ขนาด 31 ช่อง ซึ่งเครื่องจะจองเนื้อที่ใน หน่วยความจำไว้ 31 ไบต์ และให้ตัวแปร name ชี้ไปที่ ต้นอะเรย์นี้ในการกำหนดตัวแปร name กำหนดไว้ว่า ชิ่อจะต้องยาวไมเกิน 30 อักขระ หากผู้ใช้ป้อนไม่ถึง 30อักขระ เครื่องจะทำการเติมnull characterให้จนครบ 31 ช่อง แต่ถ้าผู้ใช้ป้อนเกินจะเกิดข้อผิดพลาดหลุดจาก โปรแกรมนี้ เพราะฉะนั้นจึงต้องกำหนดความยาวของสตริงให้เพียงพอ

ฟังกชั่น gets( )เป็นฟังกชั่นที่อ่านค่าจากแป้นพิมพ์มาเก็บไว้ในหน่วยความจำ ซึ่งก็คืออะเรย์ที่ตัว แปร name ชี้อยู่ รวมทั้งช่องว่าง จนกว่าผู้ใช้จะกดEnter จะเติม null characterให้หากใช้ scanf( )จะถือว่า Jame เป็นค่าหนึ่งและ Smith เป็นอีกค่าหนึ่ง เพราะมีช่องว่างคน และไม่ เติม null character นั้นคือจะได้อะเรย์ที่มีค่าเป็น Jameไม่ใช่ String ที่มีค่าเป็น Jame Smith

อะเรย์ของสตริง
ถ้าหากมีสตริงจำนวนมาก ก็ควรจะทำ ให้เป็นอะเรย์ของสตริง เพื่อที่จะเขียน โปรแกรมได้สะดวก การสร้างอะเรย์ของ สตริง สามารถสร้างได้ทั้งแบบที่ให้ค่าเริ่มต้น และแบบที่กำหนดเป็นตัวแปร
อะเรย์ของสตริงที่ยาวไม่เท่ากันทำได้เฉพาะเมื่อมีการกำหนดค่าเริ่มต้นเท่านั้น ผลการ

รันโปรแกรม
Thailand
United State of America
England
Indonesia

การกำหนดตัวแปร country จะแตกต่างกับการกำหนดตัวแปรอะเรย์ เพราะเป็นการกำหนดตัวแปรพอยเตอรขึ้น 4 ตัว โดยให้แต่ละตัวชี้ไปยังค่าคงตัวสตริงทั้ง 4 ตัวโดยที่ contry[0] จะชี้ไปที่ข้อมูลแรก contry[1] จะชี้ข้อมูลที่สอง contry[2] จะชี้ข้อมูลที่สาม และcontry[3]จะชี้ข้อมูลตัวสุดท้ายในการเขียนค่าเริ่มต้น คือ ค่าคงตัวสตริง เขียนไว้ในเครื่องหมายวงเล็บปีกกา และข้อมูลในเครื่องหมายคำพูด คือ ค่าคงตัวสตริง
ฟังกชั่น puts( )ใช้ในการพิมพ์สตริงออกทางจอภาพ โดยการผ่านค่าแอดเดรสของสตริงไปให้เท่านั้น

ข้อสังเกตการกำหนดอะเรย์ของสตริงในลักษณะอย่างนี้ไม่ใช่อะเรย์ที่แท้จริงตามหลักการของอะเรย์เนื่องจาก ขนาดของช่องในอะเรย์ไม่เท่ากัน แต่อนุโลมให้ถือว่า เป็นอะเรย์อะเรย์ของสตริงที่ยาวเท่ากันอะเรย์ในลักษณะนี้จะถือว่าเป็นอะเรย์ที่แท้จริงและสามารถกำหนดได้ทั้งเมื่อมีการให้ค่าเริ่มต้น และเมื่อ กาหนดเป็นตัวแปร โดยดำเนินการตามแบบการกำหนดอะเรย์ 2 มิติ เช่น
char fruit [3][7]={“Apple”, “Orange”, “Mango”}; กาหนดตัวแปร fruit เป็นแบบ 3 แถว 7 คอลัมน์ ใน แต่ละช่องจะเก็บข้อมูลแบบอักขระอะเรย์ของสตริงที่ยาวเท่ากันอะเรย์ในลักษณะนี้จะถือว่าเป็นอะเรย์ ที่แท้จริง และสามารถกำหนดได้ทั้งเมื่อมี การให้ค่าเริ่มต้น และเมื่อกำหนดเป็นตัวแปร โดยดำเนินการตามแบบการกำหนดอะเรย์ 2 มิติการกำหนดตัวแปรในลักษณะนี้ จะแตกต่างจากการกำหนดตัวแปรแบบความ ยาวไม่เท่ากัน คือ ในแบบความยาวไม่เท่ากัน ท้ายของ สตริงจะเครื่องจะเติม null character ให้เพียงตัวเดียว แต่ในแบบความยาวเท่ากัน จะเติม null character ให้ จนครบทุกช่อง
char fruit[3]= {“Apple”, “Orange”, “Mango”};

char fruit[3][7]= {“Apple”, “Orange”, “Mango”};
การดำเนินการเกี่ยวกับสตริงในการดำเนินการเกี่ยวกับสตริงจะมีฟังกชั่นที่อยู่ในแฟ้มข้อมูล stdio.hเก็บอยู่ใน C Library อยู่แล้วสามารถนำมาใช้ได้ โดยการใช้คำสั่ง #include ในการเรียกใช้ เช่น
- ฟังก์ชั่น strlen(str) ใช้หาความยาวของสตริง
- ฟังกชั่น strcpy (str1,str2) ใช้คัดลอกข้อมูล จาก string หนึ่งไปยังอีก string หนึ่ง
- ฟังกชั่น strcat(str1,str2)ใช้เชื่อมต่อข้อความ2 ข้อความเข้าด้วยกัน
- ฟังกชั่น strcmp(str1,str2 )ใช้เปรียบเทียบข้อความ 2 ข้อความว่ามีคีาเท่ากันหรือไม่ ถือหลักการ เปรียบเทียบแบบพจนานุกรม เช่น abcda จะมีค่าน้อย กว่า abcde และ abcdf จะมีค่ามากกว่า abcde ค่าที่ เท่ากัน คือ ค่าที่เหมือนกัน เช่น abcd กับ abcd สำหรับ อักษรตัวเล็กตัวใหญ่ จะถือว่าอักษรตัวใหญ่มีค่าน้อยกว่า อักษรตัวเล็ก ตามลำดับรหัส ASCII
แบบฝึกหัด
1.การกำหนดค่าตัวแปรแบบ Set มีประโยชน์อย่างไร ให้นักศึกษาอธิบายการทำงานที่เกี่ยวข้อง
2.การกำหนดค่าตัวแปรสตริงสามารถกำหนดอย่างไรได้บ้าง ให้นักศึกษากำหนดตัวแปรชนิดสตริงเพื่อจัดเก็บข้อมูลตามประเภทที่เป็น รายละเอียด เช่น ที่อยู่ ชื่อ
3.ให้นกัศึกษาลองเขียนโปรแกรม ภาษาซี เพิ่อกำหนด การใช้ฟังกชั่นstrlen(), strcmp(), strcat(), strcopy()

1 ความคิดเห็น: