Khóa học nâng cao về lập trình Java
và cấu trúc dữ liệu + giải thuật

Chú ý: Sinh viên cần tự điền thông tin vào danh sách (hết hạn)

Tài liệu đọc

  • Giáo trình Lập trình hướng đối tượng với Java
  • Clean Code
  • Effective Java
  • Head First Design Patterns

    Buổi 14, Thứ Bảy 31/1

    Áp dụng đa luồng cho bài Creatures. Gợi ý các bước như sau:
    1. Giữ cho dân số trong board thật đơn giản để tránh gặp phải quá nhiều lỗi một lúc: Tắt chức năng sinh sản của Bacteria, trên board chỉ có duy nhất một con Bacteria. Nó chỉ già đi và chết.
    2. Sửa nút "Tick" thành nút "Start", để thay đổi ý nghĩa từ việc phải bấm liên tục sang chỉ bấm một lần.
    3. Sửa nội dung action handler của nút Start để không gọi Board.tick mà gọi Board.start()
    4. Viết hàm Board.start() với nhiệm vụ start từng creature nằm trong danh sách creature của Board.
    5. Viết hàm Creature.start() với nhiệm vụ tạo một thread và chạy hàm run của creature trong thread đó. Để làm điều này có thể cho Creature implement Runnable và cài hàm run với nội dung là cuộc đời của một creature (tick, ngủ, tick, ngủ.... cho đến khi chết)
    6. Tạo timer (Google (timer java swing) hoặc đọc luôn ví dụ này) đặt tại UI thread (lớp BoardSimulator) với nhiệm vụ định kì gọi repaint để vẽ lại màn hình (nếu không thì sẽ không thấy được hình ảnh creature già và chết đi). Nên đặt các lệnh System.err.print vào trong các hàm Creature.draw, Creature.tick, Board.paintComponent để theo dõi quá trình sống của creature và chu trình repaint của ứng dụng.
    7. Có thể chỉnh timer để khi không còn creature nào sống sót thì cũng ngừng repaint.
    Như vậy ta đã làm được để một creature tự động thực hiện cuộc sống của mình trong một luồng riêng mà người dùng không cần phải điều khiển từng nhịp tick từ nút "Tick". Tuy nhiên, chương trình còn rất nhiều vấn đề và sẽ phát sinh nhiều lỗi do đa luồng. Ta hãy tăng dần độ phức tạp để thấy lỗi (để ý exception) và lắp dần thêm các cơ chế lock.
    1. Thêm một bacteria nữa vào cấu hình board
    2. Cho bacteria sinh sản, nhưng để nó đẻ ít thôi, chẳng hạn gần chết vì già mới cho đẻ
    3. Giảm tuổi sinh sản của bacteria để dân số tăng nhanh hơn, khả năng lỗi do xung đột giữa các luồng cũng tăng lên.

    Buổi 13, Thứ Bảy 24/1

    Nội dung: multithreading.anonymous class.

    Tài liệu đọc và mã nguồn ví dụ: 1,2,3

    Bài luyện: Sửa project Creatures để không phải bấm nút tick để chạy từng tick. Thay vào đó, có một nút Start, khi bấm vào đó thì các sinh vật tự động chạy một vòng lặp thực hiện 2 việc: tick() của bản thân mình và Thread.sleep(SLEEP). Trong đó SLEEP là một hằng số với giá trị riêng của từng loài, có loài "ngủ" nhiều có loài "ngủ" ít giữa những lần thức dậy và hoạt động (tick).

    Buổi 12, Thứ Sáu 23/1

    Nội dung: Exception handling, Exception handling best practice, inner class, anonymous class, multithreading.
    Mã nguồn thực hành exception: TestException.java, AccountExamples

    Buổi 11, Thứ Hai 12/1

    Bài luyện (thuật toán đơn giản, hash và hashCode, equals khi sử dụng các cấu trúc dữ liệu): Counting triangles.

    Buổi 10, 10/1

    Nội dung: ôn tập thừa kế, học tiếp đa hình, lớp trừu tượng, interface.
    Slide: các bài Inheritance, Abstract, Interface.
    Bài luyện: Expression, test và project mẫu.
    Bài tập lập trình: Rectangular Game, Missing Numbers, và Counting triangles.

    Buổi 9, 27/12

    Viết tiếp chương trình Creatures.
    Trò chơi vương quyền.
    Xếp lịch học cho tuần tới.
    Kỹ năng: thừa kế, đa hình, abstract class, tìm kiếm nhị phân.

    Buổi 8, 20/12

    Viết chương trình Creatures.
    Kỹ năng: giới thiệu về Java Swing, lập trình với nhiều mô-đun, OOP, sử dụng thư viện ArrayList.
    Đọc thêm: Hướng dẫn lập trình GUI với Java Swing.

    Buổi 7, 19/12

  • Viết chương trình Sắp xếp tên. Dữ liệu mẫu:NameData.zip.

    Tuần 6, 13/12

  • Viết chương trình Password
  • Chữa bài Eat-Sleep-Code. Sample solution (HackerEarth/RoysDailyLog.java, EatSleepCode/).
  • Bài về nhà: Viết chương trình Palindrome. Hạn trước thứ Bảy tới.

    Tuần 5, 6/12

  • Viết chương trình Eat-Sleep-Code
  • Thừa kế, đa hình. Sample code (AccountExamples).

    Tuần 4, 29/11

  • Chữa bài ChiefFinder.

    Tuần 3, 22/11

    Mời các bạn signup vào diễn đàn của lớp tại Piazza để có thể trao đổi giúp đỡ nhau học tập.

    Bài tập (dành cho sv ngành ngoài CNTT):

  • Hoàn thiện lớp Vector trong project VectorExp, lớp BankAccount trong project AccountExps (https://chauttm@bitbucket.org/chauttm/examples.git).
  • Viết chương trình ChiefFinder về nghi lễ tìm tù trưởng.

    Bài tập (dành cho sv CNTT):

  • Hoàn thiện bài đếm từ của tuần trước. Chú ý: Trước hết, cần làm được chương trình chạy đúng với file chứa text tiếng Anh, sau đó sửa phần so sánh xâu để so sánh được tiếng Việt. Lúc nào cũng cần đặt tên biến, tên hàm rõ nghĩa. Cuối cùng, refactor để chương trình trong sáng hơn (hàm ngắn dưới 25 dòng). Nếu thấy khó cải tiến quá thì thử viết lại từ đầu xem có khá hơn không.
  • Viết chương trình ChiefFinder về nghi lễ tìm tù trưởng.

    Tuần 2, 14/11

    Maven:

    Tài liệu đọc tuần 2, môn Lập trình hướng đối tượng.

    Bài tập (dành cho sv ngành ngoài CNTT):

    Tạo project examples theo mẫu https://chauttm@bitbucket.org/chauttm/examples.git theo các bước sau:

  • Tạo repository có tên examples tại bitbucket của bạn.
  • Tải project mẫu về máy.
  • Vào bên trong thư mục project vừa tải, thực hiện lần lượt các lệnh sau để nối repo tại máy của bạn với repo vừa tạo tại bitbucket
    git init
    git remote add origin http://your-username@bitbucket.org/your-username/examples.git
    git add .
    git commit -m "first commit"
    git push -u origin --all
    
  • Dùng mvn để thử chạy test, package rồi chạy chương trình VectorDemo.
  • Viết tiếp hàm subtract() trong lớp Vector với nhiệm vụ tính vector kết quả của việc lấy vector hiện tại trừ đi vector cho làm tham số (xem chi tiết tại nội dung VectorTest.testSubtract()).
  • Viết hàm Vector.dotProduct() trả về kết quả là tích vô hướng của hai vector. Xem ví dụ sử dụng tại VectorDemo. Viết test cho hàm này tại VectorTest.
  • Viết hàm Vector.length() trả về độ dài của vector.Xem ví dụ sử dụng tại VectorDemo.Viết test cho hàm này tại VectorTest. Chú ý: mỗi lần hoàn thành một hàm cần thực hiện lại chuỗi lệnh git add, commit, push để đẩy bài lên bitbucket.

    Bài tập (dành cho sv CNTT):

    Viết chương trình đọc một file text tiếng Việt có tên 'IN.TXT', sắp xếp các từ theo thứ tự từ điển tiếng Việt và thống kê số lần mỗi xuất hiện trong file, rồi ghi các từ đó theo thứ tự đã sắp xếp ra file 'OUT.TXT', mỗi từ và số lần xuất hiện từ đó nằm trên một dòng, cách nhau một kí tự tab ('\t').

    Bài đặt trong repo tại bitbucket có tên word-count.

    Tuần 1, 8/11

    Bài tập 0:(dành cho các sinh viên học từ đầu)

  • Assignment 01 và các tài liệu đọc tuần 1, môn Lập trình hướng đối tượng.
  • Tìm đọc tài liệu tham khảo chính - giáo trình Lập trình hướng đối tượng với Java. Đọc và làm bài tập chương 2 giáo trình.

    Bài tập 1: Sudoku

    Mục tiêu: Kiểm tra kỹ năng lập trình và thiết kế hướng đối tượng, kỹ năng cài đặt thuật toán, phong cách lập trình.
    Mã nguồn đặt tại Bitbucket, repository với tên asg-sudoku, private. Chỉ cần thư mục src. Chú ý không đẩy file nén.
    Deadline 1: 23h59' ngày 8/11:
    File text Readme.txt với nội dung: Phác thảo thiết kế thuật toán. SV CNTT cần có cả phác thảo thiết kế hướng đối tượng(liệt kê được Spot có những phương thức gì, biến thực thể gì, trong mô tả thuật toán có sử dụng luôn các biến/phương thức đó)
    Deadline 2: ????