Object Oriented Programming

Bài tập Abstract Class vs Interface

Bài 1: OOP-Market

Chợ OOP-Market là một khu kinh doanh sầm uất của thành phố. Mặt bằng chợ được chia thành các sạp có diện tích khác nhau cho tiểu thương thuê. Có ba loại sạp tương ứng với ba loại mặt hàng được phép kinh doanh tại chợ là: thực phẩm, quần áo, và trang sức. Đơn giá thuê ở mỗi loại sạp là như nhau: 40.000.000 đồng/m2/năm. Thông tin chung để quản lý mỗi sạp bao gồm:

Vào cuối năm, số tiền mỗi tiểu thương thuê sạp phải đóng = tiền thuê sạp + thuế doanh thu.

Tiền thuê sạp = đơn giá thuê * diện tích sạp.

Thuế doanh thu tùy thuộc vào từng loại sạp và cho bởi bảng sau:

Loại sạpThuế doanh thu
Sạp thực phẩm5%
Sạp quần áo10%
Sạp trang sức - Phần doanh thu < 100.000.000 đồng: 20%
- Phần doanh thu >= 100.000.000 đồng: 30%

Ngoài ra, những tiểu thương thuê sạp thực phẩm phải đóng thêm tiền sử dụng dịch vụ đông lạnh để bảo quản thực phẩm mà sạp của mình đã sử dụng trong năm (số tiền khác nhau ở từng sạp).

Cài đặt chương trình cho phép quản lý số tiền mỗi sạp được thuê phải đóng hàng năm như sau:

  1. Nhập vào danh sách thông tin các sạp được thuê.
  2. Tính tổng số tiền các sạp được thuê phải đóng hàng năm.
Yêu cầu:

Áp dụng kế thừa và đa hình để tăng tính tái sử dụng và tính dễ mở rộng của chương trình.

Bài 2: Dịch vụ viễn thông

Một công ty viễn thông cung cấp dịch vụ điện thoại và internet hỗn hợp cho khách hàng theo hình thức trả sau. Để sử dụng dịch vụ, khách hàng cần ký hợp đồng với công ty. Trong hợp đồng, cần có các thông tin cá nhân của khách hàng (họ tên, chứng minh nhân dân, địa chỉ) và thông tin về cách tính cước mà khách hàng chọn. Cuối mỗi tháng, khách hàng sẽ được thông báo cước tùy theo lượng sử dụng của mình tương ứng với gói cước đã đăng ký ban đầu.

Hợp đồng với gói cước Basic có cách tính tiền như sau:

Để thu hút thêm đối tượng khách hàng thường xuyên sử dụng internet, công ty mở rộng thêm hai loại hợp đồng mới có cách tính cước linh hoạt như sau:

Gói cước Cước điện thoại Cước internet
Data Free Tương tự gói Basic
  • Nếu Lưu lượng truy cậpNgưỡng lưu lượng miễn phí
    ⇨ Chỉ đóng Cước thuê bao.
  • Nếu Lưu lượng truy cập > Ngưỡng lưu lượng miễn phí
    Cước thuê bao + Cước lưu lượng vượt ngưỡng.

Ghi chú:

  • Cước thuê baoNgưỡng lưu lượng miễn phí được công ty xác định lúc lập hợp đồng đăng ký cho khách hàng và được ghi trong mỗi hợp đồng: Có thể khác nhau tùy vào lúc lập hợp đồng nhưng không đổi sau đó.
  • Cước lưu lượng vượt ngưỡng tính theo công thức Cước internet của gói Basic.
Data Fix Tương tự gói Basic +
Giảm 10% giá cước
Mức cố định 1.000.000 đồng

Viết chương trình cho phép công ty quản lý các hợp đồng trong một danh sách duy nhất với 2 chức năng:

  1. Cho phép khách hàng đăng ký hợp đồng mới.
  2. Thông báo tiền cước cho tất cả khách hàng vào cuối tháng.
Yêu cầu:

Áp dụng kế thừa và đa hình để tăng tính tái sử dụng và tính dễ mở rộng của chương trình.

Bài 3: Quản lý khách hàng

Công ty XYZ quản lý việc mua hàng của 3 loại khách hàng:

- Loại A: Khách hàng bình thường:

Số tiền khách hàng trả = Số lượng hàng * đơn giá hàng + Thuế VAT (10%)

- Loại B: Khách hàng thân thiết:

Phần trăm khuyến mãi = MAX (Số năm thân thiết * 5%, 50%)

Số tiền khách hàng trả = (Số lượng hàng * đơn giá hàng) * (100% - Phần trăm khuyến mãi) + Thuế VAT (10%)

- Loại C: Khách hàng đặc biệt:

Số tiền khách hàng trả = (Số lượng hàng * đơn giá hàng) * 50% + Thuế VAT (10%)

Viết chương trình thực hiện các yêu cầu sau:

  1. Nhập danh sách khách hàng
  2. Tính Tổng số tiền công ty thu được từ danh sách khách hàng trên

Bài 4: Nông trại

Một nông trại chăn nuôi có 3 loại gia súc: bò, cừu, và dê. Mỗi loại gia súc đều có thể sinh con, cho sữa và phát ra tiếng kêu riêng của chúng. Khi đói, các gia súc sẽ phát ra tiếng kêu để đòi ăn. Sau một thời gian chăn nuôi, người chủ nông trại muốn thống kê xem trong nông trại có bao nhiêu gia súc ở mỗi loại, tổng số lít sữa mà tất cả các gia súc của ông đã cho. Áp dụng kế thừa, xây dựng chương trình cho phép người chủ nông trại nhập vào số lượng gia súc ban đầu ở mỗi loại.

  1. Một hôm người chủ nông trại đi vắng, tất cả gia súc trong nông trại đều đói. Hãy cho biết những tiếng kêu nghe được trong nông trại.
  2. Chương trình sẽ đưa ra thống kê các thông tin người chủ mong muốn (nêu trên) sau một lứa sinh và một lược cho sữa của tất cả gia súc.
Biết rằng:

Bài 5: HR Alpha

Công ty phát triển phần mềm Alpha có nhu cầu quản lý các nhân viên văn phòng gồm:

Thông tin cơ bản các nhân viên đều có:

Lương của từng loại nhân viên tính như sau:
Áp dụng tính kế thừa và đa xạ viết chương trình thực hiện các chức năng sau:
  1. Nhập danh sách các nhân viên của công ty (lưu trong một mảng duy nhất).
  2. Tính tổng số tiền lương công ty phải trả cho toàn bộ nhân viên trong một tháng. (TotalSalary)

Bài 6: Babilon

Hành tinh Babilon có 3 loại robot: Pedion, ZattackerCarrier. Cả 3 loại robot đều có trọng lượng nhất định là M. Pedion thuộc loại robot xây dựng, có M = 20 kg và một độ linh hoạt F (1 ≤ F ≤ 5). Zattacker là robot có khả năng tấn công với trọng lượng M = 50 kg có sức mạnh P (20 ≤ P ≤ 30). Carrier là robot mang theo năng lượng tiếp tế cho 2 loại còn lại, có trọng lượng M = 30 kg và kho năng lượng vận chuyển E (50 ≤ E ≤ 100). Năng lượng tiêu thụ khi robot đi 1 quãng đường S km là:

Một hôm, tổng chỉ huy Babilon điều động một đoàn tàu robot gồm a Pedion, b Zattackerc Carrier (a, b, c là do người dùng nhập vào) đi khai phá những vùng đất còn bỏ hoang. Các robot có trọng lượng cố định theo loại, nhưng F, PE thì có giá trị ngẫu nhiên trong miền giá trị của nó. Giả sử tất cả các robot đều đi được một đoạn đường dài 10km. Hãy xuất ra:

  1. Loại robot, các thông tin của nó và số năng lượng nó đã được sử dụng. (4 điểm)
  2. Cho biết loại robot tiêu thụ năng lượng nhiều nhất trong đoàn. (3 điểm)
  3. Xuất tổng năng lượng đã tiêu thụ của cả đoàn robot. (3 điểm)

Bài 7: Clothing Store

Một cửa hàng quần áo bán giày, quần và áo. Cửa hàng cũng cho phép khách hàng mua một “bộ trang phục”, bao gồm ba món: một đôi giày, một chiếc quần và một chiếc áo. Mỗi mặt hàng quần áo có một mô tả và một mức giá. Bốn loại mặt hàng quần áo được đại diện bởi bốn class Shoes, Pants, Top, and Outfit. Tất cả bốn class đều phải cài đặt theo interface ClothingItem sau

public interface IClothingItem{
    string GetDescription();
    double GetPrice();
}

Sơ đồ sau đây cho thấy mối quan hệ giữa interface IClothingItem và các class Shoes, Pants, Top và Outfit.

Cửa hàng cho phép khách hàng tạo các bộ trang phục bao gồm một đôi giày, quầnáo. Phần mô tả trang phục bao gồm phần mô tả theo thứ tự giày, quầnáo được phân tách bằng dấu "/" và theo sau là khoảng trắng và "outfit". Giá của một bộ trang phục được tính như sau. Nếu tổng giá của hai mặt hàng bất kỳ bằng hoặc vượt quá $100 , thì sẽ được giảm giá 25% cho tổng giá của cả ba mặt hàng. Ngược lại thì giảm giá 10%.

Ví dụ 1: một bộ trang phục bao gồm giày sneakers ($40), quần bue jeans ($50)T-shirt ($10) sẽ có tên "sneakers/blue jeans/T-shirt outfit" và giá là 0.90(40 + 50 + 10) = $90,00.

Ví dụ 2: Một bộ trang phục bao gồm giày loafers ($50), quần cutoffs ($20) và áo dress-shirt ($60) sẽ có mô tả "loafers/cutoffs/dress-shirt outfit" và giá 0.75(50 + 20 + 60) = $97.50. Viết class Outfit cài đặt interface IClothingItem. Việc triển khai phải có một phương thức khởi tạo có ba tham số đại diện cho một đôi giày, quần và áo.

Shoes shoes = new Shoes("sneakers", 40);
Pants pants = new Pants("blue jeans", 50);
Top top = new Top("T-Shirt", 10);
Outfit outfit = new Outfit(shoes, pants, top);
Console.WriteLine(outfit.GetDescription());
Console.WriteLine(outfit.GetPrice());

Shoes shoes2 = new Shoes("loafers", 50);
Pants pants2 = new Pants("cutoffs", 20);
Top top2 = new Top("dress-shirt", 60);
Outfit outfit2 = new Outfit(shoes2, pants2, top2);
Console.WriteLine(outfit2.GetDescription());
Console.WriteLine(outfit2.GetPrice());

Bài 8: Textbook

Xây dựng các class như mô hình UML sau:

Dựa vào mô hình UML ở trên tạo 2 class BookTextbook theo yêu cầu sau:

1. Tạo class Book với 2 phương thức GetTitle()GetBookInfo() theo các yêu cầu sau:

Phương thức GetTitle() trả về tên của sách

Phương thức GeBookInfo() trả tên thông tin của sách theo định dạng sau: “title-price”

Lưu ý: phải cài đặt thêm phương thức khởi tạo và các phương thức nếu cần thiết.

2. Tạo Class Textbook với 3 phương thức GetEdition(), GetBookInfo() và CanSubstituteFor() theo các yêu cầu sau:

Phương thức GetEdition() trả về thông tin số ấn bản - edition của Textbook

Phương thức GetBookInfo() trả về thông tin của Textbook theo định dạng sau: “title-price-edition”

Phương thức CanSubstituteFor() trả về true nếu thỏa mãn các 2 điều kiệu sau ngược lại trả về false:

Xem các ví dụ

Statement Giá trị trả về
(để trống nêu không có giá trị)
Diễn giải
Textbook bio22 = new Textbook(“Biology”, 49.75, 2);bio22 là 1 Textbook với title là “Biology” với price là 49.75, và có ấn bản edition là 2.
Textbook bio23 = new Textbook(“Biology”, 39.75, 3);bio23 là 1 Textbook với title là “Biology” với price là 39.75, và có ấn bản edition là 3.
bio23.GetEdition()3Trả về ấn bản edition
bio23.GetBookInfo()“Biology-39.37-3”Trả về chuỗi định dạng bao gồm title, price và edition
bio23.CanSubstituteFor(bio22)Truebio23 có thể thay thế hợp lệ cho bio22, ví chúng có cùng tên và edition của bio23 lớn hơn edion của bio22
bio22.CanSubstituteFor(bio23)Falsebio22 không thay thế được bio23 vì edition của bio22 nhỏ hơn edition của bio23.
Textbook math = new Textbook("Calculus", 45.25, 1);math là 1 Textbook với title là “Calculus” với price là 45.25, và có ấn bản edition là 1.
bio22.CanSubstituteFor(math)Falsebio22 không thay thế được cho math, vì title của bio22 không giống với title của math

Bài 9: Máy lọc nước

Phần 1

Máy lọc ly tâm là một loại máy lọc nước hoạt động bằng xăng. Người ta thuê máy sử dụng với đơn giá thuê 50.000 đồng/h. Mỗi máy lọc ly tâm có công suất lọc (m3/h) và tốc độ hao xăng (lít/h) khác nhau nhưng không đổi trong suốt thời gian hoạt động (h) của máy. Đơn giá xăng là 20.000 đồng/lít.

Phần 2

Máy lọc xúc tác là một loại máy lọc nước hoạt động bằng hóa chất. Người ta thuê máy với đơn giá thuê 80.000 đồng/h. Mỗi máy có công suất lọc (m3/h) khác nhau. Để lọc nước, ta cho một lượng hóa chất (g) vào từ đầu và sử dụng trong suốt thời gian sử dụng (h) của máy. Công suất lọc thực tế được tính theo hai trường hợp như sau:

Lượng nước mỗi máy lọc được = công suất lọc thực tế * thời gian hoạt động.

Chi phí thuê mỗi máy = đơn giá thuê * thời gian hoạt động.

Chi phí sử dụng máy = chi phí thuê + chi phí nhiên/vật liệu (đơn giá hóa chất là 10.000 đồng/g).

Phần 3

Một cái ao chứa M mét khối (m3) nước. Để lọc nước trong ao, người ta thuê N máy lọc (vừa xúc tác vừa ly tâm) để sử dụng. Thông tin các loại máy lọc và các công thức tính như đã được mô tả ở các phần 1 và 2 bên trên.

Bảng tóm tắt thông tin các loại máy lọc:
Loại máy Đơn giá thuê Công suất lọc Chi phí nhiên/vật liệu
Máy ly tâm 50.000 đồng/h Không đổi Lượng xăng * 20.000
Máy xúc tác 80.000 đồng/h Thay đổi theo lượng hóa chất và thời gian sử dụng hóa chất Lượng hóa chất * 10.000

Áp dụng các tính chất hướng đối tượng (đóng gói, kế thừa, đa hình) để thực hiện những việc sau:

  1. Thiết kế chương trình có tính tái sử dụng (reuse) và khả năng mở rộng (scalable).
  2. Xây dựng chương trình cho phép:
    • Nhập vào danh sách N máy lọc (với đầy đủ thông tin sử dụng).
    • Nhập vào lượng nước M (số m3) trong ao. Chương trình cho biết với số máy lọc được sử dụng, ao có được lọc hết hay không, và tính tổng chi phí sử dụng các máy lọc.

Bài 10: Guess Game

Xây dựng các class như mộ hình UML như hình sau

Guess Game

Yêu cầu

Tạo lớp WordMatch như được mô tả trong mô hình UML ở phía trên, bạn cần cài đặt 2 phương thức ScoreGuessFindBetterGuess sẽ được mô tả chi tiết trong phần a và b ở phía dưới

Tạo phương thức ScoreGuess(string guess) trong lớp WordMatch (6 điểm)

Tiền điều kiện

0 < guess.Length ≤ secret.Length
Cách tính Score theo công thức sau:
Score= Số lần xuất hiện chuỗi con × bình phương chiều dài chuỗi guess
Xét ví dụ sau
WordMatch game = new WordMatch(“mississippi”);
GuessSố lần xuất hiện chuỗi conScore = Số lần xuất hiện chuỗi con × bình phường chiều dài của guessGiá trị trả về game.ScoreGuess(guess)
“i”44 * 12 = 44
“iss”22 * 32 = 1818
“issipp”11 * 62 = 3636
“Mississippi”11 * 112 = 121121
WordMatch game = new WordMatch(“aaaabb”);
GuessSố lần xuất hiện chuỗi conScore = Số lần xuất hiện chuỗi con × bình phường chiều dài của guessGiá trị trả về game.ScoreGuess(guess)
“a”44 * 12 = 44
“aa”33 * 22 = 1212
“aaa”22 * 32 = 1818
“aabb”11 * 42 = 1616
“c”00 * 12 = 00

Tạo phương thức FindBetterGuess(string guess1, string guess2) trong lớp WordMatch (4 điểm).

Tiền điều kiện:

Phương thức FindBetterGuess trả về dự đoán tốt hơn của 2 tham số chuỗi guess1 và guest2. Nếu phương thức ScoresGuess của guess1 và guess2 trả về giá trị khác nhau, thì trả về guess có điểm cao hơn. Nếu phương thức ScoreGuess của guess1 và guess2 trả về cùng giá trị, thì trả về guess lớn hơn tính theo alphabet.

Xét ví dụ sau
WordMatch game = new WordMatch(“concatenation”);
Gọi phương thứcGiá trị trả vềGiải thích
game.ScoreGuess(“ten”);91 * 32
game.ScoreGuess(“nation”);361 * 62
game.FindBetterGuess(“ten”, “nation”);“nation”Vì ScoreGuess(“ten”) lớn hơn ScoreGuess(“nation”) nên trả về “nation”
game.ScoreGuess(“con”);91 * 32
game.ScoreGuess(“cat”);91 * 32
game.FindBetterGuess(“con”, “cat”);“con”Vì ScoreGuess(“con”) bằng ScoreGuess(“cat”) và “cat” tính theo alphabet lớn hơn “con” nên trả về “con”

Bài 11: Library

Thư viện trường học là trung tâm văn hóa, khoa học của nhà trường nhằm mở rộng kiến thức, góp phần nâng cao hiệu quả dạy- học và nghiên cứu khoa học của giáo viên và học sinh. Một thư viện trường học cần quản lý danh sách các loại sách gồm 2 loại như sau:

Yêu cầu:
  1. Nhập và xuất danh sách các sách của thư viện trường học.
  2. Tính thành tiền mà thư viện trường học phải trả cho từng loại sách và hiển thị thông tin chi tiết những sách nào có thành tiền phải trả ít nhất.
  3. Tìm thông tin các sách giáo khoa của nhà xuất bản có tên do người dùng nhập vào.

Bài 12: Quản lý đất đai

Trước hết phải khẳng định, đất đai là nguồn tài nguyên vô cùng quý giá, là tài sản quan trọng của quốc gia, là tư liệu sản xuất,… Đặc biệt, đất đai là điều kiện cần cho mọi hoạt động sản xuất và đời sống. Ở nước ta, khi còn nhiều người sống nhờ vào nông nghiệp, thì đất đai càng trở thành nguồn lực rất quan trọng.

Muốn phát huy tác dụng của nguồn lực đất đai, ngoài việc bảo vệ đất của quốc gia, còn phải quản lý đất đai hợp lý, nâng cao hiệu quả sử dụng đất sao cho vừa đảm bảo được lợi ích trước mắt, vừa tạo điều kiện sử dụng đất hiệu quả lâu dài để phát triển bền vững đất nước.

Hiện nay, ở Việt Nam đất đai được phân chia thành 2 loại chính sau:

Quan điểm nhất quán của Đảng, Nhà nước và nhân dân ta đã được xác định từ năm 1980 đến nay là đất đai thuộc sở hữu toàn dân, do Nhà nước đại diện chủ sở hữu và thống nhất quản lý. Để góp phần nâng cao hiệu quả quản lý nhà nước về đất đai, mỗi thửa đất được nhà nước quản lý và cấp quyền sử dụng cho một hoặc nhiều người dân (nhà nước cho phép nhiều người dân có thể đồng sở hữu quyền sử dụng đất) có nhu cầu sử dụng (Giấy chứng nhận quyền sử dụng đất hay còn được gọi là Sổ hồng).

Áp dụng kiến thức lập trình hướng đối tượng (kế thừa, đa hình) thiết kế sơ đồ chi tiết các lớp đối tượng và khai báo các lớp để xây dựng chương trình thực hiện các yêu cầu sau:

  1. Tạo danh sách các giấy chứng nhận quyền sử dụng đất mà nhà nước đã cấp cho người dân.
  2. Tính tiền thuế mà người sử dụng đất phải đóng cho nhà nước và cho biết thửa đất nào (thông tin thửa đất) có tiền thuế phải đóng nhiều nhất.
  3. Xuất ra màn hình thông tin các thửa đất nông nghiệp đã hết thời hạn sử dụng (năm sử dụng < năm hiện tại).

Bài 13. Quản lý nhân viên trường đại học K

Một trường đại học K cần quản lý danh sách các nhân viên cùng hưởng trợ trên tiêu chí cụ thể để đánh giá lao động tiên tiến.

Nhân viên bao gồm 3 loại: giảng viên, nghiên cứu viên và nhân viên văn phòng.

Mỗi nhân viên đều có: mã nhân viên, họ tên, ngày tháng năm sinh.

Thông tin chi tiết theo từng loại nhân viên:

Tiêu chuẩn xét tuyên lao động tiên tiến:

Yêu cầu:

  1. Xây dựng các lớp (class) và các thuộc tính kế thừa phù hợp cho bài toán trên.
  2. Nhập vào danh sách các nhân viên (với loại khác nhau), sau đó xác định các nhân viên đủ tiêu chuẩn lao động tiên tiến.

Bài 14: Trung tâm thể hình MTK

Như chúng ta đã biết, sức khỏe tốt là nền tảng góp phần cho một cuộc sống hạnh phúc, và việc tập luyện hằng ngày chính là một biện pháp cực kỳ hiệu quả để nâng cao cả về sức khỏe tinh thần và thể chất. Nắm bắt xu thế quan tâm sức khỏe của người dân, ngày 26/10/2018 vừa qua, trung tâm thể hình MTK của thị xã Dĩ An đã được khai trương và bắt đầu đón nhận khách hàng.

Mỗi khách hàng tham gia CLB của trung tâm có thể tùy chọn một trong 3 gói dịch vụ khác nhau là Premium (nâng cao), Basic (cơ bản), Non-member (không thành viên). Đây là phương thức mà trung tâm tiến hành để từng loại đối tượng khách hàng có thể dễ dàng tiếp cận các dịch vụ tương ứng.

Bên cạnh thể hình là dịch vụ mặc định, tùy gói dịch vụ mà khách hàng có thể đăng kí tham gia các lớp học được cung cấp xuyên suốt các thời gian trong ngày như:

Dịch vụ xông hơi và hỗ trợ từ huấn luyện viên cá nhân (PT) cũng sẽ được cung cấp.

Mỗi khách hàng khi đăng kí sẽ phải điền thông tin họ tên và số CMND và lựa chọn gói dịch vụ cũng như thời gian muốn sử dụng dịch vụ đó (theo tháng).

Chi tiết gói dịch vụ trong một tháng

Đơn vị: Nghìn đồng

Premium Basic Non-member
Phí cơ bản 1 000 500 200
Chi phí lớp học Miễn phí 100 / lớp Không có
Dịch vụ xông hơi Miễn phí Không có Không có
Hỗ trợ PT Miễn phí 100 200

Lưu ý:
Miễn phí: Khách hàng không chi trả thêm tiền khi đăng ký tính năng này.
Không có: Khách hàng sẽ không được cung cấp tính năng này.

Yêu cầu
  1. Nhập vào danh sách khách hàng
  2. Trung tâm cần thông tin của những khách hàng đã chi tiêu nhiều nhất để tiến hành tư vấn gói dịch vụ thích hợp cho họ