การเปรียบเทียบข้อมูล

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

ปกติแล้วคนชอบทำผิดการตรงไหน?


สมมุติว่าคุณต้องการเปรียบเทียบว่า A เท่ากับ B หรือไม่ สิ่งแรกที่ทุกคนนึกถึง ก็คงจะเป็นเครื่องหมาย
"A==B" (ใช้เท่ากับ 2 ตัว เพื่อเปรียบเทียบความเท่ากัน) แต่หลายๆ คนกลับลืมไปว่า ข้อมูลในโปรแกรมไม่ได้มีชนิดเดียว มันมีทั้งตัวเลข และตัวอักษร และใน MATLAB เวอร์ชั่นใหม่ (ตั้งแต่ 2016b ขึ้นมา) MATLAB ได้แบ่งประเภทข้อมูลตัวอักษรออกเป็น 2 แบบ ซึ่งทำให้การใช้งานข้อมูลประเภทตัวอักษรทำได้ง่ายขึ้น

แล้ววิธีการเปรียบเทียบตัวเลข กับวิธีการเปรียบเทียบตัวอักษร ต่างกันอย่างไร?

คำตอบคือ ต่างกันที่ผลลัพธ์ครับ

เช่น

การเปรียบเทียบระหว่างตัวเลข เราสามารถใช้เครื่องหมายเปรียบเทียบพวกนี้ได้

เครื่องหมาย
ความหมาย
ตัวอย่าง
มากกว่า
A>5
น้อยกว่า
B<12
>=
มากกว่าเท่ากับ
C>=9
<=
น้อยกว่าเท่ากับ
D<=26
==
เท่ากันกับ
A==B
~=
ไม่เท่ากับ
C~=D
~ หรือ not()
ไม่
E = ~(A) หรือ E = not(A)

อย่างเช่น

>> A = X==Y

เราจะเห็นว่า A จะได้คำตอบเป็น ture หรือ false แค่คำตอบเดียวเท่านั้น
สังเกตุที่ Size ของ A นะครับ จะเห็นว่ามีขนาดเป็น 1x1 หรือก็คือ คำตอบมีค่าเดียว

แต่ถ้าหากคุณใช้เครื่องหมาย == กับข้อมูลตัวอักษรประเภท char ผลลัพธ์ที่ได้จะต่างกันออกไป

เห็นไหมครับว่าถ้าหากเราใช้เครื่องหมาย == ในการเปรียบเทียบ char มันคือการเปรียบเทียบระหว่างตัวอักษรแต่ละตัว ดังนั้นเราจึงได้คำตอบออกมาหลายคำตอบ ซึ่งต่างจากการเปรียบเทียบตัวเลขที่เราจะได้เพียงคำตอบเดียวเท่านั้น ดังนั้นหากเราเขียนโปรแกรมโดยไม่เข้าใจถึงความแตกต่างนี้ โปรแกรมของเราก็จะทำงานผิดพลาดได้ เช่น ถ้าเราเอาแค่คำตอบแรกไปเป็นเงื่อนไข เราก็จะได้ผลลัพธ์ว่า X มีค่าเท่ากับ Y ซึ่งในความเป็นจริงแล้วมันไม่ได้เป็นเช่นนั้น ซึ่งก็หมายความว่าโปรแกรมของเราทำงานผิดพลาดนั่นเอง

แล้ววิธีการที่ถูกต้องควรจะทำอย่างไร?

1. ข้อมูลประเภทตัวเลข

หากเป็นตัวเลขเดียว สามารถใช้เครื่องหมายเปรียบเทียบในตารางด้านบนได้เลย เช่น

>> X = 4;
>> Y = 5;
>> Z = X==Y;

แต่ถ้าหากข้อมูลนั้นเป็นอาเรย์ ให้ใช้คำสั่ง isequal แทนเครื่องหมาย == เช่น

>> X = [1 2 3];
>> Y = [1 2 3];
>> Z = isequal(X,Y);

เราก็จะได้ผลลัพธ์เป็นคำตอบเดียวเหมือนกับการใช้เครื่องหมาย == (แต่หากเราใช้เครื่องหมาย == เปรียบเทียบอาเรย์ เราจะได้หลายคำตอบ)

2. ข้อมูลประเภทตัวอักษร

ใน MATLAB เวอร์ชั่นใหม่ๆ จะแบ่งประเภทตัวอักษรออกเป็น char และ string ซึ่งมีวิธีเขียนที่ต่างกันดังนี้

- ข้อมูลประเภท char จะใช้เครื่องหมาย '  ' (sigle quote) เช่น

>> A = 'Hello'
>> whos A
  Name      Size            Bytes  Class    Attributes

  A            1x5                10      char   

หากใช้คำสั่ง whos ตรวจสอบ เราก็จะเห็นว่า class เป็น char
สำหรับการเปรียบเทียบข้อมูลประเภท char ให้ใช้คำสั่ง strcmp เช่น

>> A = 'Hello';
>> B = 'Hi';
>> C = strcmp(A,B);

- ข้อมูลประเภท string จะใช้เครื่องหมาย "" (double quote) เช่น

>>A = "Hello"
>>whos A
  Name      Size            Bytes  Class     Attributes

  A            1x1               158    string  

สังเกตุดูนะครับว่า size จะเหลือแค่ 1 หน่วย คือ นับเป็น 1 ข้อความ ไม่ได้นับเป็นตัวอักษรเหมือน char แต่ขนาดของข้อมูลก็เพิ่มขึ้นเช่นกัน จาก 10 bytes กลายเป็น 158 bytes และ class ก็เปลี่ยนเป็น string

เมื่อข้อมูลกลายเป็น 1 หน่วย การเปรียบเทียบจึงสามารถใช้เครื่องหมายเหมือนตัวเลขได้ (เปรียบเทียบ string กับ string) เช่น

>>A = "Hello";
>>B = "Hello";
>>C = A==B
C =

  logical

   1

ก็จะได้คำตอบ 1 ค่าเช่นกัน หรือเราจะใช้คำสั่ง strcmp ก็ได้

>>D = strcmp(A,B)
D =

  logical

   1

ในกรณีที่เราต้องการเปรียบเทียบ string กับ char ก็ทำเช่นเดียวกับการเปรียบเทียบ string กับ string ซึ่งจะได้คำตอบออกมา 1 ค่าเช่นกัน

สรุปนะครับ

1. เปรียบเทียบตัวเลข 1 ตัว ใช้เครื่องหมายเปรียบเทียบในตารางได้ทั้งหมด (== , > , < , ... )
2. เปรียบเทียบตัวเลขหลายตัว (อาเรย์) ใช้คำสั่ง isequal( )
3. เปรียบเทียบ char กับ char ใช้คำสั่ง strcmp
4. เปรียบเทียบ string กับ string หรือ string กับ char ใช้คำสั่ง == หรือ strcmp อันไหนก็ได้

การใช้ "และ" กับ "หรือ"

เครื่องหมาย "&&" หมายความว่า "และ" ทางตรรกศาสตร์ แต่หลายๆ คนมักจะเขียนผิดโดยเขียน "&" แค่ตัวเดียว ซึ่งมันก็หมายความว่า "และ" เหมือนกัน แต่ใช้กับข้อมูลคนละแบบ คือ

"&&" ใช้กับข้อมูลทั่วไป
"&" ใช้กับข้อมูลประเภทตรรกศาสตร์ (logic)

เช่น

>> X = 'Hello';
>> Y = 'Hellx';
>> Z = X&Y
Z =

  1×5 logical array

   1   1   1   1   1

จะเห็นว่าคำตอบที่ได้เป็น true ทั้งหมดทั้งๆ ที่ตัวอักษรสุดท้ายต่างกัน (ตัว o กับ x) แต่คำตอบก็ยังเป็น true นั่นก็เพราะว่า ตัวอักษรทุกตัว เมื่อเปลี่ยนเป็น ascii code มันก็คือตัวเลขตัวหนึ่ง ซึ่งในทางคอมพิวเตอร์ ตัวเลขทุกตัวที่ไม่ใช่ 0 ไม่ว่าจะเป็นบวก หรือ ลบ จะมีค่าเป็น true เสมอ ดังนั้นเมื่อ
"จริง และ จริง" ผลลัพธ์ที่ได้ก็เลยเป็น "จริง"

แต่หากเราใช้ && โปรแกรมจะแจ้งเตือน error ดังนี้

Z = X&&Y
Operands to the || and && operators must be convertible to logical scalar values.

ซึ่งหมายความว่า ด้านหน้า และด้านหลังเครื่องหมาย && จะต้องเป็นข้อมูลประเภท scalar เท่านั้น (ข้อมูลตัวเดียว ที่ไม่ใช่อาเรย์)

ส่วนการใช้ "หรือ" ( || ) ก็มีหลักการเช่นเดียวกันกับการใช้ && นะครับ ดังนั้นต้องใช้ให้ถูกต้องนะครับ ไม่งั้นโปรแกรมอาจทำงานผิดพลาดได้

ความเห็น

โพสต์ยอดนิยมจากบล็อกนี้

การแก้สมการ Differential ด้วย MATLAB

การหาค่าเฉลี่ยโดยไม่ต้องเก็บค่า