Showing posts with label ภาษา ซี. Show all posts
Showing posts with label ภาษา ซี. Show all posts

Thursday, October 8, 2015

โปรแกรมคอมพิวเตอร์ช่วยหาคำตอบของระบบสมการเชิงเส้น ด้วย Class CMatrix

สวัสดีครับ บทความ โปรแกรมภาษา C++ บทนี้จะขอนำเสนอการประยุกต์ใช้คลาส CMatrix ช่วยในการหาคำตอบของระบบสมการเชิงเส้น เราจะประดิษฐ์โปรแกรมสำหรับช่วยหาคำตอบของระบบสมการเชิงเส้น เพื่อให้ท่านผู้อ่่านนำไปใช้งาน ทั้ง นร นศ ที่ต้องการนำไปตรวจเช็คคำตอบกับวิธีการหาคำตอบแบบแม่นตรง (Exact Solution) หรือวิศวกรที่กำลังแก้ปัญหาบางอย่างที่ประกอบไปด้วระบบสมการเชิงเส้นหลายตัวแปร สุดท้ายก็คือให้โปรแกรมเมอร์เห็นถึงวิธีการใช้งานคลาส CMatrix เพื่อนำไปประยุกต์ใช้ในการประมวลผลที่โปรแกรมประยุกต์อื่นๆ มาเริ่มกันเลยครับ

ในตัวอย่างโปรแกรมนี้จะใช้วิธีการโหลดสมาชิกของเมตริกซ์จาก Text file ที่เก็บข้อมูลไว้ ดังที่เคยนำเสนอวิธีการไว้ครับ และเป็นที่ทราบกันดีว่าระบบสมการเชิงเส้นสามารถเขียนในรูปแบบเมตริกซ์ได้ดังนี้
[A][x] = [b]
โดย A คือเมตริกซ์จัตตุรัสขนาด n x n ที่ประกอบด้วยค่าสัมประสิทธิ์คงที่ของตัวแปร x ในแต่ละสมการ
x คือ เมตริกซ์ตัวแปรที่ต้องหาคำตอบขนาด n x 1
b คือ เมตริกซ์ค่าด้านขวาของระบบสมการขนาด n x 1
ตัวอย่างเช่น พิจารณาระบบสมการเส้น 3 ตัวแปร
x + y + z = 10
x - y + z = 6
2x + y - 3z = -17.5

โดยจะบันทึกสมาชิกของเมตริก A และ b ในไฟล์ A.txt และ b.txt ไว้ที่ c:// ตามบทความที่เคยนำเสนอการเขียนโปรแกรมอ่านข้อมูลจาก text ไฟล์ 

มาดู code program ภาษา c++ กันครับ ดูแนวคิดกันก่อนนะครับ

สร้าง object A ของ class CMatrix โดยเรียก constructor สำหรับโหลดข้อมูลจากไฟล์ A.txt
สร้าง object b ของ class CMatrix โดยเรียก constructor สำหรับโหลดข้อมูลจากไฟล์ b.txt
สร้าง object x ของ class CMatrix และเรียกใช้ฟังก์ชัน SolveGuass เพื่อหาคำตอบของระบบสมการ โดยใช้ระเบียบวิธี  Gauss elimination หรือ LU decomposition

แสดงผลการหาคำตอบของระบบสมการเชิงเส้นมาดู Code กันเลยครับ


มาดูการใช้งานโปรแกรมนี้กันเลยครับตามภาพที่ 1


ท่านสามารถโหลด Program LES ไปใช้งานได้เลยนะครับ ตามวัตถุประสงค์ของบทความนี้ แต่ต้องระวังข้อผิดพลาดจากผู้ใช้ เช่น เป็นระบบสมการที่ไม่มีคำตอบ ซึ่งจะทำให้โปรแกรมทำงานผิดพลาด การไม่มีอยู่ของไฟล์เมตริกซ์ A หรือ b ตาม path ที่กำหนด ซึ่งตรงนี้ผมยังไม่ได้ทำ code ตรวจสอบไว้นะครับ ในบทต่อๆไปจะพยายามแทรก code การตรวจสอบไว้ให้เป็นตัวอย่างนะครับ นำเสนอการประยุกต์ใช้ Class CMatrix ในการสร้างโปรแกรมแก้ปัญหาอื่นๆอีกครับ



Wednesday, August 12, 2015

โปรแกรมภาษา C++ : Class CMatrix สำหรับช่วยคำนวณพิชคณิต

หลังจากที่ได้นำเสนอการเขียนโปรแกรมภาษา C++ มาระยะหนึ่ง โดยที่ผ่านมามุ่งเน้นไปที่การเขียนโปรแกรมสำหรับแก้ปัญหาพืชคณิตด้วยเมตริกซ์มาบ้างแล้ว ทั้งการ บวก ลบ คูณ เมตริกซ์ โดยได้เขียนโปรแกรมแยกเป็นโมดูลหรือฟังก์ชันไว้แล้ว แต่เพื่อจะให้ผู้ที่สนใจนำโค้ดโปรแกรมภาษา C++ ไปใช้ในการแก้ปัญหาพีชคณิตโดยใช้การดำเนินการของเมตริกซ์ เอาไปใช้ได้ด้วย จึงเกิด Class CMatrix ขึ้น Class ในภาษา C++ เป็นการเขียนโปรแกรมเชิงวัตถุ (Object -Oriented Programming) ซึ่งได้รวมรวมการดำเนินการของเมตริกซ์ไว้เกือบครบ รวมถึงระเบียบวิธีเชิงตัวเลขสำหรับแก้ระบบสมการ โดย Class CMatrix ที่ได้พัฒนาขึ้นจะมีขอบเขตถึงการแก้ระบบสมการที่เป็นเชิงเส้น(Linear Equation System) เท่านั้น ส่วนความสามารถในการแก้ระบบสมการที่ไม่เป็นเชิงเส้น (Nonlinear Equation System) ท่านอาจจะนำไปประยุกต์ต่อได้ครับ ในเบื้องต้นจะขอแนะนำ การโหลดข้อมูลของเมตริกซ์ก่อนเพื่อให้ท่านสามารถใช้งาน Class Matrix ได้ โดยสามารถทำได้ 2 วิธีคือ

1. ผ่านคอนสตรัคเตอร์ ตอนประกาศ Object มีรูปแบบดังนี้
CMatrix A(char *pFilePath)  โดย FilePath จะเป็นชื่อและที่อยู่ของ text ไฟล์ที่เป็นรูปแบบของเมตริกซ์ ดังที่เคยนำเสนอไปแล้วในตอน ฟังก์ชันสำหรับโหลดไฟล์ input เพื่อสร้างเมตริกซ์ 

2. ผ่านคอนสตรัคเตอร์แบบที่ 2 ตอนประกาศ Object มีรูปแบบดังนี้
CMatrix A(const int r , const int c , double **pD)

3. ท่านสามารถสำเนาข้อมูลจาก Object อื่นๆ ได้ ผ่าน Copy คอนสตรัคเตอร์ ดังนี้
สมมุติ มี object คลาส CMatrix ชื่อ A เราสามารถสร้าง object ฺB โดยให้ Copy ข้อมูลจาก object A ได้ ดังนี้
CMatrix B(A) ;

4. ท่านสามารถสร้าง object class CMatrix เมื่อทราบแค่ขนาดของ Matrix โดยทียังไม่มีข้อมูลก็ได้ดังนี้
CMatrix A(2,3) สร้างเมตริกส์ขนาด 2x3
CMatrix A(3) สร้างเมตริกส์ขนาด 3x3

5. ท่านสามารถสร้าง object class CMatrix แบบ Default Constructor ขึ้นมาเพื่อรองรับการดำเนินการทางเมติกซ์ของ object class CMatrix อื่นๆ ได้ เช่น การแก้ระบบสมการ สามารถประกาศได้ ดังนี้
CMatrix A ;

โดย r คือจำนวนแถวของเมตริกซ์ c คือจำนวนหลักของเมตริกซ์ และ pD คือ ไดนามิกส์อาเรย์ 2 มิติ ที่ประกอบไปด้วยสมาชิกของเมตริกซ์ row x col ตัว

มาถึงตรงนี้ท่านก็จะสามารถใช้งาน Class CMatrix ได้แล้ว หรือหากจะนำ Class นี้ไปพัฒนาต่อก็ทำได้ครับ download Class CMatrix ได้เลยครับ

ในบทความต่อๆไปผมจะนำเสนอการประยุกต์ใช้ Class CMatrix ในภาษา C++ สำหรับแก้ปัญหาพิชคณิตต่อไปนะครับ หรือจะเป็นปัญหาอื่นๆที่สามารถเขียนในรูป Matrix และมีการดำเนินการระหว่างเมตริกซ์ที่เป็นขั้นเป็นตอนก็สามารถนำ Class นี้ไปใช้งานได้ครับ

Friday, February 20, 2015

ชนิดข้อมูลแบบสร้างเองในภาษา c และ c++

ตัวแปรแบบสร้างเองใน c และ c++ จริงๆแล้วก็คือ struct นั่นเอง แนวคิดของการสร้างข้อมูลชนิดนี้ขึ้นมาก็คือ ต้องการเก็บข้อมูลให้เป็นกลุ่มก้อนเดียวกัน เพื่อว่าจะสามารถเข้าถึง ดำเนินการต่างๆ หรือโอนย้ายได้ง่าย ขอยกตัวอย่างให้เห็นชัด กรณีตำแหน่งของจุดๆหนึ่งในพิกัดฉาก เราจะบอกตำแหน่งนั้นด้วยพิกัด x , y และ z ในที่นี้หากเราต้องการเก็บข้อมูลพิกัดทั้งสามนี้เป็นข้อมูลกลุ่มเดียวกัน เราจะทำการประกาศโครงสร้างแบบ struct เพื่อกำหนดชนิดข้อมูลแบบสร้างเองขึ้นมา เช่น ต้องการสร้างข้อมูลชนิด Point ที่มีสมาชิกในกลุ่มเป็นพิกัด x , y และ z ที่เป็นชนิดข้อมูลแบบ int เราจะประกาศโครงสร้างตามโค้ดโปรแกรมดังนี้ครับ
struct Point
{
                   int x ;
                   int y ;
                   int z ;
} ;

เราสามารถใช้ฟังก์ชัน sizeof หาขนาดหน่วยความจำของตัวแปรชนิด Point ได้เหมือนตัวแปรปกติทั่วไป โดยจากตัวอย่างตัวแปรชนิด Point ต้องการหน่วยความจำในการจัดเก็บ 3x4 = 12 bytes
การกำหนดค่าให้กับตัวแปรขนิด Point สามารถทำได้ผ่านตัวดำเนินการ . ดังตัวอย่าง
Point V   // ประกาศตัวแปร V เป็นข้อมูลประเภท Point
V.x = 10 ;                 //กำหนดให้ x มีค่าเท่ากับ 10
V.y = 15 ;                 //กำหนดให้ y มีค่าเท่ากับ 15
V.Z = 20 ;                 //กำหนดให้ z มีค่าเท่ากับ 20

จากบทความที่ผ่านมาเราได้เขียนโปรแกรมเกี่ยวกับการดำเนินการของเมตริกซ์  ซึ่งเราสามารถกำหนดชนิดตัวแปรแบบเมตริกซ์ไว้ใช้งานได้เช่นกัน ดังนี้
struct Matrix
{
                   int col ;
                   int row ;
                   Float** member ;
};

เท่านี้ก็สามารถใช้งานตัวแปรแบบเมตริกซ์ได้อย่างสะดวกครับ ตัวอย่างการใช้งานจะนำเสนอในบทความอื่นๆต่อไป

เราสามารถพบเจอตัวแปรแบบสร้างเองมากขึ้นในการเขียนโปรแกรมประเภทวินโดว์ ด้วย Visual C++ , WIN32 API ซึ่งมีการกำหนดตัวแปรชนิดใหม่ๆขึ้นมารองรับการพัฒนาแอฟพลิเคชั่นเพื่อความสะดวกกับโปรแกรมเมอร์ผู้พัฒนา Application เหล่านั้น

Wednesday, January 29, 2014

เขียนโปรแกรมด้วย C++ : ฟังก์ชันสำหรับโหลดไฟล์ input เพื่อสร้างเตริกซ์

การเขียนโปรแกรมในบทความนี้จะนำเสนอ การสร้างฟังก์ชันสำหรับโหลดไฟล์ input เพื่อสร้างเมตริกซ์ ซึ่งจะนำความรู้เกี่ยวกับการเขียนโปรแกรมการอ่านไฟล์ชนิด text file ที่ได้กล่าวถึงไปแล้วมาประยุกต์กับการสร้าง Dynamics Array แบบ 2 มิติ เพื่อสร้างเมตริกซ์ไว้สำหรับใช้งานต่างๆต่อไป ลักษณะการติดต่อกับผู้ใช้จะเป็นการอ่านข้อมูลจาก text file ซึ่งเราได้กำหนดรูปแบบของการบันทึกข้อมูลไว้เรียบร้อยแล้วนั่นเอง โดยเราจะเรียก text file นั้นว่า input file สมมุติให้นามสกุลไฟล์เป็น .txt โดยเราสามารถใช้โปรแกรม Notepad สำหรับการบันทึกข้อมูล เรามากำหนดรูปแบบของ input file กันก่อนครับ 
ในบรรทัดแรก จะเป็นการบันทึกจำนวนแถวและหลักของเมตริกซ์
ในบรรทัดถัดไปจะเป็นสมาชิกในเมตริกซ์ในตำแหน่งต่างๆ ดัง ตย
3,4
1, 3, 5, 6,
3, 4, 5, 7,
5, 6, 7, 8,

การทำงานของโปรแกรมจะเริ่มจาก
1. รับตำแหน่งและชื่อ input file ที่จะเข้าไปอ่าน
2. อ่านข้อมูลขนาดของเมตริกซ์ แถวxหลัก
3. สร้าง Dynamic Array ตามขนาดของเมตริกซ์
4. อ่านข้อมูล Aij จาก input file ครั้งละ 1 ตัว จนหมด
5. พิมพ์เมตริกซ์ที่อ่านได้จาก input file บนหน้าจอ

ฟังก์ชันอ่านข้อมูลจาก input file มีรูปแบบดังนี้
ReadInput(จำนวนแถว , จำนวนหลัก ,input file name) โดยจะคืนค่าเป็น Dynamics Array แบบ 2 มิติ


ฟังก์ชั่น printMatrix

เรามาดู main Program สำหรับเรียกใช้ฟังก์ชันทั้งสองกันครับ


เมื่อคอมไพล์โปรแกรมนี้จะปรากฎหน้าต่างโปรแกรม
ในบรรทัด Enter path of input file : ให้ท่าน input ชื่อ input file ที่ต้องการอ่านลงไป ตัวอย่างเช่น c:\\aa.txt แล้ว Enter หากไฟล์นั้นมีอยู่จริงและมีข้อมูลที่ถูกต้องโปรแกรมจะแสดงขนาดของเมริกซ์และสมาชิกของเมตริกซ์ให้ทราบดังแสดงในภาพ


ภาพหลังการอ่านข้อมูลจาก text file 
จากตัวอย่างการอ่านข้อมูลจาก text file ดังกล่าว หากเราต้องการดำเนินการระหว่างเมตริกซ์เช่น การบวก ลบ การคูณ การ transpose และให้บันทึกผลการดำเนินการลง text file เพื่อนำไปใช้งานต่อก็สามารถทำได้โดยง่ายแล้ว เดี๋ยวมาเขียนโปรแกรมกันต่อในบทความต่อไปครับ




Sunday, January 19, 2014

เขียนโปรแกรมภาษา c++ : ตัวอย่างการบวกและคูณ เมตริกซ์

เขียนโปรแกรมภาษา c++ ในบทความนี้จะขอยกตัวอย่างการประยุกต์ใช้ Dynamics Array และการเรียกใช้ฟังก์ชันมาช่วยในการดำเนินการบวกและคูณเมตริกซ์ ซึ่งเป็นตัวอย่างแสดงการเรียกใช้ฟังก์ชั่นต่างๆ ก่อนที่บทความต่อไปจะนำเสนอ การเขียนโปรแกรมภาษา c++ สำหรับดำเนินการทางเมตริกซ์แบบสมบูรณ์ สามารถนำไปใช้งานได้โดยง่ายครับ
ในลำดับแรกของการเขียนโปรแกรมนี้ เราจะสร้างตัวแปรโครงสร้างขึ้นมาชนิดหนึ่งประกาศไว้ตอนต้นของโปรแกรม นั่นคือตัวแปรโครงสร้าง Matrix ซึ่งภายในประกอบด้วยตัวแปรที่เก็บค่าจำนวนแถว จำนวนหลักและตัวแปรพอยเตอร์สำหรับเก็บสมาชิกในเมตริกซ์ ดังนี้ครับ
struct Matrix
{
int r ; // rows
int c; // columns
float **m;  // data
};

ลำดับถัดมาเป็นการสร้างฟังก์ชันสำหรับใช้ในการดำเนินการระหว่างเมตริกซ์ โดยในตัวอย่างนี้จะมีทั้งหมด 5 ฟังก์ชั่นดังนี้
1. ฟังก์ชั่น creatematrix ทำหน้าที่สร้าง matrix ขึ้นมา โดยจะคืนค่าเป็นตัวแปรโครงสร้างชนิด Matrix ซึ่งจะรับค่าจำนวนแถว(iRow) และ จำนวนหลัก(iCol) ของ Matrix ที่ต้องการสร้างรูปแบบดังนี้
Matrix creatematrix(int iRow,int iCol)


2. ฟังก์ชั่น plusmatrix ทำหน้าที่ดำเนินการบวก matrix สองเมตริกซ์ โดยจะคืนค่าเป็นตัวแปรโครงสร้างชนิด Matrix ซึ่งจะรับค่าเป็น matrix 2 matrix ที่ต้องการนำมาดำเนินการบวกกัน มีรูปแบบดังนี้
Matrix plusmatrix(Matrix a , Matrix b)


3. ฟังก์ชั่น mulMatrix ทำหน้าที่คูณเมตริกซ์ด้วยค่าคงที่ โดยจะคืนค่าเป็นตัวแปรโครงสร้างชนิด Matrix ซึ่งจะรับค่า 2 ค่าคือ ค่าคงที่ที่นำมาคูณ และ matrix ที่ต้องการมาดำเนินการคูณด้วยค่าคงที่ มีรูปแบบดังนี้
Matrix mulMatrix(float fm ,Matrix a)


4. ฟังก์ชั่น Product ทำหน้าที่ดำเนินการคูณระหว่างเมตริกซ์ โดยจะคืนค่าเป็นตัวแปรโครงสร้างชนิด Matrix ซึ่งจะรับค่าเมตริก 2 เมตริกซ์ ที่ต้องการมาดำเนินการคูณระหว่างเมตริกซ์ มีรูปแบบดังนี้
Matrix Product(Matrix a , Matrix b)


5. ฟังก์ชั่น freedynamicarray ทำหน้าที่คืนหน่วยความจำให้ระบบหลังการใช้งาน Dynamic Array ทั้งหมดของโปรแกรม

เรามาดู Main Program ของการเขียนโปรแกรม แสดงการบวกและคูณเมตริกซ์กันครับ


มาดูผลลัพธ์จากการคอมไพล์ครับ

ผลการคอมไฟล์โปรแกรม การคูณกันระหว่างเมตริกซ์

จากตัวอย่างการเขียนโปรแกรมที่ได้นำเสนอมา จะพบว่าการที่จะเขียนโปรแกรมให้สมบูรณ์จะต้องเพิ่มโค้ดในการตรวจจับความผิดพลาดของการคำนวณทางตัวเลขเพื่อป้องกันความผิดพลาดที่จะเกิดขึ้น จากตัวอย่างนี้เราจะพัฒนาโปรแกรมให้มีความสมบูรณ์มากขึ้นโดยจะเพิ่มการลบเมตริกซ์ การสร้างเมตริกซ์มาตรฐานต่างๆ ตัวดำเนินการแยกองค์ประกอบเมตริกซ์ และสุดท้ายการกำหนดสมาชิกในเมตริกจากการอ่านข้อมูลรูปแบบ text file ที่ผมได้นำเสนอไปแล้วในบทความก่อนหน้านี้ ซึ่งจะทำให้การใช้งานโปรแกรมนี้สามารถใช้งานได้ง่ายที่สุด นอกจากนี้จะทำการพัฒนา Class CMatrix เพื่อให้ผู้ที่สนใจนำไปประยุกต์ใช้งานกับการสร้าง Application ต่างๆ ต่อไป โดยจะเพิ่มความสามารถในการแก้ระบบสมการเพื่อนำไปใช้ในการแก้ปัญหาทางวิศวกรรมและระเบียบวิธีไฟไนต์เอลิเมนต์ต่อไปครับ

หัวข้อที่น่าสนใจ







Saturday, December 14, 2013

โปรแกรมภาษา C++ : ตอนการเก็บข้อมูลลงใน Disk แบบ Binary File

การเขียนโปรแกรมภาษา c++ วันนี้จะนำเสนอ วิธีการเก็บข้อมูลลง Disk แบบ Binary File ซึ่งจะมีจุดเด่นในด้านการจัดการและการเข้าถึงข้อมูลได้ง่ายและเป็นระบบกว่า การเก็บข้อมูลลงใน Disk แบบ Text File มาดู Code  การบันทึกข้อมูลแบบ Binary File กันครับ


เมื่อคอมไพล์โปรแกรมท่านจะได้ไฟล์ DATA.bin มาหนึ่งไฟล์ แต่จะไม่สามารถใช้ Nodepad เปิดดูข้อมูลในไฟล์นี้ได้นะครับ เนื่องจากไฟล์ DATA.bin มีโครงสร้างการเก็บที่ Nodepad ไม่รู้จักนั่นเอง และเมื่อตรวจสอบขนาดไฟล์จะพบว่ามีขนาดเท่ากับ 4 ไบต์ เนื่องจากข้อมูลที่เราเก็บลงไปเป็นชนิด int ซึ่งมีขนาดเท่ากับ 4 ไบต์ 
ฟังก์ชั่น fwrite เป็นฟังก์ชันที่ใช้บันทึกข้อมูลลงไฟล์ โดยมีรูปแบบของฟังก์ชันดังนี้
พารามิเตอร์ตัวแรกเป็น address ของตัวแปรที่ต้องการเข้าถึงข้อมูลที่จะบันทึก
พารามิเตอร์ตัวที่สองเป็นขนาดของตัวแปรที่ต้องการบันทึกในแต่ละครั้ง โดยเราจะใช้ฟังก์ชัน Sizeof ช่วยคืนค่าขนาดของตัวแปรที่เราต้องการบันทึก
พารามิเตอร์ตัวสุดท้ายเป็น pointer ของ object FILE ที่ต้องการบันทึก

สมมุติ เราต้องการเก็บข้อมูลของตัวแปร int temp ลงไปในไฟล์ต่อจาก num เราจะแก้ไข code ดังนี้โดยไฟล์ DATA.bin จะมีขนาดเท่ากับ 8 ไบต์ เนื่องจากเก็บข้อมูลชนิด int ไว้ 2 ชุดนั่นเอง โดยจะจัดเรียงจากตัวแปร num และ temp ตามลำดับ


เราจะลองศึกษา code โปรแกรม ที่บันทึกข้อมูลแบบอาเรย์กันครับซึ่งไม่มีความยุ่งยากเลย ดังนี้


ท่านจะได้ไฟล์ DATA.bin ที่บรรจุตัวเลข 100 ตัว ตั้งแต่เลข 1-100 ซึ่งเรียงกันอยู่ในอาเรย์ครับ ส่วนขนาดของไฟล์ก็จะเท่ากับ 4*100 = 400 ไบต์ นั่นเอง 
ในบทความนี้ก็ได้นำเสนอการบันทึกข้อมูลลงไฟล์แบบ Binary File เรียบร้อยแล้วนะครับ ซึ่งที่สำคัญท่านจะพบว่า ไฟลืที่เราบันทึกข้อมูลจะมีความปลอดภัยสูง เนื่องจากเราจะไม่สามารถเปิดอ่านและแก้ไขข้อมูลในไฟล์ดังกล่าวได้เลยหากไๆม่ทราบโครงสร้างของการจัดเรียงข้อมูลในไฟล์ ซึ่งในบทความถัดไปจะนำเสนอการอ่านหรือโหลดข้อมูลในไฟล์ดังกล่าวครับ รวมถึงจะนำเสนอการนำไปประยุกต์อ่านข้อมูลไฟล์เสียงกันครับ

Friday, December 6, 2013

โปรแกรมภาษา C++ : ตอนการเก็บข้อมูลลงใน Disk แบบ Text File

การเขียนโปรแกรมภาษา c++ วันนี้จะนำเสนอ กระบวนการเก็บข้อมูลลงไฟล์ ซึ่งจะพบอยู่เป็นประจำสำหรับโปรแกรมเมอร์ โดยเฉพาะการเขียนโปรแกรมติดต่อกับ Hardware เช่น เครื่องรูดบัตร เครื่องบันทึกข้อมูลเป็นต้นซึ่งข้อมูลจะถูกเก็บไว้ใน Disk  และจะถูกอ่านเข้ามาใช้หรือเก็บไว้ใช้อยู่ตลอดเวลา โดยทั่วไปไฟล์จะแบ่งออกเป็น 2 ประเภท คือ Text File และ Binary File ในบทความนี้จะขอกล่าวถึง Text File ก่อนครับ มาดู Code  การบันทึกข้อมูลแบบ Text File กันครับ


เมื่อคอมไพล์โปรแกรมท่านจะได้ไฟล์ DATA.txt มาหนึ่งไฟล์ เมื่อเปิดด้วย Nodepad จะพบเลข 100 และเมื่อดูขนาดไฟล์จะพบว่ามีขนาดเท่ากับ 3 ไบต์ เนื่องจากการบันทึกไฟล์แบบ text มันจะเก็บเป็นตัวอักษร ซึ่งจากตัวอย่างเราเก็บเลข 100 ไว้ ดังนั้นจึงมีตัวอักษร 3 ตัว ตัวละ 1 ไบต์ ดังนั้นจึงมีขนาด 3 ไบต์ ทีนี้ลองปรับโค้ดโปรแกรมดูนะครับ หากเป็นดังนี้ text ไฟล์จะมีขนาดเท่าใด
float af ;
af = 120.56 ;
int mum ;
num = 100 ;

FILE *fp ;
fp = fopen("DATA.txt","wt") ;
fprint(fp,"%d %f" ,num,af);
fclose(fp);

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

Monday, December 2, 2013

โปรแกรมภาษา C++ : การเข้าถึงข้อมูลในอาเรย์

ตัวแปรแบบอาเรย์เป็นตัวแปรแบบตาราง ที่หนึ่งตัวแปรเก็บค่าได้หลายค่า ประโยชน์ของตัวแปรแบบ อาเรย์ช่วยในการประหยัดเวลาในการเก็บข้อมูล การบริหารจัดการข้อมูลทำได้อย่างมีประสิทธิภาพ สิ่งหนึ่งที่สำคัญในทางวิศวกรรมคือ กลุ่มตัวแปรแบบอาเรย์มักมีความสัมพันธ์กัน ในบทความนี้จะมาทำความรู้จักกับตัวแปรแบบอาเรย์ในภาษา c และ C++ กันครับ
1. การประกาศตัวแปรแบบอาเรย์
typeVar VarName[n]
เมื่อ
typeVar คือ ชนิดของตัวแปร
VarName คือ ชื่อของตัวแปรที่จะกำหนด
n คือจำนวนสมาชิกในอาเรย์ที่ต้องจองไว้ในหน่วยความจำนั้น

ตัวอย่างเช่น
int Element [10] ;

มิติของอาเรย์ 
อาเรย์มีหลายมิติขึ้นอยู่กับจัดเก็บข้อมูลหรือความสัมพันธ์นั้นๆ ในที่นี้ขอยกตัวอย่างอาเรย์ที่ใช้กันเยอะคือ
1 อาเรย์ 1 มิติ ตัวอย่างเช่น int Element [5] ข้อมูลจะเรียงกันเป็นตารางที่มีจำนวน 1 แถว และมีสมาชิก 10 หลัก 
2 อาเรย์ 2 มิติ ตัวอย่างเช่น int Element [4][5] ซึ่งข้อมูลหรือตัวแปรย่อยจะจัดเรียงในตารางที่มีจำนวน 4 แถว 5 หลัก หรือมองง่ายๆเป็น Matrix ขนาด 4x5 


ภาพที่ 1 อาเรย์แบบ 1 มิติ


ภาพที่ 2 อาเรย์ 2 มิติ
การกำหนดค่าตัวแปรอาเรย์
เทคนิคหนึ่งในการเขียนโปรแกรมภาษา c ก็คือ จะต้องกำหนดค่าให้กับตัวแปรก่อนนำไปใช้งาน เพื่อป้องกันความผิดพลาดที่จะเกิดขึ้น ในการกำหนดค่าตัวแปรอาเรย์สามารถทำได้โดยการเข้าถึงตัวแปรสมาชิกโดยตรงจากการอ้างตำแหน่งของตัวแปร ตัวอย่างเช่น ต้องการกำหนดค่าให้กับตัวแปร Element ตัวที่ 3 สามารถเขียนโค้ดได้ดังนี้
Element[2] = value ;   // index ของตัวแปรอาเรย์ในภาษาซีจะเริ่มที่ 0 จนถึง n-1 เมื่อ n คือ จำนวนสมาชิกในอาเรย์

ข้อควรจำ
หลังจากสร้างตัวแปรอาเรย์แล้วควรกำหนดค่าตัวแปรทันที เพื่อป้องกันความผิดพลาด โดยหากยังไม่มีข้อมูลให้กำหนดค่า Null ให้กับตัวแปร อาเรย์ โค้ตตัวอย่างการกำหนดค่า 0 ให้กับตัวแปรอาเรย์จะอาศัยคำสั่ง for ดังนี้
สมมุติ อาเรย์ 4X5
for( int i = 0 ; i < 4 ; i++)
{
     for(int j = 0 ; j < 5 ; j++)
     {
          Element[i][j] = 0 ;
     }
}

การเข้าถึงข้อมูลในตัวแปรอาเรย์
เราจะอ้างด้วยตำแหน่งของตัวแปรในอาเรย์นั้น ตามภาพที่ 1 และ 2
เช่น Element[0][1] หมายถึง ตำแหน่งแถวที่ 0 หลักที่ 1 เป็นต้น การใช้คำสั่ง for , while , do..while เพื่อใช้ในการเข้าถึงหรือกำหนดค่าเป็นสิ่งที่โปรแกรมเมอร์ต้องพบอยู่เสมอ

จากตัวอย่างข้างต้นเป็นการกำหนดตัวแปรอาเรย์แบบสเตติก ซึ่งต้องจองหน่วยความจำตั้งแต่เริ่มต้น ยังมีวิธีการกำหนดตัวแปรอาเรย์แบบ dynamic ซึ่งมักจะใช้ในกรณีที่ไม่ทราบจำนวนสมาชิกในตัวแปรอาเรย์ที่แน่นอน ซึ่งเราจะใช้ pointer มาช่วยในการกำหนด ซึ่งจะทำให้โปรแกรมเมอร์จองหน่วยความจำได้พอดีกับที่ต้องใช้งานจริง ตัวอย่างเช่น
อาเรย์ 1 มิติ
// C++
int * Element ;   // ประกาศไว้ตอนต้น
Element = NULL;

เมื่อจะใช้งาน
Element = new int [size];

// do some thing

เมื่อใช้เสร็จ
delete [] Element ;
Element = NULL ;

อาเรย์ 2 มิติ ขนาด row x col
int ** Element ;
Element = NULL ;

Element = new int* [row];
for (int i= 1 ; i < row ; i++)
{
    Element[i] = new int [col];
}
// do some thing
เมื่อใช้งานเสร็จ
for (int i = 1 ; i < row ; i++)
{
       delete [] Element[i];
}
delete [] Element ;
Element = NULL;

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