วันอาทิตย์ที่ 15 พฤษภาคม พ.ศ. 2554

เริ่มต้นการเขียนโปรแกรมภาษา C ตอนที่ 3

มาถึงตอนที่ 3 กันแล้ว ในการทบทวนภาษา C เบื้องต้น จากตอนที่แล้ว ได้ทวนเรื่อง ฟังก์ชั่นที่ภาษา C ได้เตรียมไว้ให้เรา ในตอนนี้เราจะมีมาสร้างฟังก์ชั่นเอง หรือ ฟังก์ชั่นย่อย กันนะ! 


ทำไมเราถึงต้องสร้างฟังก์ชั่นเอง ?
ก็เพราะว่าในการเขียนโปรแกรมแต่ในครั้ง หากเราทำคำสั่งนั้น ซ้ำๆกัน จะทำให้โปรแกรมที่เราเขียน ย๊าวววววววว เกินไป ทำให้ลำบากต่อการแก้ได้ เช่น


main()
     {
     while(TRUE)
      {
      output_high(PIN_A0);
      delay_ms(1000);
      output_low(PIN_A0);
      delay_ms(1000);
     output_high(PIN_A1);
      delay_ms(1000);
      output_low(PIN_A1);
      delay_ms(1000);
     output_high(PIN_A2);
      delay_ms(1000);
      output_low(PIN_A2);
      delay_ms(1000);
     output_high(PIN_A3);
      delay_ms(1000);
      output_low(PIN_A3);
      delay_ms(1000);
    }
     }

แบบนี้ ยาววไหมล่ะ อย่างในตัวอย่างด้านบนนี้ เป็นการเขียนโปรแกรมสั่ง Output ของทาง Port A0 - A3 โดยหน่วงเวลาขาล่ะ 1 วินาที โดยเป็นคำสั่งใน CCS C นะ ไม่ต้องตกใจ

เราสามารถใช้การสร้าง ฟังก์ชั่นเพื่อลดบรรทัดของโปรแกรมใน main ได้ มีรูปแบบอย่างนี้

รูปแบบ

ชนิดฟังก์ชั่น ชื่อฟังชั่น (ตัวแปรพารามิเตอร์)
     {
          คำสั่ง;
          return ;
     }

ชนิดฟังก์ชั่น = ข้อมูลที่ใช้ในการ ส่งค่ากลับ(return) หากไม่ได้มีการส่งค่ากลับจะใช้ void
ชื่อฟังชั่น = ชื่อฟังชั่น มีกฎการตั้งชื่อแบบเดียวกับตัวแปร
ตัวแปรพารามิเตอร์ = ตัวแปรที่นำเข้ามาในฟังก์ชั่น
คำสั่ง = ชุดคำสั่งในการทำงาน
return = ใช้ในการส่งค่ากลับ main ถ้าไม่มีการส่งค่ากลับก็ไม่ต้องมี

ตัวอย่าง

void PortA_blink(void)
     {
      output_high(PIN_A0);
      delay_ms(1000);
      output_low(PIN_A0);
      delay_ms(1000);
      output_high(PIN_A1);
      delay_ms(1000);
      output_low(PIN_A1);
      delay_ms(1000);
      output_high(PIN_A2);
      delay_ms(1000);
      output_low(PIN_A2);
      delay_ms(1000);
      output_high(PIN_A3);
      delay_ms(1000);
      output_low(PIN_A3);
      delay_ms(1000);
     }

main()
     {
     while(TRUE)
      {
        PortA_blink();
      }
     }

จากตัวอย่าง เราสร้างฟังก์ชั่นย่อยที่มีชื่อว่า PortA_blink เพื่อแสดง Output ของ Port A เราสามารถใช้ฟังก์ชั่นนี้ใน main ได้ ทำให้โปรแกรมหลัก(main) เหลือน้อยลงได้

ในกรณีที่เราต้องการสร้าง ฟังก์ชั่นย่อย ไว้ด้านล่างโปรแกรมหลัก(main) เราจำเป็นที่จะต้องประกาศต้นแบบ (Prototype) ไว้ด้านบนของโปรแกรมหลัก ดังนี้


void PortA_blink(void);                  // ประกาศ Prototype ของ ฟังก์ชั่นย่อย

main()
     {
     while(TRUE)
      {
        PortA_blink();
      }
     }



void PortA_blink(void)
     {
      output_high(PIN_A0);
      delay_ms(1000);
      output_low(PIN_A0);
      delay_ms(1000);
      output_high(PIN_A1);
      delay_ms(1000);
      output_low(PIN_A1);
      delay_ms(1000);
      output_high(PIN_A2);
      delay_ms(1000);
      output_low(PIN_A2);
      delay_ms(1000);
      output_high(PIN_A3);
      delay_ms(1000);
      output_low(PIN_A3);
      delay_ms(1000);
     }

แล้วการส่งค่ากลับคืออะไร งง ???
การส่งค่ากลับก็คือการนำตัวแปรเข้ามากระทำใน ฟังก์ชั่นย่อย แล้วส่งค่ากลับไปใน main เช่น การนำเลขมาบวกกัน หรือสูตรทางคณิตศาสตร์

ตัวอย่าง


int Add_number(int a,int b)
     {
           int sum;
           sum = a+b;
           return sum;
     }

main()
     {
           printf("/fSum = %d",Add_number(5,7));
     }

จากฟังก์ชั่นย่อย มีการนำค่าของ a มาบวกกับ b แล้วส่งค่าออกไปเป็น int ทำให้ Add_number เป็น int ตัวหนึ่ง ที่มีค่าเท่ากับ sum แล้วนำมาแสดงในโปรแกรมหลัก ในตัวอย่างก็คือนำเลข 5 + 7 = 12 ก็จะแสงข้อความว่า             " Sum = 12 "    ถ้าต้องการเป็นชนิดข้อมูลอื่นเช่น float ก็สามารถเปลี่ยนได้ เช่น



float Add_number(int a,int b)
     {
           int sum;
           sum = a+b;
           return sum;
     }

main()
     {
           printf("/fSum = %f",Add_number(5,7));
     }



พอเข้าใจกันนะ ๆ ไม่น่ายาก ๆ ต่อกันเลย ต่อไปคือ " ตัวแปรอาร์เรย์ "


ตัวแปรอาร์เรย์ คืออะไร ?? มันทำอะไรได้บ้าง


5 ความคิดเห็น:

  1. ไม่ระบุชื่อ15 พฤษภาคม 2554 เวลา 19:00

    อาจารย์ไนท์ช่วยอธิบาย
    1)ฟังชันที่ผ่านค่าข้อมูลไปให้กับฟังก์ชั่น
    2)ฟังชั่นที่ผ่านค่าอ้างอิงหรือแอดเดรสไปให้กับฟังก์ชัน


    หน่อยคับ

    ตอบลบ
  2. ไม่ระบุชื่อ15 พฤษภาคม 2554 เวลา 19:12

    ขอตัวอย่างการสร้างฟังก์ชั่นย่อยแบบมีการส่งค่ากลับไปยังฟังก์ชั่นหลัก
    โดยการใช้คำสั่งreturn เพื่อให้มองภาพถึงความแตกต่างกับไม่ส่งค่ากลับที่ยกตัวอย่างไว้อะคับ

    ตอบลบ
  3. 1 กับ 2 เป็นเรื่องตัวแปร pointer นะ บทความนี้ยังไม่เสร็จดีน่ะ

    ส่วนตัวอย่างการส่งค่ากลับได้ลงไว้ตั้งแต่แรกแล้วนะ ตัวอย่าง Add_number

    ตอบลบ
  4. while(TRUE) เหมือนกับ while(1) ไหมครับ??

    ตอบลบ
  5. สอนต่อครับ กำลังเริ่มเรียนครับ
    ขอบคุณครับ

    ตอบลบ