BÀI TẬP LẬP TRÌNH JAVA –
CƠ BẢN - phần 2
Xem tóm tắt lý thuyết tại
Xem gợi ý làm bài tập tạihttps://www3.ntu.edu.sg/home/ehchua/programming/java/J2a_BasicsExercises.html
1.
Viết chương trình ThongKeDiem,
nhận đầu vào là số lượng sinh viên một lớp, tiếp theo là dãy các điểm số của
sinh viên, tính và in ra average, minimum, maximum,
và standard deviation. Chương trình gồm các phương thức readData,
aver, min, max, và stdDev thực
hiện các hoạt động tương ứng. Giả sử thang điểm 10, với 1 chữ số phần lẻ.
(a) Nhập đầu vào từ bàn phím;
(b) Nhận đầu vào từ tệp Diem.txt;
2.
Viết chương trình BieuDoDiem,
nhận đầu vào là số lượng sinh viên một lớp, tiếp theo là dãy các điểm số của
sinh viên, đếm số sinh viên có điểm rơi vào từng khoảng [0,1), [1,2), . . .
[9,10] và vẽ biểu đồ thanh ngang
(histogram) biểu diễn phân bố điểm theo mẫu, ví dụ như sau:
0 – 0.9 :
|
|
1
– 1.9 :
|
*
|
2
– 2.9 :
|
**
|
3
– 3.9 :
|
*
|
4
– 4.9 :
|
***
|
5
– 5.9 :
|
**
|
6
– 6.9 :
|
******
|
7
– 7.9 :
|
***
|
8
– 8.9 :
|
*
|
9
– 10 :
|
**
|
3.
Viết phương thức reverseArray
, đảo ngược một mảng với chữ ký như dưới
đây và chương trình reverseArrayTest để kiểm
thử phương thức hoạt động đúng
public static void reverseArray(int[] intArray)
Chú ý rằng không được dùng một mảng
khác mà trả về chính là mảng đã cho được đảo ngược, nghĩa là tham đối của
phương thức phải được truyền tham chiếu
(pass by reference) chứ không phải
truyền tham trị (pass by value).
4. Viết một lớp có tên là TrigonometricSeries
với các phương thức tính sin(x) và cos(x), sử dụng khai triển Taylor:
public static double sin(double x, int numTerms)
public static double cos(double x, int
numTerms)
So sánh cách tính này với các phương thức JDK đã làm sẵn Math.sin(), Math.cos() tại một số điểm x=0, π/6, π/4, π/3, π/2 , và thay đổi các số numTerms khác nhau.
Mẹo: tránh chia cho mẫu số quá lớn,
ví dụ 13! (có thể gây lỗi overflow) bằng cách tính các
số hạng của chuỗi theo công thức:
5.
Xây dựng lớp Circle với
các thành phần (như đặc tả trong sơ đồ lớp bên dưới): Circle có hai biến radius (kiểu
double), và color (kiểu String),
giá trị default là 1.0 và "red", tương ứng;
Có 4 hàm tạo: không tham đối; có 1
tham đối; có đủ hai tham đối.
Có hai phương thức setter và hai
phương thức getter: setRadius(),
setColor(); getRadius(); getColor()
Có một phương thức tính toán getArea().
Circle
|
-radius: double
-color: String
|
+ Circle() . . .
+ setRadius(radius:
double) : void
+ getRadius() :
double
+setColor( color:
String): void
+getColor() : String
+getArea() : double
|
1-
Viết chương trình TestCircle
kiểm thử hoạt động của lớp Circle.
2-
Viết thêm phương thức toString() trả về một xâu mô tả ngắn gọn đối tượng Circle đang xét, ở đây là radius và color. Kiểm tra hoạt động của phương thức toString() bằng cách gọi trực tiếp
<instanceName>. toString() và bằng cách gọi ngầm định, dùng println().
6.
(a) Xây dựng lớp Author
với các thành phần như đặc tả trong sơ đồ lớp bên dưới và viết chương trình
TestAuthor kiểm thử hoạt động của lớp Author.
(b) Xây dựng lớp Book với các thành phần như đặc tả trong
sơ đồ lớp bên dưới và viết chương trình kiểm thử. (Lưu ý đặc tả trong hình: mỗi
Book chỉ có một Author duy nhất, nhưng một Author
có thể viết nhiều Book).
(c) Thử in ra name và email
của tác giả một cá thể Book. (Gợi ý: aBook.getAuthor().getName();
aBook.getAuthor().getEmail()).
(d) Thử viết thêm các phương thức
mới của lớp Book: getAuthorName(), getAuthorEmail(), getAuthorGender().
7. Xây dựng lớp Ball theo sơ đồ lớp đã thiết kế
7. Xây dựng lớp Ball theo sơ đồ lớp đã thiết kế
Ý
nghĩa của các thành phần như sau: x,y
là tọa độ tâm, radius là bán kính. Để
thể hiện quả bóng nẩy khi chạm sàn hay tường: xDelta (Δx) và yDelta (Δy)
là độ dịch chuyển theo hai trục x,y tương ứng, phụ thuộc vào speed và direction. Speed đo bằng
số pixel đi được, direction nằm trong phạm vi (-180°,
180°]. Δx, Δy được tính theo công thức Δx = d*cos(q), Δy = -d* sin(q) (xem hình vẽ).
Phương thức move() di chuyển ball một bước, x = x+ Δx
, y = y + Δy.
Phương thức reflectHorizontal() làm nẩy ball theo chiều ngang (khi va vào
tường): Δx = -Δx, Δy
giữ nguyên.
Phương thức reflectVertical() làm nẩy
ball theo chiều đứng (khi va vào sàn): Δy = -Δy, Δx giữ nguyên.
Viết chương
trình TestBall kiểm thử lớp Ball vừa xây dựng.
Kế thừa
8. Xây
dựng hai lớp như sơ đồ lớp đã thiết kế, Cylinder là
lớp con của Circle. Chú ý sử dụng hàm
tạo của lớp mẹ khi viết hàm tạo của lớp con (super() , super(radius)
và sự kế thừa các biến các phương thức theo quy định.
Viết đè và gọi "Super": Cylinder kế thừa phương thức getArea() . Hãy viết đè
phương thức này để tính diện tích mặt ngoài hình trụ =2π×radius×height +
2×base-area. Sau khi viết đè như thế thì
getVolume() không còn đúng nữa. Hãy sửa lỗi này ( Gợi ý: chỉ cần
thay lời gọi getArea() bằng lời
gọi chính xác hơn là super.getArea().
9. Xây dựng các lớp Shape, Circle, Rectangle, Square với quan hệ kế thừa như thiết kế trong sơ đồ lớp. Chú ý rằng Square có thể là lớp con của Rectangle được nếu luôn khởi tạo với chiều dài và chiều rộng bằng nhau, tức là dùng hàm tạo Square(double side) { super (side, side) }.
Hợp thành
10. Xây dựng lớp Point và lớp Line như sơ đồ lớp đã thiết kế. Chú
ý mỗi Line hợp thành từ hai Point, điểm đầu và điểm cuối (thể hiện
trong sơ đồ lớp bên dưới).
Point
|
|
Line
|
-x : int
-y: int
|
|
-begin: Point
-end : Point
|
+ Point(x: int, y: int)
+ setter…
+ getter…
|
|
+Line(begin: Point, end : Point)
+Line(beginX: int, beginY:int
endX:
int, endY: int)
+setter ; getter …
|
11. Viết lại lớp Cylinder nhưng bây giờ thay cho
thiết kế kế thừa dùng thiết kế hợp thành “một cylinder bao gồm hình tròn đáy và
chiều cao”, như vẽ trong sơ đồ lớp bên dưới
12. Xây dựng giao tiếp Movable chung cho mọi kiểu đối tượng có
hành vi dịch chuyển được theo bốn hướng lên, xuống, sang trái, sang phải với
các phương thức tương ứng là moveUp(), moveDown(), moveLeft(), moveRight().
Triển khai cụ thể sẽ tùy thuộc kiểu đối tượng sẽ implement
nó sau này.
Viết các lớp MovablePoint và MovableCircle triển khai giao tiếp Movable vừa định nghĩa theo thiết kế
trong sơ đồ lớp.
13. Xây dựng lớp MovableRectangle, bao gồm hai MovablePoints (là hai đỉnh đối diện
trên-trái và dưới-phải) triển khai giao
tiếp Movable. Chú ý rằng cả hai điểm
phải di chuyển cùng tốc độ (có cùng speed).
Thầy có lời giải các bài này không ạ
Trả lờiXóa