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






Bai tap lap trinh Java - co ban

BÀI TẬP LẬP TRÌNH JAVA - CƠ BẢN

Xem tóm tắt lý thuyết tại





1.     Viết chương trình NhapTuBanPhim, mời người dùng nhập một số nguyên, một số thực, một ký tự, một xâu ký tự …  và in ra kết quả để kiểm tra.

2.     Viết chương trình DocChuSo, nhập một số nguyên dương thì in ra lời đọc, ví dụ nhập ký số “5” sẽ in ra “năm”.  
(a) Trường hợp đơn giản: đọc các số có 1 chữ số, dùng câu lệnh if lồng nhau
(b) Dùng câu lệnh switch-case.
(c)* Trường hợp đầu vào là số nguyên có nhiều chữ số (gợi ý: xem bài TachTungKySo  để trích ra từng ký số của một số nguyên có nhiều chữ số)

3.     Viết chương trình TrungBinhCong, nhập một số nguyên dương  N thì in ra trung bình cộng các số từ 1 đến N.
(a) Dùng vòng lặp FOR
(b) Dùng vòng lặp While, Do-while
(c) Chỉ tính các số chẵn, các số lẻ, các số chia hết cho 5, …

4.     Viết chương trình Fibonaci  tính, in ra N số Fibonaci đầu tiên và trung bình cộng của N số này; số N nhập từ bàn phím.

5.     Viết chương trình SoPi tính số  π, sử dụng khai triển  π /4 = 1- 1/3 + 1/5 – 1/7 + 1/9 -  1/11…
(a)  Tiêu chuẩn dừng là khi chuỗi số đạt 100 số hạng;
(b)  Người dùng quyết định một độ chính xác epsilon và gõ nhập vào.
Java có một hằng số tên là  Math.PI.  Hãy so sánh SoPI với Math.PI.

6.     Viết chương trình TachTungKySo trích ra từng ký số của một số nguyên có nhiều chữ số (gợi ý: dùng phép chia  %10).

7.     Viết chương trình BangNhan, in ra bảng nhân các số từ 1 đến 9 (bảng cửu chương)


8.     Viết chương trình  NhapTuFile, đọc một số nguyên, một số thực, một ký tự, một xâu ký tự …  từ một tệp data.txt  (kiểu text) và in ra kết quả để kiểm tra.

9.     Viết chương trình  DaoNguocXau, nhận xâu ký tự nhập từ bàn phím và in ra xâu đảo ngược.

10.                        Viết chương trình  PhimDienThoai, chuyển xâu ký tự (không phân biệt chữ hoa, chữ thường) thành xâu ký số theo quy tắc: ABC(2),  DEF(3),  GHI(4),  JKL(5),  MNO(6),  PQRS(7),  TUV(8),  WXYZ(9).

11.                        Một từ gọi là palindrome nếu hai đầu đối xứng nhau, nghĩa là đảo ngược của nó lại là chính nó, ví dụ:  Radar, Racecar, Madam … Viết chương trình  TestPalindrome, kiểm tra một xâu ký tự có là palindrome hay không. 

12.                        Viết chương trình  Hex2Dec, chuyển đổi một số cơ số 16 (hexadecimal) thành số thập phân tương ứng.


13.                        Viết chương trình  Hex2Bin, chuyển đổi một số cơ số 16 (hexadecimal) thành dãy bit tương ứng (gợi ý: chuyển từng ký số Hex sang 4 bit tương ứng).