โจทย์: การเขียนโปรแกรมเชิงอ็อบเจกต์#

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

ข้อ 1#

สมมติว่าเรามีคลาสชื่อ MyCounter ดังนี้

class MyCounter:
       max_number = 200
       contacts = []
 
   def __init__(self, number):
       self.number = number
       print ("I am number " + str(self.number))
 
   def report(self):
       print ("I am now number " + str(self.number))
 
   def multiply(self, factor):
       self.number = self.number * factor

จากโค้ดด้านล่างนี้ จงวิเคราะห์ว่าแต่ละบรรทัดเกิดข้อผิดพลาดหรือไม่ หากไม่เกิดข้อผิดพลาดโค้ดจะแสดงผลลัพธ์อย่างไรบ้าง

c1 = MyCounter(10)
c2 = MyCounter()
c3 = MyCounter(15)

print(c1.report)
print(c1.max_number)

c1.report()
c3.report()

c1.multiply(2, 5)
c3.multiply(4)
c1.report()
c3.report()

MyCounter.report()
print (MyCounter.max_number)
print (c3.max_number)

c3.contacts.append(10)
MyCounter.append(15)
print(c3.contacts)
print(c1.contacts)

ข้อ 2#

สมมติว่าเรามีคลาสชื่อ SentimentLexicon ดังนี้

class SentimentLexicon:
        
   def __init__(self, polarity='positive', language='en'):
       self.language = language
       self.words = []
       if polarity in ['positive', 'negative', 'neutral']:
           self.polarity = polarity
       else:
           print('Found a weird polarity: {}'.format(polarity))
 
   def add_word(self, word):
       self.words.append(word)
 
   def vocab_size(self):
       return len(self.words)

จากโค้ดด้านล่างนี้ จงวิเคราะห์ว่าแต่ละบรรทัดเกิดข้อผิดพลาดหรือไม่ หากไม่เกิดข้อผิดพลาดโค้ดจะแสดงผลลัพธ์อย่างไรบ้าง

my_lex = SentimentLexicon()
french_lex = SentimentLexicon(language='fr')
german_neg_lex = SentimentLexicon('de', 'negative')

print(my_lex.polarity)
print(french_lex.polarity)
print(my_lex.add_word)

my_lex.add_word('good')
my_lex.add_word('bon')
print(my_lex.vocab_size())
print(french_lex.vocab_size())

ข้อ 3#

สมมติว่าเรามีคลาสชื่อ Library และ Book ดังนี้

class Library:
    def __init__(self):
        self.books = []

    def add_book(self, book):
        self.books.append(book)
        print(f"{book.title} added to the library.")

    def lend_book(self, book_title):
        for book in self.books:
            if book.title == book_title and book.available:
                book.available = False
                print(f"{book.title} lent from the library.")
                return
        print("Book not available for lending.")

    def collect_book(self, book_title):
        for book in self.books:
            if book.title == book_title and not book.available:
                self.books.append(book)
                book.available = True
                print(f"{book.title} collected back to the library.")
                return
        print("Book not found or already available in the library.")

    def report(self):
      if self.books:
          print("Books available in the library:")
          for book in self.books:
              print("-", book.title)
      else:
          print("No books available in the library.")

class Book:
    def __init__(self, title):
        self.title = title
        self.available = True

จากโค้ดด้านล่างนี้ จงวิเคราะห์ว่าแต่ละบรรทัดเกิดข้อผิดพลาดหรือไม่ หากไม่เกิดข้อผิดพลาดโค้ดจะแสดงผลลัพธ์อย่างไรบ้าง

arts_library = Library()

book1 = Book("ภาษาศาสตร์เบื้องต้น")
book2 = Book("ปรัชญาทั่วไป")
arts_library.add_book(book1)
arts_library.add_book(book2)

arts_library.lend_book("ภาษาศาสตร์เบื้องต้น")
arts_library.lend_book("ภาษาศาสตร์เบื้องต้น")
arts_library.collect_book("ภาษาศาสตร์เบื้องต้น")
arts_library.lend_book("Machine Learning Basics")
arts_library.report()

ข้อ 4#

สมมติว่าเรามีคลาสชื่อ BankAccount ดังนี้

class BankAccount:
        
    def __init__(self, account_number, initial_balance=0):
        self.account_number = account_number
        self.balance = initial_balance

    def deposit(self, amount):
        self.balance += amount

    def withdraw(self, amount):
        if amount <= self.balance:
            self.balance -= amount
            print("Withdrawal successful.")
        else:
            print("Insufficient funds. Withdrawal not allowed.")

    def get_balance(self):
        return self.balance

จากโค้ดด้านล่างนี้ จงวิเคราะห์ว่าแต่ละบรรทัดเกิดข้อผิดพลาดหรือไม่ หากไม่เกิดข้อผิดพลาดโค้ดจะแสดงผลลัพธ์อย่างไรบ้าง

account1 = BankAccount(12345, 500)
account1.deposit(200)
account1.withdraw(100)
account1.withdraw(700)

print("Current balance:", account1.get_balance())

ข้อ 5#

สมมติว่าเรามีคลาสชื่อ StudentRecord ดังนี้

class StudentRecord:
    def __init__(self, name, roll_number):
        self.name = name
        self.roll_number = roll_number
        self.courses = []

    def add_course(self, course):
        self.courses.append(course)
        print(f"Course '{course}' added to {self.name}'s record.")

    def drop_course(self, course):
        if course in self.courses:
            self.courses.remove(course)
            print(f"Course '{course}' dropped from {self.name}'s record.")
        else:
            print(f"Course '{course}' not found in {self.name}'s record.")

    def view_courses(self):
        if self.courses:
            print(f"Courses enrolled by {self.name}:")
            for course in self.courses:
                print("-", course)
        else:
            print(f"No courses enrolled by {self.name}.")

จากโค้ดด้านล่างนี้ จงวิเคราะห์ว่าแต่ละบรรทัดเกิดข้อผิดพลาดหรือไม่ หากไม่เกิดข้อผิดพลาดโค้ดจะแสดงผลลัพธ์อย่างไรบ้าง

student1 = StudentRecord("เอเรน", "S001")
student2 = StudentRecord("มิคาสะ", "S002")
student3 = StudentRecord("อามิน", "S003")


student1.add_course("NLP_SYSTEM")
student2.add_course("USE_IN_DE_INF_WRK")

student1.view_courses()

student1.drop_course("NLP_SYSTEM")
student1.drop_course("WEB_DES_DEV")


student1.view_courses()
student2.view_courses()
student3.view_courses()

ข้อ 6#

สมมติว่าเรามีคลาสชื่อ SocialMediaProfile ดังนี้

class SocialMediaProfile:
    def __init__(self, username, bio='', followers=0):
        self.username = username
        self.bio = bio
        self.followers = followers
        self.posts = []
        self.mentioned_organizations = {}
 
    def add_post(self, post_content):
        self.posts.append(post_content)
        self.extract_and_track_organizations(post_content)
 
    def num_posts(self):
        return len(self.posts)
    
    def extract_and_track_organizations(self, text):
        organizations = ['XYZ Corp', 'ABC Company', 'Tech Inc']
        for org in organizations:
            if org.lower() in text.lower():
                self.mentioned_organizations[org] = self.mentioned_organizations.get(org, 0) + 1
    
    def get_mentioned_organizations(self):
        return self.mentioned_organizations

จากโค้ดด้านล่างนี้ จงวิเคราะห์ว่าแต่ละบรรทัดเกิดข้อผิดพลาดหรือไม่ หากไม่เกิดข้อผิดพลาดโค้ดจะแสดงผลลัพธ์อย่างไรบ้าง

profile1 = SocialMediaProfile('user1', bio='I love technology!', followers=1000)
profile2 = SocialMediaProfile('user2', bio='Foodie | Traveler', followers=500)

print(profile2.bio)
print(profile1.add_post)

profile1.add_post('Just got a new job at XYZ Corp!')
profile1.add_post('Excited to join the team at ABC Company!')

print(profile1.num_posts())
print(profile2.num_posts())

print(profile1.get_mentioned_organizations())