CÁC KỸ THUẬT CƠ BẢN TRONG JAVA
Các thành phần cơ bản trong ngôn ngữ Java
Cũng giống nhƣ ngôn ngữ C/C++, các toán tử của Java để viết biểu thức tính toán trong chương trình được giới thiệu ở bảng sau:
Các toán tử trong lập trình bao gồm toán tử gán "=" và các toán tử tăng, giảm "++", " " Ngoài ra, còn có các toán tử đa năng như "+", "-", "~", "!", và các toán tử ép kiểu Các toán tử nhân, chia và chia dư được biểu thị bằng "*", "/", "%" Đối với các phép toán cộng, trừ và kết nối, ta sử dụng "+", "-", và "+" Các toán tử dịch bít được ký hiệu là "", và ">>>" Để so sánh, ta có các toán tử như "=", "==", "!=" và "instanceof" Các tác động bít được thực hiện bằng "&", "|", và "^" Các kết nối logic sử dụng "&&" và "||" Cuối cùng, toán tử điều kiện được biểu thị bằng "? :" và các toán tử gán kết hợp như "+=", "-=", "*=", "%=" cũng rất quan trọng.
Trong các ngôn ngữ lập trình, các toán tử tương tự như ++ và có thể được sử dụng dưới dạng tiền tố hoặc hậu tố, ảnh hưởng đến mức ưu tiên của phép toán Chẳng hạn, khi thực hiện phép gán x = 5; y = x++; thì giá trị của x sẽ được gán cho y trước, sau đó x sẽ được tăng lên 1 Ngược lại, với y = ++x; thì x sẽ được tăng lên trước và sau đó giá trị mới của x sẽ được gán cho y.
Phép toán ép kiểu cho phép chuyển đổi dữ liệu giữa các kiểu khác nhau, nhưng có nguy cơ mất dữ liệu nếu kiểu đích có miền giá trị nhỏ hơn Ví dụ, khi ép kiểu từ biến int x sang short y, kết quả có thể dẫn đến mất mát dữ liệu, như trong trường hợp y nhận giá trị không chính xác.
Thông thường việc ép kiểu được dùng trong các tham chiếu, trình bày ở phần sau
Phép toán chia (/) giữa hai số nguyên sẽ cho kết quả là phần nguyên, trong khi nếu một trong hai số là số thực, kết quả sẽ là giá trị chính xác của phép chia Phép chia dư (%) chỉ áp dụng cho các số nguyên.
9.0/2 hoặc 9/2.0 sẽ cho kết quả 4.5
Toán tử dịch bít là các phép toán quan trọng trong lập trình, bao gồm dịch bít sang trái (), và sang phải không dấu (>>>), tác động trực tiếp lên từng bít của dữ liệu Ví dụ, với biến short x = -45, biểu diễn nhị phân của nó sẽ không sử dụng số bù 2.
Khi thực hiện phép dịch trái (2; khi đó y=-11 và giá trị nhị phân là
Khi thực hiện phép dịch phải không dấu (>>>) trong lập trình, các bít dấu cũng được dịch theo các bít giá trị, dẫn đến việc đôi khi kết quả có thể không có ý nghĩa Ví dụ, khi thực hiện phép toán `int y = x>>>2;`, giá trị của y có thể là 73741812.
Toán tử so sánh chỉ áp dụng cho những loại dữ liệu như số, ký tự và tham chiếu Đặc biệt, đối với tham chiếu, chỉ có thể thực hiện phép so sánh bằng (==) và so sánh khác (!=).
Toán tử “instanceof” trong Java là một công cụ đặc biệt, chỉ hoạt động trên các tham chiếu và dùng để xác định xem một đối tượng có thuộc về một lớp cụ thể nào không Nội dung chi tiết về toán tử này sẽ được trình bày ở phần sau.
- Toán tử kết nối bít (&, |, ^) sẽ tác động lên từng bít của dữ liệu để cho kết quả, cụ thể nhƣ sau:
- Toán tử lôgíc (&&, ||) để kết nối các biểu thức lôgíc, thường được dùng trong các điều kiện của lệnh rẽ nhánh, lệnh lặp
- Phép toán ba ngôi (?:) sẽ tác động lên ba dữ liệu, cú pháp nhƣ sau:
(điều kiện) ? biểu thức 1 : biểu thức 2
Máy sẽ cho kết quả khi đúng, ngược lại sẽ cho kết quả Chẳng hạn, với câu lệnh x = (a>b)? a-b : b-a; máy sẽ trả về hiệu số giữa số lớn và số bé trong hai số a và b.
Phép toán nối (+) cho phép kết hợp hai xâu ký tự, nối xâu ký tự với một ký tự, cũng như nối xâu ký tự với số nguyên và số thực.
“Ha” + “noi”, hoặc “Hano” + „i‟ cho kết quả là “Hanoi”,
45 + “ABC” cho kết quả là “45ABC”,
“ABC” + 45 cho kết quả là “ABC45”
Trong Java, dữ liệu ký tự có thể được xử lý như số nguyên theo mã ký tự, do đó phép nối giữa số và ký tự sẽ thực hiện như phép cộng.
45 + „A‟ cho kết quả là 110, vì mã của ký tự „A‟ là 65
Biểu thức là sự kết hợp của các phép toán tác động lên dữ liệu để thực hiện tính toán và xử lý Trong biểu thức, có thể sử dụng dấu ngoặc để ưu tiên thực hiện phép toán cao nhất; nếu không, máy sẽ tuân theo thứ tự ưu tiên mặc định là nhân chia trước, cộng trừ sau Ví dụ, với biểu thức $x = 7 + 8 * 2$, kết quả sẽ là $x = 23$, trong khi đó, với $y = (7 + 8) * 2$, kết quả sẽ là $y = 30$.
Câu lệnh là sự kết hợp của các từ khóa và biểu thức, nhằm yêu cầu máy thực hiện một thao tác tính toán hoặc xử lý Mỗi câu lệnh phải kết thúc bằng dấu chấm phẩy (;), và có thể có nhiều câu lệnh trên một dòng, cũng như một câu lệnh có thể được viết trên nhiều dòng.
Khối lệnh là nhóm lệnh được bao quanh bởi cặp dấu { và } Khi cần thực hiện nhiều lệnh trong một hành động xử lý, việc sử dụng khối lệnh là cần thiết Lưu ý rằng, sau khi kết thúc khối lệnh với dấu }, không cần thêm dấu chấm phẩy (;).
Các cấu trúc điều khiển trong lập trình
Trong tất cả các ngôn ngữ lập trình, máy tính đều có cấu trúc thực hiện lệnh tuần tự, cùng với hai cấu trúc điều khiển cơ bản là rẽ nhánh và lặp Trong Java, quy tắc thực hiện các cấu trúc này được quy định cụ thể.
2.2.1 Lệnh rẽ nhánh (if, switch)
Lệnh rẽ nhánh cho phép điều khiển máy thực hiện một hoặc một vài trong các trường hợp đã đưa ra Có hai loại lệnh rẽ nhánh phổ biến là lệnh if và lệnh switch Cú pháp của lệnh if được viết như sau: `if ( điều-kiện ) nhóm-lệnh-1; else nhóm-lệnh-2;` Trong khi đó, cú pháp của lệnh switch là: `switch ( biểu-thức ) { case giá-trị-1: nhóm-lệnh-1; break; case giá-trị-2: nhóm-lệnh-2; break; }`.
… case giá-trị-n: nhóm-lệnh-n; break; default: nhóm-lệnh-n+1;
Lệnh if thực hiện khi đúng, và có thể không cần lệnh else để thực hiện Nếu không có else, máy sẽ bỏ qua khi sai.
Lệnh switch so sánh giá trị của với các đến Nếu giá trị bằng (với k=1,…,n), lệnh switch sẽ thực hiện tương ứng cho đến khi gặp lệnh break.
Ví dụ hiện số lớn trong hai số a và b: if ( a>b )
System.out.println(“Số lớn là : ” + a); else if ( b>a )
System.out.println(“Số lớn là : ” + b); else
System.out.println(“Hai số bằng nhau”); hoặc hiện ngày trong tuần bằng tiếng anh theo số ngày tương ứng: switch ( a ){ case 1:
System.out.println(“Sunday”); break; case 2:
System.out.println(“Monday”); break; case 3:
System.out.println(“Tuesday”); break; case 4:
System.out.println(“Wednesday”); break; case 5:
System.out.println(“Thursday”); break; case 6:
System.out.println(“Friday”); break; case 7:
System.out.println(“Saturday”); break; default:
System.out.println(“Không phải là ngày trong tuần”);
Trong đó lệnh System.out.println( ) để hiện dữ liệu ra màn hình sẽ đƣợc trình bày chi tiết sau
Lệnh if có thể được lồng nhau, trong đó chứa một lệnh if khác Việc thực hiện các lệnh if lồng nhau sẽ diễn ra theo thứ tự từ ngoài vào trong.
Trong lệnh switch, nếu không có lệnh break trong một trường hợp, thì các nhóm lệnh của các trường hợp tiếp theo sẽ tự động được thực hiện cho đến khi gặp lệnh break.
Nếu trong một nhóm có nhiều lệnh thì phải đóng khối bằng cặp ký tự { và }, ví dụ: if ( a>b )
System.out.println(“Tổng hai số là : ” + x);
2.2.2 Lệnh lặp (for, while, do-while)
Lệnh lặp trong Java cho phép thực hiện nhiều lần một nhóm lệnh mà chỉ cần viết một lần trong chương trình Có ba cách để viết lệnh lặp trong Java: for, while và do-while, được trình bày chi tiết dưới đây.
Cách viết lệnh for: for ( nhóm-lệnh-1 ; điều-kiện ; nhóm-lệnh-2 )
Cách viết lệnh while: while ( điều-kiện )
Cách viết lệnh do-while: do { nhóm-lệnh-lặp;
Lệnh for bắt đầu bằng việc thực hiện , sau đó kiểm tra Nếu điều kiện đúng, máy sẽ thực hiện Sau khi hoàn thành, máy sẽ tiếp tục thực hiện và lặp lại việc kiểm tra cho đến khi điều kiện trở thành sai.
Lệnh while máy sẽ kiểm tra và thực hiện , quá trình lặp lại cho đến khi có giá trị sai
Lệnh do-while thực hiện nhóm lệnh lặp trước, sau đó kiểm tra điều kiện Nếu điều kiện đúng, lệnh sẽ lặp lại nhóm lệnh cho đến khi điều kiện sai.
Ví dụ hiện các số nguyên lẻ từ 50 đến 100 bằng lệnh for, for ( iP; i a, và c + a > b) Để tính diện tích tam giác khi biết ba cạnh, bạn có thể sử dụng công thức Hê-rông.
Lập trình nhập ba số nguyên a, b, n Tính a lũy thừa b chia cho n lấy phần dƣ (đồng dƣ của biểu thức a b mod n )
Để thực hiện phép tính kết hợp, trước tiên chúng ta cần tính $a$ chia $n$ lấy dư Kết quả thu được sẽ được nhân với $a$ và sau đó tiếp tục chia $n$ lấy dư Quá trình này được lặp lại đủ $b$ lần.
- Đặt kết quả tính kq bằng 1
- Lặp từ 1 đến b, thực hiện
Nhập một xâu ký tự và tách các từ trong xâu In ra các từ theo thứ tự từ 0, 1, 2 đến hết Nếu từ nào là một chữ số từ 0 đến 9, chuyển nó thành chữ số và in ra các chữ số đó.
Để tách một xâu ký tự thành các từ, ta có thể sử dụng lệnh “split” của kiểu “String”, với điều kiện giữa hai từ chỉ có duy nhất 1 dấu cách Ngoài ra, có thể tự viết chương trình để tách các từ mà không yêu cầu giữa hai từ phải có 1 dấu cách, tương tự như phương pháp tách các số nguyên trong bài tập trước.
Sau khi tách, chúng ta có mảng các từ Tiến hành in ra các từ này và kiểm tra xem có từ nào trùng với các từ là chữ số (các từ chữ số được lưu trong một mảng) Định nghĩa các từ là chữ số trong một mảng như sau.
String[] tcs = {“khong”, “mot”, “hai”, “ba”, “bon”, “nam”, “sau”, “bay”, “tam”,
Nhập cặp số nguyên a và b, kiểm tra xem hai số a và b có nguyên tố cùng nhau hay không (ƣớc số chung lớn nhất của chúng bằng 1)
Để xác định hai số có phải là nguyên tố cùng nhau hay không, chúng ta cần tìm ước số chung lớn nhất (ƯCLN) của chúng Nếu ƯCLN bằng 1, hai số này là nguyên tố cùng nhau; nếu không, chúng không phải là nguyên tố cùng nhau.
Nhập vào một số thực x và xây dựng chuỗi đọc cho số tiền này, bao gồm cả dấu âm và phần thập phân, với từ “đồng” ở cuối Ví dụ, nếu x = -1030.05, chuỗi đọc sẽ là “Âm một nghìn không trăm ba mươi phẩy không năm đồng”.
Hướng dẫn: Xem hướng dẫn và bài làm ở bài tập trước
Ch C h ƣơ ƣ ơn n g g 3 3: : L LẬ ẬP P T TR RÌ Ì NH N H L LỚ ỚP P V V À À Đ ĐỐ ỐI I T TƢ ƢỢ ỢN NG G
3.1 Phân tích các đối tượng và thiết kế lớp
Lớp có thể được coi như một khuôn mẫu cho đối tượng, bao gồm dữ liệu thuộc tính và các phương thức tác động lên dữ liệu đó Những đối tượng được tạo ra từ các lớp được gọi là thể hiện của lớp.