วันศุกร์ที่ 31 ตุลาคม พ.ศ. 2557

C++ :: 13. ชนิดของข้อมูล enumerated

enumerated  เป็นข้อมูลแบบโครงสร้างอีกแบบหนึ่ง  ที่อธิบายยาก... ยิ่งอธิบายยิ่งไม่เข้า..จาย... แต่ว่าใช้งานง่าย  คืออย่างนี้ 
enum  WeekDay { Sunday,Monday,Tuesday,Wednesday,Thurday,Friday,Saturday };
enum  เป็นคำสั่งให้สร้าง โครงสร้าง  ข้อมูลแบบ enumerated  ชื่อว่า Weekday  ยังไม่ใช่ตัวแปร นะพี่น้อง..
WeekDay   Day1,Day ; //    Day1 และ Day2 จึงเป็นตัวแปรที่เราต้องการ  แต่ว่าโดนจำกัดอิสระภาพ.. ให้มีค่าได้ แค่  
Sunday หรือ Monday หรือTuesday หรือ Wednesday หรือThurday หรือFriday หรือSaturday  เท่านั้น
เช่น  Day1 = Monday ;  Day2 = Saturday ;   => แล้ว Tuesday  Saturday มันมีค่าเท่าไรหว่า ??   อันนี้คอมไพล์เลอร์จะกำหนดให้เองพี่น้อง...เป็น
Sunday = 0 , Monday = 1 ......Saturday = 6  โดยอัตโนมัติ  ยกเว้นว่า เราไม่ต้องการ....
ดังนั้นเวลาสั่ง  std::cout<<"Day1= "<<Day1<<std::endl;    จะได้ค่า  เป็น  Day1=1

C++ :: 12. ฟังก์ชั่นเกี่ยวกับสตริง

นอกจากการใช้งาน String ในแบบ variable และ  constant ที่พูดถึงในตอนที่  C++ :: 11. สตริง ( string )      Standard Library C++ ยังได้เตรียม class สำหรับจัดการ  string ไว้ให้ด้วย  ทำให้เราสามารถใช้งาน string ในแบบ อ๊อบเจ็ค  .. ใช้ยังไง อ็อบเจ็ค  ??... เดี๋ยวมาดูกัน  ก่อนอื่น ต้องเรียกใช้บริการเฮดเดอร์ไฟล์   #include <string> ซะก่อน
หลากหลายวิธีในการสร้าง  String
std::string  S1 ; // สร้าง อ็อบเจค S1
S1 = " HelloTest_1" ; // ใส่ข้อมูลเข้าอ็อบเ็จค
std::string  S2 ("Hello Test_2") ; // สร้าง อ็อบเจคและใส่ข้อมูลเลย อย่างนี้ก็ได้
S1 += S2 ; //  จะได้ S1 = "HelloTest_1HelloTest_1"
std::string  S3 (S2) ; // จะได้ S3 = "HelloTest_2"
std::string  S3 ; S3 = S2 ; // จะได้ S3 = "HelloTest_2"
std::string  S4 = S1 + S2 ;
..... รู้ยัง อ็อบเจ็ค คือ อะไร ... วัตถุ ?.. วัตถุ ?  อะไรหว่า

C++ :: 11. สตริง ( string )

หลังจากเข้าใจเรื่อง Array แล้วคราวนี้มาต่อเรื่อง  string     เว้ากันซื่อๆ  string ก็คือ Array ของ ข้อมูลชนิด  char  ที่มีอะไรบางอย่าง...ที่ไม่ธรรมดา  ตัวอย่างเช่น
ถ้า Array ของ char  ทั่วไป จะเป็นอย่างนี้  
char  MyDog[6] ; // จองพื้นที่ 6 ตัวอักษร
MyDog = {'B','i','g','B','i','g'} ; // ป้อนข้อมูลทีเดียวรวด 6 ตัวอักษร

แต่ถ้าเป็น string สถานการณ์ จะต่างกันหน่อย
char MyDog_1[8] ;//จองพื้นเอาไว้ป้อนชื่อหมา 7 ตัวอักษร   อ๊ะ ..อ๊ะ จอง พื้นที่ไว้ 8 ทำไมป้อนได้แค่ 7  เหตุผลคือ  string เก็บ พื้นที่ ที่ 8 ไว้เก็บอักษรพิเศษ  \0   อ่านออกเสียงว่า นัลล์ (null)  การตบท้ายด้วย \0 เป็นเอกลักษณ์ของ string  
MyDog_1= {'B','i','g','B','i','g','1','\0'}; //ป้อนค่าทีเดียวรวด
หรือจะป้อนทีละตัวอักษร ก็ได้
MyDog_2[0]= 'B' ; MyDog_2[1]= 'i '; MyDog_2[2]= 'g' ; MyDog_2[3]= 'B' ; MyDog_2[4]= 'i '; MyDog_2[5]= 'g';MyDog_2[6]= '2'; MyDog_2[7]= '\0' ;

เวลาคอมพิวเตอร์เก็บข้อมูลจะเป็นลักษณะดังนี้  =>  | B | i | g | B | i | g | 2|\0 |
สารพัดวิธีป้อนค่าให้ string
char MyDog_3[8] = {'B','i','g','B','i','g','3','\0'};//จองพื้นที่แล้วป้อนค่าเลย

char MyDog_4[] = {'B','i','g','B','i','g','4','\0'};//ไม่ต้องกำหนดขนาด เดี๋ยวคอมไพเลอร์จัดการให้

char MyDog_5[8] = "BigBig5"; // วิธีการป้อนค่าแบบพิเศษ สงวนเฉพาะ string เท่านั้น

char MyDog_6[] = "BigBig6"; //อันนี้ก็ ไม่ต้องกำหนดขนาด เดี๋ยวคอมไพเลอร์จัดการให้
แต่ถ้าทำแบบนี้ !!
char MyDog_6[8] ;
MyDog_6 = "BigBig6" ;// จะเกิด Error ตอนคอมไพล์  ไม่เชื่อลองดู๊ ... เจอมาแล้..ววว

C++ :: 10. Array และ หน่วยความจำ

ข้อไม่ดีของ Array คือเราจะต้องจองพื้นที่หน่วยความจำ เหมือนจองโรงแรม ยังไงยังงั้น..  จองแล้วจองเลยด้วยน๊ะ  จะไปเพิ่มหรือลดทีหลังไม่ได้ด้วย เพราะในขบวนการทำงาน ของการจองพื้นที่หน่วยความจำจะทำตั้งแต่ตอนคอมไพล์ หลังจากนั้นหมดสิทธิเปลี่ยน เราสามารถคำนวณพื้นที่หน่วยความจำที่ใช้ได้เช่นว่า
จองพื้นที่หน่วย ความจำเพื่อเก็บข้อมูลจำนวน นักเรียนหญิง และ นักเรียนชาย ในแต่ละห้องเรียน จากห้องเรียนทั้งหมด 10 ห้องเรียน (ชนิดข้อมูลแบบ integer )
int Student[10][2] ;
1 integer กินพื้นที่ 4 ไบท์ (ดู  C++ :: 7. ชนิดของข้อมูล simple data type  )   ดังนั้นพื้นที่ ที่ใช้ทั้งหมดสำหรับตัวแปรนี้คือ (ห้องเรียน x ชาย หญิง x size of int)  = (10 x 2 x 4)  = 80 ไบท์
ดู อีกตัวอย่างนึง :  จองพื้นที่หน่วยความจำเพื่อเก็บข้อมูลความสูงของนักเรียน (ชนิดข้อมูลแบบ float) สำหรับนักเรียนจาก 10 โรงเรียน โรงเรียนละ10 ห้อง ห้องละ 30 คน
float  StudentHeight[10][10][30] ;
1 float  กินพื้นที่ 4 ไบท์    ดังนั้นพื้นที่ที่ใช้ทั้งหมดสำหรับตัวแปรนี้คือ (โรงเรียน x ห้องเรียน x ห้องละ30คน x size of float)  = (10 x 10 x 30 x 4)   =  12,000 ไบท์
ถ้าขี้เกียจคำนวณ นี่เลย ...คำสั่ง sizeof()  ใช้แสดงจำนวนหน่วยความจำที่ใช้ของ Array  เช่น  
std::cout << "หน่วยความจำของ StudentHeight = " << sizeof(StudentHeight) <<"Byte" ;
หรือใช้แสดงหน่วยความจำของข้อมูลชนิดใดๆก็ได้เช่น  sizeof(int)  sizeof(float) ...
  chapter10.cpp
  #include <iostream>
  //จองพื้นที่ หน่วยความจำ
  int Student[10][2]; 
  float StudentHeight[10][10][30]; 

  int main() // ฟังก์ชั่นหลัก
  {
      std::cout<<"Memory for integer = "<<sizeof(int)<<" Byte "<<std::endl; // แสดง หน่วยความจำที่ใช้ของ ข้อมูลแบบ integer
      std::cout<<"Memory for Student = "<<sizeof(Student)<<" Byte "<<std::endl; // แสดง หน่วยความจำที่ใช้ของ Student
      std::cout<<std::endl;
      std::cout<<"Memory for float = "<<sizeof(float)<<" Byte "<<std::endl; // แสดง หน่วยความจำที่ใช้ของ ข้อมูลแบบ float
      std::cout<<"Memory for StudentHeight = "<<sizeof(StudentHeight)<<" Byte "<<std::endl;// แสดง หน่วยความจำที่ใช้ของ StudentHeight   
      return 0; // จบโปรแกรม
  }


C++ :: 9. ชนิดของข้อมูล Array

ข้อมูลแบบโครงสร้างอีกแบบหนึ่งที่ใช้งานกันบ่อยใน C++  คือ Array  ซึ่งมีวิธีใช้งานต่างจากแบบ struct   เวลาพูดถึงข้อมูลแบบ  Array  ให้นึกถึงข้อมูลที่ถูกจับมาเรียงต่อๆกัน เป็นชุด เป็นแถวเช่น เอาแบบง่ายๆก่อน นี่เล้ย...
วันในหนึ่งสัปดาห์
Week[7] = { Sun,Mon,Tue,wed,Thu,Fri,Sat } ;
อย่างนี้เป็น Array แบบ 1 มิติ  ง่าย สุดๆแล้วนะเนี่ย...    Week  คือชื่อของ  Array ส่วน  [..] คือ มิติ  เลข 7 เป็นตัวบอกว่า มิตินั้นมีสมาชิกกี่ตัว  สรุปคือว่า  Array Week มี 1 มิติ และมีสมาชิกในมิตินั้น 7 ตัว
ยากขึ้นมาอีกหน่อยเป็น Array แบบ 2  มิติ ตัวอย่างเช่น  Array เก็บข้อมูล จำนวนนักเรียนชาย หญิง ในแต่ละห้องเรียน โดยมีโครงสร้างข้อมูลดังนี้  ห้องเรียน(มิติที่ 1) ->จำนวนนักเรียน ชาย,หญิง(มิติที่ 2)
Student [3][2] =       { 10,20 ,    // ห้องเรียนที่ 0 -> นักเรียน->2 เพศ -> ชายตำแหน่งที่(0)->10, หญิงตำแหน่งที่(1)->20  
                                  { 11,12 } ,   // ห้องเรียนที่ 1 -> นักเรียน->2 เพศ ->ชายตำแหน่งที่(0)->11, หญิงตำแหน่งที่(1)->12
                                  { 20,10 }     // ห้องเรียนที่ 2 -> นักเรียน->2 เพศ ->ชายตำแหน่งที่(0)->20, หญิงตำแหน่งที่(1)->10
                            };

C++ :: 8. ชนิดของข้อมูล Structure และ Union

คราวนี้มาพูดถึงข้อมูลอีกแบบหนึ่ง ที่มีลักษณะแบบโครงสร้าง structure  คือ  struct  และ union   จากตอนที่แล้วยกตัวอย่างเรื่องหมาๆ  MyDog  ตอนนี้ก็มาต่อเรื่องหมาแล้วกัน !!  ( เก็บกดเรื่องหมาข้างบ้าน)    สมมุติว่าเราจะเก็บข้อมูลหมาในหมู่บ้าน  เช่นว่า หมาของใคร หมาสีอะไร หมาเพศอะไร  อายุเท่าไหร่   นี่พูดถึงหมาหนึ่งตัวน๊ะ  เริ่มที่ ข้อมูลแบบ struct ก่อนก็แล้วกัน
***** STRUCT ******
โครงสร้างข้อมูลก็จะเป็นดังนี้
Dog_1{  
    Owner =  นาย แดง
    Sex  = ผู้
    Color  = แดง
    Age =5
}
คำสั่ง C++ ที่ใช้สร้างข้อมูลแบบนี้คือ   struct   โดยสั่งดังนี้
struct   TheDog
{
    char *   Owner ;
    char*   Sex ;
    char* color ;
    int  Age ;
} ;

C++ :: 7. ชนิดของข้อมูล simple data type

ตอนนี้จะว่าด้วยเรื่องชนิดของข้อมูล   คอมพิวเตอร์มีวิธีการเก็บข้อมูลแต่ละชนิดไม่เหมือนกัน ดังนั้นเวลากำหนดตัวแปรใน  C++  เราต้องบอกคอมพิวเตอร์ด้วยว่า ตัวแปรนั้นเก็บข้อมูลชนิดใด เช่น  จำนวนเต็ม(int)   จำนวนทศนิยม(float)   ตัวอักษร(char)   และอื่นๆ....อีกเยอะแยะ
int MyDog = 1;  // หมาของฉัน มี 1 ตัว     MyDog  คือ ตัวแปร  int คือชนิดของข้อมูลแบบจำนวนเต็ม  ของ MyDog 
int YourDog = 1;  // หมาของเธอ มี 1 ตัว   
float Height = 150.62 ; // ความสูง 150.62     Height  คือ ตัวแปร  float  คือชนิดของข้อมูลแบบทศนิยม  ของ Height
char Letter = 'a'; // ตัวอักษร a     Letter  คือ ตัวแปร  char  คือชนิดของข้อมูลแบบตัวอักษร  ของ Letter
ถ้าเราสั่งให้   :  int  Result = MyDog + YourDog ;  // คอมพิวเตอร์จะเต็มใจ ทำให้เรา เพราะเป็นข้อมูลชนิดเดียวกัน
ถ้าเราสั่งให้   : float  Result = MyDog + Height ;  // เอาจำนวนเต็ม ไปบวกกับ  เลขทศนิยมคอมพิวเตอร์ก็พอจะ จำใจ  ทำให้เราได้ แต่มีโวยตอนคอมไพล์  ? !*&..
ถ้าเราสั่งให้   : float  Result = Letter + Height ; //เอาตัว อักษร ไปบวกกับ  เลขทศนิยม   รับรองว่าคอมไพล์ไม่ผ่าน แน่นอน..ขอบอก
ชนิดของข้อมูลแบ่งได้เป็น 2 ประเภทคือแบบ เดี่ยวๆ( simple data type )  และแบบ  โครงสร้าง( structure)   ที่กล่าวมาข้างบนนั้นเป็นข้อมูลประเภท simple  ดังแสดงในตารางข้างล่างนี้