06066301 วิชาโครงสร้างข้อมูลและอัลกอริทึม (Data Structures and Algorithms)
- เป็น ภาษาระดับสูง (High-level language)
- เป็น Dynamic Programming Language (ภาษาที่สามารถแยกชนิดตัวแปรได้)
- สามารถรองรับการเขียนได้หลายรูปแบบ ได้แก่
- โครงสร้างเชิงวัตถุ (Object Oriented Programming)
- การเขียนเชิงฟังก์ชัน (Functional Programming)
- มีส่วนขยายเสริมสำหรับการเขียนเชิงตรรกะ
- เป็น Open Source สามารถโหลดแล้วใช้งานได้เลย
- ใช้ Interpreter ในการแปลงโค้ด
- Python เวอร์ชั่นล่าสุดคือ 3.13.0
- Windows
- https://www.python.org/downloads/
py --versionคำสั่งในการเช็ค Version ของ Python ใน Windows
- Mac OS: สามารถลงผ่าน Homebrew โดยใช้คำสั่ง: https://brew.sh/
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
- Ubuntu: ลงผ่าน apt โดยใช้คำสั่ง:
sudo apt install python3python3 --versionคำสั่งในการเช็ค Version ของ Python ใน MacOS, Ubuntu
คือ ตัวแปรภาษา ระหว่างภาษามนุษย์กับภาษาคอมพิวเตอร์ให้เป็น 1 กับ 0 เพราะคอมพิวเตอร์อ่านได้แค่นั้นทำให้ต้องแปลงภาษาเป็นภาษาที่มนุษย์เข้าใจให้เป็นภาษาของ machine language ก่อนที่คอมพิวเตอร์ถึงจะประมวณผลได้
| Interpreter | Compiler |
|---|---|
| แปลงทีละบรรทัดระหว่างทำงานทีละบรรทัด | แปลงให้หมดก่อนแล้วค่อยทำงาน |
| ระหว่างรัน ถ้าเจอ Error ในบรรทัดที่ทำงานอยู่ก็หยุดการรันทันที | ระหว่างแปลง ถ้าเจอ Error ก็ไม่รันเลย |
| ตัวอย่างภาษาที่ใช้: Python, Ruby และ JavaScript | ตัวอย่างภาษาที่ใช้: C, C++ และ Java |
ชนิดของข้อมูลในภาษา Python จะมีอยู่ 4 ตัวหลักๆ คือ
-
String
- String คือชุดข้อความที่คลุมด้วย "" (Double Quote), '' (Single Quote) หรือ """ """ (Triple Quote)
- ไม่สนว่าจะเป็นอะไรแค่คลุมด้วย Double Quote หรือ Single Quote เช่น “0.01” นับเป็นข้อมูลประเภท String
-
Integer
- Int คือข้อมูลตัวเลขจำนวนเต็ม เช่น 1, 0, -5
- ใช้แยกกับ float ที่เป็นจำนวนจริง
-
Float
- float คือข้อมูลตัวเลขจำนวนจริงและทศนิยม เช่น 1.0, 3.141592653589 เป็นต้น
-
Boolean
- bool คือชนิดข้อมูลตรรกศาสตร์ มี 2 ค่าคือ True กับ False
- เราสามารถสร้างตัวแปร เพื่อเก็บข้อมูลประเภทต่างๆ ได้
- ไม่จำเป็นต้องกำหนดชนิดข้อมูลให้กับตัวแปร
- การสร้างตัวแปรนั้นควรมีลักษณะดังนี้
- ตัวอักษรต้องมีมากกว่า 3 อักษรขึ้นไป
- ตัวอักษรต้องเป็นตัวพิมพ์เล็กทั้งหมด
- ชื่อของตัวแปรควรจะมีความหมายเพื่อให้ง่ายต่อการเรียกใช้
- การประกาศตัวแปรนั้นห้ามใช้อักษรพิเศษยกเว้นตัว Underscore (_)
นอกจากนี้ Python ยังเปิดโอกาสให้เพิ่มเติมโมดูลพิเศษที่นอกเหนือจากที่ Python โมดูลพิเศษเหล่านี้ก็ได้รับการพัฒนาจาก Python, C, C++, Java, Dot Net หรือภาษาอื่นๆ
คำสั่งที่เราใช้ในการอ้างอิงโมดูลมาตรฐานหรือโมดูลเพิ่มเติมพิเศษใน Python ประกอบไปด้วย 2 คำสั่งดังนี้
-
คำสั่ง
importเป็นการอ้างอิงโมดูลที่เราต้องการโดยใช้กลุ่มคำสั่งภายในตัวโมดูลimport datetime import datetime, decimal, os
-
คำสั่ง
fromเป็นการอ้างอิงโมดูลที่เราต้องการเฉพาะกลุ่มคำสั่งภายในตัวโมดูลที่เราต้องการfrom os import error, chdir, getcwd
ฟังก์ชัน (Function) คือ ส่วนชุดคำสั่งของโค้ดที่ถูกมาสร้างมาทำงานเพื่อวัตถุประสงค์บางอย่าง ในการเขียนโปรแกรมเรามักจะแยกโค้ดที่มีการทำงานเหมือนๆ กันเป็นฟังก์ชันเอาไว้และ เรียกใช้ฟังก์ชันนั้นซ้ำๆ ซึ่งเป็นแนวคิดของการนำโค้ดกลับมาใช้ใหม่
defย่อมาจากคำว่า “define” ทำหน้าที่เป็นคำสั่งในการประกาศฟังก์ชันmain()คือการตั้งชื่อของฟังก์ชัน อย่างในตัวอย่าง ฟังก์ชันนี้มีชื่อว่า “main” (น้อง ๆ สามารถเปลี่ยนชื่อฟังก์ชันได้)
*ในบรรทัดแรกฟังก์ชันและโปรแกรมต้องมีการสร้าง docstring ขึ้นมาด้วย เพื่อไม่ให้ผิดหลัก PEP-8 ใน <i>Judge
ลักษณะการสร้างฟังก์ชันมีรูปแบบของการเขียนที่ค่อนข้างง่าย มีวิธีการเขียนฟังก์ชันที่แบ่งตามการนำไปใช้งาน 4 รูปแบบ ได้แก่
- การสร้างฟังก์ชันที่ไม่มีการส่งค่าใดๆ กลับ
- การสร้างฟังก์ชันมีไม่มีการส่งค่าใดๆ กลับแต่มีการส่งผ่านค่าร่วมกับตัวแปรอาร์กิวเมนต์
- การสร้างฟังก์ชันร่วมกับการส่งค่าผลลัพธ์กลับ
- การสร้างฟังก์ชันที่มีการใช้ตัวแปรอาร์กิวเมนต์และการส่งค่าผลลัพธ์กลับ
- นอกจากการใช้งานฟังก์ชันที่เป็นแบบทั่วไปแล้ว
ก็มีการสร้างหรือเขียนฟังก์ชันเพื่อใช้งานภายใต้รูปแบบการเขียนโปรแกรมเชิงวัตถุ (Object-Oriented Programming)
- เราจะเรียกว่าเป็น Class Module
- เปลี่ยนชื่อเรียกฟังก์ชันใหม่เป็นคำว่า Method ของ Class Module
- แบ่งลักษณะการใช้งาน Method ออกเป็น 2 ลักษณะการใช้งาน คือ
- Internal Method หรือ Private Method
- Interface Method
-
Internal Method หรือ Private Method
- Method ลักษณะนี้คือ ฟังก์ชันที่สร้างขึ้นเพื่อใช้งานเฉพาะภายใน Class Method
- ฟังก์ชันลักษณะนี้ไม่สามารถเรียกใช้งานโดยตรงจากภายนอก
- อีกทั้งในแต่ละ Class Method ยังมี Internal Method แบบ Built-in ภายในแต่ละ Class Module ซึ่งบางครั้งก็เรียกว่า
Operation Internal Method
- เช่น
__init__,__format__,__len__ฯลฯ
- เช่น
-
Interface Method
- เป็น Method ที่ต้องการสร้างใน Class เพื่อเรียกใช้งานจากภายนอกได้
- จะใช้วิธีประกาศใช้ Class Object ซึ่งรูปแบบการเขียนโปรแกรมเพื่อสร้าง Method
- มีวิธีเขียนเหมือนกับการสร้างฟังก์ชันทั่วไป
คลาส (Class) เปรียบเสมือนเป็นพิมพ์เขียว (Blueprint) หรือต้นแบบที่ใช้สร้างวัตถุ (Object) โดยจะมีแอตทริบิวต์ ( attributes) และเมธอด (methods)
คลาสใน Python
- การสร้างคลาส: ใช้คีย์เวิร์ด
class - แอตทริบิวต์: คือตัวแปรที่อยู่ภายในคลาส
- แอตทริบิวต์เป็น public เสมอ: เข้าถึงได้โดยใช้จุด (.) เช่น
peter.age
Class Diagram คือ Diagram ในรูปแบบของ UML ที่ใช้แสดงโครงสร้างของระบบเชิงโดยแสดง Class, Relationship, Attributes และ Method
Object (วัตถุ) คือเอนทิตีที่มี สถานะ (State) และ พฤติกรรม (Behavior)
ใน Python จะนับ Integer, String, arrays, and dictionaries เป็นวัตถุทุกตัว
โครงสร้างของวัตถุ (Object Structure):
- State (สถานะ): แสดงผ่าน attributes ซึ่งสะท้อนคุณสมบัติของวัตถุ เช่น สี อายุ หรือชนิด
- Behavior (พฤติกรรม): แสดงผ่าน methods ซึ่งสะท้อนการตอบสนองของวัตถุต่อการโต้ตอบ เช่น การกินหรือการนอน
-
Constructor
__init__เป็นเมธอด constructor ที่ใช้สำหรับกำหนดค่าเริ่มต้นให้กับ instance ของคลาส Character- มีพารามิเตอร์สองตัวคือ
self(อ้างถึง instance ที่ถูกสร้างขึ้น),name(ชื่อของตัวละคร) และcatchphrase - พารามิเตอร์
name,catchphraseนี้จะถูกใช้เพื่อกำหนดค่าให้กับแอตทริบิวต์ของ instance แต่ละตัวของคลาส Character
-
เมธอด speak
- ทำหน้าที่คืนข้อความที่รวมชื่อของตัวละครและวลีประจำตัวในรูปแบบ "ชื่อของตัวละครที่พูด: วลีประจำตัว"
self: เมธอดนี้เป็นเมธอดในคลาส ดังนั้นจะรับพารามิเตอร์selfซึ่งหมายถึง instance ของคลาสที่เรียกใช้งานเมธอด- ภายในเมธอด speak ใช้
self.nameเพื่อดึงค่าชื่อ (name) ของตัวละคร และใช้self.catchphraseเพื่อดึงค่าของวลีประจำตัว (catchphrase) ของตัวละครใน instance ที่กำลังทำงาน
-
สร้างอ็อบเจ็กต์ peter
peterคืออ็อบเจ็กต์ที่ถูกสร้างจากคลาส Character- เมื่อสร้างอ็อบเจ็กต์นี้ จะเรียกใช้งานคอนสตรัคเตอร์
__init__ของคลาส Character - Constructor จะได้รับค่าพารามิเตอร์สองค่า:
- "Peter Griffin" จะถูกเก็บในแอตทริบิวต์
self.name - "Bird is the word" จะถูกเก็บในแอตทริบิวต์
self.catchphrase
- "Peter Griffin" จะถูกเก็บในแอตทริบิวต์
-
เรียกเมธอด speak
- เมธอด speak จะถูกเรียกใช้จากอ็อบเจ็กต์
peter - ในเมธอด speak ข้อความจะถูกสร้างโดยการเข้าถึงค่าของแอตทริบิวต์
self.nameและself.catchphrase
- เมธอด speak จะถูกเรียกใช้จากอ็อบเจ็กต์
- คุณฉงนต้องการโปรแกรมรับรายละเอียดนักศึกษาโดยรับรายละเอียดนักศึกษาทั้งหมด 3 คน
- หลังจากรับค่ามาครบแล้วคุณฉงนสามารถเลือกได้ว่าจะให้แสดงผลข้อมูลของนักศึกษาคนไหนผ่านรหัสนักศึกษาของนักศึกษาคนนั้น
- โปรแกรมนั้นจะต้องเก็บข้อมูลของนักศึกษาทั้งหมด 3 คนโดยที่ในแต่ละคนต้องเก็บข้อมูลดังนี้
- ชื่อ, เพศ, อายุ, รหัสนักศึกษา, เกรดเฉลี่ย
- ถ้าไม่เจอข้อมูลของนักศึกษาให้แสดงคำว่า "Student not found"
จากตัวอย่างที่ผ่านมา หากนำข้อมูลของตัวละครมาประกอบกันเป็นโครงสร้างวัตถุของตัวละครและใช้งานตัวแปรชนิดวัตถุแทนการประกาศตัวแปรแบบปกติที่เรียนมาสามารถประกาศตัวแปรได้ดังนี้
เริ่มต้นด้วยการสร้างคลาสที่ชื่อว่า Student โดยคลาสใน Python ทำหน้าที่เป็นโครงสร้างที่ใช้สำหรับสร้างออบเจกต์
ซึ่งในกรณีนี้จะเป็นตัวแทนของนักศึกษาแต่ละคน
class Student:
...เมธอด __init__ จะถูกใช้เพื่อกำหนดค่าเริ่มต้นให้กับแอตทริบิวต์ของออบเจกต์เมื่อมีการสร้างคลาส
- Attributes:
name: ชื่อของนักศึกษาgender: เพศของนักศึกษาage: อายุของนักศึกษาstudent_id: รหัสนักศึกษาที่ไม่ซ้ำกันgpa: เกรดเฉลี่ยสะสม (GPA)
class Student:
def __init__(self, name, gender, age, student_id, gpa):
self.name = name
self.gender = gender
self.age = age
self.student_id = student_id
self.gpa = gpaเวลาสร้าง Object ชึ้นมา
student = Student(name, gender, age, student_id, gpa)เมธอดนี้จะแสดงข้อความที่จัดรูปแบบข้อมูลของนักศึกษา
- Logic:
- ใช้คำนำหน้าชื่อ (
Mrสำหรับเพศชาย,Missสำหรับเพศหญิง) - แสดง GPA ด้วยทศนิยม 2 ตำแหน่ง
- ใช้คำนำหน้าชื่อ (
def display_info(self):
prefix = "Mr" if self.gender.lower() == "male" else "Miss"
return f"{prefix} {self.name} ({self.age}) ID: {self.student_id} GPA {self.gpa:.2f}"การ Override ใน OOP (Object-Oriented Programming) หมายถึงการเขียนเมธอดในคลาสลูก (Subclass) เพื่อแทนที่หรือปรับเปลี่ยนพฤติกรรมของเมธอดที่มีอยู่แล้วในคลาสแม่ (Superclass) โดยที่เมธอดในคลาสลูกมีชื่อและพารามิเตอร์เหมือนกับในคลาสแม่
เมธอด __str__ ช่วยให้สามารถแปลงออบเจกต์เป็นสตริงได้โดยตรงเมื่อใช้ฟังก์ชัน str() หรือ print() และจะเรียกใช้งานเมธอด
display_info() เพื่อแสดงข้อมูลนักศึกษา
def __str__(self):
return self.display_info()class Student:
def __init__(self, name, gender, age, student_id, gpa):
self.name = name
self.gender = gender
self.age = age
self.student_id = student_id
self.gpa = gpa
def __str__(self):
return self.display_info()
def display_info(self):
prefix = "Mr" if self.gender.lower() == "male" else "Miss"
return f"{prefix} {self.name} ({self.age}) ID: {self.student_id} GPA {self.gpa:.2f}"- Creating Objects
สร้างออบเจกต์ของคลาสStudent
peter = Student("Peter Griffin", "Male", 43, 67070067, 2.50)
quagmire = Student("Glenn Quagmire", "Male", 47, 67070112, 3.10)
herbert = Student("Herbert Pervert", "Male", 69, 67070275, 1.90)- Displaying Information
ใช้ฟังก์ชันprint()เพื่อแสดงข้อมูลนักศึกษา
print(peter)
print(quagmire)
print(herbert)Mr Peter Griffin (43) ID: 67070067 GPA 2.50
Mr Glenn Quagmire (47) ID: 67070112 GPA 3.10
Mr Herbert Pervert (69) ID: 67070275 GPA 1.90
Lab Documentation (Lab 1)
Class Diagram จะมี 3 ส่วนคือ
- Class Name (ชื่อคลาส)
- Attributes (คุณลักษณะ)
intคือคุณลักษณะที่มีชนิดเป็น intfloatคือคุณลักษณะที่มีชนิดเป็น floatObjectคือคุณลักษณะที่มีชนิดเป็น Object
- Methods (เมธอด)
voidคือเมธอดที่ไม่มีการ return ค่าใดๆ เลยfloatคือเมธอดที่ return ค่าเป็น floatintคือเมธอดที่ return ค่าเป็น inttupleคือเมธอดที่ return ค่าเป็น tuple
-
จงเขียนฟังก์ชัน
is_even()ที่รับค่าตัวเลขจำนวนเต็ม 1 ค่า (k) และทำการคืนค่า (return) ผลลัพธ์เป็นค่า True หรือ False- คืนค่า True ก็ต่อเมื่อ k เป็นเลขคู่
- ไม่เช่นนั้น ให้คืนค่า False
-
ไม่อนุญาตให้ใช้โอเปอเรเตอร์สำหรับการคูณ การ mod หรือ การหาร
-
ตัวอย่าง
is_even(22)- ผลลัพธ์ คือ True
-
สร้างฟังก์ชันที่รับค่าลิสต์ข้อมูลคะแนนและทำการคืนค่าผลลัพธ์ต้องออกมาเป็นข้อมูล tuple ความยาว 3 ข้อมูลที่ประกอบไปด้วยค่ามากสุด, ค่าน้อยสุดและค่าเฉลี่ยของข้อมูลที่รับเข้ามา
- ข้อมูลทุกตัวจะต้องโดนปัดทศนิยมให้เหลือ 2 ตำแหน่งผ่านคำสั่ง
round(x, 2)
- ข้อมูลทุกตัวจะต้องโดนปัดทศนิยมให้เหลือ 2 ตำแหน่งผ่านคำสั่ง
-
ไม่อนุญาตให้ใช้ Built-In function
min(),max() -
ตัวอย่าง
your_function([22, 54, 7, 87, 12, 9, 63, 55, 48])- ผลลัพธ์ คือ (7, 87, 39.67)
-
สร้างฟังก์ชันที่ทำหน้าที่สลับค่าของตัวแปรทั้งสองตัวนี้จากข้อมูล tuple ขนาด 2 ข้อมูล
- ชนิดของข้อมูลใน tuple ผลลัพธ์ต้องเป็น float เท่านั้น
-
ตัวอย่าง
- เช่น
function((6, 8)) - ผลลัพธ์ คือ (8.0, 6.0)
- เช่น
(โค้ด Python สำหรับรับ input)
คุณฉงนต้องการโปรแกรมรับรายละเอียดนักศึกษาโดยรับรายละเอียดนักศึกษาทั้งหมด 3 คน หลังจากรับค่ามาครบแล้วคุณฉงนสามารถเลือกได้ว่าจะให้แสดงผลข้อมูลของนักศึกษาคนไหนผ่านรหัสนักศึกษาของนักศึกษาคนนั้น โดยที่โปรแกรมนั้นจะต้องเก็บข้อมูลของนักศึกษาทั้งหมด 3 คนโดยที่ในแต่ละคนต้องเก็บข้อมูลดังนี้
- ชื่อ, เพศ, อายุ, รหัสนักศึกษา, เกรดเฉลี่ย
ถ้าไม่เจอข้อมูลของนักศึกษาให้แสดงคำว่า "Student not found"
REMARK: ในข้อนี้ให้ลองเขียนแบบไม่ใช้ Class ในการสร้าง Object, ให้เก็บเป็นตัวแปรของนักศึกษา 3 คนแทน ห้ามนักศึกษาใช้ OOP, Dictionary หรือสร้างคลาสในข้อนี้โดยเด็ดขาด
คุณฉงนต้องการโปรแกรมรับรายละเอียดนักศึกษาโดยรับรายละเอียดนักศึกษาทั้งหมด 3 คน หลังจากรับค่ามาครบแล้วคุณฉงนสามารถเลือกได้ว่าจะให้แสดงผลข้อมูลของนักศึกษาคนไหนผ่านรหัสนักศึกษาของนักศึกษาคนนั้น โดยที่โปรแกรมนั้นจะต้องเก็บข้อมูลของนักศึกษาทั้งหมด 3 คนโดยที่ในแต่ละคนต้องเก็บข้อมูลดังนี้
- ชื่อ, เพศ, อายุ, รหัสนักศึกษา, เกรดเฉลี่ย
ถ้าไม่เจอข้อมูลของนักศึกษาให้แสดงคำว่า "Student not found"
REMARK: ในข้อนี้ให้ลองใช้ Class ในการสร้าง Object ของนักศึกษาแต่ละคนขึ้นมาดู, ลองออกแบบและสร้างคลาสเอง ห้ามใช้ Dictionary ในข้อนี้โดยเด็ดขาด
ให้สร้างคลาสที่ชื่อว่า Rectangle ขึ้นมาโดยที่ภายในคลาสนี้จะมี Attribute 2 ตัวและ Method 2 ตัวดังนี้
- Attributes (คุณลักษณะ) ได้แก่
- ค่าความสูง (จำนวนจริง)
- ค่าความกว้าง (จำนวนจริง)
- Methods (เมธอด) ได้แก่
calculate_area()ทำหน้าที่คำนวณค่าของพื้นที่ของสี่เหลี่ยมและ return ค่ากลับcalculate_perimeter()ทำหน้าที่คำนวณหาความยาวรอบรูปของสี่เหลี่ยมและ return ค่ากลับ
วิธีการรับ Input ใน <i>Judge จะรับมาเป็นลำดับตามนี้
- ค่าความสูง
- ค่าความกว้าง
- ค่าเงื่อนไข มี 2 ตัวได้แก่ {"area", "perimeter"}
- ถ้าค่าที่รับเข้ามาเป็น "area" ให้เรียกเมธอด
calculate_area()พร้อมกับแสดงผลค่าพื้นที่ของสี่เหลี่ยม - ถ้าค่าที่รับเข้ามาเป็น "perimeter" ให้เรียกเมธอด
calculate_perimeter()พร้อมกับแสดงผลค่าความยาวรอบรูปของสี่เหลี่ยม
- ถ้าค่าที่รับเข้ามาเป็น "area" ให้เรียกเมธอด














