You are on page 1of 35

Bài

tập chương 2+3


Phần 1.1 Program and Statement
Nội dung kiến thức thực hành:

+ Sử dụng JDK để biên dịch và thực thi chương trình.


+ Sử dụng Eclipse để soạn thảo, biên dịch và thực thi chương trình.
+ Khai báo và sử dụng biến, đối tượng.
+ Sử dụng các cấu trúc điều khiển.
+ Nhận dữ liệu từ đối số hàm main.

Bài tập 1.
Mục đích:
- Download và cài đặt được JDK.

Yêu cầu:
- Hãy tải và cài đặt JDK

Hướng dẫn:

Để biên dịch được các source code Java, máy tính của chúng ta phải có máy Ảo

Java Để có được máy Ảo Java các bạn vào link bên dưới để download bộ JDK

http://www.oracle.com/technetwork/java/javase/downloads/index.html

Sau khi click vào đường link bên trên, danh mục JAVA Kit sẽ hiển thị như hình bên dưới:

Trang 3

chọn JDK để Download, sau khi click chọn Download thì một màn hình mới sẽ được hiển
thị ra, trong màn hình mới này tùy vào cấu hình của máy tính mà chúng ta chọn tập tin
Download cho hợp lý.


Giả sử rằng máy tính của bạn 32bits, bạn sẽ chọn Windows x86 để load. Sau khi load và
cài đặt thành công bạn vào Control Panel để kiểm tra xem máy ảo Java đã được cài đặt vào
máy hay chưa. Nếu có biểu tượng Java như hình bên dưới thì coi như bạn đã cài đặt thành
công:

Trang 4
Bài tập 2.
Mục đích:

- Thiết lập được biến môi trường để chạy java ở cơ chế command-line.

Yêu cầu:

- Hãy thiết lập biến môi trường để chạy được java ở cơ chế command -line

Hướng dẫn:

1. Bấm chuột phải vào biểu tượng Computer/ chọn Properties


2. Một cửa sổ mới hiện lên, chúng ta chọn Advanced System Settings

3. Cửa sổ System Properties sẽ hiển thị ra, chúng ta vào tab Advanced, click chọn
button Environment Variables…Cửa sổ Environment variables sẽ hiển thị như hình
bên dưới.


4. Trong mục System variables, click chọn button New.

Mục Variable name, chúng ta nhập vào biến JAVA_HOME
Mục Variable value, chúng ta copy đường dẫn cài đặt JDK vào đây, trong ví dụ này thì
Trang 5
JDK được cài đặt như hình minh họa. Tức là nếu máy của bạn cài JDK ở đâu thì copy paste
đường dẫn đó vào mục này.


Sau khi chọn OK, bạn quan sát trong vùng System Variables, biến JAVA_HOME và giá trị của
nó sẽ xuất hiện như hình minh họa bên dưới:

Trang 6
5. Bước tiếp theo, các bạn tìm tới biến Path trong mục System variables, click chọn Edit:
Trong mục Variable value, các bạn di chuyển tới cuối, nhập vào các giá trị như hình minh
họa : ;%JAVA_HOME%\bin;.;



6. Kiểm tra lại cấu hình có chính xác hay không:
Để kiểm tra xem máy tính của bạn đang cài JDK version bao nhiêu, vào Start/ Run. Hoặc
gõ tổ hợp phím Windows+R để hiển thị cửa sổ Run, trong cửa sổ này các bạn gõ vào lệnh
cmd rồi nhấn phím Enter.

Trang 7
Gõ java –version để kiểm tra JDK version.
Gõ javac –version để kiểm tra javac
version.

Bài tập 3.
Mục đích:
- Viết được chương trình Java bằng notepad và biên dịch bằng command -
line

Yêu cầu:

1. Đánh đoạn code sau sử dụng Notepad:

class Welcome
{
public static void main(String []arg)

{
System.out.println("\nMy first Java
Program");
}
}

2. Chọn menu File Save As và đánh tên file ‘Welcome.java’ (giống tên của class)
3. Chọn Start Run và đánh lệnh ‘cmd’ vào trong hộp thoại Run
4. Click vào button OK để cửa sổ command prompt xuất hiện. Thay đổi đường dẫn thư
mục lưu file trong bước 3.
5. Biên dịch chương trình sử dụng lệnh ‘javac’
6. Chạy chương trình sử dụng ‘java’

Hướng dẫn:

Bài tập 4.
Mục đích:

Trang 8
- Sử dụng được Netbean
Yêu cầu:

* Tổng quan về NetBeans

Khi mở Netbeans lên, bạn sẽ được 1 giao diện như thế này. Mình sẽ giải thích qua một chút về
các thành phần của Netbean nha


1.View windows: các cửa sổ theo dõi, các log, output hay cây thư mục project sẽ hiển thị ở các
cửa sổ này.

2.Toolbar: đây là thanh công cụ, thanh này chứa các nút điều khiển như tạo, lưu project,
run/debug project,…

3.Editor: Đây là nơi bạn sẽ code các dòng code Java

4.Status bar: thanh trạng thái, thỉnh thoảng nó sẽ hiển thị trạng thái của Project.

À, nếu bạn nào thắc mắc là sao Netbean của mình màu đen thì đó là Darktheme nha :)) Bạn có
thể cài đặt nó ở đây (Nhìn cool phết, sau ra cafe ngồi code cho
ngầu): http://plugins.netbeans.org/plugin/62424/darcula-laf-for-netbeans

Ngoài ra thì mình cũng khuyên mọi người thu nhỏ các View window lại để thuận tiện cho việc
code hơn nhé, các bạn cứ yên tâm là nó sẽ hiện lại như cũ bằng các nhấp vào các hình thu nhỏ.

* Tạo 1 Project Java mới

Trang 9
Ok, chúng ta vừa có một cái nhìn tổng quan về IDE Netbeans, bây giờ hãy cùng tạo một Project
Java đầu tiên nào
Bước 1: Nhấn tổ hợp “Ctrl + Shift + N” bạn sẽ ra một màn hình như dưới đây.


Bước 2: Chọn “Java Application” rồi nhấn “Next”.
*) Chú ý: Nếu đây là lần đầu tiên bạn tạo một Java Project thì hãy chờ một lúc để Netbean load
nhé, tầm 1-2 phút thôi.

Bước 3: Đặt tên cho Project của bạn. Còn một số cái nữa như là vị trí của Project trong máy thì
các bạn tự chỉnh sao cho phù hợp với mình nhất nhé.

Trang 10
Bước 4: Vậy là bạn đã thành công và sẽ được một màn hình như dưới.


* 1 file .java có những gì?
Sau khi bạn tạo 1 Project Java mới, bạn sẽ được 1 file .java như sau:

/*
* To change this license header, choose License Headers in Project
Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package javaapplication2;

/**
*
* @author D.A.N_3002
*/
public class JavaApplication2 {

/**
* @param args the command line arguments
*/
public static void main(String[] args) {
// TODO code application logic here
}

Trang 11
Ok, xem một file cơ bản thì ta sẽ thấy nó có những từ khoá sau:

• package: Như tên gọi của nó, package là một nhóm hay tập hợp các thư viện con được định sẵn
hoặc là do người dùng tự viết. Có rất nhiều package được dựng sẵn như java, lang, AWT, javax,
swing, net, io, util, ...
• class: Đây là một thứ rất quan trọng trong OOP, nhưng vì chúng ta đang tìm hiểu cơ bản thôi
nên hãy làm rõ class là gì trong một bài viết riêng về nó nhé
• public static void main(String[] args) Đây là hàm main của Java, toàn bộ code Java của ta sẽ
được viết vào trong hàm này.
• Còn một điều quan trọng nữa là Comment. Comment có thể bắt đầu bằng 2 từ khoá // hoặc
là /* code */. Các comment sẽ không ảnh hưởng gì đến đoạn code của bạn, khi chạy thì chương
trình sẽ tự động bỏ qua các comment. Nó như là ghi chú vậy, sẽ giúp ích cho bạn rất nhiều
trong việc code.

* Cách in thông tin ra màn hình

Đây chắc là phần mà các bạn mong chờ nhất đây, bắt đầu code thôi nào Để in ra màn hình thì
ta sẽ sử dụng 2 dòng code:

System.out.println();: Sau khi in thì sẽ xuống dòng.

System.out.print();: Sau khi in thì chương trình sẽ không xuống


dòng.

Những thành phần bạn muốn in ra phải trong dấu ngoặc kép " " nha .Nghe khó hiểu nhỉ @@
Xem thử ví dụ để dễ hiểu nào Ta có đoạn code như sau (Không phải Hello Word đâu)

package javaapplication2;

public class JavaApplication2
{
public static void main(String[] args)
{
System.out.println("Hello Everyone!");
System.out.print("My Name: ");
System.out.println("D.A.N_3002");
System.out.println("Welcome to JavaLearning");
}

Sau khi chạy đoạn code (bằng tổ hợp Shift + F6 nhé) thì bạn sẽ được một kết quả như sau, chú
ý ở phần Output nào:

Hello Everyone!
My Name: D.A.N_3002

Trang 12
Welcome to JavaLearning

Các bạn thấy đó, câu “Hello Everyone!” mình sử dụng cách 1 để in, sau khi in hết câu đó xong
thì chương trình sẽ nhảy xuống dòng rồi mới in tiếp. Nhưng ở câu "My Name: " thì mình lại
dùng cách 2, chương trình không xuống dòng mà tiếp tục in “D.A.N_3002” cùng dòng với câu
đó luôn Dễ hiểu hơn rồi đúng không nào. Nhưng nếu ta gộp lại như thế này thì vẫn có chung 1
Output

System.out.println("Hello Everyone!");
System.out.println("My Name: D.A.N_3002");
System.out.println("Welcome to JavaLearning");

Ví dụ Hãy viết một chương trình để in ra câu chào và giới thiệu họ tên của bạn theo mẫu sau:

Xin chào!
Tôi tên là: ...
Năm nay tôi ... tuổi
Đây là chương trình Java đầu tiên của tôi!
Solution

Gợi ý

package javaapplication2;

public class JavaApplication2
{
public static void main(String[] args)
{
System.out.println("Xin chào!");
System.out.println("Tôi tên là: DAN");
System.out.println("Năm nay tôi 15 tuổi");
System.out.println("Đây là chương trình Java đầu tiên của
tôi!");
}

Bài tập 5.
Mục đích:

- Thao tác với toán tử trong Java.

Yêu cầu:
import java.util.*;

public class MathOps {


//method to print a string and an int

Trang 13
static void printInt(String s, int i) {

System.out.println(s + " = " + i);


}
//method to print a string and a float

static void printFloat(String s, float f) {

System.out.println(s + " = " + f);


}

public static void main(String[] args) {


Random random = new Random();
int i, j, k;
//Choose value from 1 to 100
j = random.nextInt(100) + 1;
k = random.nextInt(100) + 1;
printInt("j", j);
printInt("k", k);
i = j + k; printInt("j + k", i);
i = j - k; printInt("j - k", i);
i = j / k; printInt("j/k", i);
i = j * k; printInt("j * k", i);
i = j % k; printInt("j % k", i);
j %= k; printInt("j %= k", j);
// Floating-point number tetts
float u, v, w; // also applies to doubles
v = random.nextFloat();
w = random.nextFloat();
printFloat("v", v);
printFloat("w", w);
u = v + w; printFloat("v + w", u); // contd…
u = v - w; printFloat("v - w", u);
u = v * w; printFloat("v * w", u);
u = v / w; printFloat("v/w", u);
//The following also works for char, byte, short, int, long, and
double
u += v; printFloat("u += v", u);
u -= v; printFloat("u -= v", u);
u *= v; printFloat("u *= v", u);
u /= v; printFloat("u /= v", u);
}
}
Kết quả được xuất ra là gì? Giải thích các toán tử trên.
Hướng dẫn:
Viết trực tiếp giải thích bằng comment trong file code

Bài tập 6.

Trang 14
Mục đích:

- Thao tác với toán tử tự động tăng giảm

Yêu cầu:

public class AutoInc_DecOps {
public static void main(String[] args) {
int i = 1;
System.out.println("i : " + i);
System.out.println("++i : " + ++i); // Pre-increment
System.out.println("i++ : " + i++); // Post-increment
System.out.println("i : " + i);
System.out.println("--i : " + --i); // Pre-decrement
System.out.println("i-- : " + i--); // Post-decrement
System.out.println("i : " + i);
}

Kết quả được xuất ra là gì? Giải thích.



Hướng dẫn: Giải thích bằng comment trực tiếp trong code.

Bài tập 7.
Mục đích:

- Thao tác với toán tử logic

Yêu cầu:

import java.util.*;

public class Rel_LogOps {


public static void main(String[] args) {
Random random = new Random();
int i = random.nextInt(100);
int j = random.nextInt(100);
// Using Relational Operators
System.out.println("i = " + i);
System.out.println("j = " + j);
System.out.println("i > j is " + (i > j));
System.out.println("i < j is " + (i < j));
System.out.println("i >= j is " + (i >= j));
System.out.println("i <= j is " + (i <= j));

System.out.println("i == j is " + (i == j));

Trang 15
System.out.println("i != j is " + (i != j));
//Using Logical Operators
System.out.println("(i < 10) && (j<10) is " + ((i < 10) && (j <
10)));
System.out.println("(i < 10) || (j<10) is " + ((i < 10) || (j <
10)));
}
}
Kết quả được xuất ra là gì? Giải thích
Hướng dẫn: Giải thích bằng comment trực tiếp trong code.

Bài tập 8.
Mục đích:

- Ôn luyện lại cấu trúc điều khiển

Yêu cầu:

a) Viết chương trình in ra tổng của 10 số chẵn đầu tiên (sử dụng vòng lặp for hoặc while)
b) Viết chương trình in ra những số lẻ từ 1 đến 99.
c) Viết chương trình xuất ra tổng các số là bội số của 7 (từ 1 đến 100)
d) Viết chương trình in ra tổng 1+2+3….+n với n được nhập từ tham số command line
e) Viết chương trình in ra tổng 1+3+5….+n nếu n là số chẳn, 2+4+6+….n nếu n là số lẻ.
Giá trị n được nhập vào từ tham số command line
f) Viết chương trình in ra giá trị lớn nhất và nhỏ nhất trong một dãy các giá trị user đã
nhập vào từ tham số command line.
g) Viết chương trình giải phương trình bậc 1 với hệ số a, b được nhập vào bởi user từ
tham số command line.
h) Viết chương trình đọc một giá trị nguyên từ bàn phím và in ra số đó là số chẵn, lẻ
hoặc zero
i) Viết chương trình in ra bội số của 3 từ 300 đến 3
j) Viết chương trình in ra số lần kí tự „a‟ xuất hiện trong một chuỗi.
k) Vẽ các hình bên dưới:

Trang 16
Phần 1.2 Objects and Primitive data
Nội dung kiến thức thực hành:

- Dùng lớp Scanner để nhập dữ liệu
- Sử dụng lớp Math
- Sử dụng lớp String, lớp Character
- Viết hàm (method)
- Viết hàm overload

Bài tập 9.
Mục đích:

- Sử dụng lớp Scanner để nhập số.
- Định dạng xuất.
- Sử dụng lớp Math.

Yêu cầu:
Viết chương trình tính thể tích và diện tích bề mặt của một hình cầu với bán kính r nhập
vào (r>=0). Kết quả chỉ cần lấy 4 chữ số thập phân. Công thức tính:

Thể tích =

Diện tích bề mặt = 4PI*r2


HD: Dùng lớp DecialFormat để định dạng kết quả với 4 chữ số thập phân:
DecialFormat df = new DecialFormat ("0.####");

Hướng dẫn:

Bài tập 10.

Mục đích:

Yêu cầu:

Viết chương trình cho nhập vào kích thước 3 cạnh a, b, c của một tam giác. Tính
và xuất diện tích của tam giác, sử dụng công thức Heron. Trước khi tính phải kiểm tra
xem 3 số a, b, c có lập thành một tam giác không (a, b, c lập thành tam giác khi tổng 2
số bất kỳ luôn lớn hơn số còn lại).

HD: Diện tích = , biết s bằng 1/2 chu vi tam giác.

Trang 17
Bài tập 11.

Yêu cầu:

Viết chương trình tính khoảng cách giữa 2 điểm có tọa độ (x1,y1) và (x2,y2), biết công thức

để tính khoảng cách là: distance =


Hướng dẫn:

Bài tập 12.

Mục đích:

+ Nhập chuỗi.
+ Lấy từng kí tự trong chuỗi.
Yêu cầu:
Viết chương trình cho nhập một chuỗi và in ra các ký tự trong chuỗi đó ra màn
hình, mỗi ký tự trên một dòng.
HD: dùng hàm charAt(int)

Hướng dẫn:

Bài tập 13.

Mục đích:

Yêu cầu:
Viết chương trình cho nhập một chuỗi và đếm số khoảng trắng có trong chuỗi đó.
HD: dùng hàm isSpace(char) của lớp Character để kiểm tra khoảng
trắng.
Hướng dẫn:

Bài tập 14.


Mục đích:

Yêu cầu:
Viết chương trình cho nhập một chuỗi và in ra các ký tự chữ cái (a-z hoặc A-Z) có
trong chuỗi.
HD: dùng hàm isLetter(char) của lớp Character để kiểm tra chữ cái.

Trang 18
Bài tập 15.

Mục đích:
- So sánh 2 chuỗi

Yêu cầu:
Viết chương trình cho nhập vào hai chuỗi, kiểm tra xem hai chuỗi có bằng nhau
không, không phân biệt chữ hoa chữ thường.

Hướng dẫn:

Bài tập 16.

Mục đích:
- Nối chuỗi

Yêu cầu:
Viết chương trình cho nhập một chuỗi và một số nguyên n. Chương trình in ra một
chuỗi mới là chuỗi được ghép từ n lần chuỗi đã nhập. Nếu n<2 thì xuất ra chuỗi gốc. Ví dụ
nhập “hi” và 4, kết quả xuất ra “hihihihi”.
Hướng dẫn:

Bài tập 17.

Mục đích:
- Tách chuỗi

Yêu cầu:
Viết chương trình cho nhập vào một chuỗi, tách chuỗi này thành các chuỗi con
dựa vào khoảng trắng, xuất kết quả thành từng dòng.
Ví dụ: nhập s = Xin Chao ban!
Xuất kết quả:
Xin
Chao
ban!
Hướng dẫn:

Trang 19

Bài tập 18.

Mục đích:
- Viết hàm

Yêu cầu:
(i) Viết một hàm có tên square, hàm có 1 tham số x kiểu số thực. Hàm này tính
toán và trả về bình phương của x.
(ii) Đưa hàm trên vào một chương trình và nó được gọi thực hiện bởi hàm main.
Test hàm vừa viết bằng cách thực hiện vài lần, mỗi lần với các giá trị truyền khác nhau.

Hướng dẫn:

Bài tập 19.


Mục đích:


Yêu cầu:
Viết chương trình trong đó có một hàm sẽ nhận một tham số nguyên, hàm trả về
giá trị false nếu số đó là số chẵn, ngược lại trả về giá trị true.
Test hàm vừa viết bằng cách thực hiện vài lần, mỗi lần với các giá trị truyền khác nhau.

Hướng dẫn:
-

Bài tập 20.

Mục đích:

Yêu cầu:
Viết chương trình giải phương trình bậc hai ax2 + bx + c = 0, viết hàm tính delta.
Hướng dẫn:

Bài tập 21.

Mục đích:

Yêu cầu:
Viết hàm alarm in ra các chuỗi “Alarm!”, mỗi chuỗi trên một dòng. Hàm alarm
có một tham số kiểu số nguyên biểu thị cho số dòng cần in, nếu số này nhỏ hơn 1 thì in
ra câu thông báo lỗi.
Test hàm vừa viết bằng cách thực hiện vài lần, mỗi lần với giá trị truyền khác
nhau.

Trang 20
Hướng dẫn:

Bài tập 22.


Mục đích:
Viết hàm sumRange, hàm có hai tham số kiểu số nguyên biểu thị cho khoảng giá
trị. Nếu tham số thứ hai nhỏ hơn tham số thứ nhất thì xuất ra một thông báo lỗi và trả ra
giá trị 0, ngược lại hàm trả về tổng của các giá trị trong khoảng đó.
Test hàm vừa viết bằng cách thực hiện vài lần, mỗi lần với các giá trị truyền khác nhau.
Hướng dẫn:

Bài tập 23.

Mục đích:

Yêu cầu:
Viết hàm countA, hàm này nhận một tham số kiểu String và trả về số lần xuất hiện
ký tự
„A‟ trong chuỗi đó.
Test hàm vừa viết bằng cách thực hiện vài lần, mỗi lần với giá trị truyền khác
nhau.
Hướng dẫn:

Bài tập 24.


Mục đích:
- Viết hàm overload.

Yêu cầu:
(i) Viết hàm average, hàm có hai tham số kiểu số nguyên, hàm trả về giá trị trung
bình của hai số đó.
(ii) Overload hàm average với ba tham số nguyên, hàm trả về giá trị trung bình của ba số
đó.
Test các hàm vừa viết bằng cách thực hiện vài lần, mỗi lần với các giá trị truyền khác nhau.
Hướng dẫn:

Bài tập 25.

Mục đích:


Yêu cầu:
Viết hàm multiConcat, hàm nhận một tham số kiểu String và một số nguyên n,
hàm trả về một chuỗi mới là chuỗi được ghép từ n lần chuỗi trong tham số. Nếu n<2
thì xuất ra chuỗi gốc.
Ví dụ gọi hàm multiConcat(“hi”,4) kết quả xuất ra “hihihihi”. Test hàm vừa
viết bằng cách thực hiện vài lần, mỗi lần với các giá trị truyền cho hàm khác nhau.

Trang 21
Hướng dẫn:

Bài tập 26.

Mục đích:

Yêu cầu:
Viết chương trình xuất ra dãy số Fibonacci, Yêu cầu phải viết 2 phương thức.
Phương thức 1 dùng để trả về số Fibonacci tại vị trí thứ k bất kỳ. Phương thức 2 dùng để
xuất dãy số Fibonacci từ 1 n.

Dãy Fibonacci : 1 1 2 3 5 8 13 21 34 …
- Số Fib thứ k = (số Fib thứ k-1) + (số Fib thứ k-2), tức là 13 =8+5, 21=13+8
- 2 số Fib đầu tiên trong dãy luôn luôn là 1

Hướng dẫn:

Bài tập 27.

Mục đích:

Yêu cầu:
Hãy viết phương thức tên Panlyndrome nhận 1 tham số có kiểu String và trả về true
nếu tham số là chuỗi panlyndrome (chuỗi panlyndrome là chuỗi có chuỗi đảo ngược bằng
chính nó, ví dụ madam)

Hướng dẫn:
public static boolean isPanlyndrome(String s)
{
for(int i=0;i<s.length();i++)
{
if(s.charAt(i)!=s.charAt(s.length()-i-
1)) return false;
}
return true;
}

Bài tập 28.


Mục đích:

Yêu cầu:
Viết một hàm đặt tên là NegativeNumberInStrings(String str). Hàm này có đối
số truyền vào là một chuỗi bất kỳ, Hãy viết lệnh để xuất ra các số nguyên âm trong chuỗi.
Ví dụ: Nếu nhập vào chuỗi “abc-5xyz-12k9l--p” thì hàm phải xuất ra được 2 số nguyên
âm đó là -5 và -12

Trang 22
Hướng dẫn:

Bài tập 29.

Mục đích:

Yêu cầu:
Viết chương trình chơi game đoán số, mô tả game như sau:
- Khởi tạo ban đầu người chơi có 5 điểm
- Máy tự động Random ngẫu nhiên 1 số từ 0->5 (số này sẽ không xuất ra, chỉ dùng
để so sánh với số số mà người chơi đoán
- Người chơi đoán số, Nếu đoán đúng thì + 1 điểm vào điểm khởi tạo, ngược lại -1 điểm
(Chú ý là có xuất thông báo khi người chơi đoán trúng hay đoán sai)
- Khi người chơi không còn điểm nào thì thông báo Game Over
- Nếu người chơi tích lũy được 10 điểm thì thông báo Congratulations! You Win!

Hướng dẫn:
Random rd=new Random();
int so=rd.nextInt(6);

Bài tập 30.


Mục đích:

Yêu cầu:
Viết hàm để xuất ra 5 hình bên dưới (Viết 5 hàm riêng biệt, mỗi hàm chứa 2 vòng lặp)


Hướng dẫn:

Trang 23
Phần 1.3 Writing Class
Nội dung kiến thức thực hành:

- Khai báo và sử dụng lớp


- Viết các lớp với mối quan hệ composition

Bài tập 31.


Mục đích:

- Tìm hiểu cách viết lớp trong Java.

Yêu cầu:
Cho lớp Distance như sau:


Tìm hiểu lớp này và giải thích kết quả. Nếu chương trình bị lỗi, hãy sửa
lỗi.

Hướng dẫn:
-

Bài tập 32.

Mục đích:
- Biết cách viết và sử dụng overloaded constructors.

Yêu cầu:
- Cho các lớp sau, hãy tìm hiểu và giải thích cách sử dụng lớp Time. Cho biết kết quả
của chương trình là gì?

Trang 24
// Time.java

import java.text.DecimalFormat;

public class Time {


private int hour; // 0 - 23
private int minute; // 0 - 59
private int second; // 0 - 59

// Time constructor initializes each instance variable to zero.


Ensures that Time object
// starts in a consistent state.
public Time() {
setTime(0, 0, 0);
}

// Time constructor: hour supplied, minute and second defaulted to 0


public Time(int h) {
setTime(h, 0, 0);
}

// Time constructor: hour and minute supplied, second defaulted to 0


public Time(int h, int m) {
setTime(h, m, 0);

}
// Time constructor: hour, minute and second supplied
public Time(int h, int m, int s) {
setTime(h, m, s);
}

// Time constructor: another Time object supplied


public Time(Time time) {
setTime(time.hour, time.minute, time.second);
}

// Set a new time value using universal time. Perform


// validity checks on data. Set invalid values to zero.
private void setTime(int h, int m, int s) {
// hour = ( ( h >= 0 && h < 24 ) ? h : 0 );
if ((h >= 0 && h < 24))
hour = h;
else hour = 0;
minute = ((m >= 0 && m < 60) ? m : 0);
second = ((s >= 0 && s < 60) ? s : 0);
}

// convert to String in universal-time format


public String toUniversalString() {
DecimalFormat twoDigits = new DecimalFormat("00");
return twoDigits.format(hour) + ":" + twoDigits.format(minute) +

Trang 25
":" + twoDigits.format(second);
}

// convert to String in standard-time format


public String toString() {
DecimalFormat twoDigits = new DecimalFormat("00");
return ((hour == 12 || hour == 0) ? 12 : hour % 12) + ":" +
twoDigits.format(minute) + ":" + twoDigits.format(second) + (hour < 12 ?
" AM" : " PM");
}
}
// TimeTest.java
import javax.swing.*;

public class TimeTest {


// test constructors of class Time2
public static void main(String args[]) {
Time t1, t2, t3, t4, t5, t6;
t1 = new Time(); // 00:00:00 t2 = new Time( 2 ); // 02:00:00
t3 = new Time(21, 34); // 21:34:00
t4 = new Time(12, 25, 42); // 12:25:42
t5 = new Time(27, 74, 99); // 00:00:00
t6 = new Time(t4); // 12:25:42 String output="";
output = "Constructed with: " + "\nt1: all arguments defaulted" +
"\n " + t1.toUniversalString() + "\n " + t1.toString();
output += "\nt2: hour specified; minute and " + "second
defaulted" + "\n " + t2.toUniversalString() + "\n " + t2.toString();
output += "\nt3: hour and minute specified; " + "second
defaulted" + "\n " + t3.toUniversalString() + "\n " + t3.toString();
output += "\nt4: hour, minute, and second specified" + "\n " +
t4.toUniversalString() + "\n " + t4.toString();
output += "\nt5: all invalid values specified" + "\n " +
t5.toUniversalString() + "\n " + t5.toString();
output += "\nt6: Time2 object t4 specified" + "\n " +
t6.toUniversalString() + "\n " + t6.toString();
JOptionPane.showMessageDialog(null, output, "Demonstrating
Overloaded Constructors", JOptionPane.INFORMATION_MESSAGE);
System.exit(0);
}
}

Hướng dẫn: Viết trực tiếp giải thích trong file code

Bài tập 33.


Mục đích:
- Biết cách viết và sử dụng lớp thành phần (composition class).

Yêu cầu:
- Cho các lớp sau, hãy tìm hiểu và giải thích cách sử dụng lớp Date, lớp Employee.
Trang 26
Cho biết kết quả của chương trình là gì?
// Date.java
public class Date {
private int month; // 1-12
private int day; // 1-31 based on month
private int year; // any year

public Date(int theMonth, int theDay, int theYear) {


if (theMonth > 0 && theMonth <= 12) // validate month
month = theMonth;
else {
month = 1;
System.out.println("Month " + theMonth + " invalid. Set to
month 1.");
}
year = theYear; // could validate year
day = checkDay(theDay); // validate day
System.out.println("Date object constructor for date " +
toString());
}

private int checkDay(int testDay) {


int daysPerMonth[] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31,
30, 31};
// check if day in range for month
if (testDay > 0 && testDay <= daysPerMonth[month]) return
testDay;
// check for leap year
if (month == 2 && testDay == 29 && (year % 400 == 0 || (year % 4
== 0 && year % 100 != 0)))
return testDay;
System.out.println("Day " + testDay + " invalid. Set to day 1.");
return 1; // leave object in consistent state
}

// Create a String of the form month/day/year


public String toDateString() {
return month + "/" + day + "/" + year;
}
}


// Employee.java
public class Employee {
private String firstName;
private String lastName;
private Date birthDate;
private Date hireDate;

// constructor to initialize name, birth date and hire date


public Employee() {

Trang 27
firstName =””;
lastName =””;
birthDate = new
Date(0, 0, 0);

hireDate = new

Date(0, 0, 0);
}

public Employee(String first, String last, Date dateOfBirth, Date


dateOfHire) {
firstName = first;
lastName = last;
birthDate = dateOfBirth;
hireDate = dateOfHire;
}

// convert Employee to String format


public String toEmployeeString() {
return lastName + ", " + firstName + " Hired: " +
hireDate.toDateString() + " Birthday: " + birthDate.toDateString();
}
}


//EmployeeTest.java
import javax.swing.JOptionPane;

public class EmployeeTest {


public static void main(String args[]) {
Date birth = new Date(7, 24, 1949);
Date hire = new Date(3, 12, 1988);
Employee employee = new Employee("Bob", "Jones", birth, hire);
JOptionPane.showMessageDialog(null, employee.toEmployeeString(),
"Testing Class Employee", JOptionPane.INFORMATION_MESSAGE);
System.exit(0);
}
}

Hướng dẫn:
-

Bài tập 34.

Mục đích:

Yêu cầu:
Viết lớp HinhTron dùng để tính diện tích và chu vi hình tròn từ bán kính. Viết hàm
main để test lớp này.

Trang 28
Hướng dẫn:

Bài tập 35.


Mục đích:
-
Yêu cầu:
(i) Xây dựng lớp CHinhTamGiac như sau:
CHinhTamGiac
- ma : int
- mb : int
- mc : int
+ CHinhTamGiac()
+ CHinhTamGiac(a: int, b: int, c: int)
+ getCanhA() : int
+ setCanhA(v : int) : void
+ getCanhB() : int
+ setCanhB(v : int) : void
+ getCanhC() : int
+ setCanhC(v : int) : void
+ laTamGiac() : boolean
+ laTamGiac(int, int, int) : boolean
+ getChuVi() : int
+ getDienTich() : double


Trong đó:
Thuộc tính ma, mb, mc là ba cạnh của tam giác.
Hàm khởi tạo CHinhTamGiac(int, int, int): yêu cầu kiểm tra:
Nếu giá trị truyền có số âm thì thông báo và gán thuộc tính tương ứng bằng 0;
o nếu 3 giá trị truyền vào không lập thành một hình tam giác thì thông báo "Không phải
hình tam giác" và gán 3 thuộc tính bằng 0.

HD : ba giá trị lập thành một hình tam giác khi và chỉ khi tổng hai cạnh bất kỳ luôn
lớn hơn cạnh còn lại.
setCanhA, setCanhB, setCanhC cũng yêu cầu phải kiểm tra giá trị gán có
là số dương và lập thành tam giác hay không, nếu không thì không gán (giữ lại giá trị
cũ).
getChuVi(), getDienTich(): tính chu vi và diện tích của tam giác.
laTamGiac(): trả về giá trị true khi ba giá trị ma, mb, mc lập thành một hình
tam giác, ngược lại trả về giá trị false.
laTamGiac(int, int, int): trả về giá trị true khi ba giá trị a, b, c lập thành
một hình tam giác, ngược lại trả về giá trị false.

(ii) Viết hàm main để kiểm tra lớp CHinhTamGiac theo yêu cầu sau:
Trang 29
Cho nhập vào 3 giá trị số nguyên và khởi tạo hình tam giác có các cạnh ứng với 3 giá
trị này, nếu 3 giá trị này không lập thành tam giác thì thông báo, ngược lại thì tính và xuất
ra chu vi và diện tích của nó.
Hướng dẫn:

Bài tập 36.

Yêu cầu:
(i) Xây dựng lớp NhanVien như sau:
NhanVien

- maNV : String
- soSP : int
+ NhanVien()
+ NhanVien (ma: String, sp : int)
+ getMaNV() : String
+ setMaNV(ma : String) : void
+ getSoSP() : int
+ setSoSP(sp : int) : void
+ coVuotChuan() : boolean
+ getTongKet() : String
+ getLuong(): double
+ XuatTieuDe() : static void
+ toString() : String

rong các hàm khởi tạo và các hàm setSoSP, khi gán giá trị cho thuộc tính soSP thì
cần kiểm tra giá trị đó có phải là số dương không, nếu là số dương thì mới gán giá trị
cho thuộc tính, ngược lại thì gán bằng 0.
coVuotChuan() : trả về true nếu soSP > 500, ngược lại trả về false.
Giải thích: hàm này dùng để kiểm tra xem số lượng sản phẩm của nhân viên có vượt
quá số lượng chuẩn hay không.
getTongKet() : trả về chữ "Vượt" khi soSP > 500, ngược lại để trống (có thể
sử dụng hàm coVuotChuan() để kiểm tra).
getLuong() : trả về lương của một nhân viên, lương ăn theo sản phẩm với đơn
giá cơ bản cho 1 sản phẩm là 20000, và nếu số sản phẩm của nhân viên vượt chuẩn thì
phần vượt chuẩn được tính đơn giá là 30000.
XuatTieuDe() : xuất tiêu đề gồm các cột : mã nhân viên, số sản phẩm, lương,
tổng
kết.
toString() : trả về chuỗi chứa thông tin của nhân viên gồm các cột: Mã nhân
viên
(maNV), Số sản phẩm (soSP), Lương và Tổng kết.

(ii) Viết hàm main để kiểm tra lớp NhanVien theo yêu cầu sau:
Tạo 2 nhân viên với các thuộc tính cho người dùng nhập vào. Xuất ra các thông tin
Trang 30
của họ, gồm mã, số sản phẩm, lương, tổng kết.
Hướng dẫn:

Bài tập 37.


Yêu cầu:
(i) Xây dựng lớp CNhanVien, biết:
ần lượt là các thuộc tính họ, tên và số sản phẩm của nhân
viên. ết hàm khởi tạo CNhanVien(String, String, int), hàm này sẽ khởi tạo họ,
tên, số sản
phẩm của nhân viên; hàm phải kiểm tra số sản phẩm là số lớn hơn hoặc bằng 0, nếu
là số
âm thì gán giá trị cho mSoSP bằng 0.
ết các hàm lấy và gán giá trị cho thuộc tính của lớp (các hàm get/set).
ết hàm getLuong() để tính lương cho nhân viên, lương = số sản phẩm * đơn giá,
với đơn giá tùy thuộc vào số sản phẩm như sau:
Số sản phẩm Đơn giá

1 - 199 0.5

200 - 399 0.55

400 - 599 0.6

600 trở lên 0.65


t hàm LonHon(CNhanVien nv2): hàm này trả về giá trị true khi số sản phẩm
(mSoSP) lớn hơn số sản phẩm của nv2, ngược lại trả về false
(ii) Viết hàm main sử dụng lớp CNhanVien theo yêu cầu sau:
Cho người dùng nhập vào 2 nhân viên, mỗi nhân viên nhập vào họ, tên, số sản phẩm
của họ. Hãy tính và xuất ra lương của từng nhân viên. So sánh và xuất ra thông báo nhân
viên nào có số sản phẩm nhiều hơn và nhiều hơn bao nhiêu. Dùng 2 cách so sánh: dùng
hàm LonHon và không dùng hàm LonHon.
Hướng dẫn:

Bài tập 38.


Yêu cầu:

Xây dựng lớp SinhVien với các thuộc tính của sinh viên là mã sinh viên, họ tên, điểm lý
thuyết, điểm thực hành. Viết hàm main cho phép thực hiện:
(i) Nhập thông tin cho một sinh viên.
(ii) Tính điểm trung bình của sinh viên (điểm trung bình = (đlt+dth)/2).
(iii) Xuất thông tin sinh viên và cho biết kết quả học tập của sinh viên (Đậu khi điểm
trung bình >=5, ngược lại là Rớt).
Trang 31

Hướng dẫn:

Bài tập 39.


Yêu cầu:

Xây dựng lớp NhanVien, biết cấu trúc của một nhân viên như sau:
- Mã NV: kiểu số nguyên
- Họ tên: kiểu chuỗi.
- Địa chỉ: kiểu chuỗi.
- CBQL: kiểu logic, có giá trị true nếu nhân viên này là cán bộ quản lý.
Viết hàm main cho phép khởi tạo một số đối tượng thuộc lớp NhanVien, sau đó in ra mã,
họ tên của các nhân viên là cán bộ quản lý.

Bài tập 40.


Mục đích:
- Viết các lớp với mối quan hệ cấu thành, tập hợp (aggregation)

Yêu cầu:
Cho lược đồ các lớp như sau :


Hãy cài đặt theo mô hình này. Viết hàm main cho nhập vào một số Student và xuất ra các
thông tin đó.

Phần 1.4 Enhancing Class


Nội dung kiến thức thực hành:

Trang 32

- Cách truyền tham số trong Java
- Cách sử dụng từ khóa static
- Viết Interface và thực thi

Bài tập 41.

Mục đích:
Hiểu cách truyền tham số cho hàm trong Java.
Yêu cầu:

Cho các lớp dưới đây, cho biết kết quả chương trình và giải thích.
// Num.java
public class Num
{
private int value;
public Num (int update)
{
value = update;
}
public void setValue (int update)
{
value = update;
}
public String toString ()
{
return value + "";
}
}

// ParameterTester.java

public class ParameterTester {
public static void changeValues(int f1, Num f2, Num f3) {
System.out.println("Before changing the values:");
System.out.println("f1\tf2\tf3");
System.out.println(f1 + "\t" + f2 + "\t" + f3 + "\n");
f1 = 999;
f2.setValue(888);
f3 = new Num(777);
System.out.println("After changing the values:");
System.out.println("f1\tf2\tf3");
System.out.println(f1 + "\t" + f2 + "\t" + f3 + "\n");
}

public static void main(String[] args) {


int a1 = 111;
Num a2 = new Num(222);
Num a3 = new Num(333);
Trang 33
System.out.println("Before calling changeValues:");
System.out.println("a1\t a2\t a3");
System.out.println(a1 + "\t" + a2 + "\t" + a3 + "\n");
changeValues(a1, a2, a3);
System.out.println("After calling changeValues:");
System.out.println("a1\t a2\t a3");
System.out.println(a1 + "\t" + a2 + "\t" + a3 + "\n");
}
}

Hướng dẫn:

Bài tập 42.

Mục đích:
- Hiểu cách sử dụng thuộc tính và hàm static.

Yêu cầu:
Cho các lớp dưới đây, cho biết kết quả chương trình và giải thích.
// NhanSu.java
class HoSo {
static int soNguoi;
String hoTen;

HoSo(String ht) {
hoTen = ht;
soNguoi++;
}

static void tongKet() {


System.out.println("Ho khau nay co " + soNguoi + " nguoi");
}

void xuatHoTen() {
System.out.println(hoTen);
}

}
public class NhanSu{
public static void main( String argv[] ){
HoSo n1 = new HoSo( "Kim Jong Un" );
HoSo n2 = new HoSo( "Barack Obama" );
HoSo n3 = new HoSo( "Vladimir Putin" );
HoSo n4 = new HoSo( "Nguyễn Lãnh Đạo" );
HoSo.tongKet();
n1.xuatHoTen();
n2.xuatHoTen();
n3.xuatHoTen();
n4.xuatHoTen();
}
}

Trang 34
Hướng dẫn:

Bài tập 43.

Mục đích:
- Tìm hiểu cách viết và sử dụng interface.

Yêu cầu:
Cài đặt các lớp theo mô hình dưới đây:

Bài tập 44.

Mục đích:
- Tìm hiểu cách viết và sử dụng interface

Yêu cầu:
- Thiết kế class theo mô hình bên dưới, sinh viên lựa chọn nội dung thích hợp cho
từng phương thức cụ thể.

Trang 35

Bài tập 45.

Mục đích:
- Tìm hiểu cách viết abstract class

Yêu cầu:
- Hãy thiết kế class hợp lý theo mô hình UML dưới đây, dấu “-” là private, dấu
“#” là protected, dấu “+” là public

Trang 36

Viết thêm class TestMain để kiểm tra class Staff, phương thức payday() sẽ xuất
toàn bộ bảng lương chi tiết cho mỗi nhân viên tại thời điểm tính lương, cách tính lương
cho mỗi nhân viên là khác nhau dựa vào các thuộc tính được mô tả trong mỗi class.
Hướng dẫn:

Trang 37

You might also like