Thứ Hai, 9 tháng 3, 2015

BÀI TẬP LẬP TRÌNH JAVA – CƠ BẢN - phần 2

BÀI TẬP LẬP TRÌNH JAVA – CƠ BẢN - phần 2



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 averageminimummaximum, và standard deviation. Chương trình gồm các phương thức  readData, aver, min,  max,  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à radiuscolor. 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ế



Ý 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 speeddirection. 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).






1 nhận xét: