Tải bản đầy đủ (.docx) (62 trang)

Bài tập 1- Các kỹ thuật lập trình làm việc với biến, dữ liệu và các cấu trúc lập trình

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (425.93 KB, 62 trang )

1
TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI
VIỆN CÔNG NGHỆ THÔNG TIN VÀ TRUYỀN THÔNG
BÀI TẬP NHÓM MÔN HỌC
BÀI TẬP KĨ THUẬT LẬP TRÌNH NĂM HỌC 2012

Hà Nội 2012
BÀI TẬP 1- PHÂN TÍCH BÀI TOÁN
LẬP TRÌNH
Giảng viên hướng dẫn : PGS. TS. Huỳnh Quyết Thắng
Nhóm học viên :Mai Tiến Khải
Nghiêm Xuân Đức
Lê Sơn Hải

Lớp :KSTN-CNTT K55
Bài tập 1- Các kỹ thuật lập trình làm việc với biến, dữ liệu và các cấu trúc lập trình
Mục lục
1.2) Một số vấn đề về sử dụng dữ liệu
2.1) Các vấn đề cơ bản về đặt tên biến.
2.2) Đặt tên từng kiểu dữ liệu.
2.3) Các tên viết tắt.
2.4) Những loại tên cần tránh:
Chương 3 nhũng kiểu sữ kiệu cơ bản
3.1) Tổng quan về số:
3.2) Số nguyên:
3.3) Số thực dấu phẩy động:
3.4) Xâu và kí tự:
3.5)
3.6) Biến Boolean:
3.7) Kiểu liệt kê:
3.8) Hằng:


3.9) Mảng:
4. 4.1) Kiểu dữ liệu cấu trúc:
5.
6. 4.2)Dữ liệu toàn cục:
7. 5.1) Mỗi câu lệnh phải theo một thứ tự cụ thể
A, Câu lệnh if-else
6.1) những lưu ý về code else-if
2
Mai Tiến Khải–Nghiêm Xuân Đức-Lê Sơn Hải KSTN-CNTT K55
Bài tập 1- Các kỹ thuật lập trình làm việc với biến, dữ liệu và các cấu trúc lập trình
6.2) điều kiện xử lý có cần xét hết khả năng hay không
6.3)xử lý các điều kiện rẽ nhánh dài và phức tạp
6.4) điều kiện rẽ nhiều nhánh
6.5) sắp xếp các khả năng xảy ra theo một thứ tự nhất định
B) Câu lệnh case
6.1) Ta nên sắp xếp các khả năng xảy ra theo một thứ tự nào đó
6.2) Biểu thức trong case ta thường viết sao cho ngắn gọn, nếu việc xử lý dài
ta có thể viết thành một method,
6.3) cân nhắc trường hợp nào sử dụng được case hay không hay nên dùng if-
else
6.4) sử dụng Default
7.1) chọn loại vòng lặp cho hợp lí
7.2) Vào vòng lặp
7.3) Bên trong vòng lặp
7.4) Thoát khỏi vòng lặp
7.5) vòng lặp vô hạn
7.6) Vòng lặp lồng nhau
7.7) các biến index cho vòng lặp (đặc biệt là vòng lặp for)
3
Mai Tiến Khải–Nghiêm Xuân Đức-Lê Sơn Hải KSTN-CNTT K55

Bài tập 1- Các kỹ thuật lập trình làm việc với biến, dữ liệu và các cấu trúc lập trình
Lời mở đầu
4
Mai Tiến Khải–Nghiêm Xuân Đức-Lê Sơn Hải KSTN-CNTT K55
Bài tập 1- Các kỹ thuật lập trình làm việc với biến, dữ liệu và các cấu trúc lập trình
Chương 1:Các vấn đề cơ bản trong sử dụng
biến
1.1) Khởi tạo biến
- Khai báo biến gần nơi nó được sử dụng lần đầu, tránh khai báo ngầm.
- Nên khởi tạo giá trị của biến ngay khi khai báo. (Trong trường hợp
ngôn ngữ lập trình không cho phép thì nên khởi tạo biến gần với nơi nó được sử
dụng lần đầu).
- Luôn chú ý đến các biến đếm, nên khởi tạo lại chúng mỗi lần sử dụng.
- Kiểm tra sự cần thiết của việc khởi tạo lại biến trong những đoạn mã
chạy lặp lại nhiều lần (ví dụ như vòng lặp).
Ví dụ 1: Chương trình giải phương trình bậc 2.
import java.util.Scanner;
public class QuadraticEquationSolution {
public static void main(String[] args) {
Scanner nhap = new Scanner(System.in);
System.out.println("Nhập vào giá trị cho a ");
float a = nhap.nextInt();
System.out.println("Nhập vào giá trị cho b ");
float b = nhap.nextInt();
System.out.println("Nhập vào giá trị cho c ");
float c = nhap.nextInt()
if(a == 0) {
if(b == 0) {
if(c == 0)
5

Mai Tiến Khải–Nghiêm Xuân Đức-Lê Sơn Hải KSTN-CNTT K55
Bài tập 1- Các kỹ thuật lập trình làm việc với biến, dữ liệu và các cấu trúc lập trình
System.out.println("Phương trình vô số nghiệm");
} else
System.out.println("Phương trình vô nghiệm ");
} else {
float delta = b * b – 4 * a * c;
double x1,x2;
if (delta > 0) {
x1 =- b + Math.sqrt(delta) / (2 * a);
x2 =- b - Math.sqrt(delta) / (2 * a);
System.out.println("Phương trình có 2 nghiệm phân biệt
");
System.out.println("X1 là : "+x1);
System.out.println("X2 là : "+x2);
} else {
if(delta==0) {
x1=-Math.sqrt(delta)/(2*a);
System.out.println("Phương trình có 1 nghiệm
kép: "+x1);
} else
System.out.println("Phương trình vô nghiệm");
}
}
}
}
Trong ví dụ trên, các biến a, b, c được khai báo gần nơi nó được sử dụng
đồng thời giá trị của biến được khởi tạo ngay khi khai báo.
6
Mai Tiến Khải–Nghiêm Xuân Đức-Lê Sơn Hải KSTN-CNTT K55

Bài tập 1- Các kỹ thuật lập trình làm việc với biến, dữ liệu và các cấu trúc lập trình
Ví dụ 2: Chương trình nhập vào một mảng nguyên, tìm phần từ lớn nhất, nhỏ
nhất trong mảng
import java.io.*;
public class MinMax {
public static void main (String[] args) throws Exception {
BufferedReader in = new BufferedReader(new
InputStreamReader(System.in));
System.out.print("Nhap so phan tu co trong mang n: ");
int n = Integer . parseInt(in.readLine());
int a[] = new int[n];
int i;
for (i = 0; i < n; i++) {
System.out.print("Nhap a["+i+"]: ");
a[i] = Integer . parseInt(in.readLine());
}
int min=a[0];
int max=a[0];
for(i=0;i<n;i++) {
if(a[i]<min)
min=a[i];

else
max=a[i];
}
System.out.println("So nho nhat la: "+min);
System.out.println("So lon nhat la: "+max);
}
}
7

Mai Tiến Khải–Nghiêm Xuân Đức-Lê Sơn Hải KSTN-CNTT K55
Bài tập 1- Các kỹ thuật lập trình làm việc với biến, dữ liệu và các cấu trúc lập trình
Trong ví dụ trên biến đếm i được chú ý và được khởi tạo lại mỗi lần sử
dụng (trong các vòng lặp).
1.2) Một số vấn đề về sử dụng dữ liệu
- Khởi tạo và sử dụng biến sao cho thời gian sống của chúng là ngắn
nhất.
- Cục bộ hóa tham chiếu đến biến (cố gắng để các lần tham chiếu đến
biến gần nhau nhất).
- Các biến phải có ý nghĩa rõ ràng, tránh nghĩa ẩn.
- Đảm bảo tất cả các biến khai báo đều được sử dụng.
- Các biến chỉ được sử dụng cho một và chỉ một mục đích.
Ví dụ: Chương trình kiểm tra một số nguyên nhập vào từ bàn phím là số chẵn
hay lẻ
import java.io.*;
public class OddOrEven {
public static void main (String[] args) throws Exception {
BufferedReader in = new BufferedReader(new
InputStreamReader(System.in));
System.out.print("Nhap n can xem chan hay le: ");
int soKiemTra=Integer.parseInt(in.readLine());
if (soKiemTra % 2 == 0) {
System.out.print("so :" + soKiemTra + "la so chan");
} else {
System.out.print("so : "+ soKiemTra + " la so le");
}
8
Mai Tiến Khải–Nghiêm Xuân Đức-Lê Sơn Hải KSTN-CNTT K55
Bài tập 1- Các kỹ thuật lập trình làm việc với biến, dữ liệu và các cấu trúc lập trình
}

}
Trong ví dụ trên: tất cả các biến đều được khai báo rõ ràng, có ý nghĩa,
đều được cục bộ hóa, được sử dụng (cho chỉ một mục đích) và có thời gian sống
ngắn.

9
Mai Tiến Khải–Nghiêm Xuân Đức-Lê Sơn Hải KSTN-CNTT K55
Bài tập 1- Các kỹ thuật lập trình làm việc với biến, dữ liệu và các cấu trúc lập trình
Chương 2 : Đặt tên biến
2.1) Các vấn đề cơ bản về đặt tên biến.
- Tên biến mô tả đầy đủ, đúng và chính xác đối tượng mà nó đại diện.
- Tên biến cần liên quan đến vấn đề cần giải quyết hơn là cách giải
quyết vấn đề đó.
- Tên biến có độ dài phù hợp (khoảng 8-20 ký tự).
- Các biến mang giá trị tính toán như: max, min, sum, total… nên đặt
kiểu tính toán đó ở cuối tên biến.
- Nên sử dụng Count và Index thay vì Num để tránh gây rối loạn, nhầm
lẫn.
- Sử dụng quy ước đặt tên với từng loại ngôn ngữ cụ thể. Ví dụ như
Java Convention.
Ví dụ: Chương trình kiểm tra một sô tự nhiên nhập vào từ bàn phím có phải số
nguyên tố không.
import java.util.*;
public class IsPrime {
public static void main (String[] args) throws Exception {
Scanner scan=new Scanner(System.in);
10
Mai Tiến Khải–Nghiêm Xuân Đức-Lê Sơn Hải KSTN-CNTT K55
Bài tập 1- Các kỹ thuật lập trình làm việc với biến, dữ liệu và các cấu trúc lập trình
System.out.print("Nhap so tu nhien can kiem tra:");

int soKiemTra = scan.nextInt();
if (( soKiemTra == 0) | (soKiemTra == 1))
System.out.print("so '" + soKiemTra + "' khong phai la so ng to");
if (soKiemTra == 2)
System.out.print("so 2 la so ng to");
if (( soKiemTra > 2 ) && (soKiemTra % 2 == 0))
System.out.print("so '" + soKiemTra + "'khong phai la so ngyen to ");
else {
System.out.print("so '" + soKiemTra + "'la so nguyen to ");
}
}
}
Trong chương trình trên ta thấy biến soKiemTra mô tả đầy đủ, chính xác,
rõ ràng, liên quan đến vấn đề bải toán, có độ dài hợp lý và đặt đúng quy ước
Java Convention.
2.2) Đặt tên từng kiểu dữ liệu.
- Chú ý đến tên biến chỉ số của vòng lặp. Thông thường: đặt là i, j, k.
Tuy nhiên nếu biến này được sử dụng cả ở ngoài vòng lặp thì nên đặt tên biến có
ý nghĩa cụ thể, ngoài ra chú ý cả trong trường hợp các vòng lặp lông nhau.
- Biến tạm thời nên đặt tên có ý nghĩa để tránh nhầm lẫm.
- Đặt tên biến luân lý (Boolean) mang hàm ý true hoặc false
11
Mai Tiến Khải–Nghiêm Xuân Đức-Lê Sơn Hải KSTN-CNTT K55
Bài tập 1- Các kỹ thuật lập trình làm việc với biến, dữ liệu và các cấu trúc lập trình
- Đặt tến hằng số cho đơn vị trừu tượng nó đại diện thay vì giá trị mà nó
mang.
Ví dụ :Chương trình tính tổng các số nguyên tố trong mảng nguyên một chiều
nhập từ bàn phím
import java.io.*;
public class example4 {

public static boolean isPrime(int soKiemTra) {
boolean checkPrime = true;
if (soKiemTra == 1)
checkPrime = false;
else {
for (int i = 2; i <= Math.sqrt (soKiemTra); i++) {
if (soKiemTra % i == 0) {
checkPrime = false;
break;
}
}
}
return checkPrime;
}
public static void main (String[] args) throws Exception {
BufferedReader in = new BufferedReader(new
InputStreamReader(System.in));
System.out.print("Nhap so phan tu co trong mang n: ");
int n = Integer . parseInt(in.readLine());
int a[] = new int[n];
12
Mai Tiến Khải–Nghiêm Xuân Đức-Lê Sơn Hải KSTN-CNTT K55
Bài tập 1- Các kỹ thuật lập trình làm việc với biến, dữ liệu và các cấu trúc lập trình
for (int i = 0; i < n; i++) {
System.out.print("Nhap a["+i+"]: ");
a[i] = Integer . parseInt(in.readLine());
}
int arraySum = 0;
for (int i = 0; i < n; i++) {
if (isPrime(a[i]) == true)

arraySum = sum + a[i];

}
System.out.println("Tong cac so nguyen to trong mang la:
"+arraySum);
}
}
Trong ví dụ trên, tên biến chỉ số vòng lặp i được đặt theo cách thông
thường.
Biến luân lý checkPrime dùng để kiểm tra số nguyên tố được đặt hợp lý
và mang hàm nghĩa true, false rõ ràng. Biến tổng số nguyên tố của mảng được
đặt với kiểu tính toán sum cuối: arraySum.
2.3) Các tên viết tắt.
Trong một số trường hợp cụ thể, cần thiết phải đặt những tên ngắn tắt,
khi đó cần:
13
Mai Tiến Khải–Nghiêm Xuân Đức-Lê Sơn Hải KSTN-CNTT K55
Bài tập 1- Các kỹ thuật lập trình làm việc với biến, dữ liệu và các cấu trúc lập trình
- Tránh những tên viết tắt chỉ bỏ đi một ký tự so với tên đầy đủ.
Ví dụ: tên biến arrayNumber viết tắt là arrayNumbe (nên viết là
arrayNum)
- Đặt các tên viết tắt một các phù hợp, hợp lý và có thể đọc, phát âm
được.
Ví dụ: tên biến arraySum viết tắt đặt là: rrySum không đọc được
(nên đặt là arrSum ).
- Tránh những sự kết hợp gây đọc sai, hiểu nhầm hoặc không đọc được.
Ví dụ: biến endNumber viết tắt là enum gây hiểu nhầm.
- Với một số ngôn ngữ, cần có bảng dịch với các tên viết tắt (ví dụ như
FORTRAN).
2.4) Những loại tên cần tránh:

- Những tên, viết tắt gây nhầm lẫn, đa nghĩa.
- Những tên có nghĩa giống nhhau.
Ví dụ: arrayNum và arrayNo
- Những tên chỉ khác nhau một ký tự.
Ví dụ: dataRecs và dataReps
- Những tên nghe có vẻ giống nhau.
Ví dụ: wrap, swap
- Những tên có ký tự số.
Ví dụ: a1, a2, a3
- Những tên thường hay hoặc cố ý viết sai chính tả.
Ví dụ: accumulate viết thành acumulate
14
Mai Tiến Khải–Nghiêm Xuân Đức-Lê Sơn Hải KSTN-CNTT K55
Bài tập 1- Các kỹ thuật lập trình làm việc với biến, dữ liệu và các cấu trúc lập trình
- Những tên chứa nhiều ngôn ngữ khác nhau
- Những tên đặt bừa bãi không liên quan đến giá trị nó đại diện.
- Những tên trùng với những từ dùng trong ngôn ngữ lập trình.
Ví dụ: public, math
Chương 3: Những kiểu dữ liệu cơ bản
3.1) Tổng quan về số:
+) Tránh sử dụng “magic number”:
- “Magic number” là những số như 23, 5724 xuất hiện ở giữa
chương trình mà không được giải thích. Ta nên sử dụng hằng để
thay thế cho chúng.
+) Dự đoán trước lỗi chia cho 0:
- Mỗi lần sử dụng đến phép chia, hãy nghĩ đến khả năng của số
chia là 0. Nếu có, viết code để ngăn điều này xảy ra.
+) Ép kiểu một cách tường minh:
- Ép kiểu tường minh để người đọc sẽ biết được khi nào việc
chuyển đổi dữ liệu diễn ra

+) Tránh so sánh khác kiểu:
- So sánh trên các dữ liệu khác kiểu khiến chương trình dịch cần
tự tìm xem cần chuyển đổi sang kiểu nào để so sánh, kéo theo
việc làm tròn số, gây ra sai sót. Ta lên làm việc chuyển đổi này
bằng tay để chương trình dịch biết rõ nó đang so sánh cái gì.
+) Kiểm tra cảnh báo warning của chương trình dịch:
Ví dụ:
package com.xuanduc987.example;
import java.util.*;
15
Mai Tiến Khải–Nghiêm Xuân Đức-Lê Sơn Hải KSTN-CNTT K55
Bài tập 1- Các kỹ thuật lập trình làm việc với biến, dữ liệu và các cấu trúc lập trình
public class Example1 {
/* dung hang NUMBER_OF_MONTH thay cho so 12 */
final static int NUMBER_OF_MONTH = 12;
public static void main(String[] args) {
int[] mangDiemThiDua = new int[NUMBER_OF_MONTH];
float diemTb = 0;
Scanner console = new Scanner(System.in);
for (int i = 0; i < NUMBER_OF_MONTH; ++i) {
System.out.println("Nhap vao diem thi dua cua ca to trong
thang "
+ (i + 1) + ": ");
mangDiemThiDua[i] = console.nextInt();
diemTb += (float) mangDiemThiDua[i]; /* ep kieu mot cach
tuong minh */
}
diemTb = diemTb / NUMBER_OF_MONTH;
System.out.println("Diem thi dua trung binh cua ca to la: " +
diemTb);

if (diemTb == 50.0)
System.out.println("Chuc mung doi da dat diem toi da!");
System.out.println("Nhap vao so nguoi trong to: ");
int soNguoi = console.nextInt();
/* kiem tra xem so chia co the bang 0 hay khong */
if (soNguoi != 0) {
float diemTbCaNhan = diemTb / soNguoi;
System.out.println("Diem trung binh cho moi ca nhan la: "
+ diemTbCaNhan);
} else
System.out.println("So nguoi khong the bang khong!");
}
}
3.2) Số nguyên:
+) Chú ý việc chia nguyên
16
Mai Tiến Khải–Nghiêm Xuân Đức-Lê Sơn Hải KSTN-CNTT K55
Bài tập 1- Các kỹ thuật lập trình làm việc với biến, dữ liệu và các cấu trúc lập trình
+) Chú ý kiểm tra lỗi tràn số
- Không chỉ chú ý lỗi tràn số ở kết quả cuối cùng, cần nghĩ đến
việc có thể bị tràn số ở kết quả trung gian.
Ví dụ:
package com.xuanduc987.example;
import java.util.*;
public class Example2 {
public static void main(String[] args) {
int soA = 0;
int soB = 0;
float giaTri = 0;
Scanner console = new Scanner(System.in);

System.out.print("Nhap a: ");
soA = console.nextInt();
System.out.print("Nhap b: ");
soB = console.nextInt();
giaTri = soA / soB;
System.out.println("a / b = " + giaTri);
giaTri = ((float) soA) / soB;
System.out.println("(float) a / b = " + giaTri);
int giaTri2 = 2147483640 + 50;
System.out.println("2147483640 + 50 = " + giaTri2);
}
}
/*
* ket qua voi a = 5 va b =3:
* "a / b = 1.0" do a / b la chia nguyen;
* "(float) a / b = 1.6666666" do ep kieu nen gio la chia so thuc;
* "2147483640 + 50 = -2147483606" do loi tran so
*/
7.3) Số thực dấu phẩy động:
17
Mai Tiến Khải–Nghiêm Xuân Đức-Lê Sơn Hải KSTN-CNTT K55
Bài tập 1- Các kỹ thuật lập trình làm việc với biến, dữ liệu và các cấu trúc lập trình
1. Tránh cộng trừ trên những số có sự khác biệt lớn:
- Việc này nhằm làm giảm sai số do làm tròn.
2. Dự đoán và tránh việc làm tròn tới 0:
3. Tránh so sánh giá trị 2 số thực:
Ví dụ:
package com.xuanduc987.example;
public class Example3 {
final static double SAI_SO_CHAP_NHAN_DUOC = 0.00001;

public static boolean equal(float a, float b) {
return (Math.abs(a - b) < SAI_SO_CHAP_NHAN_DUOC);
}
public static void main(String[] args) {
float giaTri = 0;
for (int i = 0; i < 100; ++i)
giaTri += 0.01;
if (giaTri == 1)
System.out.println("giaTri = 1 la dung");
else
System.out.println("giaTri = 1 la sai");
if (equal(giaTri, 1))
System.out.println("giaTri equal 1 la dung");
else
System.out.println("giaTri equal 1 la sai");
}
}
/*
* OUTPUT:
* giaTri = 1 la sai
* giaTri equal 1 la dung
18
Mai Tiến Khải–Nghiêm Xuân Đức-Lê Sơn Hải KSTN-CNTT K55
Bài tập 1- Các kỹ thuật lập trình làm việc với biến, dữ liệu và các cấu trúc lập trình
*/
Ở đây do làm tròn số nên giaTri không bằng 1. Cho nên, để so sánh, ta
dùng method equal, so sánh |giaTri – 1| với SAI_SO_CHAP_NHAN_DUOC.
7.4) Xâu và kí tự:
+) Tránh “magic character” và “magic string”:
- Giống ở kiểu dữ liệu số, nên dùng hằng để thay thế chúng.

Ví dụ minh họa cùng ở phần sau
7.5) Biến Boolean:
+)Dùng biến Boolean để chương trình dễ đọc:
+)Dùng biến Boolean để đơn giản hoá những kiểm tra phức tạp:
Ví dụ:
package com.xuanduc987.example;
import java.util.*;
public class Example4 {
public static void main(String[] args) {
Scanner console = new Scanner(System.in);
int maxIndex = 0;
System.out.println("Nhap vao so phan tu can nhap: ");
maxIndex = Integer.parseInt(console.nextLine());
int[] mangSo = new int[maxIndex];
for (int i = 0; i < maxIndex; ++i) {
System.out.print("Nhap vao phan tu thu " + (i + 1) + " :
");
mangSo[i] = Integer.parseInt(console.nextLine());
}
System.out.print("Nhap vao chi so phan tu can truy nhap: ");
int index = Integer.parseInt(console.nextLine());
boolean quaGioiHan = index >= maxIndex;
boolean chiSoAm = index < 0;
19
Mai Tiến Khải–Nghiêm Xuân Đức-Lê Sơn Hải KSTN-CNTT K55
Bài tập 1- Các kỹ thuật lập trình làm việc với biến, dữ liệu và các cấu trúc lập trình
if (quaGioiHan || chiSoAm)
System.out.println("Chi so khong hop le");
else
System.out.println("So can tim la: " + mangSo[index]);

}
}
Ở đây ta dùng 2 biến Boolean quaGioiHan và chiSoAm để chương trình
dễ đọc, dễ hiểu hơn: biểu thức
(quaGioiHan || chiSoAm) dễ hiểu hơn ((index >= maxIndex) || (index <
0))
7.6) Kiểu liệt kê:
+) Dùng kiểu liệt kê thay cho hằng để cải thiện sự dễ đọc, sự ổn định,
và dễ thay đổi:
- Dễ đọc: (chosenColor == Color.red) dễ hiểu hơn nhiều so với
(chosenColor == 1)
- Tăng sự ổn định: khi đặt chosenColor là kiểu Color, không thể
gán chosenColor = 1 hay gán chosenColor = Device.phone
- Dễ sửa đổi: Nếu không dùng kiểu liệt kê, ta phải quy ước 1 là
red, 2 là blue,… nếu phát hiện ra cách qui ước đó không hợp lí,
ta phải sửa lại hết nhứng số 1, 2,… trong chương trình.
Ví dụ:
package com.xuanduc987.example;
import java.util.Random;
enum Color {
RED, BLUE, YELLOW, BLACK, WHITE
}
public class Example5 {
public static void main(String[] args) {
Color color = Color.BLACK;
Random random = new Random();
20
Mai Tiến Khải–Nghiêm Xuân Đức-Lê Sơn Hải KSTN-CNTT K55
Bài tập 1- Các kỹ thuật lập trình làm việc với biến, dữ liệu và các cấu trúc lập trình
int i = random.nextInt(5);

switch (i) {
case 0:
color = Color.RED;
break;
case 1:
color = Color.BLUE;
break;
case 2:
color = Color.YELLOW;
break;
case 3:
color = Color.BLACK;
break;
case 4:
case 5:
color = Color.BLUE;
break;
}
System.out.println("Mau ngau nhien la mau " + color);
}
}
+)Dùng kiểu liệt kê thay cho Boolean khi 2 giá trị TRUE và FALSE
không đủ để mô tả giá trị của biến:
- Nhiều khi biến Boolean không đủ để mô tả biến. Giả sử ta có
method kiểm tra lỗi, nếu dùng Boolean thì chỉ có thể kiểm tra
được đúng sai mà không thể biết được điều gì gây ra lỗi.
Ví dụ:
package com.xuanduc987.example;
import java.util.*;
enum Error {

21
Mai Tiến Khải–Nghiêm Xuân Đức-Lê Sơn Hải KSTN-CNTT K55
Bài tập 1- Các kỹ thuật lập trình làm việc với biến, dữ liệu và các cấu trúc lập trình
FALSE, OUT_OF_RANGE, NEGATIVE_INDEX
}
public class Example6 {
final static int MAX_INDEX = 10;
public static Error isError(int index) {
if (index >= MAX_INDEX)
return Error.OUT_OF_RANGE;
if (index < 0)
return Error.NEGATIVE_INDEX;
return Error.FALSE;
}
public static void main(String[] args) {
int[] mangSo = new int[MAX_INDEX];
System.out.print(“Nhap vao chi so phan tu can nhap: “);
Scanner console = new Scanner(System.in);
int index = Integer.parseInt(console.nextLine());
switch (isError(index)) {
case FALSE:
System.out.print(“Nhap vao phan tu mangSo[“ + (index) +
“] : “);
mangSo[index] = Integer.parseInt(console.nextLine());
break;
case OUT_OF_RANGE:
System.out.println(“index vuot gioi han”);
break;
case NEGATIVE_INDEX:
System.out.println(“Chi so am”);

break;
}
}
}
Ở đây ta dùng kiểu liệt kê Error làm kiểu trả về cho hàm kiểm tra lỗi, nhờ
22
Mai Tiến Khải–Nghiêm Xuân Đức-Lê Sơn Hải KSTN-CNTT K55
Bài tập 1- Các kỹ thuật lập trình làm việc với biến, dữ liệu và các cấu trúc lập trình
vậy ta có thể dễ dàng xác định được lỗi.
7.7) Hằng:
+) Dùng hằng để khai báo dữ liệu và làm giá trị chặn vòng lặp thay
cho “magic number”:
- Giúp chương trình dễ đọc và dễ hiểu hơn
+) Dùng hằng một cách nhất quán, tránh lúc dùng hằng, lúc dùng số
trực tiếp:
Ví dụ:
package com.xuanduc987.example;
import java.util.*;
public class Example1 {
/* dung hang NUMBER_OF_MONTH thay cho so 12 */
final static int NUMBER_OF_MONTH = 12;
public static void main(String[] args) {
int[] mangDiemThiDua = new int[NUMBER_OF_MONTH];
float diemTb = 0;
Scanner console = new Scanner(System.in);
for (int i = 0; i < NUMBER_OF_MONTH; ++i) {
System.out.println("Nhap vao diem thi dua cua ca to trong
thang "
+ (i + 1) + ": ");
mangDiemThiDua[i] = console.nextInt();

diemTb += (float) mangDiemThiDua[i]; /* ep kieu mot cach
tuong minh */
}
diemTb = diemTb / NUMBER_OF_MONTH;
System.out.println("Diem thi dua trung binh cua ca to la: " +
diemTb);
if (diemTb == 50.0)
System.out.println("Chuc mung doi da dat diem toi da!");
System.out.println("Nhap vao so nguoi trong to: ");
23
Mai Tiến Khải–Nghiêm Xuân Đức-Lê Sơn Hải KSTN-CNTT K55
Bài tập 1- Các kỹ thuật lập trình làm việc với biến, dữ liệu và các cấu trúc lập trình
int soNguoi = console.nextInt();
/* kiem tra xem so chia co the bang 0 hay khong */
if (soNguoi != 0) {
float diemTbCaNhan = diemTb / soNguoi;
System.out.println("Diem trung binh cho moi ca nhan la: "
+ diemTbCaNhan);
} else
System.out.println("So nguoi khong the bang khong!");
}
}
7.8) Mảng:
+)Tất cả chỉ số phải trong giới hạn:
- Ta có thể truy cập một cách tự do các phần tử nằm trong mảng,
có chỉ số trong giới hạn nhất định. Nếu ta thử truy cập phần tử
nằm ngoài giới hạn ấy, chương trình sẽ báo lỗi.
+) Tránh lỗi “off-by-one”:
- Mảng được đánh số từ 0, nên mảng có n phần tử thì phần tử thứ
n có chỉ số n-1

+) Các chỉ số trong mảng nhiều chiều cần chú ý đúng thứ tự:
+) Trong vòng lặp lồng nhau, cần chú ý tránh nhầm lẫn chỉ số các
vòng lặp:
Ví dụ:
package com.xuanduc987.example;
import java.util.*;
public class Example7 {
public static void main(String[] args) {
Scanner console = new Scanner(System.in);
System.out.print("Nhap vao kich thuoc cua ma tran n x n: ");
int n = Integer.parseInt(console.nextLine());
24
Mai Tiến Khải–Nghiêm Xuân Đức-Lê Sơn Hải KSTN-CNTT K55
Bài tập 1- Các kỹ thuật lập trình làm việc với biến, dữ liệu và các cấu trúc lập trình
int[][] matranA = new int[n][n];
int[][] matranB = new int[n][n];
int[][] matranC = new int[n][n];
/* can tranh nham lan chi so cac vong lap */
for (int i = 0; i < n; ++i)
for (int j = 0; j < n; ++j) {
System.out.print("Nhap vao a[" + i + "][" + j + "]
= ");
/* chu y thu tu cua chi so trong mang nhieu chieu
*/
matranA[i][j] =
Integer.parseInt(console.nextLine());
}
for (int i = 0; i < n; ++i)
for (int j = 0; j < n; ++j) {
System.out.print("Nhap vao b[" + i + "][" + j + "]

= ");
matranB[i][j] =
Integer.parseInt(console.nextLine());
}
for (int i = 0; i < n; ++i)
for (int j = 0; j < n; ++j)
matranC[i][j] = matranA[i][j] + matranB[i][j];
System.out.println("Matran c = a + b la: ");
for (int i = 0; i < n; ++i)
for (int j = 0; j < n; ++j) {
System.out.printf("%5d", matranC[i][j]);
if (j == n - 1)
System.out.print('\n');
}
}
}
25
Mai Tiến Khải–Nghiêm Xuân Đức-Lê Sơn Hải KSTN-CNTT K55

×