Showing posts with label โปรแกรมเมอร์. Show all posts
Showing posts with label โปรแกรมเมอร์. Show all posts

Saturday, October 17, 2015

ตัวอย่างการโหลดสมาชิกเมตริกซ์จากอาเรย์ 2D มาใช้ใน Class CMatrix ในโปรแกรมภาษา C++

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

CMatrix A(const int r , const int c , double **pD)
มาพิจารณาพารามิเตอร์ที่ต้องส่งผ่านคอนสตรัคเตอร์ตัวนี้ ซึ่งจะประกอบไปด้วย
1. จำนวนแถวของเมตริซ์ r
2. จำนวนหลักของเมตริกซ์ c
3. อาเรย์ 2D ซึ่งต้องเป็นแบบ pointer 

สมมุติตัวอย่าง ต้องการโหลดสมาชิกเมตริกซ์ขนาด 3x3 จากตัวแปรอาเรย์ชื่อ A เราจะเขียน code โปรแกรมภาษา C++ ในส่วนนี้ได้ดังนี้
        int row , col ;
double** data ;
row = 3 ;
col = 3 ;
data = new double*[row];
for (int i = 0 ; i < row ; i++)
{
data[i] = new double[col] ;
}

for (int j = 0 ; j < row ; j++)
{
for(int k = 0 ; k < col ; k++)
data[j][k] = j+k ;
}
cout<<"Matrix A"<<endl;
CMatrix A(row,col,data);
A.Show();
cout<<endl ;
cout<<"Matrix B"<<endl;
CMatrix B(3,3,data) ;
B.Show();

ผลลัพธ์การทำงานใน code ส่วนนี้จะแสดงได้ดังนี้


ผลการทำงานของโค้ดโปรแกรม

จากตัวอย่างโค้ดโปรแกรมภาษา C++ ที่ประมวลผลเมตริกซ์นี้ ผมได้นำเสนอ 2 รูปแบบ คือ ท่านสามารถผ่านขนาดของเมตริกซ์ด้วยตัวแปรก็ได้ หรือจะผ่านด้วยค่าก็ได้ เนื่องจาก คอนสตรัคเตอร์นี้ กำหนดชนิดของตัวแปรขนาดเป็นแบบ คงที่ (const int r , const int c , double **pD) เอาหล่ะครับ จบตรงนี้เราก็ได้ object ของคลาส CMatrix ที่พร้อมจะนำไปใช้ประมวลผลหรือดำเนินการทางเมตริกซ์ต่อ ไม่ว่าจะนำไป บวก ลบ หรือคูณเมตริกซ์ หรือแม้แต่จะนำไปหาคำตอบของระบบสมการดังที่เคยนำเสนอไปแล้ว ในบทความต่อไปจะนำ ตัวอย่างการใช้คอนสตรัคเตอร์ดังกล่าวในการแก้ปัญหาระบบสมการไม่เชิงเส้น โดยใช้ระเบียบวิธี Newton-Raphson 




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 เพื่อนำไปใช้งานต่อก็สามารถทำได้โดยง่ายแล้ว เดี๋ยวมาเขียนโปรแกรมกันต่อในบทความต่อไปครับ




Thursday, December 26, 2013

โปรแกรมอ่านข้อมูลจาก text file ด้วยภาษา c++

จากบทความโปรแกรมบันทึกข้อมูลลง text file ด้วยภาษา c++ ที่ได้นำเสนอไป ในบทความนี้ผมจะขอนำเสนอโปรแกรมอ่านข้อมูลจาก text file ด้วยภาษา c++ ซึ่งจะเป็นแสดงให้เห็นถึงการใช้ฟังก์ชันต่างๆใน library ของซีและซีพลัสพลัสมากขึ้น โดยโปรแกรมเล็กๆนี้เราสามารถนำไปใช้ในการแก้ปัญหาที่ต้องใช้เวลาในการดำเนินการมากได้เป็นอย่างดี รวมถึงนำไปประยุกต์เป็นฟังก์ชันเล็กๆในโปรแกรมขนาดใหญ่ที่เราจะพัฒนาในลำดับถัดไปครับ ตัวอย่างที่จะนำเสนอในวันนี้คือ การอ่านค่าสมาชิกใน matrix ซึ่งถูกเก็บไว้ใน text file ผ่านตัวแปร Dynamic Array  สมมุติเรามีสมาชิกใน matrix เก็บไว้ใน text file ชื่อ K.txt โดยมีข้อมูลเป็นจำนวนเต็ม matrix 3x3 ดังนี้
1 5 10
2 10 20
3 15 30
ในการอ่านไฟล์ txt เราจะใช้ ฟังก์ชัน fscanf เรามาเขียนโปรแกรมกัน



ผลการรันโปรแกรมจะแสดงผลสมาชิกของ Matrix 3x3 มาดังนี้

1 5 10
2 10 20
3 15 30

จาก Source Code โปรแกรม จะเริ่มจากการสร้างตัวแปร pointer ชนิด FILE เพื่อใช้เปิดไฟล์ text และสร้างตัวแปร K ชนิด Integer เป็น Dynamic Array แบบสองมิติ ขนาด 3x3 
จากนั้นจะทำการเปิดไฟล์ K.txt และตรวจสอบตัวแปร fp เพื่อพิจารณาผลลัพธ์ของการเปิดไฟล์ 
หากเปิดไฟล์ได้ก็จะเริ่มอ่านไฟล์ตั้งแต่แถวที่ 1 จนกระทั่งสิ้นสุดไฟล์ และปิดไฟล์ด้วยฟังก์ชัน fclose() และทำการแสดงสมาชิกที่อ่านเข้ามาเก็บไว้ที่ตัวแปร k 
จากโค้ดโปรแกรมจำนวนแถวของข้อมูลจะถูกเก็บไว้ที่ตัวแปร m ซึ่งสามารถนำไปใช้งานในการกำหนดขนาดของตัวแปร Array อื่นๆได้ครับ 
มาดูฟังก์ชัน fscanf กันครับ หากรูปแบบของข้อมูลใน text file มี , กั้นระหว่างสมาชิก (จะพบในกรณีที่เรา export file .csv จาก Excel) ในการใช้ฟังก์ชัน fscanf ก็จะต้องกำหนดรูปแบบให้สอดคล้องกันดังนี้
หรือในกรณีที่สมาชิกเป็นข้อมูลประเภทมีจุดทศนิยม เราก็ต้องปรับชนิดของตัวแปร k ให้เป็น float หรือ double เพื่อให้สอดคล้องกับข้อมูลมิเช่นนั้นจะเกิดการสูญเสียข้อมูลไป ทำให้เกิดความผิดพลาดจากการนำข้อมูลนี้ไปใช้งานประมวลผลต่อครับ

จากโค้ดนี้ท่านก็จะได้ Matrix 3x3 เก็บไว้ใน ARRAY เรียบร้อย และก็นำไปดำเนินการทาง matrix ได้ต่อไปครับ ไม่ว่าจะเป็น บวก ลบ คูณ หรือเตรียมสำหรับการ แก้ระบบสมการ ด้วยระเบียบวิธีทางตัวเลข (Numerical Method) ต่อไป สำหรับวิศวกร หรือนักวิทยาศาสตร์นะครับ เสริมท้ายก่อนจบ หากท่านมีข้อมูลใน text ไฟล์เป็นพันหรือหมื่นบรรทัด การใช้โปรแกรมนี้ประยุกต์เช้าไปอ่านก็สามารถทำได้โดยง่าย สวัสดีครับ


Monday, December 16, 2013

โปรแกรมภาษา C++ : ตอนการอ่านข้อมูลจาก Binary File (How to read the binary file)

สวัสดีครับ บทความนี้เป็นบทความต่อจาก การเขียนโปรแกรมภาษา C++ สำหรับการบันทึกข้อมูล Binary file โดยในบทความนี้จะเสนอการอ่านหรือโหลดข้อมูลจาก Binary File จากเรื่องการบันทึกข้อมูล ท่านผู้อ่านคงจำได้ว่า Binary File เป็นไฟล์ที่มีการเก็บข้อมูลแบบเป็นโครงสร้างและเรียงลำดับอย่างเป็นระบบ ซึ่งหากโปรแกรมเมอร์ต้องการเข้าไปอ่านหรือโหลดข้อมูลจากไฟล์เหล่านี้มาใช้งาน จำเป็นอย่างยิ่งที่ต้องรู้จักโครงสร้างของข้อมูลดังกล่าว ยกตัวอย่างเช่น การเปิดไฟล์ภาพชนิดต่างๆ หรือไฟล์เสียงต่างๆ หรือแม้กระทั่งไฟล์จากโปรแกรม Microsoft office ทั้งหลาย หากเรารู้จักโครงสร้างของมันเราก็จะเข้าไปอ่านข้อมูลได้เช่นกัน  ดังนั้นจึงจำเป็นต้องพัฒนาโปรแกรมที่รู้จักโครงสร้างการเก็บข้อมูลของ Binary File นั้นๆครับ ขอยกตัวอย่าง Code Program ภาษา C++ ที่ได้นำเสนอการบันทึกข้อมูลลงไฟล์ DATA.bin ไปแล้วนะครับ การเข้าไปอ่านข้อมูลจำเป็นอย่างยิ่งที่ต้องกำหนดตำแหน่งในการเข้าถึงข้อมูลและกำหนดขนาดของข้อมูลที่ต้องการโหลดมาใช้งาน โดยจะใช้ฟังก์ชัน fread ในการเข้าถึงตำแหน่งข้อมูลและโหลดข้อมูล 
โดยลำดับแรก จะต้องกำหนดตัวแปรที่ใช้เก็บข้อมูล มาดู Code Program กันครับ


เมื่อคอมไพล์โปรแกรมจะปรากฏเลข 1 - 100 บนหน้าจอ จาก Code Program ดังกล่าวเป็นการอ่านหรือโหลดข้อมูลตั้งแต่ลำดับแรกจนถึงลำดับสุดท้ายจากไฟล์ DATA.bin โดยโปรแกรมเมอร์ทราบอยู่แล้วว่ามีข้อมุลชนิด INT เก็บในไฟล์ DATA จำนวน 100 ชุด ในกรณีที่ต้องการอ่านข้อมูลที่ละชุดไล่ไปเรื่อยๆจนหมด (ตรวจสอบโดยฟังก์ชัน feof() ) สามารถเขียน Code Program ได้ดังนี้ ซึ่งจะได้ผลลัพธ์เหมือน Code Program ก่อนหน้านี้



ในกรณีต้องการระบุตำแหน่งที่จะเริ่มอ่านข้อมูล เราจะต้องอาศัยฟังก์ชัน fseek ในการเลื่อนพอย์เตอร์ไปยังตำแหน่งที่ระบุ ดังตัวอย่าง Code Program ที่ต้องการอ่านข้อมูลในอาเรย์ตัวที่ 3 จนถึงตัวที่ 5 


ผลการคอมไพล์ Code Program ดังกล่าวจะปรากฎเลข 3 4 5 เรียงกันบนหน้าจอ 
มาถึงตรงนี้โปรแกรมเมอร์ภาษาซีทุกท่านคงจะเข้าใจถึงวิธีการอ่านหรือโหลดข้อมูลในไฟล์ Binary กันแล้วนะครับ และจะเห็นว่าเราสามารถบริหารจัดการข้อมูลที่อ่านมาได้อย่างง่ายๆครับ เพียงเราทราบโครงสร้างของไฟล์ดังกล่าว ก่อนจบมีโจทย์เล็กๆให้ปรับปรุงนะครับ สมมุติเราไม่ทราบจำนวนชุดข้อมูลที่อยู่ในไฟล์ดังกล่าว เราจะต้องทำอย่างไรถึงจะอ่านข้อมูลและนำข้อมูลที่อ่านได้มาเก็บไว้ในตัวแปรเพื่อใช้งานต่อไป 
ผมแนะนำฟังก์ชัน fseek และการระบุตำแหน่งพอย์เตอร์ไปยังจุดสุดท้ายของไฟล์ด้วย SEEK_END และรอ่านขนาดของไฟล์ด้วยฟังก์ชัน ftell(fp) จากนั้นท่านสามารถคำนวณหาจำนวนชุดข้อมูลด้วยการหารขนาดของไฟล์ด้วยขนาดของชนิดตัวแปร ใช้ fseek และระบุด้วย SEEK_SET เพื่อเลื่อนพอยเตอร์มายังจุดเริ่มต้นของไฟล์ และเมื่อเราทราบจำนวนชุดของตัวแปรแล้ว เราสามารถใช้วิธีการสร้างอาเรย์แบบไดนามิกส์ที่ได้นำเสนอมาแล้วช่วยในการเก็บบันทึกข้อมูลครับ มาดู Code Program กันครับ