SlideShare a Scribd company logo
1 of 57
Download to read offline
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
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.
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.
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 {}
}
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");
}
}
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);
}
}
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));
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
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");
}
}
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();
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
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:
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
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
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);
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());
}
}
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);
}
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;
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) {
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) {
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;
}
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)));
}
}
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);
}
}
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);
}
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 độ
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();
}
}
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();
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.
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
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
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.
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
32
(mặ
c
định
)
yes yes
priv
ate
yes
//Connguoi.java
package goiA;
Class ConNguoi
- public String hoten; (1)
- protected String ngaysinh; (2)
- String diachi; //mặc định (3)
- private String gioitinh; (4)
+public String setGioiTinh(){}; (5)
+protected String setGioiTinh()
{ gioitinh = “Nam”; };
(6)
+int tinhtuoi() {};// mặc định (7)
+private String xeploaitheotuoi(){};(8)
Class NhanVien extends
ConNguoi
+ void setNhanvien() {
hoten = “Hoang” (9)
ngaysinh =
”10/12/1984” (10)
diachi = ”Quang Nam”
(11)
gioitinh = ”Nam”
(12)
}
Class QuanLy
ConNguoi obj = new
ConNguoi ()
+ void quanLy() {
obj. setGioiTinh();
(13)
obj.setGioiTinh();
(14)
obj.tinhtuoi();
(15)
obj.xeploaitheotuoi();
(16)
//Sinhvien.java
package goiB;
import goiA.*;
Class Sinhvien extends
ConNguoi
ConNguoi obj_A = new
ConNguoi ()
Sinhvien obj_B = new
Sinhvien ()
+ void setNhanvien() {
obj_A. setGioiTinh();
(17)
obj_A.setGioiTinh();
(18)
obj_A.tinhtuoi();
(19)
obj_A.xeploaitheotuoi();
(20)
obj_B. setGioiTinh();
(21)
obj_B.setGioiTinh();
(22)
obj_B.tinhtuoi();
(23)
obj_B.xeploaitheotuoi();
(24)
}
Class QuanLySV
ConNguoi obj_C = new
ConNguoi ()
+ void quanLySV() {
obj_C.hoten = “An”
(25)
obj_C.ngaysinh =
”20/10/1990”(26)
obj_C.diachi = ”Da Nang”
(27)
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
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>.
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();
}
}
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;
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
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).
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)
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
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();
}
}
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);
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"));
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ả:
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ả:
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"));
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){};
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:
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 )
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.
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
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());
}
}
}
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:
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();
}
}
}
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”
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

More Related Content

What's hot

Cs lab04 win-form assignment
Cs lab04   win-form assignmentCs lab04   win-form assignment
Cs lab04 win-form assignmentHoangbach Nguyen
 
Lập trình C# 2008 cơ bản_Nhất Nghệ
Lập trình C# 2008 cơ bản_Nhất NghệLập trình C# 2008 cơ bản_Nhất Nghệ
Lập trình C# 2008 cơ bản_Nhất NghệTrần Thiên Đại
 
Bai09 ngoai levaxulyngoaile
Bai09 ngoai levaxulyngoaileBai09 ngoai levaxulyngoaile
Bai09 ngoai levaxulyngoaileNhuận Lê Văn
 
Lập Trình Hướng Đối Tượng trong Java ( Vietnamese )
Lập Trình Hướng Đối Tượng trong Java ( Vietnamese )Lập Trình Hướng Đối Tượng trong Java ( Vietnamese )
Lập Trình Hướng Đối Tượng trong Java ( Vietnamese )Đông Lương
 
OOP in Java - Ver1.1
OOP in Java -  Ver1.1OOP in Java -  Ver1.1
OOP in Java - Ver1.1vdlinh08
 
Bai04 tao vasudungdoituong
Bai04 tao vasudungdoituongBai04 tao vasudungdoituong
Bai04 tao vasudungdoituongNhuận Lê Văn
 
Bai06 mot sokythuattrongkethua
Bai06 mot sokythuattrongkethuaBai06 mot sokythuattrongkethua
Bai06 mot sokythuattrongkethuaNhuận Lê Văn
 
[Cntt] bài giảng lập trình java bkhcm
[Cntt] bài giảng lập trình java   bkhcm[Cntt] bài giảng lập trình java   bkhcm
[Cntt] bài giảng lập trình java bkhcmHong Phuoc Nguyen
 
Giáo trình java Đại Học Sư Phạm Kỹ Thuật Hưng Yên
Giáo trình java Đại Học Sư Phạm Kỹ Thuật Hưng YênGiáo trình java Đại Học Sư Phạm Kỹ Thuật Hưng Yên
Giáo trình java Đại Học Sư Phạm Kỹ Thuật Hưng YênTrần Thiên Đại
 
Jniについて
JniについてJniについて
JniについてChu Chu
 
ThuậT ToáN
ThuậT ToáNThuậT ToáN
ThuậT ToáNquyloc
 

What's hot (20)

Hdsd eclipse
Hdsd eclipseHdsd eclipse
Hdsd eclipse
 
C# cơ bản hay
C# cơ bản hayC# cơ bản hay
C# cơ bản hay
 
Cs lab04 win-form assignment
Cs lab04   win-form assignmentCs lab04   win-form assignment
Cs lab04 win-form assignment
 
Lập trình C# 2008 cơ bản_Nhất Nghệ
Lập trình C# 2008 cơ bản_Nhất NghệLập trình C# 2008 cơ bản_Nhất Nghệ
Lập trình C# 2008 cơ bản_Nhất Nghệ
 
Bai05 ket tapvakethua
Bai05 ket tapvakethuaBai05 ket tapvakethua
Bai05 ket tapvakethua
 
Bai09 ngoai levaxulyngoaile
Bai09 ngoai levaxulyngoaileBai09 ngoai levaxulyngoaile
Bai09 ngoai levaxulyngoaile
 
Bai08 lap trinhtongquat
Bai08 lap trinhtongquatBai08 lap trinhtongquat
Bai08 lap trinhtongquat
 
Bai07 da hinh
Bai07 da hinhBai07 da hinh
Bai07 da hinh
 
Bai02 java introduction
Bai02 java introductionBai02 java introduction
Bai02 java introduction
 
Lập Trình Hướng Đối Tượng trong Java ( Vietnamese )
Lập Trình Hướng Đối Tượng trong Java ( Vietnamese )Lập Trình Hướng Đối Tượng trong Java ( Vietnamese )
Lập Trình Hướng Đối Tượng trong Java ( Vietnamese )
 
OOP in Java - Ver1.1
OOP in Java -  Ver1.1OOP in Java -  Ver1.1
OOP in Java - Ver1.1
 
Bai04 tao vasudungdoituong
Bai04 tao vasudungdoituongBai04 tao vasudungdoituong
Bai04 tao vasudungdoituong
 
Chuong8 (2)
Chuong8 (2)Chuong8 (2)
Chuong8 (2)
 
Bai06 mot sokythuattrongkethua
Bai06 mot sokythuattrongkethuaBai06 mot sokythuattrongkethua
Bai06 mot sokythuattrongkethua
 
[Cntt] bài giảng lập trình java bkhcm
[Cntt] bài giảng lập trình java   bkhcm[Cntt] bài giảng lập trình java   bkhcm
[Cntt] bài giảng lập trình java bkhcm
 
Bai01 oop overview
Bai01 oop overviewBai01 oop overview
Bai01 oop overview
 
Bai03 xay dunglop
Bai03 xay dunglopBai03 xay dunglop
Bai03 xay dunglop
 
Giáo trình java Đại Học Sư Phạm Kỹ Thuật Hưng Yên
Giáo trình java Đại Học Sư Phạm Kỹ Thuật Hưng YênGiáo trình java Đại Học Sư Phạm Kỹ Thuật Hưng Yên
Giáo trình java Đại Học Sư Phạm Kỹ Thuật Hưng Yên
 
Jniについて
JniについてJniについて
Jniについて
 
ThuậT ToáN
ThuậT ToáNThuậT ToáN
ThuậT ToáN
 

Similar to 179887496 sdc1-bai tap-javacanban-5

bt-mon-lap-trinh-huong-doi-tuong.pdf
bt-mon-lap-trinh-huong-doi-tuong.pdfbt-mon-lap-trinh-huong-doi-tuong.pdf
bt-mon-lap-trinh-huong-doi-tuong.pdfHiNht6
 
Sơ lược về Java
Sơ lược về JavaSơ lược về Java
Sơ lược về JavaĐiệp Lê
 
Core java 3
Core java 3Core java 3
Core java 3. .
 
OOP_02_Java can ban.pdf
OOP_02_Java can ban.pdfOOP_02_Java can ban.pdf
OOP_02_Java can ban.pdfssuserd01a5c
 
Bai tap lap trinh c
Bai tap lap trinh  cBai tap lap trinh  c
Bai tap lap trinh ctiểu minh
 
Bai Thuc hanh Tin học cơ sở nhom Kinh te-update.docx
Bai Thuc hanh Tin học cơ sở nhom Kinh te-update.docxBai Thuc hanh Tin học cơ sở nhom Kinh te-update.docx
Bai Thuc hanh Tin học cơ sở nhom Kinh te-update.docxCuongLe893252
 
6 - Lập trình C++ cơ bản_print.pdf
6 - Lập trình C++ cơ bản_print.pdf6 - Lập trình C++ cơ bản_print.pdf
6 - Lập trình C++ cơ bản_print.pdfSonNguyen642431
 
csience.pptx a document of technology design
csience.pptx a document of technology designcsience.pptx a document of technology design
csience.pptx a document of technology designchamson2
 
Lap trinh c_tu_co_ban_den_nang_cao
Lap trinh c_tu_co_ban_den_nang_caoLap trinh c_tu_co_ban_den_nang_cao
Lap trinh c_tu_co_ban_den_nang_caoHuy Nguyễn
 
Lap trinh c_tu_co_ban_den_nang_cao
Lap trinh c_tu_co_ban_den_nang_caoLap trinh c_tu_co_ban_den_nang_cao
Lap trinh c_tu_co_ban_den_nang_caoBác Luân
 
Lab01a get started
Lab01a get startedLab01a get started
Lab01a get startedPhuong Tran
 
Core java 5
Core java 5Core java 5
Core java 5. .
 
De kiem tra Chuyen de ngon ngu lap trinh 1 - Visual Basic.Net
De kiem tra Chuyen de ngon ngu lap trinh 1 - Visual Basic.NetDe kiem tra Chuyen de ngon ngu lap trinh 1 - Visual Basic.Net
De kiem tra Chuyen de ngon ngu lap trinh 1 - Visual Basic.Netsin216
 
[C] giao trinh c dhbk - viet nhat
[C] giao trinh c   dhbk - viet nhat[C] giao trinh c   dhbk - viet nhat
[C] giao trinh c dhbk - viet nhatHoang Nguyen
 
Lớp học lập trình android tại hà đông
Lớp học lập trình android tại hà đôngLớp học lập trình android tại hà đông
Lớp học lập trình android tại hà đôngEnter Focus
 

Similar to 179887496 sdc1-bai tap-javacanban-5 (20)

bt-mon-lap-trinh-huong-doi-tuong.pdf
bt-mon-lap-trinh-huong-doi-tuong.pdfbt-mon-lap-trinh-huong-doi-tuong.pdf
bt-mon-lap-trinh-huong-doi-tuong.pdf
 
Sơ lược về Java
Sơ lược về JavaSơ lược về Java
Sơ lược về Java
 
Core java 3
Core java 3Core java 3
Core java 3
 
OOP_02_Java can ban.pdf
OOP_02_Java can ban.pdfOOP_02_Java can ban.pdf
OOP_02_Java can ban.pdf
 
Bai tap lap trinh c
Bai tap lap trinh  cBai tap lap trinh  c
Bai tap lap trinh c
 
Bai giangvb.net
Bai giangvb.netBai giangvb.net
Bai giangvb.net
 
Bai Thuc hanh Tin học cơ sở nhom Kinh te-update.docx
Bai Thuc hanh Tin học cơ sở nhom Kinh te-update.docxBai Thuc hanh Tin học cơ sở nhom Kinh te-update.docx
Bai Thuc hanh Tin học cơ sở nhom Kinh te-update.docx
 
6 - Lập trình C++ cơ bản_print.pdf
6 - Lập trình C++ cơ bản_print.pdf6 - Lập trình C++ cơ bản_print.pdf
6 - Lập trình C++ cơ bản_print.pdf
 
csience.pptx a document of technology design
csience.pptx a document of technology designcsience.pptx a document of technology design
csience.pptx a document of technology design
 
Lap trinh c_tu_co_ban_den_nang_cao
Lap trinh c_tu_co_ban_den_nang_caoLap trinh c_tu_co_ban_den_nang_cao
Lap trinh c_tu_co_ban_den_nang_cao
 
Lap trinh c_tu_co_ban_den_nang_cao
Lap trinh c_tu_co_ban_den_nang_caoLap trinh c_tu_co_ban_den_nang_cao
Lap trinh c_tu_co_ban_den_nang_cao
 
Chuong 1@ngon ngu c
Chuong 1@ngon ngu cChuong 1@ngon ngu c
Chuong 1@ngon ngu c
 
Chuong 01
Chuong 01Chuong 01
Chuong 01
 
Chuong 01 mo dau
Chuong 01 mo dauChuong 01 mo dau
Chuong 01 mo dau
 
Lab01a get started
Lab01a get startedLab01a get started
Lab01a get started
 
Core java 5
Core java 5Core java 5
Core java 5
 
Chuong 3
Chuong 3Chuong 3
Chuong 3
 
De kiem tra Chuyen de ngon ngu lap trinh 1 - Visual Basic.Net
De kiem tra Chuyen de ngon ngu lap trinh 1 - Visual Basic.NetDe kiem tra Chuyen de ngon ngu lap trinh 1 - Visual Basic.Net
De kiem tra Chuyen de ngon ngu lap trinh 1 - Visual Basic.Net
 
[C] giao trinh c dhbk - viet nhat
[C] giao trinh c   dhbk - viet nhat[C] giao trinh c   dhbk - viet nhat
[C] giao trinh c dhbk - viet nhat
 
Lớp học lập trình android tại hà đông
Lớp học lập trình android tại hà đôngLớp học lập trình android tại hà đông
Lớp học lập trình android tại hà đông
 

179887496 sdc1-bai tap-javacanban-5

  • 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
  • 33. 32 (mặ c định ) yes yes priv ate yes //Connguoi.java package goiA; Class ConNguoi - public String hoten; (1) - protected String ngaysinh; (2) - String diachi; //mặc định (3) - private String gioitinh; (4) +public String setGioiTinh(){}; (5) +protected String setGioiTinh() { gioitinh = “Nam”; }; (6) +int tinhtuoi() {};// mặc định (7) +private String xeploaitheotuoi(){};(8) Class NhanVien extends ConNguoi + void setNhanvien() { hoten = “Hoang” (9) ngaysinh = ”10/12/1984” (10) diachi = ”Quang Nam” (11) gioitinh = ”Nam” (12) } Class QuanLy ConNguoi obj = new ConNguoi () + void quanLy() { obj. setGioiTinh(); (13) obj.setGioiTinh(); (14) obj.tinhtuoi(); (15) obj.xeploaitheotuoi(); (16) //Sinhvien.java package goiB; import goiA.*; Class Sinhvien extends ConNguoi ConNguoi obj_A = new ConNguoi () Sinhvien obj_B = new Sinhvien () + void setNhanvien() { obj_A. setGioiTinh(); (17) obj_A.setGioiTinh(); (18) obj_A.tinhtuoi(); (19) obj_A.xeploaitheotuoi(); (20) obj_B. setGioiTinh(); (21) obj_B.setGioiTinh(); (22) obj_B.tinhtuoi(); (23) obj_B.xeploaitheotuoi(); (24) } Class QuanLySV ConNguoi obj_C = new ConNguoi () + void quanLySV() { obj_C.hoten = “An” (25) obj_C.ngaysinh = ”20/10/1990”(26) obj_C.diachi = ”Da Nang” (27)
  • 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