หน่วยที่ 3 การเขียนโปรแกรม 2

ประวัติความเป็นมาภาษาซี

        ภาษาซีเกิดขึ้นในปี ค.. 1972 ผู้คิดค้นคือ Dennis Rittchie โดยพัฒนามาจากภาษาและ ภาษา BCPL แต่ยังไม่มีการใช้งานอย่างกว้างขวางนัก ในปี ค.. 1978 Brain Kernighan ได้ร่วมกับ Dennis Ritchie มาพัฒนามาตรฐานของภาษาซี เรียกว่า K&R ทำให้มีผู้สนใจเกี่ยวกับภาษาซีมากขึ้น จึงเกิดภาษาซีอีกหลายรูปแบบเพราะยังไม่มีการกำหนดรูปแบบภาษาซีที่เป็นมาตรฐาน และในปี 1988 Ritchie  จึงได้กำหนดมาตรฐานของภาษาซีเรียกว่า ANSI C เพื่อใช้เป็นตัวกำหนดมาตรฐานในการสร้างภาษาซีรุ่นต่อไปภาษาซี เป็นภาษาซีระดับกลางเหมาะสมสำหรับการเขียนโปรแกรมแบบโครงสร้าง เป็นภาษาที่มีความยืดหยุ่นมากคือใช้งานได้กับเครื่องต่างๆ ได้และปัจจุบันภาษาซีเป็นภาษาพื้นฐานของภาษาโปรแกรมรุ่นใหม่ ๆ เช่น C++
ขั้นตอนการพัฒนาโปรแกรมภาษาซี
    ขั้นตอนที่ เขียนโปรแกรม (Source code)
        ใช้ editor เขียนโปรแกรมภาษาซีและทำการบันทึกไฟล์ให้มีนามสกุลเป็น .c  เช่น  work.c เป็นต้น
editor  คือ  โปรแกรมที่ใช้สำหรับการเขียนโปรแกรม  โดยตัวอย่างของ editor  ที่นิยมนำมาใช้ในการเขียนโปรแกรมได้แก่  Notepad,Edit  ของ Dos ,TextPad  และ  EditPlus เป็นต้น ผู้เขียนโปรแกรมสามารถเลือกใช้โปรแกรมใดในการเรียนโปรแกรมก็ได้  แล้วแต่ความถนัดของแต่ละบุคคล

    ขั้นตอนที่ คอมไพล์โปรแกรม (Compile)        
        นำ source code จากขั้นตอนที่ มาทำการคอมไพล์  เพื่อแปลจากภาษาซีที่มนุษย์เข้าใจไปเป็นภาษาเครื่องที่คอมพิวเตอร์เข้าใจได้  ในขั้นตอนนี้คอมไพเลอร์จะทำการตรวจสอบ  source code  ว่าเกิดข้อผิดพลาดหรือไม่

    ·       
หากเกิดข้อผิดพลาด จะแจ้งให้ผู้เขียนโปรแกรมทราบ  ผู้เขียนโปรแกรมจะต้องกลับไปแก้ไขโปรแกรม  และทำการคอมไพล์โปรแกรมใหม่อีกครั้ง
    ·       
หากไม่พบข้อผิดพลาด  คอมไพเลอร์จะแปลไฟล์  source code จากภาษาซีไปเป็นภาษาเครื่อง(ไฟล์นามสกุล .obj) เช่นถ้าไฟล์ source code ชื่อ work.c ก็จะถูกแปลไปเป็นไฟล์  work.obj  ซึ่งเก็บภาษาเครื่องไว้เป็นต้น
        compile
 เป็นตัวแปลภาษารูปแบบหนึ่ง  มีหน้าที่หลักคือการแปลภาษาโปรแกรมที่มนุษย์เขียนขึ้นไปเป็นภาษาเครื่อง โดยคอมไพเลอร์ของภาษาซี คือ  C Compiler  ซึ่งหลักการที่คอมไพเลอร์ใช้  เรียกว่า  คอมไพล์ (compile)  โดยจะทำการอ่านโปรแกรมภาษาซีทั้งหมดตั้งแต่ต้นจนจบ  แล้วทำการแปลผลทีเดียว
        นอกจากคอมไพเลอร์แล้ว  ยังมีตัวแปลภาษาอีกรูปแบบหนึ่งที่เรียกว่า  อินเตอร์พรีเตอร์  การอ่านและแปลโปรแกรมทีละบรรทัด  เมื่อแปลผลบรรทัดหนึ่งเสร็จก็จะทำงานตามคำสั่งในบรรทัดนั้น  แล้วจึงทำการแปลผลตามคำสั่งในบรรทัดถัดไป  หลักการที่อินเตอร์พรีเตอร์ใช้เรียกว่า อินเตอร์เพรต (interpret)
ข้อดีและข้อเสียของตัวแปลภาษาทั้งสองแบบมีดังนี้

ข้อดี
ข้อเสีย
คอมไพเลอร์
·       ทำงานได้เร็ว เนื่องจากทำการแปลผลทีเดียว แล้วจึงทำงานตามคำสั่งของโปรแกรมในภายหลัง
·       เมื่อทำการแปลผลแล้ว  ในครั้งต่อไปไม่จำเป็นต้องทำการแปลผลใหม่อีก เนื่องจากภาษาเครื่องที่แปลได้จะถูกเก็บไว้ที่หน่วยความจำ สามารถเรียกใช้งานได้ทันที
·       เมื่อเกิดข้อผิดพลาดขึ้นกับโปรแกรมจะตรวจสอบหาข้อผิดพลาดได้ยาก เพราะทำการแปลผลทีเดียวทั้งโปรแกรม
อินเตอร์พรีเตอร์
·       หาข้อผิดพลาดของโปรแกรมได้ง่าย เนื่องจากทำการแปลผลทีละบรรทัด
·       เนื่องจากทำงานทีละบรรทัดดังนั้นจึงสั่งให้โปรแกรมทำงานตามคำสั่งเฉพาะจุดที่ต้องการได้
·       ไม่เสียเวลารอการแปลโปรแกรมเป็นเวลานาน
·       ช้า เนื่องจากที่ทำงานทีละบรรทัด
    ขั้นตอนที่  3  เชื่อมโยงโปรแกรม (link)
         การเขียนโปรแกรมภาษาซีนั้นผู้เขียนโปรแกรมไม่จำเป็นต้องเขียนคำสั่งต่าง ๆ ขึ้นใช้งานเอง  เนื่องจากภาษาซีมีฟังก์ชั้นมาตรฐานให้ผู้เขียนโปรแกรมสามารถเรียกใช้งานได้ เช่น  การเขียนโปรแกรมแสดงข้อความ  “Lumpangkanyanee” ออกทางหน้าจอ  ผู้เขียนโปรแกรมสามารถเรียกใช้ฟังก์ชั่น  printf() ซึ่งเป็นฟังก์ชั่นมาตรฐานของภาษาซีมาใช้งานได้  โดยส่วนการประกาศ (declaration) ของฟังก์ชั่นมาตรฐานต่าง ๆ จะถูกจัดเก็บอยู่ในเฮดเดอร์ไฟล์แต่ละตัว แตกต่างกันไปตามลักษณะการใช้งาน
        ด้วยเหตุนี้ภาษาเครื่องที่ได้จากขั้นตอนที่ 2  จึงยังไม่สามารถนำไปใช้งานได้ แต่ต้องนำมาเชื่อมโยงเข้ากับ  library  ก่อน  ซึ่งผลจากการเชื่อมโยงจะทำให้ได้  executable program (ไฟล์นามสกุล.exe เช่น  work.exe)      ที่สามารถนำไปใช้งานได้
    ขั้นตอนที่ 4 ประมวลผล (run)        เมื่อนำ executable program  จากขั้นตอนที่ 3 มาประมวลผลก็จะได้ผลลัพธ์  (output) ของโปรแกรมออกมา (ถ้ามี)

=======================================================

โครงสร้างโปรแกรมภาษาซี

โครงสร้างของโปรแกรมภาษาซีแบ่งออกเป็น 3 ส่วน
    1. ส่วนหัวของโปรแกรม        ส่วนหัวของโปรแกรมนี้เรียกว่า  Preprocessing Directive  ใช้ระบุเพื่อบอกให้คอมไพเลอร์กระทำการ   ใด ๆ ก่อนการแปลผลโปรแกรม  ในที่นี่คำสั่ง #include  <stdio.h>  ใช้บอกกับคอมไพเลอร์ให้นำเฮดเดอร์ไฟล์ที่ระบุ  คือ  stdio.h เข้าร่วมในการแปลโปรแกรมด้วย  โดยการกำหนด  preprocessing  directives  นี้จะต้องขึ้นต้นด้วยเครื่องหมาย # เสมอ
        คำสั่งที่ใช้ระบุให้คอมไพเลอร์นำเฮดเดอร์ไฟล์เข้าร่วมในการแปลโปรแกรม  สามารถเขียนได้  2  รูปแบบ คือ
    -  #include <ชื่อเฮดเดอร์ไฟล์>  คอมไพเลอร์จะทำการค้นหาเฮดเดอร์ไฟล์ที่ระบุจากไดเรกทอรีที่ใช้สำหรับเก็บเฮดเดอร์ไฟล์โดยเฉพาะ (ปกติคือไดเรกทอรีชื่อ include)
    - #include “ชื่อเฮดเดอร์ไฟล์”  คอมไพเลอร์จะทำการค้นหาเฮดเดอร์ไฟที่ระบุ จากไดเร็คทอรีเดียวกันกับไฟล์  source code  นั้น  แต้ถ้าไม่พบก็จะไปค้นหาไดเร็คทอรีที่ใช้เก็บเฮดเดอร์ไฟล์โดยเฉพาะ
    2. ส่วนของฟังก์ชั่นหลัก        ฟังก์ชั่นหลักของภาษาซี  คือ ฟังก์ชั่น main()  ซึ่งโปรแกรมภาษาซีทุกโปรแกรมจะต้องมีฟังก์ชั่นนี้อยู่ในโปรแกรมเสมอ  จะเห็นได้จากชื่อฟังก์ชั่นคือ main  แปลว่า  “หลัก” ดังนั้น การเขียนโปรแกรมภาษซีจึงขาดฟังก์ชั่นนี้ไปไม่ได้  โดยขอบเขตของฟังก์ชั่นจะถูกกำหนดด้วยเครื่องหมาย  {  และ  }  กล่าวคือ  การทำงานของฟังก์ชั่นจะเริ่มต้นที่เครื่องหมาย {  และจะสิ้นสุดที่เครื่องหมาย  }    ฟังก์ชั่น  main()  สามารถเขียนในรูปแบบของ  void main(void)  ก็ได้  มีความหมายเหมือนกัน  คือ  หมายความว่า  ฟังก์ชั่น  main()  จะไม่มีอาร์กิวเมนต์  (argument)  คือไม่มีการรับค่าใด ๆ เข้ามาประมวลผลภายในฟังก์ชั่น  และจะไม่มีการคืนค่าใด ๆ กลับออกไปจากฟังก์ชั่นด้วย
   3. ส่วนรายละเอียดของโปรแกรม        เป็นส่วนของการเขียนคำสั่ง  เพื่อให้โปรแกรมทำงานตามที่ได้ออกแบบไว้
==============================================================================

คอมเมนต์ในภาษาซี

        คอมเมนต์ (comment)  คือส่วนที่เป็นหมายเหตุของโปรแกรม  มีไว้เพื่อให้ผู้เขียนโปรแกรมใส่ข้อความอธิบายกำกับลงไปใน  source code  ซึ่งคอมไพเลอร์จะข้ามาการแปลผลในส่วนที่เป็นคอมเมนต์นี้ คอมเมนต์ในภาษาซีมี 2 แบบคือ
        •    คอมเมนต์แบบบรรทัดเดียว  ใช้เครื่องหมาย //
        •    คอมเมนต์แบบหลายบรรทัด  ใช้เครื่องหมาย /*  และ */

    ตัวอย่าง  การคอมเมนต์ในภาษาซี
        ข้อควรระวังในการใช้คอมเมนต์  คือ  ในกรณีที่ใช้คอมเมนต์แบบหลายบรรทัด  จะไม่สามารถใช้คอมเมนต์ซ้อนคอมเมนต์ได้  ดังรูป  มิฉะนั้นจะก่อให้เกิดข้อผิดพลาดในการคอมไพล์
        อธิบายโปรแกรม            บรรทัดที่ 1:    เป็นการบอกให้คอมไพเลอร์นำเฮดเดอร์ไฟล์ชื่อ  stdio.h เข้ามาร่วมในการแปลผลด้วย  โดย  stdio  ย่อมาจาก  standard input/output  และ .h  คือ นามสกุลของเฮดเดอร์ไฟล์ในภาษาซี (h  ย่อมาจาก header) ซึ่ง stdio.h  คือ เฮดเดอร์ไฟล์ที่รวมเอาการประกาศ  (declaration)  ของฟังก์ชั่นมาตรฐานของภาษาซีที่เกี่ยวกับการจัดการด้านอินพุตและเอาต์พุตเข้ามาไว้ด้วยกันโปรแกรมนี้มีการเรียกใช้งานฟังก์ชั่น printf()  เพื่อแสดงข้อมูลออกทางจอภาพ  และเนื่องจากส่วนของการประกาศฟังก์ชั่น printf()  ถูกบรรจุอยู่ในเฮดเดอร์ไฟล์  stdio.h  ดังนั้นจึงจำเป็นต้องนำเฮดเดอร์ไฟล์  stdio.h  เข้าร่วมในการแปลผลด้วย
            บรรทัดที่ 2:    คือฟังก์ชั่น  void main()  ซึ่งเป็นฟังก์ชั่นหลักของโปรแกรม  การทำงานของโปรแกรมภาษาซีจะเริ่มต้นที่ฟังก์ชั่นนี้
            บรรทัดที่ 3:    เครื่องหมาย  {  ระบุจุดเริ่มต้นของฟังก์ชั่น  main()
            บรรทัดที่ 4:    เป็นคำสั่งให้เคลียร์หน้าจอเวลาแสดงผลลัพธ์
            บรรทัดที่ 5:    เป็นการเรียกใช้ฟังก์ชั่น printf()  ซึ่งเป็นฟังก์ชั่นมาตรฐานของภาษาซีทำหน้าที่แสดงผลข้อมูลออกทางจอภาพ ในที่นี้จะแสดงข้อความ My name is Kwanjit  ออกทางจอภาพ
            บรรทัดที่ 6:    เครื่องหมาย  }  ระบุจุดสิ้นสุดของฟังก์ชั่น  main()
==============================================================================

ขั้นตอนการพัฒนาโปรแกรม

        การเขียนโปรแกรมเพื่อแก้ปัญหาได้ปัญหาหนึ่ง  จนได้ผลลัพธ์ตามที่ต้องการ  หากผู้เขียนโปรแกรมมีแนวคิดในการเขียนโปรแกรมที่ดี และทำการเขียนโปรแกรมตามแนวคิดที่ได้วางไว้
        ในการพัฒนาโปรแกรมมีขั้นตอนหลัก  5 ขั้นตอน  ซึ่งไม่ว่าจะทำการพัฒนาโปรแกรมครั้งใดจะต้องปฏิบัติตามขั้นตอนเหล่านี้

                  โจทย์ :  จงเขียนโปรแกรมรับค่าเลขจำนวนเต็ม  2  จำนวนและหาผลบวกของเลขทั้ง 2 จำนวนนั้น   1. วิเคราะห์ปัญหา (Analysis)
        
ขั้นตอนนี้ถือว่าเป็นขั้นตอนที่สำคัญที่สุด  ผู้เขียนโปรแกรมต้องวิเคราะห์ปัญหาให้ออกว่าจะต้องทำการเขียนโปรแกรม  เพื่อแก้ปัญหาอะไร  เพราะหากวิเคราะห์หรือมองปัญหาผิดแล้ว  จะทำให้เขียนโปรแกรมได้ผลลัพธ์ออกมาผิดไปจากสิ่งที่ต้องการด้วย และวิเคราะห์ข้อมูลที่จะนำเข้ามาใช้ในโปรแกรมมีอะไรบ้าง  จากโจทย์ข้างต้น สามารถแตกปัญหาได้เป็น 2 ส่วน คือ
    -  ต้องรับข้อมูลเลขจำนวนเต็ม  2  ตัวเข้ามาในโปรแกรม
        วิเคราะห์     กำหนดให้  X  เก็บเลขจำนวนเต็มที่ 1
                        กำหนดให้  y  เก็บเลขจำนวนเต็มที่ 2
    -  เลขจำนวนเต็มที่ 1 + เลขจำนวนเต็มที่ 2  มีค่าเท่ากับเท่าไร
        วิเคราะห์     กำหนดให้  sum  เก็บค่าผลบวกของเลขจำนวนเต็มทั้ง 2 จำนวน  นั่นคือ
                         sum = x + y
   2. วางแผนและออกแบบ  (Planning & Design)        การวางแผน  คือ  การนำปัญหาที่วิเคราะห์ได้จากขั้นตอนที่ 1 มาวางแผนอย่างเป็นขั้นตอนว่าจะต้องเขียนโปรแกรมเพื่อแก้ปัญหาอย่างไร  การวางแผนอย่างเป็นขั้นตอนนี้ เรียกว่า  อัลกอริทึม (Algorithm) ซึ่งอัลกอริทึมแบ่งออกเป็น 2 รูปแบบ คือ
       ซูโดโค้ด (Pseudo code) คือ การเขียนอัลกอริทึมโดยใช้ประโยคภาษาอังกฤษที่สื่อความหมายง่าย ๆ สามารถอ่านแล้วเข้าใจได้โดยทันที  จากโจทย์สามารถเขียนซูโดโค้ดได้ดังนี้

        จะเห็นว่า  เมื่ออ่านซูโดโค้ดแล้วสามารถเข้าใจได้ทันทีว่าขั้นตอนการเขียนโปรแกรมเป็นอย่างไร
        โฟลวชาร์ต (Flowchart)  คือการเขียนอัลกอริทึมโดยใช้สัญลักษณ์รูปภาพเป็นตัวสื่อความหมายจากโจทย์ สามารถเขียนโฟลวชาร์ตได้ดังนี้

   3.  เขียนโปรแกรม (Coding)        เป็นการนำอัลกอริทึมจากขั้นตอนที่ 2 มาเขียนโปรแกรมให้ถูกต้องตามหลักไวยากรณ์ (syntax)  ของภาษาซี  จากโจทย์สามารถเขียนโปรแกรมได้ดังนี้

        ตัวอย่างแสดง  ซอร์สโค้ด

        หากนำโปรแกรม มาพิจารณา จะพบว่าการเขียนโปรแกรมมีขั้นตอนเป็นไปตามขั้นตอนของอัลกอริทึมที่ได้วิเคราะห์ขึ้นทุกประการ   4.  ทดสอบโปรแกรม         เป็นการนำผลลัพธ์จากขั้นตอนที่ 3 มาทำการรัน  จากนั้นทดสอบโดยป้อนค่า x และ y  เข้าไปในโปรแกรม  และตรวจสอบผลลัพธ์ที่ได้ว่าถูกต้องหรือไม่  โดยทดสอบหลาย ๆ ครั้ง  หากผลลัพธ์ที่ได้ถูกต้องแสดงว่าโปรแกรมที่เขียนขึ้นถูกต้องแล้ว  แต่หากผลลัพธ์ถูกบ้างผิดบ้างหรือผิดทุกครั้งแสดงว่าโปรแกรมที่เขียนขึ้นผิดพลาด  ผุ้เขียนต้องกลับไปตรวจสอบโปรแกรม
        จากโจทย์สามารถทดสอบโปรแกรมได้ดังนี้

   5.  จัดทำคู่มือ (Documentation)        จุดประสงค์ที่สำคัญของการทำคู่มือ  คือ  ช่วยให้ผู้ที่ศึกษาซอร์สโค้ดของโปรแกรม (source code) ได้ง่ายขึ้น  จะเป็นประโยชน์มากสำหรับการพัฒนาโปรแกรมในอนาคต  เพราะจะช่วยให้ศึกษาซอร์สโค้ดได้ง่ายและรวดเร็วขึ้น  การจัดทำคู่มือไม่มีกฎเกณฑ์ระบุไว้แน่นอน  แต่ผู้เขียนโปรแกรมควรจัดทำคู่มือให้มีรายละเอียดมากที่สุด
        จากโจทย์ สามารถจัดทำคู่มือได้ดังนี้

ชื่อโปรแกรม
หาค่าผลบวกของเลขจำนวนเต็ม  2  จำนวน
ตัวแปรที่ใช้
x  เก็บค่าจำนวนเต็มตัวที่ 1

Y  เก็บค่าจำนวนเต็มตัวที่ 2

Sum  เก็บค่าผลบวกของตัวเลขจำนวนเต็มทั้ง จำนวน
ชนิดของข้อมูล
x,y,sum  เป็นข้อมูลชนิดเลขจำนวนเต็ม (integer)

ไม่มีความคิดเห็น:

แสดงความคิดเห็น