2011/08/24

Object Pascal - ตัวแปร

สวัสดีครับ กลับมาเจอกันอีกเช่นเคย จนถึงตอนนี้ ผมขอขอบคุณเพื่อน ๆ พี่ ๆ น้อง ๆ ทุกคนที่เข้ามาอ่านนะครับ
ถึงจะมีไม่กี่คนก็เถอะ :)

ก่อนอื่นเลยผมขอเฉลยการบ้านของเมื่อวานก่อนนะครับ

1) โจทย์คือให้พิมพ์ชื่อของตนเองลงไป ก็ง่าย ๆ ครับ จัดยัดลงใน Write หรือ Writeln ได้เลยครับ
แล้วก็อย่าลืมใส่ Readln; ต่อท้ายด้วยนะครับ ^-^


2) ข้อนี้ก็ไม่มีอะไรครับ ใช้ Writeln 3 ตัวก็ได้แล้วครับ



เป็นไงบ้างครับ ไม่ยากเลยใช่ไหม

ก่อนจะเริ่มในส่วนของวันนี้ พอดีมีคนถามมาว่า มีโปรแกรมอื่นที่ใช้แทน Delphi ได้ไหม
     มีครับ เป็นโปรแกรมฟรี ก็คือ Lazarus ครับ โหลดได้จากเว็บของ Free Pascal ครับ

สำหรับการสร้าง Project ใน Lazarus นะครับ ให้สร้างแบบ Program ธรรมดา ไม่ต้องสร้างแบบ Console Application นะครับ เพราะมันเป็นคนละแบบกัน



ส่วน Source Code ที่มันเขียนมาให้ ก็ไม่ต้องไปสนใจครับ ให้เขียน Code ของเราในส่วนของ begin - end. ก็พอครับ ลองดูในรูปนะครับ



เอาละครับ มาถึงหัวข้อในวันนี้กันครับ
วันนี้เราจะมาเรียนเรื่อง ตัวแปร กันครับ
แล้วตัวแปรมันคืออะไรหล่ะ
     ตัวแปร (Variable) ก็คือตัวเก็บข้อมูลครับ คงจะเคยเจอกันในคณิตแล้ว เช่น ตัวแปร x, y, z อะไรทำนองนั้น
     แต่ตัวแปรในการเขียนโปรแกรมจะต้องกำหนดชนิดของตัวแปร เช่น จำนวนเต็ม จำนวนจริง ข้อความ ตัวอักษร ฯลฯ
     ตัวแปรแต่ละชนิดจะเก็บข้อมูลต่างชนิดไม่ได้นะครับ เช่นประกาศตัวแปรให้เก็บจำนวนเต็ม จะไปเก็บจำนวนจริง (จำนวนที่มีทศนิยม) ไม่ได้ นอกจากจะแปลงค่าจำนวนจริงให้เป็นจำนวนเต็มก่อน (เช่น ปัดทศนิยมขึ้น หรือตัดทศนิยมทิ้ง)
    รูปแบบการประกาศตัวแปรในภาษา Object Pascal ก็ไม่ยากครับ ลองมาดูกันเลยครับ

รูปแบบคือ

var
  Var_Name: Var_Type;

ลองดูตัวอย่างกันครับ


     จากในรูปนะครับ เมื่อเราจะประกาศตัวแปร เราจะต้องประกาศคำว่า var ก่อน เพื่อบอกว่า จะประกาศตัวแปรแล้วนะ
     จากบรรทัดที่ 9 นะครับ ผมกระกาศว่า Num: Integer; ซึ่งก็คือ ประกาศตัวแปรที่ชื่อว่า Num ให้เป็นชนิด Integer (จำนวนเต็ม) บรรทัดที่ 10 คือ ประกาศตัวแปร 2 ตัว ชื่อว่า Str1 กับ Str2 เป็นชนิด string (ข้อความ)
     ส่วนบรรทัดที่ 11 จะเห็นว่า ผมประกาศตัวแปรชื่อว่า Sum เป็น จำนวนจริง แล้วกำหนดค่าเริ่มต้นให้กับตัวแปรเป็น 0
    เมื่อประกาศตัวแปร ก่อนการใช้ตัวแปร เราจะต้องกำหนดค่าให้กับตัวแปรก่อนเสมอ
    เพราะว่า เมื่อมีการประกาศตัวแปร จะมีการจองหน่วยความจำขึ้นมา ซึ่งหน่วยความจำนั้นอาจจะมีข้อมูลเก่าอยู่ที่เป็นค่าอะไรก็ไม่รู้

    แล้วมันมีชนิดของตัวแปร (Variable Type) อะไรบ้างหล่ะ
    ถ้าจะแบ่งออกเป็นกลุ่มใหญ่ ๆ จะแบ่งได้เป็น จำนวนเต็ม, จำนวนจริง, อักขระ (ตัวอักษร 1 ตัว), สายอักขระ (ข้อความ / ตัวอักษรหลายตัว), ค่าทางตรรกศาสตร์ (จริงกับเท็จ)

     แล้วแต่ละกลุ่มยังมีการแบ่งย่อยออกไปอีกตามขนาดของหน่วยความจำที่ใช้
   ตัวอย่างเช่น
     Integer ใช้หน่วยความจำ 4 byte เก็บตัวเลขได้ตั้งแต่ -2,147,483,648 จนถึง 2147483647 หรือก็คือ 2^31 ถึง 2^31-1 นั้นเอง ที่ต้อง -1 เพราะว่ารวมเลข 0 เข้าไปในค่าบวกด้วย
     แต่ถ้าไม่ต้องการจำนวนที่ติดลบหล่ะ เช่นต้องการเก็บจำนวนนักเรียน มันไม่มีทางติดลบแน่ ๆ มันก็มีตัวแปรอีกแบบครับ ก็คือตัวแปรแบบ unsigned หรือก็คือ ตัวแปรที่ไม่คิดเครื่องหมาย
     ใน Object Pascal เรียกตัวแปร Integer ที่ไม่คิดเครื่องหมายว่า Cardinal ใช้ 4 byte เหมือนกันครับ เก็บข้อมูลได้ตั้งแต่ 0 ถึง 2^32-1 หรือก็คือ 0 ถึง 4,294,967,295 นั้นเอง

เอาหล่ะครับ ลองมาดูชนิดตัวแปรแบบต่าง ๆ กันครับ



ในรูปเป็นตัวอย่างคร่าว ๆ นะครับ

     ต่อไปคือ กฎการตั้งชื่อตัวแปรครับ เท่าที่ผมจำได้
          เอ๊ะ เดี๋ยวนะ นี่แสดงว่ามั่วเองหมดเลยหล่ะสิ
               ผมลืมบอกไปครับว่า ขณะที่ผมเขียนบทความ ผมไม่ได้เปิดหนังสือนะครับ เขียนตามที่จำได้ ช่วนค่าที่ตัวแปรเก็บได้ ผมใช้คำสั่งเรียกดูเอาครับ ไม่ได้มั่วขึ้นมาเอง (จริง ๆ นะ)

    กฎ ก็ไม่มีอะไรมากครับ ผมขอเขียนเป็นข้อ ๆ ตามนี้เลยครับ
        1) ตัวอักษรตัวแรกต้องเป็นภาษาอังกฤษตัวพิมพ์เล็ก พิมพ์ใหญ่ หรือ underscore ( _ ) เท่านั้น ห้ามขึ้นต้นด้วยตัวเลข
        2) ตัวอักษรอื่น ๆ ที่ไม่ใช่ตัวแรก จะเป็นภาษาอังกฤษพิมพ์เล็ก พิมพ์ใหญ่ underscore หรือ ตัวเลข เท่านั้น ห้ามใช้อักขระพิเศษ เช่น / \ | & ^ % $ # @ ! + - = * ฯลฯ
        3) ชื่อตัวแปรต้องห้ามซ้ำกับคำสงวนในภาษา Object Pascal เช่น program begin end var for if else then do while repeat until คำสงวนก็คือคำที่พิมพ์แล้วมันจะเด่นกว่าตัวอื่นครับ ดูไม่ยาก ;)
        จริง ๆ ก็น่าจะมีแค่นี้นะครับ แต่เหมือน Delphi เวอร์ชันใหม่ ๆ จะรองรับภาษาอื่น ๆ ที่ไม่ใช่ภาษาอังกฤษด้วย เช่นประกาศชื่อตัวแปรว่า var ตัวนับ: Integer; สามารถใช้ได้ครับ

ต่อไปมาดูการกำหนดค่าให้กับตัวแปรกันครับ
     เราสามารถกำหนดค่าให้กับตัวแปรตอนประกาศได้ครับ แต่ต้องเป็นการประกาศ 1 ตัวเท่านั้น เช่น



จากภาพจะเห็นว่า เราประกาศตัวแปร A เป็น Integer แล้วกำหนดค่า เป็น 10 แบบนี้ได้ครับ แต่บรรทัดที่เขียนว่า C, D: Integer = 9; แบบนี้ไม่ได้นะครับ ต้องกำหนดค่าให้กับตัวแปรเพียงตัวเดียวเท่านั้น

เครื่องหมายกำหนดค่า ( := )
     เครื่องหมายนี้คือการเอาค่าขวามือ ไปกำหนดให้กับตัวแปรทางซ้ายมือ เช่น



   จากรูปนะครับ จะเห็นว่า เราให้ A เป็น 10 ให้ B เป็น A + 20 ก็คือ 10 + 20 = 30 นั้นเอง แล้วก็ให้ C เป็น B + A = 30 + 10 = 40

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


    ในภาพคือตัวอย่างโปรแกรมคำนวณพื้นที่วงกลม โดยการรับค่ารัศมี แล้วคำนวณจากสูตร พาย อาร์ กำลังสอง นั้นเอง
    แต่เมื่อรันแล้วใส่ตัวเลขลงไป คำตอบมันออกมาแปลก ๆ


    อ่าว ทำไมมันออกมาเป็น 1.32665000000000E+0002 หล่ะ มันคืออะไร ?
        มันก็คือ 1.32665 * 10^2 นี่เองครับ อย่าตกใจ
    แล้วจะให้มันแสดงผลแบบที่อ่านง่าย ๆ จะทำยังไงหล่ะ ?
        ต้องกำหนดค่าจำนวนทศนิยมให้มันครับ วิธีก็แสนง่าย



    เปลี่ยนจากแสดง A ไปเป็น A:0:2
    แล้วมันคืออะไรหล่ะ ?
    มันจะมีค่า 2 ตัวครับ จากตัวอย่าง ตัวแรกคือเลข 0 หมายถึง ให้กำหนดช่องว่างเพื่มให้พอดี 0 ช่อง ตรงนี้ผมคิดว่าอย่าพึ่งไปสนใจมันเลยครับ เรามาดูตัวหลังดีกว่า เลข 2 ข้างหลังหมายถึง ให้แสดงทศนิยม 2 ตำแหน่งนั้งเอง ลองรันดูใหม่ครับ เราจะได้คำตอบออกมาเป็น 132.66

ถึงตรงนี้แล้วผมคิดว่า ผู้อ่านคงจะงงกันไม่น้อย ขนาดผมเขียนเองยังงงเองเลยครับ ;)

แต่ยังไงผมก็จะฝากการบ้านไว้นะครับ อย่าลืมทำกันด้วยหล่ะ
3) จงเขียนโปรแกรมรับค่ารัศมี แล้วคำนวนหาเส้นรอบวงของวงกลม ให้ใช้สูตร เส้นรอบวง = 2 * พาย * r
4) จงเขียนโปรแกรมรับค่าชื่อผู้ใช้ แล้วแสดงข้อความว่า Hello, ชื่อที่รับเข้ามา.
   เช่น พิมพ์ชื่อไปว่า Acoshift
   ให้แสดงผลออกมาเป็น Hello, Acoshift.
   ( มี . ข้างหลังด้วยนะครับ เพื่อเพิ่มความยาก )

บทนี้อาจจะยากสักหน่อย แต่ขอให้พยายามลองเขียนดูครับ เขียนมั่ว ๆ ดูได้ครับ คอมไม่พังหรอก ^-^
ถ้ามีข้อสงสัยอะไรยังไงก็ส่งเมลมาถามผมได้นะครับที่ acoshift(at)gmail.com ผมจะรีบตอบกลับทันที่ที่เห็นเมลนะครับ

ไว้เจอกันบทความหน้าครับ

No comments:

Post a Comment