1. i
ĐẠI HỌC ĐÀ NẴNG
TRUNG TÂM PHÁT TRIỂN PHẦN MỀM SDC
BÀI TẬP JAVA CĂN BẢN
Đà Nẵng - Năm 2012
2. 1
Phần 1: Giới thiệu ngôn ngữ lập trình Java
Mục tiêu:
Thiết lập biến môi trường
Khai báo lớp
Quy định đặt tên class file
Biên dịch và thực thi chương trình Java
Xuất ra chuỗi màn hình
Nhập một chuỗi từ bàn phím
Bài 1.1 Bài tập mẫu
1.1.1. Tải và cài đặt JDK 1.6.0 và Eclipse
Hướng dẫn:
Download JDK 1.6.0
Download Eclipse
1.1.2. Thiết lập biến môi trường
Hướng dẫn:
Window 7: vào run à gõ lệnh control à chọn User Accounts à chọn Change my
environment variables à Edit System variables à thêm dấu ; sau đó là đường dẫn
đến thư mục bin nơi cài đặt java jdk (xem hình)
Window XP: click phải My Computer à Chọn Tab Advanced à Environment
variables à Chọn vào Path trong phần System Variables. Thêm dấu ; sau đó là
đường dẫn đến thư mục bin của java jdk, jre.
3. 2
Kiểm tra set biến môi trường thành công: vào run à gõ lệnh cmd
à gõ lệnh: java –version à kết quả như hình dưới.
1.1.3. Tải và tạo dự án với công cụ eclipse
Hướng dẫn:
Xem video 1
Xem video 2
1.1.4. Lớp rỗng:
Viết một khai báo lớp không chứa gì cả. Biên dịch nó và kiểm tra tên của file class
được tạo ra từ file nguồn này.
4. 3
Code:
Hướng dẫn:
• Lưu file với tên A.java tại thư mục (chẳng hạn) D:baitapjavaphan1, chắc chắn
rằng file này được đặt tên A.java chứ không phải là A.java.txt.
• Lệnh biên dịch file: javac A.java
• Kết quả sẽ thấy file A.class mới được sinh ra trong quá trình biên dịch.
• Bạn không thể chạy file này vì thiếu phương thức main().
1.1.5. Hai lớp rỗng:
Viết một file nguồn java chứa hai lớp cùng cấp A và B. Biên dịch nó và kiểm tra tên
của các file class được tạo ra từ file nguồn.
Code:
Lưu ý:
• Một file nguồn java có thể chứa nhiều khai báo lớp, nhưng chỉ có duy nhất một lớp
có phương thức main() và có bổ từ public ( chẳng hạn như public class A). Trong
trường hợp này, tên của file nguồn phải cùng tên với lớp này.
1.1.6. Lớp lồng nhau:
Viết một file nguồn java chứa hai lớp A và B trong đó, lớp B được định nghĩa bên
trong lớp A. Biên dịch nó và kiểm tra tên của các file class được tạo ra từ file
nguồn.
Code:
Lưu ý:
class A {
}
class A {}
class B {}
class A {
class B {}
}
5. 4
• Một lớp có thể chứa một lớp khác. Trong trường hợp này lớp B được gọi là lớp
thành viên nội.
• Các class file được tạo ra từ file nguồn này sẽ có tên: A.class và A$B.class.
1.1.7. Lớp nội cục bộ:
Viết một file nguồn java chứa hai lớp A và B, trong đó lớp B được định nghĩa bên
trong một phương thức của lớp A. Biên dịch và kiểm tra các file class được tạo ra
từ file nguồn.
Code:
Lưu ý:
• Một phương thức có thể chứa các khai báo lớp. Trong trường hợp này, lớp này
được gọi là lớp nội cục bộ.
• Các class file được tạo ra từ file nguồn này sẽ có tên: A.class và A$1$B.class.
1.1.8. Hello class:
Viết một chương trình xuất chuỗi “Xin chao” ra màn hình.
Code:
Lưu ý:
• Đây là chương trình đầu tiên có thể chạy vì nó chứa phương thức main(). Trước
phương thức main() phải có khai báo public static void main(String[] args), trong
đó tên thông số args có thể đổi sang tên khác hợp lệ trong java, ví dụ: String[] str.
• Java là ngôn ngữ lập trình có phân biệt kiểu chữ, do đó ghi String khác với string,
class A {
void test() {
class B { }
}
}
public class hello {
public static void main(String[] args) {
// CODE HERE
System.out.println("Xin chao");
}
}
6. 5
và System khác với system. Bạn lưu ý điều này để gõ chính xác.
• Để biên dịch file này gõ vào: javac hello.java
• Để thực thi gõ vào lệnh: java hello
1.1.9. Lớp có phương thức add(), để tính tổng hai số nguyên.
Viết một chương trình chứa một phương thức cộng hai số nguyên và được gọi trong
phương thức main().
Code:
Lưu ý:
• Thay vì tạo ra một đối tượng của lớp A, chúng ta có thể gọi trực tiếp phương thức
add() trong phương thức main() bằng cách thêm vào từ khóa static trước phương
thức add(). Trong trường hợp này, từ khóa static được sử dụng để chỉ ra rằng hàm
add() thuộc tính lớp A nhưng không thuộc bất kỳ đối tượng nào của lớp. Phương
thức tĩnh có thể được gọi mà không cần tạo ra đối tượng của lớp chứa phương thức
này.
1.1.10. Lớp chứa phương thức readStr().
Viết một chương trình nhập chuỗi từ bàn phím.
Code:
public class add {
int add(int x, int y) {
return (x + y);
}
public static void main(String[] args) {
add a = new add();
System.out.println("Ket qua la: " + a.add(3, 7));
}
}
import java.io.*;
public class B {
static String readStr() throws IOException {
InputStreamReader isr = new
InputStreamReader(System.in);
BufferedReader br = new BufferedReader(isr);
return br.readLine();
}
public static void main(String[] args) {
String st = "";
System.out.print("Nhap vao chuoi: ");
try {
st = readStr();
} catch (IOException e) {}
System.out.println("Chuoi nhap vao la: " + st);
}
}
7. 6
Lưu ý:
• Nếu một phương thức có khai báo ném một ngoại lệ, có phải được đặt trong khối
try/ catch khi gọi.
1.1.11. Lớp chứa phương thức readInt().
Viết một chương trình nhập số nguyên từ bàn phím.
Code:
Bài 1.2: Viết thêm code
1.2.1. Thêm các lệnh sau vào chương trình hello.java:
Thực thi và kiểm tra kết quả.
Code:
1.2.2. Sửa chương trình hello.java:
import java.io.*;
public class C {
int readInt() throws IOException, NumberFormatException
{
InputStreamReader isr = new
InputStreamReader(System.in);
BufferedReader br = new BufferedReader(isr);
String s = br.readLine();
return Integer.parseInt(s);
}
public static void main(String[] args) {
C b = new C();
int x = 0;
System.out.print("Nhap vao so: ");
try{
x = b.readInt();
}catch (NumberFormatException e) { }
catch (IOException e) {}
System.out.println("So nhap vao la: " + x);
}
}
System.out.println(67+89);
System.out.println("Ket qua la: " + 67+89);
System.out.println("Ket qua la: " + (67+89));
8. 7
Để nó có thể xuất ra màn hình chuỗi chứa ngoặc đôi hoặc ngoặc đơn. Ví dụ:
“Trung tam tin hoc SDC”.
1.2.3. Sửa chương trình add:
Để nó có chứa phương thức max(), tìm giá trị lớn nhất của hai số nguyên.
1.2.4. Kết hợp chương trình với chương trình readInt():
Để tìm số lớn nhất của hai số nguyên nhập từ bàn phím.
Bài 1.3: Viết code từ đầu
1.3.1. Viết chương trình nhập xuất chuỗi ra màn hình:
Viết chương trình nhập vào tên ví dụ: “Hung” từ bàn phím, và xuất ra thông điệp
“Chao Hung” ra màn hình.
1.3.2. Viết chương trình tính tổng:
Viết chương trình tính tổng hai số nguyên nhập từ bàn phím.
1.3.3. Viết chương trình tính thương:
Viết chương trình tính thương của hai số nguyên được nhập từ bàn phím. Kiểm tra
kết quả với các số nhập vào là (20 và 2), (10 và 3) (10 và 4). Bạn phải thay đổi
chương trình như thế nào để luôn cho kết quả đúng ?
Bài 1.4: Trắc nghiệm
1.4.1. Khi một phương thức lớp con có cùng tên, có cùng danh sách thông số và
cùng kiểu dữ liệu trả về với với phương thức trong lớp cha, phương thức này được
gọi là gì ?
a. extended
b. overloaded
c. overexternded
d. overridden
9. 8
1.4.2. Điều nào sau đây phải trùng khớp chính xác đối với những phương thức
overloaded để biên dịch đúng ?
a. The parameter list
b. The return type
c. The exceptions thrown
d. None of the ablove
1.4.3. Điều gì xảy ra khi biên dịch và thực thi chương trình sau:
a. Chương trình khi biên dịch sẽ báo lỗi
b. Chương trình chạy bình thường và xuất ra màn hình dòng chữ Xin chao.
Bài 1.5: Thủ thuật
• Nếu bạn thấy thông báo “Bad command or file name” hay javac command not
found”, bạn hãy kiểm tra cài đặt của mình, đặc biệt là thiết đặt đường dẫn.
• Nếu java thông báo lỗi: “java.lang.NoClassDefFoundRError, bạn hãy kiểm tra cẩn
thận tên của class.
int i = 0;
class A {
public static void main(String[] s) {
System.out.println("Xin chao");
}
}
10. 9
PHẦN 2: Các phần tử cơ bản của ngôn ngữ Java
Mục tiêu:
Viết các phương thức đơn giản
Sử dụng các hàm toán học trong lớp Math
Truy xuất các thông số của chương trình Java
Nhận một chuỗi số nhập từ bàn phím trên một dòng
Sử dụng cá công cụ javap và javadoc
Bài 2.1: Bài tập mẫu
2.1.1. Giai thừa. Viết chương trình tính n giai thừa ký hiệu là n! = 1*2*3*..*n.
Yêu cầu: Sử dụng eclipse để viết code.
Hướng dẫn:
Kết quả:
2.1.2. Tính tổng. Viết chương trình tính tổng sum S = 1 + 2 + 3+ .. + n. Với n là
một số nguyên không âm nhập từ bàn phím.
2.1.3. Tam giác. Viết chương trình đọc số nguyên dương nhập từ bàn phím trên
public class fac {
int factorial (int n){
int p = 1;
for(int i = 1; i<=n; i++)
{
p *= i;
}
return p;
}
public static void main(String[] args) {
fac a = new fac();
11. 10
một dòng, được phân cách bởi một hoặc nhiều khoảng trắng. Chươn trình sẽ kiểm
tra ba số nguyên là chiều dài ba cạnh của một tam giác hay không ? Nếu đúng tính
và hiển thị diện tích của tam giác đó, nếu sai, hiển thị thông báo.
Hướng dẫn:
• Độ dài 3 cạnh a, b, c là của 1 tam giác thì thỏa mãn điều kiện tổng hai cạnh bất kỳ
luôn luôn lớn hơn cạnh còn lại.
• Công thức Heron tính tổng diện tích của một tam giác:
2.1.4. Javadoc. Dùng javadoc để tạo tài liệu cho chương trình sau:
Code:
Hướng dẫn:
Xem hình:
/** This class provides a method
to add two
*/
public class test {
int a, b;
public test(int a, int b) {
this.a = a;
this.b = b;
}
/** This method returns the sum of two integers a
12. 11
Xem các file được sinh ra trong thư mục:
2.1.5. Dùng javap để dịch ngược class file test.class được tạo ra sau khi biên dịch
bài test.java ở trên.
Hướng dẫn:
13. 12
Bài 2.2: Viết thêm code
2.2.1. Sửa chương trình mẫu 2.1.1 để bạn không cần tạo ra đối tượng của lớp fac
trong phương thức chính(nghĩa là không có dòng fac a = new fac();)
2.2.2. Sửa chương trình mẫu 2.1.1 với n là số tự nhiên được nhập vào từ dòng
lệnh.
Yêu cầu: nếu chương trình fac.java được thực thi, gõ vào java jac 5 chương
trình sẽ hiên thị kết quả:
2.2.3. Sửa chương trình mẫu 2.1.1 với n là số tự nhiên nhập vào từ bàn phím.
Bài 2.3: Viết code từ đầu
2.3.1. Viết chương trình tìm số lớn nhất chuỗi các số được đưa vào từ dòng lệnh
Ví dụ: Khi chạy chương trình: Java TimMax 6 5 7 23 14
Kết quả: só lớn nhất là: 23
2.3.2. Viết chương trình kiểm tra một số tự nhiên có phải là số hoàn thiện hay
không. Số n được gọi là số hoàn thiện nếu n bằng tổng tất cả các ước số của n( trừ
chính nó).
Ví dụ:
Số 6 là số hoàn thiện vì: 6 = 1 + 2 +3
14. 13
Số 28 là số hoàn thiện vì: 28 = 1 + 2 + 4 + 7 + 14
Viết chương trình hiển thị tất cả các số hoàn thiện từ 1 đến 1000.
2.3.3. Viết chương trình hoán đổi hai số kiểu int trong java.
Ví dụ: int a = 3, b = 5. gọi hàm hoandoi(a, b) à kết quả: a = 5 và b = 3.
2.3.4. Viết chương trình tính tổng các bit 1 của số n kiểu int.
Bài 2.4: Trắc nghiệm
2.4.1. Câu lệnh nào khai báo đúng một mảng 5 số nguyên ?
a. int a[] = {1, 2, 3, 4, 5};
b. int a[];
c. int a[] = new int[5];
d. int a[] = new int(5);
2.4.2. Kết quả câu lệnh sau là gì ?
System.out.println(0x001B + “ ” + 033);
a. 21 23
b. 21 27
c. 27 27
d. 33 33
2.4.3. Một mảng có thể được khai báo như một mảng hai chiều, chẳng hạn như int
m[][] = new int[3][4]. Phần nào sau đây có thể được sử dụng để xác định số cột của
một mảng ?
a. m.length();
b. a.size();
c. m[0].length;
d. m.length(3);
e. m[].length;
Bài 2.5: Thủ thuật
• Tạo đối tượng thì phải tốn thời gian. Cố gắng tránh toán tử new, tái sử dụng các đối
15. 14
tượng đang tồn tại. Điều này thuận lợi hơn, bởi vì càng ít sử dụng bộ nhớ thì càng ít
thời gian thu gom rác, cả hai điều này làm tăng thời gian thực thi chương trình.
PHẦN 3: Cấu trúc dữ liệu và câu lệnh điều khiển
Mục tiêu:
Giá trị mặc định của các biến chưa khởi tạo
Khai báo biến và ép kiểu
Xuất tên của một lớp cho trước
Xử lý chuỗi
Thao tác các số nguyên dài
Bài 3.1: Bài tập mẫu
3.1.1. Giá trị mặc định. Hãy xác định giá trị mặc định của các biến chưa khởi tạo
sau đây.
Code:
public class bai3_1_1 {
byte a;
float b;
boolean c;
char d;
String s;
public static void main(String[] args) {
bai3_1_1 v = new bai3_1_1();
System.out.println("a = " + v.a);
System.out.println("b = " + v.b);
16. 15
Kết quả:
3.1.2. Khai báo biến và ép kiểu. Tìm và sửa tất cả các lỗi biên dịch trong chương
trình sau:
Code:
3.1.3. Tên lớp. Viết chương trình hiển thị tên lớp hiện hành.
Code:
public class bai3_1_2 {
byte a;
byte b;
byte c = 200;
byte d = -200;
byte e = (a+b);
byte f = 4 + 5;
byte g = 4 + 126;
byte h = 3*b;
float h = b/2.0;
public class bai3_1_3 {
public static void main(String[] args) {
// TODO Auto-generated method stub
bai3_1_3 t = new bai3_1_3();
System.out.println("Ten lop: " + t.getClass().getName());
}
}
17. 16
3.1.4. Đảo chuỗi. Viết chương trình nhận vào một chuỗi và hiển thị chuỗi đảo của
nó. Ví dụ, nhập vào chuỗi “Hello” à xuất ra chuỗi đảo là: “olleH”.
Code:
Kết quả:
Bài 3.2: Viết thêm code
3.2.1. Hãy thay đổi chương trình mẫu 3.1.4 ( đảo chuỗi) để có thể đảo chuỗi sử
dụng phương thức reverse() trong lớp StringBuffer.
Gợi ý:
http://www.java2s.com/Code/JavaAPI/java.lang/StringBufferreverse.htm
Bài 3.3: Viết code từ đầu
3.3.1. Viết chương trình nhập vào một số tự nhiên (kiểu int) biểu diễn năm, và đưa
ra kết quả năm đó có phải là năm nhuận hay không ?
Gợi ý: Năm nhuận làm năm:
import java.util.*;
public class bai3_1_4 {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
System.out.print("nhap vao chuoi str =");
String str = scan.nextLine();
String str_dao = "";
for(int i = str.length()-1; i >= 0; i--) {
str_dao += str.charAt(i);
}
18. 17
Nếu nó có 2 chữ số tận cùng là 00 thì nó phải chia hết cho 400.
Nếu nó không có 2 chữ số tận cùng là 00 thì nó phải chia hết cho 4.
Ví dụ:
Năm 2000: là năm nhuận vì tận cùng bằng 00 và chia hết cho 400.
Năm 1900: không phải là năm nhuận vì nó có 2 chữ số tận cùng là 00 nhưng không
chia hết cho 400.
Năm 20012 là năm nhuận vì chia hết cho 4.
3.3.2. Viết chương trình nhập vào 2 số tự nhiên n kiểu int và k kiểu byte và hiển
thị bit thứ k của số n đếm từ phải sang trái (bắt đầu tính từ 1).
Ví dụ:
Nhập vào n = 26 và k = 4: ta có 26 đổi ra kiểu bit bằng: 11010 , tính từ phải sang
bit thứ 4 bằng 1 ( số tô đậm).
2.3.3. Viết chương trình nhập vào một số nguyên và hiển thị số đảo của nó
Ví dụ: đảo của số 1234 là số.
2.3.4. Viết chương trình nhập vào một số nguyên. Hiển thị tổng các chữ số
của nó và số chữ số của số đó.
Ví dụ: Nhập n=1234 kết quả: số chữ số của số n = 4 và tổng các chữ số của n
= 1 + 2 + 3 + 4 = 10.
Bài 3.4: Trắc nghiệm
3.4.1. Định nghĩa biến nào sau đây là hợp lệ nếu nó là biến đối tượng ? (chọn tất
cả các câu đúng).
a. protected int a;
b. transient int b=3;
19. 18
c. public static final int c;
3.4.2. Chương trình sau xuất ra kết quả gì ?
Code:
a. -9 0
b. 0 -9
c. 5 2
d. 7 2
e. 2 7
Bài 3.5: Thủ thuật
• Để biết phương thức main(String args[ ]) nhận được bao nhiêu thông số, sử dụng
thuộc tính args.length().
• Những biến không cần thiết nên đưa vào trong phương thức thay vì làm thuộc tính
của lớp.
public class bai3_4_2 {
public int t = 4;
public void NumberPlay() {
int t = 2;
t = t + 5;
this.t = this.t - 2;
System.out.print(t + " ");
System.out.println(this.t);
}
public static void main(String[] args) {
20. 19
PHẦN 4: Cách gọi phương thức và mảng hai chiều
Mục tiêu:
Gọi phương thức từ lớp cha
Tạo ngẫu nhiên mảng hai chiều
Sắp xếp mảng
Bài 4.1: Bài tập mẫu
4.1.1. Gọi phương thức từ lớp cha. Viết hai lớp trong đó lớp này thừa kế lớp kia,
và gọi phương thức từ lớp cha của nó.
Code:
public class bai4_1_1 extends A {
public static void main(String[] args) {
int tong = 0;
bai4_1_1 a = new bai4_1_1();
tong = a.add(3, 7);
System.out.println("tong 3 va 7 la: " + tong);
}
}
class A {
int add(int a, int b) {
21. 20
Kết quả:
4.1.2. Ma trận ngẫu nhiên. Viết chương trình tạo một ma trận ngẫu nhiên ( tức là
mảng hai chiều) và hiển thị ra màn hình.
Code:
public class bai4_1_2 {
static int[][] createMatrixRandom(int row, int col) {
int a[][] = new int[row][col];
for(int i = 0; i < row; i++){
for(int j = 0; j < col; j++) {
a[i][j] = (int) (Math.random()*100);
}
}
return a;
}
22. 21
Kết quả:
4.1.3. Sắp xếp mảng. Viết chương sắp xếp mảng các số nguyên theo thứ tự tăng
dần.
Code:
Kết quả:
Bài 4.2: Viết thêm code
4.2.1. Hãy thay đổi chương trình mẫu 4.1.2 để tạo ra một ma trận, trong đó từng
hàng của ma trận được sắp xếp tăng dần.
Gợi ý: sắp xếp từng hàng của ma trận
Bài 4.3: Viết code từ đầu
4.3.1. Chương trình sau sẽ xuất ra kết quả bằng bao nhiêu ?
Code:
import java.util.*;
public class bai4_1_3 {
public static void main(String args[]) {
int a[] = {4, 3, 6, 1, 9};
System.out.println("in mang a[] chua sap xep:");
for(int i = 0; i < a.length; i++){
System.out.print(a[i] + "t");
}
Arrays.sort(a);// goi ham sap xep mang a[]
System.out.println();
System.out.println("in mang a[] da sap xep:");
public class bai4_3_1 {
static byte add(byte x, byte y) {
return (byte)(x+y);
}
public static void main(String[] args) {
System.out.println(add((byte)100, (byte)(100)));
}
}
23. 22
4.3.2. Một chuỗi được gọi là anagram của một chuỗi khác nếu chuỗi thứ nhất là
một hoán vị của chuỗi thứ 2. Ví dụ chuỗi “dare” là một hoán vị của chuỗi “read”.
Viết chương trình đọc vào hai chuỗi và kiểm tra hai chuỗi đó có phải là anagram
của nhau không ?
4.3.3. Viết chương trình tạo hai ma trận ngẫu nhiên và tính tổng của chúng.
4.3.4. Viết chương trình tạo một ma trận ngẫu nhiên và hiển thị vị trí (i, j) tất cả
các điểm yên ngựa trong ma trận. Điểm yên ngựa là điểm nhỏ nhất hàng chứa nó
và lớn nhất cột chứa nó.
Ví dụ: với ma trận sau, vị trí điểm yên ngựa (1, 2).
Bài 4.4: Trắc nghiệm
4.4.1. Chương trình sau xuất ra kết quả bằng bao nhiêu ?
Code:
a. 11
b. 10
c. 9
d. 8
4.4.2. Chương trình sau xuất ra kết quả bằng bao nhiêu ?
Code:
public class bai4_4_1 {
public static void main(String[] args) {
int x = 11 & 9;
System.out.println(x);
}
}
public class bai4_4_2 {
public static void main(String[] args) {
int x = 10 | 5;
System.out.println(x);
}
}
24. 23
a. 15
b. 14
c. 13
d. 12
4.4.3. Dòng mã nào sau đây hợp lệ ?
a. int a = (int) 888.8;
b. byte b = (byte)1000L
c. long c = (byte) 100;
d. byte d = (byte) 100L;
4.4.4. Chương trình sau xuất ra kết quả bằng bao nhiêu ?
Code:
a. x = -2147483648 va x = -1
b. x = -2147483648 va x = 1
c. x = -2147483648 va x = -2147483648
d. kết quả khác
4.4.5. Chương trình sau xuất ra kết quả bằng bao nhiêu ?
Code:
public class bai4_4_4 {
public static void main(String[] args) {
int x = 0x80000000;
System.out.println("x = " + x);
x = x >> 31;
System.out.println("x = " + x);
}
}
public class bai4_4_5 {
void modify(int n) {
n = n + 1;
}
public static void main(String[] args) {
int a = 1;
bai4_4_5 t = new bai4_4_5();
System.out.print(a + "; ");
t.modify(a);
System.out.println(a);
}
25. 24
a. 1; 1
b. 1; 2
c. 1; 3
d. 1; 0
Bài 4.5: Thủ thuật
• Toán tử dịch bit có thể làm cho chương trình chạy nhanh hơn, ví dụ thay vì dung
a*2 bạn có thể thay bằng a << 1.
PHẦN 5: Lớp, phương thức và kế thừa trong java
Mục tiêu:
Tạo lớp
Tạo lớp con kế thừa từ lớp cha
Tạo phương thức khởi tạo
Nạp chồng(overriloading), ghi đè (overriding)
Sử dụng tham chiếu this, super.
Bài 5.1: Bài tập mẫu
5.1.1. Cách dùng tham chiếu this. Nạp chồng (overload) phương thức khởi
tạo. Xây dựng lớp mô tả các điểm trên màn hình đồ họa. Lớp được đặt tên là
DIEM:
+ Các thuộc tính gồm:
. int x;// hoành độ
. int y;// tung độ
26. 25
. String m;// màu sắc
+ Các phương thức gồm:
. xây dựng hàm khởi tạo các điểm có tọa độ mặc định x=0, y=0, và màu
Trắng.
. xây dựng hàm khởi tạo có 3 tham số tọa độ x, y và màu sắc //nạp chồng
hàm khởi tạo
. xuất giá trị một điểm ra màn hình console (tọa độ x, y, màu sắc)
Lưu ý: Khái niệm overloading, trong một lớp có thể có nhiều phương thức cùng
tên nhưng khác nhau về danh sách tham số (kiểu dữ liệu hoặc số lượng tham số)
được gọi là nạp chồng phương thức hay còn gọi là overloading. Ví dụ:
public void method(int x) {} //(1)
public void method(float x) {} //(2)
public int method(int y) {} //(3) không hợp lệ vì có kiểu dữ liệu giống phương
thức (1)
Code:
Kết quả:
5.1.2. Cách dùng tham chiếu super. Ghi đè (overriding) phương thức ở lớp
cha.
* Xây dựng lớp connguoi:
+ Thuộc tính:
class DIEM {
int x, y;
String mau;
DIEM(){
this.x = 0;
this.y = 0;
this.mau = "Trang";
}
DIEM(int x, int y, String m){
this.x = x;
this.y = y;
this.mau = m;
}
void hienThiDiem(){
System.out.println("x="+this.x+", y="+this.y+",
mau="+this.mau);
}
}
public class bai5_1_1 {
public static void main(String[] args) {
DIEM objDiem1 = new DIEM();
DIEM objDiem2 = new DIEM(100, 100, "Xanh");
objDiem1.hienThiDiem();
objDiem2.hienThiDiem();
}
}
27. 26
. [protected] ten: String;
. [protected] ngaysinh: String;// có dạng 10/12/1984
. [protected] id: int
+ Phương thức:
. khởi tạo: truyền 3 tham số ten, ngaysinh, id
. [public] hienthithongtin: id, ten, ngaysinh
* Xây dựng lớp nhanvien kế thừa từ lớp connguoi:
+ Thuộc tính:
. [protected] manhanvien: int;
. [protected] ngayvaolam: String;// có dạng 20/10/2012
. [protected] capbac: int
+ Phương thức:
. khởi tạo: kế thừa từ lớp cha connguoi và thêm 3 tham số manhanvien,
ngayvaolam, capbac
. [public] hienthithongtin: id, ten, ngaysinh
Lưu ý:Khái niệm overriding
- Nếu lớp con có phương thức giống (tham số và kiểu trả về) phương thức lớp cha
được gọi là verride.
- Phương thức override phải có quyền truy xuất >= phương thức bị override
- Phương thức override không được phép quăng loại trừ không hợp lệ đối với
phương thức bị override
- Để gọi phương thức bị override của lớp cha ta dùng super.xxx(…) trong đó
xxx(…) là tên phương thức.
Code:
public class bai5_1_2 {
public static void main(String[] args) {
connguoi objConnguoi = new connguoi(1000, "Le Hai",
"10/12/1984");
System.out.println("---Hien thi thong tin nguoi---");
objConnguoi.hienthithongtin();
System.out.println();
System.out.println("---Hien thi thong tin nhan vien---");
nhanvien objNhanvien = new nhanvien(99, "Nguyen Van",
"19/02/1984", 10, "01/01/2012", 7);
objNhanvien.hienthithongtin();
28. 27
Kết quả:
Bài 5.2: Viết thêm code
5.2.1. Hãy thay viết thêm vao chương trình mẫu 5.1.2 để tạo ra lớp sinhvien kế
thừa từ lớp connguoi:
* Xây dựng lớp nhanvien kế thừa từ lớp connguoi:
+ Thuộc tính:
. [protected] masinhvien: int;
. [protected] malop: String;
+ Phương thức:
. khởi tạo: nhập các giá trị (masinhvien, malop) của sinh viên và các thuộc tính kế
thừa từ lớp cha connguoi.
29. 28
. [public] hienthithongtin: của sinh viên // overriding lại hàm hienthithongtin của
lớp cha.
Bài 5.3: Viết code từ đầu
5.3.1. Xây dựng một lớp biểu diễn hình chữ nhật có:
+ Thuộc tính:
. tọa độ x: int; // trên trái
. tọa độ y: int; // trên trái
. chieudai: int;
. chieurong: int;
+ Phương thức:
. Nhập dữ liệu hai cạnh cho hình chữ nhật
. Tính chu vi
. Tính diện tích
. Hiển thị thông tin của hình chữ nhật ra màn hình gồm: độ dài hai cạnh,
chu vi và diện tích.
. Kiểm tra một điểm có nằm trong hình chữ nhật hay không ?
. Kiểm tra hai hình chữ nhật có giao nhau hay không ?
. Kiểm tra một hình chữ nhật có giao với một hình tròn hay không ?
Hướng dẫn: Xây dựng thêm lớp hình tròn có thuộc tính là tọa độ tâm và bán
kính.
5.3.2. Xây dựng một lớp để biểu diễn phân số gồm có:
+ Thuộc tính:
. tuso: int;
. mauso: int;
+ Phương thức:
. Nhập phân số
. Xuất phân số: ví dụ phân số xuất ra màn hình có dạng 6/7
. Rút gọn phân số: ví dụ 6/4 rút gọn thành 3/2
30. 29
. Hàm tính giá trị nguyên của phân số: ví dụ 3/2 giá trị nguyên bằng 1
5.3.3. Xây dựng các lớp theo cây kế thừa sau:
Hãy thiết kế các lớp trong đó:
+ Thuộc tính: là những dữ kiện để xác định từng loại hình.
+ Phương thức: in ra màn hình thông tin của các hình như diện tích, chu vi,
thể tích.
5.3.4. Tự đề xuất một ví dụ về lập trình hướng đối tượng. Yêu cầu có sử dụng các
kỹ thuật: kế thừa, nạp chồng, ghi đè,…
Hướng dẫn làm bài: Ghi rõ yêu cầu bài toán, mô tả các đối tượng gồm thuộc
tính và phương thức, có thể vẽ sơ đồ phụ thuộc giữa các đối tượng, viết code.
Có thể làm trong file word.
5.3.5. Hãy xây dựng lớp SinhVien có các thuộc tính riêng (private):
- Số báo danh
- Họ và tên
- Địa chỉ
- Môn học
- Điểm thi học kỳ I, II
a. Viết các hàm truy cập tới các thành phần dữ liệu và các toán tử tạo lập cho lớp
SinhVien.
b. Viết chương trình chính để tạo ra danh sách SinhVien và hiển thị các thông tin
31. 30
sau:
- Nhập vào thông tin về sinh viên
- Xem thông tin về sinh viên
- Tìm sinh viên theo điểm
- Kết thúc chương trình
c. Viết các hàm thành phần của 1 lớp để thực hiện nhiệm vụ trên.
5.3.6. Một công ty được giao nhiệm vụ quản lý các phương tiện giao thông gồm
các loại ôtô, xe máy, xe tải:
+ Mỗi phương tiện giao thông cần quản lý: mô hình, năm sản xuất, giá bán
và màu sắc.
+ Các ôtô cần quản lý: số chỗ ngồi, hãng sản xuất động cơ
+ Xe máy: công suất
+ Xe tải: trọng tải
a. Hãy xây dựng các lớp XeTai, XeMay, Oto kế thừa từ lớp phương tiện giao
thông PhuongTienGT.
b. Xây dựng các hàm để truy cập, hiển thị và kiểm tra các thuộc tính của các
lớp.
c. Phát biểu lớp KiemKe để quản lý tất cả các phương tiện (xe máy, ôtô, xe tải)
trong đó có hàm chính thực hiện các nhiệm vụ sau:
1. Đăng ký phương tiện
2. Tìm phương tiện theo mô hình
3. Tìm phương tiện theo màu sắc
4. Kết thúc
d. Viết các hàm để thực hiện nhiệm vụ trên.
32. 31
5.3.7. Cho hình sau, hãy xét tính truy cập đúng hay sai của các câu lệnh từ (9) đến
(28) và giải thích tại sao ?
Gợi ý: ghi câu trả lời vào file world, trong đó câu lệnh (1): giải thích,…
Truy
cập từ
cùng
lớp
Truy
cập từ
cùng
gói
Truy
cập từ
một lớp
con
Truy
cập từ
một gói
khác
publ
ic
yes yes yes yes
prot
ecte
d
yes yes yes
34. 33
} obj_C.gioitinh = ”Nam”
(28)
}
Bài 5.4: Trắc nghiệm
5.4.1. Hãy liệt kê tất cả các từ khóa thể hiện phạm vi truy xuất ?
5.4.2. Hãy liệt kê tất cả các từ khóa thể hiện khả năng truy cập ?
5.4.3. Mỗi từ khóa sau có thể được sử dụng hoặc không được sử dụng trước khai
báo biến, phương thức và lớp. Dùng yes/no để điền vào bảng sau cho hợp lý.
ST
T
Từ khóa Biến Phương
thức
Lớp
1. public
2. private
35. 34
3. protected
4. static
5. abstract
6. final
7. native
8. synchronize
d
9. volatile
5.4.4. Chỉ có một khẳng định trong những câu sau là sai. Câu nào ?
a. Mỗi thể hiện của một lớp có sở hữu riêng các thuộc tính thông thường.
b. Các thể hiện của một lớp cùng chia sẻ các thuộc tính tĩnh của lớp đó.
c. Một đối tượng là một thể hiện của một lớp.
d. Mỗi thể hiện của một lớp có các định nghĩa riêng cho các phương thức của
nó.
5.4.5. Từ khóa public và private dùng để ….
a. Trình biên dịch tối ưu hóa chương trình.
b. Đảm bảo an toàn của lớp khi thiết kế.
c. Hạn chế việc sao chép lớp.
d. Cho phép người thiết kế lớp che giấu một phần thi hành của lớp trước người
sử dụng lớp.
5.4.6. Tìm lỗi của chương trình sau và giải thích sai ở dòng nào (1), (2), (3) hay
(4) ? Tại sao sai ?
public class MyClass {
long var;
public void MyClass(long param) { //(1)
var = param;
}
public static void main(String[] args) {//(2)
MyClass a, b;
a = new MyClass(); //(3)
b = new MyClass(15); //(4)
}
}
Hướng dẫn: tất cả câu trả lời vào file world <phan5_5.doc>, tên bài tập
<Bai_5_4_6>.
36. 35
5.4.7. Tìm lỗi của chương trình sau và giải thích sai ở dòng nào (1), (2), (3) hay
(4) ? Tại sao sai ?
abstract class MyClass {
abstract void f();
final void g(){}; //(1)
final void h(){};
protected static int i;
private int j;
}
final class YourClass extends MyClass {
YourClass(int n){ m = n; } //(2)
public static void main(String[] args) {
}
void f(){}
void h(){}
void k(){i++;}//(3)
void l(){j++;}//(4)
int m;
}
5.4.8. Cho biết kế quả in ra màn hình của chương trình sau ?
class Base {
int i;
Base(){
add(1);
}
void add(int n){
i += n;
}
void print() {
System.out.println(i);
}
}
class Ext extends Base {
Ext() {
add(2);
}
void add(int n){
i += n * 2;
}
}
public class Q3 {
public static void main(String[] args) {
Ext Ext1 = new Ext();
bibo( Ext1);
}
static void bibo(Base b) {
b.add(8);
b.print();
}
}
37. 36
5.4.9. Cho trước đoạn code sau, hãy chọn lệnh thích hợp sau điền vào chỗ (1) ?
a. x = y;
b. z = x;
c. y = (B) x;
d. c = (C) y;
e. y = (A) y;
Class A { }
class B extends A { }
class C extends A {}
public class Q4 {
public static void main(String[] args) {
A x = new A();
B y = new B();
C z = new C();
//noi chon lenh thich hop (1) ?
}
}
5.4.10. Cho biết kế quả thực hiện chương trình sau ?
public class Q5 {
int a, b;
public void f(){
a = b = 0;
int[] c = {0};
g(b, c);
System.out.println(a + " " + b + " " + c[0]);
}
public void g(int b, int[] c){
a = b = 1;
c[0] = 1;
}
public static void main(String[] args) {
Q5 e = new Q5();
e.f();
}
}
Hướng dẫn: sử dụng chức năng debug trong eclip để xem giá trị các biến a,
b, c[0] thay đổi.
5.4.11. Cho biết kế quả thực hiện chương trình sau ?
public class Q6 {
public static void main(String[] args) {
int i = 4;
float f = 4.3F;
38. 37
double d = 1.3;
int c = 0;
if(i == f) c++;
if(((int) (f+d)) == ((int) f + (int) d)) {
c += 2;
}
System.out.println(c);
}
}
Bài 5.5: Thủ thuật
PHẦN 6: Ôn Tập
Mục tiêu:
Kiểu dữ liệu
Câu lệnh
Mảng
Xử lý chuỗi
Hướng đối tượng
39. 38
Bài 6.1: Kiểu dữ liệu
6.1.1. Những lệnh nào trong những lệnh sau là hợp lệ ?
a. char a = 'u0061';
b. char 'u0061' = 'a';
c. long phone = 8235468L;
d. float pi = 3.1459;
e. double p = 314.159e-2;
Bài 6.2: Xử lý bit
6.2.1. Viết chương trình đổi số nguyên n sang hệ nhị phân, in kết quả ra màn hình
(không được sử dụng các hàm có sẵn của java, mà tự viết thuật toán chuyển đổi).
6.2.2. Tính tổng các bit 1 của tất cả các số kiểu byte (đề thi cao học ngành khoa
học máy tính năm 2007).
Gợi ý: Tổng các bit 1 của tất cả các số từ 0 à 255.
Bài 6.3: Câu lệnh điều khiển
6.3.1. Viết chương trình nhập vào một số nguyên và in ra tất cả các số nguyên tố
nhỏ hơn hoặc bằng số n đó.
6.3.2. Viết chương trình nhập vào một số nguyên n và in ra tất cả các số hoàn
thiện nhỏ hơn hoặc bằng số n đó. Số hoàn thiện là số có tổng các ước số của nó
(không kể chính nó) bằng chính nó. Ví dụ: 6 = 1 + 2 + 3, 28 = 1 + 2 + 4 + 7 + 14.
Bài 6.4: Mảng một chiều
6.4.1. Cho mảng một chiều int a[n], với n nhập từ bàn phím. Viết chương trình
kiểm tra số nguyên int x có trong mảng a[] không ?
a. Viết chương trình tìm kiếm theo tuần tự.
b. Viết chương trình tìm kiếm theo nhị phân ?
Gợi ý: Tham khảo link http://www.scribd.com/doc/52926558/70/CAC-
THU%E1%BA%ACT-TOAN-TIM-KI%E1%BA%BEM
6.4.2. Viết chương trình nhập mảng int a[n], với n nhập từ bàn phím, còn các phần
tử mảng a[] nhập bằng random. Viết chương trình sắp xếp mảng a[] theo thứ tự
tăng dần.
a. Viết chương trình sắp xếp theo thuật toán nổi bột (bubble sort).
40. 39
b. Viết chương trình sắp xếp theo thuật toán nhanh (quicksort).
Gợi ý: ôn tập các loại thuật toán sắp xếp, tìm kiếm các thuật toán sắp xếp
trên internet.
Bài 6.5: Mảng hai chiều
6.5.1. Viết chương trình nhập mảng hia chiều int a[n][m], với n, m nhập từ bàn
phím, còn các phần tử mảng a[n][m] nhập bằng random.
a. Viết chương trình sắp xếp mảng a theo thứ tự tăng dần theo từng cột và in
ra màn hình.
b. Viết chương trình sắp xếp mảng a theo thứ tự tăng dần từng hàng và in ra
màn hình.
c. Viết chương trình sắp xếp mảng a theo thứ tự tăng dần từ ngoài vào trong
theo hình xoắn ốc (xem hình hướng)
41. 40
Bài 6.6: Xử lý chuỗi
Bài 6.7: Tạo lớp
Bài 6.8: Kế thừa
Bài 6.9: Lớp, hàm trừu tượng
Bài 6.10: Tạo interface
Bài 6.11: Bài tập tổng hợp
42. 41
PHẦN 7: Lập trình đồ họa, gói AWT
Mục tiêu:
Tạo frame chứa các thành phần giao diện phổ biến
Dùng Label, text field, và text area
Checkbox và radio buttion
Dùng các lớp Choice và List
Dùng FlowLayout và GridLayout
Menu và Popup Menu
Bài 7.1: Bài tập mẫu
7.1.1. Frame rỗng. Viết ứng dụng tạo một frame rỗng có kích thước 300x200 và
khi chạy chương trình nó sẽ hiện ra giữa màn hình.
Lưu ý: Khi khai báo một đối tượng frame, ta nên bắt đầu bằng cụm từ frm, ví dụ
frmDemo
Code:
Chú ý:
Phương thức show() hiển thị frame không có tiêu đề.
Phương thức setBounds(x, y, w, h) có 2 tham số đầu (x, y) là định vị vị trí xuất
hiện của frame trên màn hình, và 2 tham số sau (w, h) là kích cỡ chiều rộng và
chiều cao của frame.
Bạn không thể đóng frame bằng cách nhấp nút Close. Nếu dùng eclip để soạn code
thì bạn click vào buttion .
Có thể dùng hàm frmDemo.setVisible(true) để hiển thị frame.
Kết quả: Góc trên trái màn hình sẽ xuất hiện một frame tại vị trí (0,0) và kích cỡ
(400x100), xem hình dưới.
import java.awt.*;
public class MyFrame extends Frame {
public static void main(String[] args) {
MyFrame frmDemo = new MyFrame();
frmDemo.setBounds(0, 0, 400, 100);
frmDemo.show();
}
}
43. 42
7.1.2. Frame có tiêu đề và nút.Viết ứng dụng tạo một frame có tiêu đề “Frame
demo” và frame xuất hiện giữa màn hình, có chiều rộng 400, cao 200 và có 2 nút
bấm OK và Cancel.
Code:
Kết quả:
7.1.3. Frame có label, text field và text area.Viết ứng dụng tạo một frame có
chứa label:
+ label nhập “họ và tên”.
+ text field là một text box dùng để nhập họ và tên.
+ text area để chứa thông tin ghi chú.
import java.awt.*;
public class MyFrame1 extends Frame {
public static void main(String[] args) {
MyFrame1 frmDemo = new MyFrame1();
frmDemo.setTitle("Frame demo");
frmDemo.setBounds(200, 300, 400, 200);
frmDemo.setLayout(new FlowLayout());
frmDemo.add(new Button("OK"));
frmDemo.add(new Button("Cancel"));
frmDemo.setVisible(true);
44. 43
Code:
import java.awt.*;
public class MyFrame2 extends Frame{
public static void main(String[] args) {
MyFrame2 frmDemo2 = new MyFrame2();
frmDemo2.setTitle("Frame demo: label,textfield,textarea");
frmDemo2.setBounds(0, 0, 300, 200);
frmDemo2.setLayout(new FlowLayout());
frmDemo2.add(new Label("Ho va ten: "));
frmDemo2.add(new TextField("nhap ho vao ho va ten ..."));
frmDemo2.add(new TextArea("Nhap ghi chu...", 5, 30));
frmDemo2.setVisible(true);
}
}
Kết quả:
7.1.4. Frame có checkbox và radil button. Viết ứng dụng tạo một frame có chứa
các đối tượng sau:
+ 3 checkbox để chọn: thể thao, âm nhạc, du lịch
+ 2 radio button để xác định giới tính.
Code:
import java.awt.*;
public class MyFrame3 extends Frame{
public static void main(String[] args) {
MyFrame3 frmDemo3 = new MyFrame3();
frmDemo3.setTitle("Frame demo: checkbox, radio buttion");
frmDemo3.setBounds(0, 0, 250, 150);
frmDemo3.setLayout(new FlowLayout());
frmDemo3.add(new Checkbox("The thao"));
frmDemo3.add(new Checkbox("Am nhac"));
frmDemo3.add(new Checkbox("Du lich"));
45. 44
CheckboxGroup cbgGioiTinh = new CheckboxGroup();
frmDemo3.add(new Checkbox("Nam", cbgGioiTinh, false));
frmDemo3.add(new Checkbox("Nu", cbgGioiTinh, true));
frmDemo3.setVisible(true);
}
}
Kết quả:
7.1.5. Frame có choice và list. Viết ứng dụng tạo một frame có chứa thành phần
Choice và List. Chú ý thành phần Choice hỗ trợ chỉ chọn lựa duy nhất, còn thành
phần List có thể hỗ trợ nhiều chọn lựa.
Code:
import java.awt.*;
public class MyFrame4 extends Frame {
public static void main(String[] args) {
MyFrame4 frmDemo4 = new MyFrame4();
frmDemo4.setTitle("Frame demo: choice, list");
frmDemo4.setBounds(0, 0, 400, 200);
frmDemo4.setLayout(new FlowLayout());
Choice ch = new Choice();
ch.addItem("Lap trinh Mobile");
ch.addItem("Lap trinh PHP");
ch.addItem("Lap trinh JAVA");
frmDemo4.add(ch);
List list1 = new List();
list1.add("The thao");
list1.add("Am nhac");
list1.add("Game");
list1.add("Du lich");
list1.add("Ti vi");
frmDemo4.add(list1);
frmDemo4.setVisible(true);
}
}
Kết quả:
46. 45
7.1.6. Game Puzzle. Viết ứng dụng tạo một game puzzle như trên windows, xem
hình dưới:
Code:
import java.awt.*;
public class MyFrame5 extends Frame {
public static void main(String[] args) {
MyFrame5 frmDemo5 = new MyFrame5();
frmDemo5.setTitle("Game Puzzle");
frmDemo5.setBounds(300, 300, 250, 250);
frmDemo5.setLayout(new GridLayout(4, 4));
for(int i = 1; i < 16; i++){
frmDemo5.add(new Button(" "+ i +" "));
}
frmDemo5.add(new Button(""));
frmDemo5.setVisible(true);// tao o trong
}
}
Kết quả:
47. 46
7.1.7. Menu demo. Viết ứng dụng tạo một frame có chứa menu như hìnhdưới
đây:
Code:
import java.awt.*;
public class MenuDemo extends Frame{
public MenuDemo(String tieude) {
super(tieude);
setBounds(0, 0, 200, 200);
MenuBar menuBar = new MenuBar();
setMenuBar(menuBar);
Menu mnFile = new Menu("File");
mnFile.add(new MenuItem("New"));
mnFile.add(new MenuItem("Open"));
mnFile.add(new MenuItem("Save"));
mnFile.add(new MenuItem("-"));
mnFile.add(new MenuItem("Exit"));
menuBar.add(mnFile);
Menu mnEdit = new Menu("Edit");
mnEdit.add(new MenuItem("Copy"));
48. 47
mnEdit.add(new MenuItem("Cut"));
mnEdit.add(new MenuItem("Paste"));
mnEdit.add(new MenuItem("-"));
Menu mnSubOption = new Menu("Option");
mnSubOption.add(new MenuItem("First"));
mnSubOption.add(new MenuItem("Second"));
mnSubOption.add(new MenuItem("Third"));
mnEdit.add(mnSubOption);
mnEdit.add(new CheckboxMenuItem("Protected"));
menuBar.add(mnEdit);
setVisible(true);
}
public static void main(String[] args) {
MenuDemo f = new MenuDemo("Menu Demo");
}
}
7.1.8. Popup Menu. Viết ứng dụng tạo một frame có chứa thành phần Popup
Menu như hình bên dưới:
Code:
import java.awt.*;
import java.awt.event.*;
public class PopupDemo extends Frame implements MouseListener {
PopupMenu popMenu;//khai bao
PopupDemo(String tieude){
super(tieude);
setBounds(0, 0, 300, 200);
popMenu = new PopupMenu("Option");//khoi tao
popMenu.add(new MenuItem("Copy"));
popMenu.add(new MenuItem("Cut"));
popMenu.addSeparator();
popMenu.add(new MenuItem("Paste"));
add(popMenu);
addMouseListener(this);
}
public void mouseEntered(MouseEvent m){};
49. 48
public void mouseExited(MouseEvent m){};
public void mouseClicked(MouseEvent m){
popMenu.show(this, m.getX(), m.getY());
};
public void mouseReleased(MouseEvent m){};
public void mousePressed(MouseEvent m){};
public static void main(String[] args) {
PopupDemo frmDemo = new PopupDemo("Popup demo");
frmDemo.setVisible(true);
}
}
Kết quả:
Bài 7.2: Viết thêm code
7.2.1. Hãy thay đổi chương trình mẫu 7.1.3 để khi bạn gõ vào trong text field, ký
tự $ xuất hiện thay cho ký tự bạn gõ vào. Xem hình dưới:
7.2.2. Hãy thay đổi chương trình mẫu 7.1.6 để các button xuất hiện theo thứ tự
ngẫu nhiên và button rỗng xuất hiện ở góc trái trên như hình dưới đây:
50. 49
Hướng dẫn:
+ Yêu cầu: Tạo 1 mảng int A[Max] gồm các số nguyên ngẫu nhiên từ
0--> (Max-1) khác nhau. Ví dụ: int A[5] = {3,2,4,1,0};
+ Thuật toán:
Bước 1:
- n = Max
- Khởi tạo mảng A[i] = i; i : 0--> n-1
Bước 2:
- Lặp cho tới khi n > 0:
. Chọn 1 số id ngẫu nhiên (random) trong khoảng từ 0 -->
n -1
. Hoán đổi số A[id] (vừa chọn ngẫu nhiên) và A[n-1] ( tức
là số vừa chọn xong lần lượt cất vào cuối mảng )
. Giảm n = n -1
+ Code sample:
// 1. khai bao mang A[] va doi tuong s_math_random
//khai bao bien
static java.util.Random s_math_random = new java.util.Random();
int Max = 10;// kich thuoc mang A
int A[] = new int[Max];
// 2. gan gia tri ban dau cho mang A[]
for ( int i = 0; i < Max; i++ )// khoi tao mang A[]
{
A[i] = i;
}
// 3. sinh mang A[] cac so int ngau nhien tu 0 --> Max -1
int n = Max, temp = 0, id_Random = 0;
while ( n > 0 )
51. 50
{
id_Random = s_math_random.nextInt(n); // support trong
// CLDC 1.1 (*)
temp = A[n-1];
A[n-1] = A[id_Random];
A[id_Random] = temp;
n--;
}
// in mang A[]
for (int i = 0; i < Max; i++)
{
System.out.print(A[i] + ", ");
}
System.out.println();
7.2.3. Hãy thay đổi chương trình mẫu 7.1.8 để xuất hiện popup menu chỉ khi nhấp
phải.
Hướng dẫn: dùng phương thức isMetaDown() trong lớp MouseEvent.
Bài 7.3: Viết code từ đầu
7.3.1. Viết chương trình chứa các thành phần sau:
Bài 7.4: Trắc nghiệm
7.4.1. Phương thức nào được sử dụng để thiết lập màu nền của thành phần ?
a. setColor(Color c)
b. setBackground(Color c)
c. setBackgroundColor(Color c)
d. setForegroundColor(Color c)
7.4.2. Những container nào sau đây ở bậc cao nhất ? chọn tất cả các câu đúng.
52. 51
a. Panel
b. SrollPane
c. Window
d. Frame
7.4.3. Thành phần nào sau đây có cùng chức năng với Radio button
(CheckboxGroup) ?
a. List
b. Choice
c. Checkbox
d. Button
7.4.4. Hàm nào sau đây tạo ra TextArea ? ( chọn tất cả các câu đúng )
a. TextArea()
b. TextArea(int rows, int cols)
c. TextArea(int rows, int cois, String text)
d. TextArea(String text, int rows, int cols)
e. TextArea(String text)
Bài 7.5: Thủ thuật
53. 52
PHẦN 8: Luồng I/O (I/O Stream)
Mục tiêu:
Đề cập đến các khái niệm về luồng
Mô tả các lớp InputStream và OutputStream
Mô tả I/O mảng Byte
Thực hiện các tác vụ đệm I/O và lọc
Dùng lớp RandomAccesFile.
Mô tả các tác vụ chuỗi I/O và ký tự
Dùng lớp PrinterWriter
Bài 8.1: Bài tập mẫu
8.1.1. Lớp File. Viết chương trình hiển thị tất cả các file *.java của thư mục nào
đó.
Chú ý: Dùng dấu xuyệt trái “/” trong đường dẫn đến file, không dùng dấu xuyệt
phải “”.
Code:
Chú ý:
Phương thức show() hiển thị frame không có tiêu đề.
8.1.2. Đọc file và in nội dung file lên màn hình. Viết chương trình đọc một tệp
tin văn bản (*.txt) và in nội dung tệp tin đó lên màn hình.
Code:
import java.io.*;
public class readFileInDir {
public static void main(String[] args) {
File f = new File("D:/Baitapjava/");// thu muc hien hanh
String strFile[] = f.list();
for(int i = 0; i < strFileName.length; i++){
if(strFile[i].endsWith(".java")){
System.out.println(i +" : " + strFile[i]);
}
}
}
}
import java.io.*;
public class DocFile {
public static void main(String[] args) throws IOException {
InputStream in = new FileInputStream("E:/matran.txt");
int size = in.available();
for(int i = 0; i < size; i ++){
System.out.print((char)in.read());
}
}
}
54. 53
Kết quả: Nội dung file matran.txt
8.1.3. Đọc tệp tin văn bản theo từng dòng. Viết chương trình đọc từng dòng tệp
tin văn bản. Mỗi dòng của văn bản được hiển thị thành một dòng trên màn hình.
Code:
import java.io.*;
public class readFileToLine {
public static void main(String[] args) throws Exception {
FileReader f = new FileReader("E:/matran.txt");
BufferedReader br = new BufferedReader(f);
String s = "";
while( (s = br.readLine()) != null){
System.out.println(s);
}
}
}
Kết quả:
8.1.4. Đọc tệp tin và lấy nội dung. Viết chương trình đọc nội dung tệp tin
matran.txt và đưa vào mảng số nguyên 2 chiều int A[n][m], n dòng và m cột. Cho
biết tệp tin matran.txt có dòng dạng như sau:
55. 54
Trong đó,
- Dòng thứ 1 chứa 1 số là số dòng ma trận (n)
- Dòng thứ 2 chứa 1 số là số cột ma trận (m)
- n dòng tiếp theo, mỗi dòng ghi m số kiểu nguyên, mỗi số cách nhau một khoảng
trắng.
Code:
import java.io.*;
public class docmatran {
static int n, m;
static int A[][];
public static void main(String[] args) throws Exception {
FileReader f = new FileReader("D:/matran.txt");
BufferedReader br = new BufferedReader(f);
String str = "";
str = br.readLine().trim();
n = Integer.parseInt(str);
str = br.readLine().trim();
m = Integer.parseInt(str);
A = new int[n][m];
for(int i = 0; i < n; i++){
str = br.readLine().trim();
String B[] = str.split(" ");
for(int j = 0; j < m; j++){
A[i][j] = Integer.parseInt(B[j].trim());
}
}
//Xuat ma tran ra man hinh
for(int i = 0; i < n; i++){
for(int j = 0; j < m; j++){
System.out.print(A[i][j] + " ");
}
System.out.println();
}
}
}
56. 55
Bài 8.2: Viết thêm code
8.2.1. Hãy thay đổi chương trình mẫu 8.1.4 , đọc một file matran.txt và sắp xếp
mảng đó tăng theo từng dòng và ghi vào xuống file matran_output.txt.
Ví dụ: Tệp tin matran.txt ban đầu
Kết quả: Sau khi sắp xếp ma trận trong tệp tin matran_output.txt
Bài 8.3: Viết code từ đầu
8.3.1. Viết chương trình đọc một file văn bản in ra một bảng thống kê mỗi từ xuất
hiện bao nhiêu làn trong file đó.
Ví dụ: Tệp tin chứa nội dung sau:
“Than em vua trang lai vua tron
Bay noi ba chim voi nuoc non
Ran nat mac dau tay ke nan
Ma em van giu tam long son”
57. 56
Kết quả: In ra bảng thống kê sau:
Từ Số lần xuất hiện
Than 1
em 2
vua 2
… …
Bài 8.4: Trắc nghiệm
8.4.1. Câu nào sau đây là phương thức khởi tạo hợp lệ của lớp FileInputStream ?
a. FileInputStream (File f)
b. FileInputStream (String s)
c. FileInputStream (FileDescriptor fd)
d. FileInputStream (RandomAccessFile r)
8.4.2. Câu nào sau đây là phương thức khởi tạo hợp lệ của lớp
BufferedInputStream ?
a. BufferedInputStream (FileInputStream in, int size)
b. BufferedInputStream (FileInputStream in)
c. BufferedInputStream (FileOutputStream fos)
d. BufferedInputStream (RandomAccessFile ram)
8.4.3. Phương thức nào sau đây thuộc lớp InputStreamReader ?
a. read ()
b. write()
c. getBuffer()
d. getString()
Bài 8.5: Thủ thuật