บทที่ 9 เซต (Set) เซต หมายถึงกลุ่ม ฝูง พวก ชุด ของสิ่งใดสิ่งหนึ่ง เช่น เพศ ประกอบด้วย หญิง และ ชาย รายการที่อยู่ในเซต เรียกว่าสมาชิก เซตย่อย (Subset) คือ เซตย่อยที่อยู่ภายในเซตนั้น เช่น ทารกเพศชาย หรือ ทารกเพศหญิง เป็น เซตย่อยของเพศ
เซต (Set) ปาสคาล สามารถประมวลผลเรื่องเซต ได้ เช่น if ((age >= 15) and (age <= 25)) or ((age>=60) and (age <=70)) then…. สามารถเขียนให้สั้นง่ายได้ดังนี้ if age in [12..25],[60..70] then…..
สมาชิกเซต สมาชิกของเซต จะเขียนอยู่ในเครื่องหมาย [ ] [] หมายถึงไม่มีสมาชิก [1,2,10] หมายถึงมีสมาชิก 1, 2 และ 10 [1..10] หมายถึงมีสมาชิก 1 ถึง 10 [‘a’..’z’] หมายถึงมีสมาชิก a,b,c จนถึง z [1..10,30..50] หมายถึงมีสมาชิกเป็น integer 1ถึง10 และ 30ถึง50
สมาชิกเซต [mon,tue,wed,thu,fri] หมายถึงมีสมาชิกเป็นวันตั้งแต่จันทร์ถึงศุกร์ อาจเขียน [mon..fri] ลำดับที่ และ จำนวนครั้งของสมาชิกไม่มีความแตกต่าง เช่น [1,2,3] หรือ [2,1,2,3] มีความหมายเหมือนกัน ในหนึ่งเซตมีจำนวนสมาชิกไม่เกิน 256 รายการ
วิธีกำหนดข้อมูลให้กับเซต การกำหนดใช้คำสั่ง Set of มีรูปแบบดังนี้ TYPE ชื่อเซต = SET OF base type base type หมายถึงข้อมูลที่มีลำดับ
วิธีกำหนดข้อมูลให้กับเซต Type dayofmonth = set of 1..31; Capletter = set of ‘A’..’Z’; primarycolor = set of (red,bule,green); day=(mon,tue,wed,thu,fri,sat,sun); week = set of day; ความหมาย 1 เดือนมีวัน 1 ถึง 30 วัน เซตตัวอักษรมี A ถึง Z เซตแม่สีมี สีแดง เขียว น้ำเงิน กำหนดเซตค่าจาก Enumerate
การประกาศเซต การประกาศเซต อาจกำหนดแบบค่าคงที่ภายใต้ CONST หรือ ตัวแปรภายใต้ TYPE เช่น Type digits = set of 0..9; var num : digit ; หรือ CONST odddigits := digits= [1,3,5,7,9]; evenditits:= digits= [2,4,6,8];
เซตแบบ Constant การกำหนดสระ TYPE LETTER = SET OF ‘A’..’Z’; CONST VOWEL : LETTER = [‘A’,’E’,’I’,’O’,’U’]; การกำหนดเลขฐาน 16 CONST HEX : SET OF ‘0’..’Z’ =[‘0’..’9’,’A’..’F’,’a’..’f’];
เซตแบบ Variable VOWEL := [‘A’,’E’,’I’,’O’,’U’]; TYPE LETTER = SET OF ‘A’..’Z’; VAR VOWEL,CONSONANTS : LETTER; BEGIN VOWEL := [‘A’,’E’,’I’,’O’,’U’]; CONSONANTS := LETTER - VOWEL;
WEEKEND := [SUN,SAT]; TYPE day=(mon,tue,wed,thu,fri,sat,sun); VAR WORKDAY,WEEKEND: DAY; BEGIN WEEKEND := [SUN,SAT]; WORKDAY := DAY - WEEKEND;
โอเปอเรชันของเซต Union Intersection Difference
Difference Union เป็นการรวม 2 เซต(+)เข้าด้วยกันโดยเซตใหม่ มีจำนวนสมาชิกของทั้ง 2 เซต เช่น set [‘a’,’b’] + set [‘c’,’g’,’m’] จะได้ [‘a’,’b’ ,‘c’,’g’,’m’]
Difference Difference เป็นการหาผลต่าง (-)ระหว่างเซต 2 เซต โดยผลลัพธ์จะเป็นสมาชิกของเซตด้านซ้าย ที่ไม่อยู่ ในเซตด้านขวามือ เช่น [‘b’…’j’] - [‘e’,’g’..’y’] จะได้ [‘b’..’d’,’f’]
Intersection Intersection เป็นการสร้างเซตใหม่ที่รวม( *) เอาสมาชิกที่เหมือนกันทั้ง 2 เซตเข้าด้วยกัน เช่น [2..7,10,12] * [1..5,11..6] จะได้ [2..5,12]
Relation Relation ความสัมพันธ์อันเกิดจากการเปรียบเทียบของเซต มีคำตอบเป็น จริงกับเท็จ มี 5 แบบคือ เซตเท่ากัน (Equality) เซตไม่เท่ากัน (Inequality) ซับเซต (Subset) ซูเปอร์เซต(Superset) เป็นสมาชิกของเซต (Set member)
เซตเท่ากัน (Equality) [1,4] = [1,4] ผลลัพธ์เป็น true [1,4] = [2,4] ผลลัพธ์เป็น false [4,1] = [1,4] ผลลัพธ์เป็น true [] = [0] ผลลัพธ์เป็น false
เซตไม่เท่ากัน (Inequality) [1,4] <> [1,4] ผลลัพธ์เป็น false [1,4] <> [2,4] ผลลัพธ์เป็น ture [4,1] <> [1,4] ผลลัพธ์เป็น false [] <> [0] ผลลัพธ์เป็น ture
ซับเซต (Subset) ซับเซต (Subset) ใช้เครื่องหมาย <= ถ้าสมาชิกทุกตัวของเซตซ้ายมือ เป็นสมาชิกใน เซตขวามือ ผลลัพธ์เป็นจริง [1,3] <= [1,3] ผลลัพธ์เป็น true [1,3] <= [1..5] ผลลัพธ์เป็น true [‘a’,’p’] <= [‘a’,’q’..’z’] ผลลัพธ์เป็น false [1,2,3,4] <= [1,4] ผลลัพธ์เป็น false
ซูเปอร์เซต(Superset) ถ้าสมาชิกทุกตัวของเซตขวามือเป็นสมาชิกในเซตซ้ายมือ ผลลัพธ์เป็นจริง [1,3] >= [1,3] ผลลัพธ์เป็น true [1,3] >= [1..5] ผลลัพธ์เป็น false [‘a’,’p’] >= [‘a’,’q’..’z’] ผลลัพธ์เป็น false [1,2,3,4] >= [1,4] ผลลัพธ์เป็น ture
เป็นสมาชิกของเซต (Set member) เป็นสมาชิกของเซต (Set member) ใช้เครื่องหมาย IN ค่าทางซ้ายของ IN เป็นสมาชิกของเซตขาวมือ ผลลัพธ์เป็นจริง A IN [‘A’..’Z’] ผลลัพธ์เป็น true Z IN [‘A’..’N’] ผลลัพธ์เป็น false 5 IN [15..30] ผลลัพธ์เป็น false 10 IN [1..17] ผลลัพธ์เป็น true
การใช้เซตในโปรแกรม โปรแกรม 1. ( a=w) and (b=w) and (c=w) 2. ( a=w) or (b=w) or (c=w) 3. if ((age >= 15) and (age <= 25)) or ((age>=60) and (age <=70)) then…. การใช้เซต [a,b,c] = [w] w in [a,b,c] if age in [12..25],[60..70] then…..
การใช้เซตในโปรแกรม Read (choice); CASE choice OF ‘1’ : add; if choice in [1,2,3,4] then CASE choice OF ‘1’ : add; ‘2’ : delete; ‘3’ : update; ‘4’: exit; end; Read (choice); CASE choice OF ‘1’ : add; ‘2’ : delete; ‘3’ : update; ‘4’: exit; end;
การรับและแสดงค่าในเซต ไม่สามารถใช้คำสั่ง Read หรือ Write ได้โดยตรง เช่น var letter : set of ‘a’..’z’; write(letter); read(letter); ไม่ได้ ต้องอาศัยคำสั่ง IF หรือ Case
การรับและแสดงค่าตัวเลขในเซต โปรแกรมทำการเก็บเลขคู่ และ เลขคี่เข้าไว้ในเซต พร้อมทำการพิมพ์ค่า program setget1; uses wincrt; const max = 30; type numset = set of 1..max; var odd,even: numset; i : integer;
การรับและแสดงค่าตัวเลขในเซต begin odd := []; even := []; for i:= 1 to max do if i mod 2 > 0 then even := even + [i] {letter := [1..max] - odd;} else odd := odd + [i] end;
การรับและแสดงค่าตัวเลขในเซต writeln('***** ODD number ********'); for i:= 1 to max do if i in odd then write(i,' '); writeln; writeln('*********even number ********'); for i:= 1 to max do if i in even then write(i,' '); end.
การรับและแสดงค่าตัวอักษรในเซต โปรแกรมทำการเก็บสระ และ พยานชนะเข้าไว้ในเซต พร้อมทำการพิมพ์ค่า program setget2; uses wincrt; type letterset = set of 'a'..'z'; var letter, vowels:letterset; i : char; begin vowels := []; for i:= 'a' to 'z' do
การรับและแสดงค่าตัวอักษรในเซต begin if i= 'a' then vowels := vowels +[i]; if i= 'e' then vowels := vowels +[i]; if i= 'i' then vowels := vowels +[i]; if i= 'o' then vowels := vowels +[i]; if i= 'u' then vowels := vowels +[i]; end; for i:= 'a' to 'z' do if i in vowels then write(i,' '); writeln; letter := ['a'..'z'] - vowels; if i in letter then write(i,' '); end.
การรับและแสดงค่าตัวอักษรในเซต for i:= 'a' to 'z' do if i in vowels then write(i,' '); writeln; letter := ['a'..'z'] - vowels; if i in letter then write(i,' '); end.
การรับและแสดงค่าตัวอักษรในเซต โปรแกรมนับจำนวนตัวอักษรที่รับจากแป้นพิมพ์ และแยกว่าเป็นสระ พยานชนะ และ อักขระอื่นๆ พิมพ์จำนวนที่นับได้
การรับและแสดงค่าตัวอักษรในเซต program sets3; uses wincrt; type letterset = set of 'A'..'Z'; var vowels,letter,l: letterset; count_v,count_letter,count_wrong : integer; ch,i:char;
การรับและแสดงค่าตัวอักษรในเซต begin count_v := 0; count_letter:= 0; count_wrong := 0; vowels := ['A','E','I','O','U']; letter := ['A'..'Z'] - vowels;
การรับและแสดงค่าตัวอักษรในเซต write('Enter one letter(* for end):'); ch := readkey; ch := upcase(ch); while ch <> '*' do begin if ch in vowels then count_v := count_v +1;
การรับและแสดงค่าตัวอักษรในเซต else if ch in letter then count_letter := count_letter +1 count_wrong := count_wrong +1;
การรับและแสดงค่าตัวอักษรในเซต writeln; write('Enter one letter(* for end):'); ch := readkey; ch := upcase(ch); end;
การรับและแสดงค่าตัวอักษรในเซต writeln; writeln('Total vowels is ',count_v); writeln('Total letter is ',count_letter); writeln('Total non letter/vowels is ',count_wrong); end.