Lập tŕnh hướng đối tượng
Bài tập thực hành

Tuần 3. Hiểu thêm về Java.

 

Bài 1. Class Fraction.

1.a

Viết class Fraction (phân số) có hai thuộc tính kiểu int: numerator (tử số) và denumerator (mẫu số), và các phương thức thành viên sau:

·         Phương thức tạo (constructor) public Fraction(int, int) lấy tham số là 02 số kiểu int và khởi tạo các thuộc tính numeratordenumerator.

·         Phương thức public void display() viết phân số ra màn h́nh dưới dạng <tử số>/<mẫu số>

 

Viết class FractionTest để chạy thử lớp Fraction.. Hàm main của FractionTest cần làm các nhiệm vụ sau:

·         Khai báo 2 đối tượng f1, f2 kiểu Fraction và khởi tạo với các giá trị 1/2 và 3/4.

·         Gọi phương thức display của các đối tượng đă tạo.

Hăy chạy thử và kiểm tra kết quả in ra màn h́nh xem chương tŕnh chạy có đúng hay không. Chú ư thấy rằng bộ thuộc tính của hai đối tượng khác nhau có giá trị khác nhau, ví dụ: f1.numeratorf2.numerator là hai phần tử dữ liệu độc lập, chúng có giá trị khác nhau.

 

1.b

Sửa nội dung phương thức tạo để kiểm tra tính hợp lệ của dữ liệu khởi tạo (phân số phải khác 0). Nếu giá trị khởi tạo cho mẫu số bằng 0 th́ cần ghi thông báo lỗi ra màn h́nh (sử dụng System.err) và khởi tạo đối tượng với giá trị 1/1.

Sửa lớp FractionTest để thử tạo một đối tượng bằng dữ liệu không hợp lệ.

 

1.c

Viết thêm phương thức public void reduce() với chức năng làm tối giản phân số lưu trong đối tượng chủ. Gợi ư thuật toán:

Khởi tạo divider (số chia) bằng 2

Lặp với điều kiện cả tử số và mẫu số đều không nhỏ hơn divider:

     Nếu cả tử số và mẫu số cùng chia hết cho divider th́

          numerator = numerator / divider và denumerator = denumerator / divider

     tăng divider thêm 1

 

Sửa lớp FractionTest để thử nghiệm phương thức reduce() với các phân số sau: 1/1, -3/1, 1/-3, 25/5, 30/66.

 

1.d

Viết phương thức public Fraction plus(Faction) để thực hiện phép cộng hai phân số và trả về một phân số là kết quả của phép cộng. Ví dụ, với f1 là đối tượng phân số 2/3 và f2 là phân số 1/1, lệnh sau cho kết quả là phân số sum có giá trị 5/3.

Fraction sum = f1.plus(f2);

 

Sửa lớp FractionTest để thử nghiệm phương thức plus().

 

Bài 2. Scanner

2.a

Có thể dùng một đối tượng thuộc lớp Scanner để đọc dữ liệu từ một file text tương tự như đọc dữ liệu từ bàn phím. Ví dụ:

try {

      Scanner input = new Scanner (new File("C:\\Tmp\\test.txt"));

      // đọc dữ liệu

      int n = input.nextInt();

    

} catch (java.io.FileNotFoundException e) {    }

 

Hăy viết một chương tŕnh Java đọc dữ liệu từ một file text và in từng từ ra màn h́nh.

 

2.b

Sửa chương tŕnh tại câu 2.a để bỏ qua các dấu .,:….khi đọc các từ trong văn bản.

Gợi ư:

Lệnh sau đây đặt chế độ cho đối tượng Scanner coi tất cả các kí tự không phải a..z hay A..Z như các kí tự phân tách giữa các từ khi thực hiện lệnh đọc từng từ

 

input.useDelimiter(Pattern.compile("[^a-zA-Z]"));

 

Lệnh sau đây bỏ qua tất cả các kí tự không phải a..z hay A..Z cho đến khi gặp một kí tự trong khoản a..z hay A..Z

 

input.skip("[^a-zA-Z]*");

 

Bài 3.

Từ Bài thực hành số 02. Dành cho những ai chưa làm.

Cài đặt cấu trúc cây t́m kiếm nhị phân đơn giản trong đó lưu trữ các từ (xâu kí tự không chứa kí tự trắng). Hăy viết hàm tạo, các phương thức để chèn thêm một từ vào cây, in danh sách các từ chứa trong cây theo thứ tự từ điển. Viết một chương tŕnh test các chức năng của lớp vừa tạo (đọc một văn bản từ bàn phím, lần lượt đưa từng từ vào cây t́m kiếm nhị phân, rồi in danh sách từ ra màn h́nh. Gợi ư thiết kế và thuật toán như sau:

 

class BinarySearchTree {

   // từ được lưu tại nút hiện tại

   private String data;  

  

   //tham chiếu tới cây con bên trái (nút con trái)

   //nhánh cây bên trái chứa tất cả các từ “nhỏ” hơn this.data theo thứ tự từ điển

   private BinarySearchTree left;

 

   //tham chiếu tới cây con bên phải (nút con phải)

   //nhánh cây bên phải chứa tất cả các từ “lớn” hơn this.data theo thứ tự từ điển

   private BinarySearchTree right;

 

   // hàm tạo tạo cây (có thể là cây con) mới, với this.data bằng word,

   //các tham chiếu left và right nhận giá trị mặc định null

   public BinarySearchTree(String word) {…} ;

 

   //hàm chèn một từ vào cây hiện tại, dùng phương pháp đệ quy.

   public insert(String word) {

      //so sánh word với this.data

      //nếu word > data th́ có nghĩa word cần nằm ở cây con bên trái.

      // nếu không th́ word cần nằm ở cây con bên phải.

      // gọi phương thức insert() của cây con thích hợp (trái hoặc phải)

      // hoặc khởi tạo cây con trái/phải nếu chưa có

   }

 

   //dùng đệ quy để duyện cây nhị phân, in ra theo thứ tự từ nhỏ đến lớn.

   public printSortedList() {

      //gọi printSortedList() của cây con trái (để in các từ nhỏ hơn data)

      //in data

      //gọi printSortedList() của cây con phải (để in các từ lớn hơn hơn data)

   }

}

 

Thử viết các phương thức khác cho cây t́m kiếm nhị phân như: search(String) để t́m xem một từ có mặt trong cây hay không. Gợi ư:đệ quy: nếu đúng là từ lưu tại nút hiện tại (data) th́ dừng do đă t́m thấy, nếu nhỏ hơn data th́ gọi đệ quy để t́m tại cây con bên trái, nếu lớn hơn th́ t́m tại cây con bên phải.