วันพฤหัสบดีที่ 22 กันยายน พ.ศ. 2554

Array และ Pointer

สวัสดีครับ วันนี้ผมจะเขียนเรือง แนวคิดเกี่ยวกับ Array และ Pointer ครับ

         เนื่องจากมีหลายๆคนสงสัย และมองว่ามันยาก ในการจัดการเกี่ยวกับ Array แล้วก็งงกับ มันไปเกี่ยวอะไรกับ Pointer อีก

คำถามแรกต้องถามก่อนว่า เรามี Array ไว้ทำอะไร
          Array มองง่ายๆ ก็คือเป็นกลุ่มของข้อมูลชนิดเดียวกัน หรือก็คือเป็นกลุ่มของตัวแปรที่มีชนิดเดียวกันนั้นเอง มีเอาไว้เก็บข้อมูลเหมือนตัวแปรนั้นแหละครับ เช่น เราบอกว่าเราต้องการเก็บคะแนนของนักเรียนทั้งหมด 40 คนในห้องเรียนนี้ ถ้าเรายังไม่รู้ว่ามี Array อยู่ในโลกเนี่ย เราก็จะต้องประกาศตัวแปรถึง 40 ตัว แต่ถ้าเรารู้แล้ว ก็ประกาศเพียงแค่ Array 1 ตัวเท่านั้น

Pointer and Address
    โดยทั่วไปหน่วยความจำ(Memory)ของคอมพิวเตอร์ นั่นจะเป็นช่อง(ในมุมมองของ logical view)ที่ถูกระบุหมายเลขที่อยู่(Address)เอาไว้เรียงต่อกัน โดยช่องต่างๆเหล่านี้ สามารถถูกนำมาใช้อย่างเดี่ยวๆ หรือ นำมาใช้อย่างเป็นกลุ่มๆ ก็ได้ เช่น ชนิดตัวแปรอักขระ(char) สามารถแทนได้ด้วย Memory cell 1 ไบท์, ชนิดตัวแปรสั้น(short) สามารถแทนได้ด้วย Memory cell จำนวน 2 ไบท์(a pair of one-byte cell) หรือ Memory cells จำนวน 4 ไบท์ ติดกันใช้แทนชนิดข้อมูล Integer หรือ long 
    Pointer คือ กลุ่มของ Memory cells ที่ใช้เก็บ Address
    ถ้าให้ ตัวแปร c เป็น char และ ตัวแปร p เป็น Pointer ที่ชี้มายัง c แล้วเราสามารถแทนเหตุการณ์แบบนี้ด้วยรูปภาพด้านล่าง

& เป็น Unary Operator ที่ใช้ในการดึง Address ของวัตถุหนึ่ง ดังนั้น code ที่ใช้แทนเหตุการณ์ด้านบนคือ
p = &c; // assigns the address of c to the variable p ,and p is said point to c

*คือ indirection หรือ dereferencing operator เมื่อ apply operator นี้กับ pointer นั่นคือ การเข้าถึงวัตถุภายในหน่วยความจำที่ Pointer ตัวที่ถูก Apply * ชี้อยู่

การประกาศ pointer จำเป็นต้องระบุ ชนิดข้อมูลที่ pointer นี้สามารถชี้ไปได้
       pointer สามารถใช้ไปยังชนิดข้อมูลที่เฉพาะเจาะจงได้เท่านั้น แต่มีอยู่ type หนึ่งคือ เมื่อประกาศ pointer ว่าให้ชี้ไปยังชนิด "void" แล้ว pointer ตัวนั้นจะสามารถชี้ไปยังทุก ชนิดข้อมูลได้ แต่ pointer ตัวนั้นจะไม่สามารถถูกทำการ dereference ได้















       

วันจันทร์ที่ 18 กรกฎาคม พ.ศ. 2554

ยังไงดี กับความรักน้อยๆ ของคนตัวเล็กๆ อย่างเรา

        ครั้งหนึ่งที่เราเคยรู้จักกัน เราเคยคุยกันด้วยความรู้สึกดีๆ เห็นหน้ากัน ผมเปิดเพลงให้เธอฟัง ผมมีความสุขมากๆครับ กับรักครั้งนี้ ตอนรู้จักกันครั้งแรก เห็นกันครั้งแรก ผมบอกกับเธอว่า เธอไม่ใช่สเปคของผมเลย แต่คุยกันไปได้เรื่อยๆ ผมก็รู้สึกว่าเธอนั้น น่ารัก และ X มากๆ ผมชอบเธอมาก มีความสุขมากๆในช่วงนั้น ผมไม่อยากไปนอนเพราะยังอยากคุยกับเธอ แต่สุดท้าย เธออยากเป็นเพื่อนกับผม ผมก็คิดอยู่แล้วมั้ง มันต้องมีวันนี้ -8-
  
        ผมก็ไม่รู้ ผมมอง ผมชอบ ทุกคนที่ สเปคแบบเธอ กลายเป็น เธอได้เปลี่ยน เสปคในใจผม :) ผมก็รู้ ผมก็พยายามตัดใจจากเธอได้ประมาณ 2 เดือนมั่ง ผมก็ add MSN, Facebook ไปหาเธอ คุยกันเป็นเพื่อน ก็นะอย่างนี้เขาเรียกลืมไปลงหรือเปล่า ฮ่าๆ ผมก็เข้าใจแหละว่ามันน่ารำคาญ แต่ผมอยากคุยกับเธอจริงๆ อยากเป็นแฟนกับเธอจริงๆ ^_^ คิดถึงครับ 

วันเสาร์ที่ 2 กรกฎาคม พ.ศ. 2554

การใช้ Will และ Would

Will นั่นมีความหมายว่า "จะ"
       รูปแบบการใช้ S+ will +Verb infinitive
       เช่น I will go there.(ฉันจะไปที่นั่น)


Would นั่นเป็น รูปอดีตของ Will หรืออาจจะใช้ในความหมายสุภาพ เพื่อจะบอกว่า อยากจะ ต้องการจะ
      รูปแบบการใช้  S + would like to + V infinitive
      เช่น  I would like to talk with Mr.Suchat.(ฉันอยากจะขอคุยกับคุณสุชาติหน่อย)

วันจันทร์ที่ 20 มิถุนายน พ.ศ. 2554

[[C++]Programming Fundamental-03] พื้นฐานของภาษา C++ (C++ Basics)

     ประวัติของภาษา C++ อย่างย่อ

     C++ ชื่อของมันบอกเป็นนัยย์ๆ อยู่แล้วว่า โดยพื้นฐานมาจาก ภาษาโปรแกรมที่ชื่อว่า C (The C Programming Language) จะเรียกสั้นๆว่า ภาษาซี โดยเริ่มต้นนี้เราควรที่จะกล่าวถึงประวัติของภาษาซีก่อนอย่างย่อๆ
     ภาษา C ถูกคิดค้นขึ้นเมื่อ ช่วงต้นๆของปี 1970 ขึ้นที่ Bell Laboratories โดย Dennis Ritchie มันถูกออกแบบมาเพื่อเป็น ภาษาในการ implement สำหรับ ระบบปฏิบัติการ Unix ประวัติของภาษา C และ Unix OS จึงถูกประสานเข้าด้วยกันอย่างใกล้ชิด ด้วยเหตุผลนี้เองทำให้ โปรแกรมของระบบปฏิบัติการ Unix มากมายนั้นถูกเขียนขึ้นด้วยภาษา C โดย Original แล้วภาษา C เป็นภาษาที่เป็นแบบ Typeless
     ภาษา C++ ถูกประดิษฐ์ขึ้นโดย Bjarne Stroustroup เริ่มต้นในปี 1979 โดยเวอร์ชันแรกของภาาา C++ ถูกเรียกว่า "C with Classes" แต่ชื่อนี้ไม่ค่อยดีภายหลังจึงเปลี่ยนมาเป็น C++ โดยภาษา C++ เวอร์ชันแรกถูกใช้งานใน AT&T ในเดือน สิงหาคม 1983 การ Implement ในเชิงธุกิจถูกใช้ในปี 1985
     ปัจจุบันมาตรฐานของภาษา C++ ถูกจัดการโดย American National Standards Institute (ANSI) และ The International Standards Organization (ISO) นี้เป็นที่ว่าทำไมคุณถึงได้ยินบ่อยๆว่า C++บริสุทธ์(Pure C++) มักถูกอ้างถึง ในมาตรฐานของ ANSI หรือ ISO

     Hint: Pure C++ ถูกกล่าวถึงเพราะว่า มีเวอร์ชันขยายต่อมากมายที่ขยายต่อจาก Pure C++ ไปเพื่อพัฒนาเป็นรุ่นที่เฉพาะเจาะจงสำหรับ Operating system หรือ Compiler 


     C++ กับ C
    
   คุณรู้แล้วว่า ภาษา C ถูกพัฒนามาก่อน แล้ว C++ จึงพัฒนาต่อมาจาก C และคุณอาจจะกำลังถามตัวเองว่า อ้าวแล้วอะไรล่ะมันคือความต่างระหว่าง ภาษา C และ C++ คำตอบก็คือสิ่งที่แตกต่างกันอย่างเห็นได้ชัดเลยก็คือ

  1. C++ สนับสนุน OOP (Object-Oriented Programming)
  2. C++ จัดการกับ สายอักขระ (String) ได้ดีกว่า C
  3. C++ มี Exception Handling ที่ดีกว่า C
  4. ... อื่นๆ
    นอกจากนั้นแล้ว Compiler ของ C++ มักจะสนับสนุนการคอมไพล์ของ C แต่ไม่(ค่อย)ในทางกลับกัน
     
    เราจะเขียนโปรแกรม C++ ได้อย่างไร 
    
    เนื่องจากมีหลากหลายทางมากในการจะสามารถเขียนภาษา C++ ได้ โดยการเปิด Text editor ขึ้นมา บันทึกไฟล์นั้นแล้วทำการใช้ Command line compiler ในการคอมไพล์ไฟล์นั้น และนั่นจะเป็นวิธีที่ใช้ในการอธิบายใน Blog นี้ด้วยครับ
    จริงๆแล้ววิธีอื่นก็มี เช่น เขียนโดยใช้ IDE(Integrated Development Environment) ในตัวอย่างใน Blog นี้จะใช้ Free Download Version ของ Borland C++ Compiler ซึ่งเป็นตัวที่ไม่มี IDE หรือตัวช่วยอื่นๆเลย
    ระบบปฏิบัติการวินโดว์(Seven) สามารถเข้าใช้งาน Command line ได้โดย คลิกที่ ปุ่มรูปวินโดว์ ล่างขวามือพิมพ์ในช่อง Search ว่า "cmd"  จะขึ้นเป็น หน้าต่างดำๆ ตัวหนังสือสีขาวขึ้นมา ใช้งานโดยการพิมพ์คำสั่งลงไป แล้วกดปุ่ม Enter

    ต่อไปนี้จะพูดถึงการดาวน์โหลด และการติดตั้ง และการคอมไพล์ไฟล์ ตัวใช้ Borland C++ Compiler 5.5

    1. ให้ทำการ ดาวน์โหลด Borland C++ Compiler 5.5 (สามารถ Search ได้จาก google)
    2. โหลดมาจะได้ไฟล์ ที่นามสกุลเป็น .exe ซึ่งสามารถ ทำการ install ได้เลย
    3. เมื่อติดตั้งเสร็จแล้ว ต้อง ทำการ Set 2 Configuration files (สามารถดูจากไฟล์ readme.txt ได้หลังจากลงตัวคอมไพล์แล้ว)
          เริ่มการสร้างไฟล์โดยใช้ Notepad หรือ Text Editor ต่างๆ เพื่อนสร้างสองไฟล์ดังนี้
          1. เปิด Text Editor แล้วพิมพ์ 

     -I"C:\BORLAND\BCC55\INCLUD
-L"C:\BORLAND\BCC55\LIB" 

              จากนั้นบันทึกไฟล์โดยบันทึกชื่อ BCC32.CFG (เป็นสกุล .CFG ไม่ใช่ BCC32.CFG.txt นะครับ)
              แล้วนำไฟล์นี้ไปใส่ไว้ใน Folder ที่ลง Compiler ไว้ ตาม path นี้ "C:\BORLAND\BCC55\BIN"
          2. เปิด Text Editor แล้วพิมพ์ 

                                                              -L"C:\BORLAND\BCC55\LIB"

              จากนั้นบันทึกไฟล์โดยบันทึกชื่อ LINK32.CFG (เป็นสกุล .CFG ไม่ใช่ BCC32.CFG.txt นะครับ)
              แล้วนำไฟล์นี้ไปใส่ไว้ใน Folder ที่ลง Compiler ไว้ ตาม path นี้ "C:\BORLAND\BCC55\BIN"


    4. ทำการ Set ตัวแปรสภาพแวดล้อม(Environment Variable) -- เฉพาะ ระบบปฏิบัติการ Windows ถ้าเป็นระบบปฏิบัติการอื่นต้องลองหาวิธี Set ตัวแปรสภาพแวดล้อมเองนะครับ
         ทำโดยการ เข้าไปที่ Control Panel --> System --> Advanced System Setting --> Environment Variable
         เมื่อเปิดหน้าต่างดังกล่าวมาแล้ว ให้ดูที่  User variable for ...Your Pc Name... --> กดปุ่ม New... Variable name ให้ชื่อว่า path และ variable value ให้พิมพ์ %path%;c:\Borland\BCC55\Bin; แล้วกด OK เท่านี้ก็เสร็จสิ้น


    5. การคอมไพล์ เราสามารถทำได้โดย เปิด Command line ขึ้นมา เข้าไปยัง Directory ที่ไฟล์ต้นฉบับ(Source code)ของเราอยู่ จากนั้นพิมพ์ bcc32 filename.cpp จะได้ไฟล์ทั้งหมด 3 ไฟล์ แต่ที่เราสนใจคือ .exe เท่านั้นเป็น executable ไฟล์ เราสามารถรันไฟล์นี้เพื่อดูผลลัพธ์ได้

    * แต่ผมก็มี IDE แนะนำนะครับลองโหลด Dev-C++ มาใช้ดู ก็ได้ครับ ตัวนี้ ตัวคอมไพล์จะเป็น gcc นะครับ อันนี้ใช้งานสะดวกดีแค่กด F9 ก็คอมไพล์พร้อมรันให้เสร็จ 


     หลักเบื้องต้นของภาษา C++

     ภาษา C++ ก็เป็นภาษาโปรแกรมที่มีความคล้ายคลึงกับภาษาโปรแกรมอื่นๆ ลำดับแรกเราจะต้องรู้อย่างชัดเจนก่อนว่า ภาษาโปรแกรมคืออะไร คอมพิวเตอร์รู้จักเพียง 1's และ 0's ไม่สวิชเปิดก็ปิด คนเรามีปัญหาในการทำความเข้าใจ 1's และ 0's ภาษาโปรแกรมเป็นสะพานทอดระหว่างการทำความรู้จักกันระหว่าง คอมพิวเตอร์ กับ มนุษย์ 
         "Low-level language"หรือ"ภาษาระดับต่ำ" เป็นภาษาโปรแกรมที่มีความใกล้เคียงกับเครื่องคอมพิวเตอร์ซึ่งห่างจากมนุษย์ ตัวอย่างก็เช่นพวก ภาษา Assembly ส่วน "High-level Language" หรือ "ภาษาระดับสูง"เป็นภาษาที่มีความใกล้เคียงกับภาษามนุษย์มาก เช่น ภาษา COBOL ภาษา BASIC ส่วนภาษา C และ C++ หลายๆคนอาจจะกำลังคิดว่ามันคือภาษาระดับสูง แต่จริงๆแล้ว C, C++ น่าจะเป็นภาษาที่อยู่ตรงกลางระหว่าง ภาษาระดับสูง หรืออาจจะพิจารณาว่ามันคือ ภาษาระดับกลาง หรือ "Mid-level language" นั่นเอง
         ระดับของภาษาที่กล่าวถึงนี้พิจารณา พิจารณาจากความห่างระหว่าง ภาษาโปรแกรมกับภาษาที่เครื่องคอมพิวเตอร์สามารถเข้าใจได้ ว่าห่างกันมากแค่ไหนซึ่งไม่เกี่ยวกับว่ามันมี ความสามารถหรือความยาก-ง่าย ในการเรียนรู้มัน หรือ ความ ยาก-ง่าย ในการใช้งาน
        ภาษาโปรแกรมต่างๆ ต่างมีจุดขแข็งและจุดด้อยที่แตกต่างกันออกไป เช่น ภาษา BASIC ใช้ง่าย แต่ก็มีจุดอ่อนด้านความยืดหยุ่น(flexible) และ ประสิทธิภาพ(powerful) อื่นๆ เช่น Assembly อาจมีประสิทธิภาพมาก แต่ ใช้ยาก ภาษา C, C++ น่าจะอยู่ตรงกลางคือ มีประสิทธิภาพ(ในระดับหนึ่ง แต่ไม่เท่า Assembly) และ ก็เขียนง่าย(ในระดับหนึ่งแต่ไม่เท่า ภาษาBASIC) 
        ภาษาโปรแกรมแต่ละภาษาก็มีวัตถุประสงค์(ในใจ) ต่างกันออกไป FORTRAN ถูกอกแบบมาเพื่อเพื่อเฉพาะกับการเขียนโปรแกรมเชิงคณิตศาสตร์ (Mathematical Programming) BASIC ถูกออกแบบมาเพื่อให้ง่ายในการสอนเขียนโปรแกรม และ COBOL ถูกออกแบบมาเพื่องานทางธุรกิจ (Business Applications) แต่ C++ ออกแบบมาเพื่อจุดประสงค์ทั่วไป(General Purpose)  เช่น เพื่อ งานด้านธุรกิจ(Business Applications), telecommunications programming, ปัญญาประดิษฐ์(Artificial Intelligence), Games programming, และอื่นๆอีกมากมาย นี่เป็นเหตุผลหนึ่งที่คุณครูมักจะเลือกภาษา C++ ในการสอนนักเรียน เพราะสามารถนำไปใช้งานได้หลากหลาย
        ในทางธุรกิจ การโปรแกรม(Programming) มักถูกอ้างถึงในเรื่องการประมวลผลข้อมูล, เทคโนโลยีสารสนเทศ(IT), อื่นๆ  ข้อมูลต่างๆนั้นอาจจะเป็นข้อมูล ลูกจ้าง หรืออาจจะแบ่งเป็น การคำนวณเชิงคณิตศาสตร์(Mathematical Computation) ข้อมูลเชิงวิทยาศาสตร์(Scientific Data) รวมไปถึง ข้อมูลต่างๆที่เป็นองค์ประกอบของเกมส์
        เป้าหมายสุดยอดของการโปรแกรมคือ เพื่อที่จะเก็ยข้อมูล จัดการ(Manipulate) และ เรียกค้นคืน(Retrieve)ข้อมูล ข้อมูลจะต้องถูกเก็บอย่างชั่วคราวก่อนในโปรแกรมก่อน เพื่อที่จะถูกจัดการต่อไป การจัดเก็บต่างๆเหล่านี้ เราสามารถทำได้โดยผ่านตัวแปร(Variables)
        ตัวแปร เปรียบเสมือน พื้นที่ๆหนึ่ง บนหน่วยความจำ(Memory)  ที่จะเก็บข้อมูลที่เป็นชนิดต่างๆกัน (int, float, double, ...)บนหน่วยความจำของคอมพิวเตอร์ในส่วนที่เป็นหน่วยความจำที่คอมพิวเตอร์จัดไว้ให้โดยเฉพาะ และที่มันเรียกว่าเป็น ตัวแปร (Variable) นั่นก็เพราะว่า ค่านั้นสามารถเปลี่ยนแปลงได้ เมื่อประกาศตัวแปรนั้นหมายถึงว่า คุณกำลังกำหนดพื้นที่เล็กๆของ Memory ของคอมพิวเตอร์เพื่อวัตถุประประสงค์ในการจะจัดเก็บข้อมูล
        ชื่อตัวแปร จะเหมือนป้ายบอกว่า พื้นที่ที่กำหนดไว้นั้นอยู่ที่ address ไหนบน Memory( ชื่อที่อ้างถึงตำแหน่งใน Memory ของคอมพิวเตอร์นั้นเอง)


        คุณอาจสามารถประกาศตัวแปลได้ตามนี้                    
                                           
                  int i;


   หลังจากบรรทัดนี้ คุณได้จองพื้นที่บน Memory  ทั้งหมด 4 ไบท์(Bytes) และคุณใช้ตัวแปรที่ชื่อว่า i อ้างถึงพื้นที่ 4 ไบท์เหล่านี้ และคุณกำลังบอกว่า ชนิดของตัวแปรที่ i นี้สามารถเก็บได้คือชนิดอะไร (ในที่นี้ ประกาศว่า i มีชนิดเป็น int, int คือชนิดข้อมูลประเภทจำนวนเต็มที่ใช้ทั้งหมด 4 bytes หรือ 32 bits ในการเก็บ) ทีนี้เมื่อคุณอ้างถึงตัวแปรที่ชื่อ i ในการเขียนโปรแกรม ก็จะหมายถึงค่าที่กำลังถูกเก็บไว้ใน Memory นี้ที่ได้จองไว้แล้วเท่านั้น!

        คราวนี้เรามาดูกันว่า ชนิดของตัวแปรคืออะไร ข้อมูลในภาษา C++ นั่นมาในรูปแบบชนิดที่แตกต่างกัน บางข้อมูลประกอบด้วยตัวเลข บางข้อมูลประกอบด้วยตัวอักขระ ... ภาษาโปรแกรมจะรู้จำเฉพาะชนิดข้อมูลที่แน่นอนเท่านั้น หรือ ก็คือ ประเภทของข้อมูลนั้นเอง
        ชนิดข้อมูลพื้นฐานที่ C++ รู้จำได้จะแสดงในตารางด้านล่างนี้ (นอกจากนั้นยังมีชนิดข้อมูลที่นอกเหนือจากนี้ที่จะอธิบายให้ฟังในหัวข้ออื่น)



        สำหรับชนิดข้อมูลให้เลือกชนิดข้อมูลที่ สมเหตุสมผลกับข้อมูลที่เราจะเก็บจริงๆ อย่างเช่น เราประกาศตัวแปร int เพื่อที่จะเก็บอายุของคนในรูปจำนวนเต็ม แต่ในความเป็นจริง int นั่นขนาดมากมายเกินที่จะอายุคน (เก็บได้แต่มันเปลือง Memory) เราใช้เพียง short ก็พอแล้ว นอกจากนั้น ถ้าต้องการเก็บจำนวนเงิน, เกรดเฉลี่ย หรือ อุณหภูมิ อาจจะใช้ float ในการเก็บ แต่หากจะเก็บข้อมูลเกี่ยวกับ ดาราศาสตร์ ซึ่งเป็น  decimal ที่มีตัวเลขมาก ต้องการความละเอียดสูงๆ อาจจะใช้ double เพราะฉะนั้นให้เราเลือก ชนิดข้อมูลที่เหมาะสม
       เพิ่งเติมจากการพิจารณาชนิดข้อมูลแล้ว เรายังต้องสนใจการใช้ชื่อตัวแปรอีกด้วย กฏต่อไปนี้เป็นกฏการตั้งชื่อตัวแปรเฉพาะภาษา C++ เท่านั้น 
            1. ชื่อตัวแปร จะต้องขึ้นต้นตัว ตักอักษร หรือ _ เท่านั้น (ห้ามขึ้นต้นด้วยตัวเลข หรือ ลักญลักษณ์อื่นๆ %, ^, ( ...)
            2. ภายในชื่อ(รวมตัวเริ่มต้น) อาจจะเป็นตัวใหญ่หรือตัวเล็กก็ได้ หรืออาจจะเป็น ตัวเลข หรือ _ ก็ได้
            3. ภาษา C++ เป็น Case sensitive นั่นคือ ตัวอักษรตัวใหญ่ และ ตัวเล็ก ไม่เหมือนกัน(เช่น mY_var กับ my_var ไม่เหมือนกัน)
        นอกจากนั้นแล้ว การตั้งชื่อตัวแปรควรตั้งให้สื่อความหมาย การตั้งไม่สื่อความหมาย แม้ว่า Compiler จะยอมให้ผ่านไปได้ แต่หาก มันก็จะเป็นการยากในการอ่าน Source Code ของโปรแกรมเรา หรือยากในการตรวจข้อผิดพลาดต่างๆด้วย เช่น หากคุณตั้งชื่อตัวแปรสำหรับเก็บเลขบัญชี ไม่ควรตั้งชื่อว่า x หรือ y แต่ควรตั้งให้สื่อความหมาย เช่น acctnum หรือ account_number เป็นต้น เหนือไปกว่านั้นอีก มีนักเขียนโปรแกรมบางคนใช้ ตัวอักษรนำหน้าเพื่อนแสดงถึงชนิดตัวตัวเอง เช่น

          int iacctnum; เพื่อสื่อความหมายให้รู้ว่า iacctnum นี้มีชนิดเป็น int (i ขึ้นต้น)
     float fdistance_between_2planets;  ... ในทำนองเดียวกัน

        การประกาศตัวแปรที่แสดงให้เห็นที่ผ่านมาแล้วนั่น คุณอาจจะกำลังสงสัยถึง ; (semi-colon) ที่อยู่สุดท้ายก่อนจบประโยค ในแต่ละ Statement ของ ภาษา C++(รวมถึง ภาษา อื่นๆ ส่วนใหญ่ด้วยเช่น Sun java, C ) ก็จบประโยค(Statement) ด้วย ; 
        Semi-colon บอก Compiler ว่า คุณได้เขียนสิ้นสุดประโยค(Statement)นี้แล้ว 
        ประโยค (Statement)  เป็น 1 บรรทัด ในความเข้าใจของ Compiler ที่จะทำงานบางอย่างที่คุณเขียน
        การให้ค่าเริ่มต้น(Initialization)กับตัวแปร ทำได้โดยการให้ค่า( assign ) ค่าให้กับตัวแปรในบรรทัดที่ประกาศนั้นเลย เช่น 
      
    int iacctnum = 528400156;
    int count    = 0;

    เป็นต้น

          Statements and Expressions
      จากที่เราได้ดูมาแล้วนั้นประโยค(Statement) หรือเราเรียกอีกชื่อหนึ่งได้ว่า Expression ซึ่งมันคือ งานงานหนึ่งที่ทำ อาจจะเป็นเช่น บวกเลข เปรียบเทียบเลขสองตัว ... อื่นๆ ซึ่งแต่ละงานอย่างลืมว่าจะจบด้วย  semi-colon และสำหรับข้อผิดพลาดนักเขียนโปรแกรมมือใหม่ อาจจะเป็นการลืมใส่ semi-colon นั่นเอง
          ตัวดำเนินการ (Operator)
          ตัวดำเนินการ (Operator) คือ สัญลักษณ์ง่ายๆที่ทำงานบางอย่าง โดยส่วนใหญ่ จะเป็น ตัวดำเนินการทางคณิตศาสตร์ เช่น + , - , x , / เป็นต้น C++ สนับสนุนตัวปฏิบัติการมากมายหลายตัวที่คุณควรที่จะคุ้นเคยกับมัน ตารางด้านล่างนี้คือตารางแสดงตัวปฎิการต่างๆที่ C++ สนับสนุน

Operator
Purpose
Example
+
สำหรับการบวกเลขสองจำนวนเข้าด้วยกัน
int ans; ans = 3 + 2;
-
สำหรับการลบเลขสองจำนวนเข้าด้วยกัน
int ans; ans = 3 - 2;
*
สำหรับการคูณเลขสองจำนวนเข้าด้วยกัน
int ans; ans = 3 * 2;
/
สำหรับการหารเลขสองจำนวนเข้าด้วยกัน
float ans; ans = 3 / 2;
++
สำหรับเพิ่มค่าตัวแปร 1
ans++;
--
สำหรับลดค่าตัวแปร 1
ans--;
=
สำหรับการให้ค่า(Assignment
นำค่าด้านขวามือของตัวปฏิบัติการนี้ใส่ให้กับ ตัวแปรทางด้านซ้ายมือ
ans = 3 * 2;
==
เครื่องหมายเปรียบเทียบค่าทางขวากับทางซ้าย ว่า เท่ากันหรือไม่ (ถ้าเท่ากันจะเป็นจริง(True) ถ้าไม่เท่ากันจะเป้นเท็จ(False))
if (x == 3) ans = 1;
!=
เครื่องหมายเปรียบเทียบค่าทางขวากับทางซ้าย ว่า ไม่เท่ากันหรือไม่ (ถ้าไม่เท่ากันจะเป็นจริง(True) ถ้าเท่ากันจะเป้นเท็จ(False))
if (x != 3) ans = 0;
<=. >=
เครื่องหมายเปรียบเทียบค่าทางขวากับทางซ้าย ว่า น้อยกว่าเท่ากับ(<=) (ถ้าน้อยกว่าหรือเท่ากับจะเป็นจริง(True) ถ้ามากกว่าจะเป็นเท็จ(False))
อีกอันก็ในทางตรงกันข้าม
If (age >= 18) ans = 0;
If (age <= 20) ans = 1;
<,>
เครื่องหมายเปรียบเทียบค่าทางขวากับทางซ้าย ว่า น้อยกว่า(<=) (ถ้าน้อยกว่าจะเป็นจริง(True) ถ้ามากกว่าหรือเท่ากับจะเป็นเท็จ(False))
อีกอันก็ในทางตรงกันข้าม
If (age > 17) ans = 0;
If (age < 21) ans = 1;
+=
เครื่องหมาย บวก แล้ว จึงให้ค่า (Add then assign)
ans += 5;
-=
เครื่องหมาย ลบ แล้ว จึงให้ค่า (Subtract then assign)
ans -= 5;
||
ตัวปฏิการทางตรรกศาสตร์ “หรือ”
If(ans > 5 || ans < -2)
&&
ตัวปฏิการทางตรรกศาสตร์ “และ”
If(ans > 5 && ans < -2)
>> 
Bitwise shift to the right
3<<2
<< 
Bitwise shift to the left
3>>2
&
Bitwise and
3&2
|
Bitwise or
3|2

        ข้อควรระวัง : การใช้ --(decrease operator), ++(increase operator) ถ้า เครื่องหมายดังกล่าวอยู่ด้านหน้าตัวแปร โปรแกรมจะทำการ เพิ่มหรือลด ค่าก่อนจึงจะทำงานอย่างอื่นต่อ เช่น
     
        int x = 5, ans1, ans2, ans3, ans4;
   ans1 = x++;      //ให้ค่า ans1 ก่อนจึงเพิ่มค่า x ไป 1
   ans2 = x;
   ans3 = ++x;      //เพิ่มค่า x ก่อนจึงให้ค่า ans3
   ans4 = x;
   ค่าที่เก็บในตัวแปร ans1 จะเป็นเท่าไร? คำตอบคือ 5
   ค่าที่เก็บในตัวแปร ans2 จะเป็นเท่าไร? คำตอบคือ 6

   ค่าที่เก็บในตัวแปร ans3 จะเป็นเท่าไร? คำตอบคือ 7
   ค่าที่เก็บในตัวแปร ans4 จะเป็นเท่าไร? คำตอบคือ 7

   
   นอกจากนี้แล้ว เครื่องหมายทางคณิตศาสตร์ต่างๆ ลำดับความสำคัญก็ถูกนิยามเหมือนใน วิชาคณิตศาสตร์นั้นคือ ทำ คูณก่อนจึงหาร แล้วจึงบวก แล้วจึงลบ ตามลำดับ และจากซ้ายไปขวา 
   
   สำหรับ ตัวดำเนินการที่ต้องการ operand 1 ตัว เราจะเรียกว่า unary operator เช่น 
-5, -4, -x, x++, --x เป็นต้น ส่วนตัวดำเนินการที่ต้องการ operand 2 ตัวเรียกว่า binary operator เช่น x + 3, 5 < 3, x = 4 เป็นต้น


   *Operand คือตัวที่นำมาทำการดำเนินการตาม operator เช่น x + 5;
   + เป็น operator ส่วน x และ 5 เป็น operand


(ยังไม่จบ)

วันพฤหัสบดีที่ 16 มิถุนายน พ.ศ. 2554

[Theory of Computation-02] Automata: The method and the madness

     เป็นการศึกษาเกี่ยวกับ เครื่องคำนวณแบบนามธรรม (Abstract Computing Devices) เนื่องจากมันเป็นนามธรรมจับต้องไม่ได้ เราจึงมาเรียน Turing Machine (TM) ซึ่งเป็น โมเดล ของคอมพิวเตอร์ที่ใช้อยู่ในปัจจุบัน แต่ก่อนที่เราจะศึกษา TM เราต้องรู้จักกับ Put Down Automata(PDA) และก่อนที่จะรู้จัก PDA เราจะต้องรู้จักกับ Finite Automata (FA)

     FA  --->  PDA  --->  TM

      ทำไมต้อง? Turing Machine
      เพราะจะได้รู้ว่าคอมพิวเตอร์นั้นทำงานอย่างไร

      คอมพิวเตอร์ปัจจุบันมีสถาปัตยกรรม แบบ Von Neumann
      เราจะมองคอมพิวเตอร์เป็น 2 มุมคือ
           1. Structural(เชิงโครงสร้าง)
           2. Functional(เชิงหน้าที่การทำงาน) - ต้นแบบของหน้าที่การทำงานของคอมพิวเตอร์ คือ Turing Machine นั่นคือ เราอยากจะรู้ว่าเครื่องคอมพิวเตอร์ทำงานอย่างไร โดยผ่าน Turing Machine

ALAN TURING, 1930 คิดเครื่อง Turing Machine นี้ขึ้นมาเพราะอยากรู้ว่า คอมพิวเตอร์มีความสามารถมากน้อยแค่ไหน (คอมพิวเตอร์มีขอบเขตความสามารถอย่างไร)

โดยการใส่ปัญหา(Problem) ต่างๆเข้าไปในตัว Turing Machine และ เจ้า Turing Machine นี้ก็พบว่า มีทั้ง

           1. ปัญหาที่แก้ได้ (Decidable Problem)
           2. ปัญหาที่แก้ไม่ได้ (Undecidable Problem)

ทั้งสองข้อนั่นคือ ความสามารถในการแก้ปัญหาเราเรียกว่า = Decidability(ความสามารถในการแก้ปัญหา)

ต่อมา COOK ได้ศึกษาต่อจาก ALAN TURING แต่เขาสนใจเพียงแค่ Decidable Problem และพบว่าปัญหาที่แก้ได้นั้นแก้ได้อย่าง

           1. แก้ได้อย่างมีประสิทธิภาพ (Tractable Problem)
           2. แก้ได้อย่างไม่มีประสิทธิภาพ (Intractable Problem)

    1.แก้ได้อย่างมีประสิทธิภาพ คือ แก้ได้อย่างทันความต้องการ มีความเร็วในการแก้ไขปัญหาหรือเวลา Execution <= Polynomial(เช่น n^2) Time
    2.แก้ได้อย่างไม่มีประสิทธิภาพ คือ แก้ได้อย่างไม่ทันความต้องการ มีความเร็วในการแก้ไขปัญหาหรือเวลา Execution > Polynomial Time (เช่น Exponential, Factorial)

         ในขณะที่ ALAN TURING ได้คิดค้นตัว Turing Machine ที่เป็นโมเดลแล้ว ก็มี CHOMSKY คิดค้นภาษาที่เหมือนกับตัว Turing Machine ภาษาดังกล่าวคือ Recusively Enumerable Language ซึ่งเป็นภาษาที่ Turing Machine สามารถทำการ Recognize ได้ หรือก็คือ ALAN TURING คิดเครื่อง ส่วน CHOMSHY คิดภาษา ทั้งภาษาและเครื่องดังกล่าวมีความ Equivalent กัน
          Context-Free Language เป็นภาษาที่ถูกรู้จำโดย PDA
          Regular Language เป็นภาษาที่ถูกรู้จำโดย FA

          ทำไมถึงต้องเรียนวิชานี้(Why study automata theory?)
          1. Software Design
          2. Lexical analysis และ Parser
          3. Search Engine
          4. Verification (การทวนสอบ) - การตรวจสอบกับ Spec ว่าตรงกันหรือไม่

1.Finite Automata (FA)
  
* ในแต่ละ State ต้องใส่ชื่อ State ด้วย
เช่น ...  สถานะการเปิด/ปิดไฟ INPUT = PUSH
== Lecture on 16/6/2554 == 1 ชั่วโมง 30 นาที ==

เรื่องที่ต้องการรู้ ปูพื้นก่อนเข้าสู่เนื้อหาวิชา

        Introduction to formal proof


     1. Deductive proof คือการพิสูจน์โดย พิสูจน์จาก เหตุไปหาผล เช่น
  
        Theorem 1.3: If x >= 4 Then 2^x > x^2 --- TRUE
        
        Theorem 1.4: if x is the sum of the square of 4 positive integers then 2^x >= x^2


        1. x = a^2 + b^2 + c^2 + d^2                           กำหนดให้
        2. a >= 1, b >= 1, c >=1, d >= 1                        กำหนดให้
        3. a^2 >= 1, b^2 >= 1, c^2 >= 1, d^2 >= 1      2, คุณสมบัติของเลขคณิต
        4. x >= 4                                                            1, 3
        5. 2^x >= x^2                                                    Thorem 1.3


        คำที่ใช้ในการพิสูจน์ if ... then
        1. H Implies C
        2. H Only If C
        3. C IF H
        4. Whenever H Holds, C follows


       การพิสูจน์แบบก็ต่อเมื่อ ( <--> )
       1. IF part                         : if B then A
       2. Only-If part                 : if A then B

       Proof about sets (พิมสูจน์ว่า 2 เซตใดเท่ากัน) 
  
       ให้ E และ F เป็นเซตใดๆ


       1. Proof that if x E Then ∈ F
       2. Proof that if x ∈ F Then ∈ E


       2. Contrapositive


       if H then C
       if NOT C THEN NOT H
       
      3. Contradiction
      
      if H Then C
      if H Then NOT C              -- พิสูจน์อันนี้เป็นจริง แสดงว่า ข้อความที่ให้มาเป็นเท็จ !


      4. finding counterexamples
      
      หาตัวอย่าง อย่างน้อยที่สุด 1 เพื่อแย้วกับทฤษฏี ทฤษฎีที่มี counterexample จะเรียกว่า Alleged Theorem การพิสูจน์ว่าไม่เป็นจริงเรียกว่า Disproof


      5. Inductive proof

      เราจะพิสูจน์ S(x)       


      1. พิสูจน์ Basic Step  S(ตัวที่เล็กที่สุด) เป็นจริง
      2. พิสูจน์ Inductive Step  พิสูจน์ IF S(n) Then S(n+1) เป็นจริง


      เทคนิค พยายามแยก พจน์ที่ n+1 ออกมาจาก n ***


      ตัวอย่าง
      พิสูจน์ 
      
      
        The central concept of Automata theory
      Theory 

  1. Language แทนด้วยสัญลักษณ์ ∑*
  2. Alphabet ∑ = {A, B, C ..., Z} Set ของ Alphabet ภาษาอังกฤษ 
  3. String ที่เกิดจากการเอา Alphabet มาต่อกัน เช่น COM 
          S = String
         |S| = 0 คือ Empty String(Ɛ หรือ แรมด้า)
 
ถ้าให้ ∑ = {0, 1}


    |S| = 0 , 0  | มีสมาชิก 1 ตัว
     |S|  =  1 , 1  | {0, 1}
     |S|  =  2 , 2  | {00, 01, 10, 11}
      .              .
      .              .
      .              .
    ∑* = U U U ... = {Ɛ, 0, 1, 00, 01, 10, 11, 000, ...} 
     ∑*  =  U {Ɛ}



วันจันทร์ที่ 30 พฤษภาคม พ.ศ. 2554

เริ่มเขียนบล็อค

              จริงๆ เขียนไปงั้น ไม่น่าจะมีคนอ่านมากเท่าไหร่ แต่ก็เขียนไว้ เผื่อจะได้ไม่ลืมความรู้เก่าๆที่ได้เรียนมา ตั้งแต่ปี 1 (ช้าไปไหมเนี่ย) ตอนเริ่มเขียนบล็อคนี้่ก็ 12/06/2554 ตอนประมาณเที่ยงครึ่งพอดี(12.32) เนื้อหาในบล็อคอาจจะถูกบ้างผิดบ้าง แต่ก็จะพยายามแก้ไขไปเรื่อยๆ ถ้าใครเกิดเห็นข้อผิดพลาด หรืออยากจะเสนอแนะอะไรเพิ่มเติมก็ ส่งเมล์มาคุยกันนะครับ gagkung@gmail.com

              พิมพ์มาตั้งนาน งงละสิ ว่าบล็อคนี้จะเขียนเกี่ยวกับอะไร เนื่องจากผมเรียนสายคอม (คณะวิทยาศาสตร์ฯ เอกวิทยาการคอมพิวเตอร์ ) ผมก็จะเขียนเกี่ยวกับ การเขียนโปรแกรมต่างๆ ความรู้เกี่ยวกับคอมพิวเตอร์ต่างๆ  เพื่อจะได้เป็นสมุดจกบันทึกสำหรับตัวเอง และ อาจจะเป็นความรู้ให้กับคนที่กำลังเริ่มศึกษา

                                                                                                                        แก๊กคุง
12/6/2554