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 numerator và denumerator.
·
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.numerator và f2.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.