Bài 5 : Lệnh,Toán tử và cấu trúc lặp trong lập trình Java 9

Bài 5 : Lệnh,Toán tử và cấu trúc lặp trong lập trình Java 9
access_time 2/1/2018 12:00:00 AM
person Nguyễn Mạnh Hùng

Lệnh,Toán tử và cấu trúc lặp trong Java 9

Một chương trình bao gồm một chuỗi các câu lệnh. Khi chạy chương trình, các câu lệnh sẽ được thực thi, trình tự thực thi của các câu lệnh thông thường từ trái sang phải và từ trên xuống dưới.

1. Định nghĩa Lệnh và Khối lệnh

Thông thường, lệnh là một tập hợp các biến, các hằng số, các toán tử kết hợp với các từ khóa (những cụm từ mà ngôn ngữ lập trình quy ước) để mô tả sự logic trong điều khiển và qua đó, máy tính sẽ thực thi “những logic” này đạt đến kết quả cuối cùng xem như mục tiêu điều khiển của chương trình.

Trong Java, ký hiệu dùng để mô tả cho sự kết thúc một lệnh chính là dấu “;”.

Ví dụ :

int x; // một câu lệnh

x = 10; // câu lệnh khác

int y =x; // đây cũng là một câu lệnh

Những câu lệnh này sẽ được xử lý theo thứ tự. Đầu tiên trình biên dịch bắt đầu ở vị trí đầu của danh sách các câu lệnh và lần lượt đi từng câu lệnh cho đến lệnh cuối cùng, tuy nhiên chỉ đúng cho trường hợp các câu lệnh tuần tự không phân nhánh.

Trong Java một tập hợp các câu lệnh (Nhiều hơn một lệnh) người ta gọi là một khối lệnh, khối lệnh thực thi một mục đích logic nào đó. Một khối lệnh bắt đầu bằng dấu “{” và kết thúc bằng dấu “}”;

Ví dụ : Khối lệnh tính diện tích của đường tròn.


Hình số 1 : Khối lệnh

Với 1 lệnh sử dụng trong 1 chương trình viết bởi Java, thông thường dùng để mô tả cho các hành động nhập dữ liệu, xử lý và xuất dữ liệu để đáp ứng cho 1 mục đích cụ thể nào đó của chương trình, các lệnh này có thể bao gồm:

+ Kiểu dữ liệu

+ Biến

+ Hằng số

+ Toán tử

+ Từ khóa

Đặc trưng của khối lệnh đó là phạm vi thực hiện trong khối lệnh, một biến được khai báo trong khối lệnh được gọi là biến cục bộ, có nghĩa là biến này chỉ có tác dụng trong khối lệnh đó.

Chú ý : Trong Java lập trình viên không thể khai báo tên biến trong khối lệnh trùng với tên biến nằm ngoài khối lệnh chứa khối lệnh đó.


Hình số 2 : Khai báo biến cục bộ trong khối lệnh

Tuy nhiên với các khối lệnh cùng cấp (Các khối lệnh riêng biệt cùng nằm trong khối lệnh cha) thì hoàn toàn có thể khai báo các biến trùng tên một cách thỏa mái.

2. Các dạng lệnh trong Java

Các lệnh trong ngôn ngữ Java cũng tương tự như các lệnh trong ngôn ngữ lập trình C/C++, và C#, Java phân chia lệnh thành các loại khác nhau :

2.1 Cấu trúc lựa chọn (Selection Statements) :

Là các cấu trúc lệnh rẽ nhánh như if, if …else …, switch … Các cấu trúc này thường được sử dụng trong những tình huống giả định để thể hiện tính linh hoạt, thông minh trong logic xử lý của chương trình.

Ví dụ mô tả cấu trúc if-else thông qua hình vẽ sau :


Hình số 3 : Mô tả cấu trúc lệnh if-else

Khi lập trình đối với cấu trúc if-else đối với Java được thực hiện hóa như sau :


Hình số 4 : Cài đặt cấu trúc if-else trong Java

Cấu trúc switch-case giải quyết các vấn đề gặp phải khi chúng ta lập trình với cấu trúc if.

Cú pháp của cấu trúc switch-case được mô tả như sau :

switch (<expression>) {

case value1:

      // statement sequence

      break;

case value2:

      // statement sequence

              break;

. . .

. . .

. . .

case valueN:

      // statement sequence

          break;  

default:

      // default statement sequence

}

Từ khóa switch nhằm để xác định biểu thức có kết quả tương ứng với các giá trị của case nắm giữ hay không.

Nếu không có giá trị nào thì nó sẽ tự động thực hiện các nghiệp vụ nằm trong default.


Hình số 5 : Mô tả cấu trúc switch

Ví dụ thực hiện cấu trúc switch.


Hình số 6 : Ví dụ mô tả cấu trúc switch.

2.2 Cấu trúc lặp (Interaction Statements):

Là các cấu trúc for, do.. while, while … Cấu trúc này nhằm tổ chức thực thi các câu lệnh có mục đích lặp đi lặp lại nhiều lần. sử dụng cấu trúc lặp trong chương trình làm cho việc mô tả mã lệnh (code) trở nên ngắn gọn hơn rất nhiều, cách biểu diễn của chương trình cũng nhờ đó mà trong sáng, dễ hiểu hơn.

Ví dụ mô tả cấu trúc for thông qua hình vẽ của ví dụ sau :


Hình số 7 : Ví dụ mô tả cấu trúc for.

Triển khai code của cấu trúc for bằng Java.


Hình số 8 :Code cấu trúc lặp for bằng Java.

2.3 Lệnh “nhảy” (Jump Statements) :

Các lệnh điều khiển với mục đích phá vỡ quy luật xử lý tuần tự của chương thường thấy là : break, continue, return …. Một số lệnh dạng này không được khuyến khích sử dụng trong các cấu trúc chương trình viết bằng ngôn ngữ lập trình hiện đại (ví dụ như lệnh break gắn với lable) do nó có khả năng làm phá vỡ tính logic của thuật toán, có thể dẫn đến khó kiểm soát, tuy nhiên 1 số lệnh vẫn cần phải sử dụng như lệnh return để trả về từ trong 1 hàm, 1 phương thức.

Ví dụ về cách sử dụng break trong cấu trúc lặp while


Hình số 9 : Ví dụ về break với cấu trúc lặp

Các bạn có thể tìm hiểu thêm về lệnh nhảy trên các tài liệu chính thống khác của Java. Với các bạn đã có kinh nghiệm lập trình như C/C++ hoặc C# thì các cấu trúc này là đơn giản.

3. Toán tử trong Java

Java cung cấp khá đa dạng các phép toán với mục đích giúp cho việc đơn giản hóa biểu thức sử dụng trong chương trình đồng thời tăng cường tính hiệu quả cho việc thực thi các lệnh. Dưới đây là danh sách các dạng phép toán có thể sử dụng trong 1 chương trình viết bằng Java

·           Toán tử số học (Arithmetic operators)        

·           Toán tử quan hệ (Relational operator)

·           Toán tử logic (Logical operator)

·           Toán tử điều kiện (Condition operator)

·           Các toán tử tăng, giảm (Increment and decrement operator)

·           Toán tử gán (Assignment operator)

3.1 Toán tử số học :

Ngôn ngữ Java cung cấp năm toán tử toán học, bao gồm bốn toán tử đầu các phép toán cơ bản. Toán tử cuối cùng là toán tử chia nguyên lấy phần dư. Chúng ta sẽ tìm hiểu chi tiết các phép toán này trong phần tiếp sau.

·       Các phép toán số học cơ bản (+,-,*,/) : Đây là các phép toán số học đơn giản, các phép toán này được hỗ trợ hầu hết các ngôn ngữ lập trình

·       Phép toán chia lấy dư : Để tìm phần dư của phép chia nguyên, chúng ta sử dụng toán tử chia lấy dư (%). Ví dụ, câu lệnh sau 10%3 thì kết quả trả về là 1.

3.2 Toán tử tăng giảm

Khi sử dụng các biến số ta thường có thao tác là cộng một giá trị vào biến, trừ đi một giá trị từ biến đó, hay thực hiện các tính toán thay đổi giá trị của biến sau đó gán giá trị mới vừa tính toán cho chính biến đó (Tính toán và gán trả lại).

Ví dụ :

x = x + 1;

Do việc tăng hay giảm giá trị của một biến rất thường xảy ra trong khi tính toán nên Java cung cấp các phép toán tự gán. Bảng sau liệt kê phép toán tự gán :

 


Bảng số 1 : Toán tử tăng/giảm

Ví dụ :

x += 100; // x sẽ thực hiện phép toán x = x + 100

y -= 100; // y sẽ thực hiện phép toán y = y – 100;

Do việc tăng hay giảm 1 rất phổ biến trong lập trình nên Java cung cấp hai toán tử đặc biệt là tăng một (++) hay giảm một (--).

Toán tử tăng giảm tiền tố và tăng giảm hậu tố

Giả sử muốn kết hợp các phép toán như gia tăng giá trị của một biến và gán giá trị của biến cho biến thứ hai, ta viết như sau:

x= y++;

 

Câu hỏi được đặt ra là gán giá trị trước khi cộng hay gán giá trị sau khi đã cộng. Hay nói cách khác giá trị ban đầu của biến y là 10, sau khi thực hiện ta muốn giá trị của x là 10, y là 11, hay x là 11, y cũng 11?

Để giải quyết yêu cầu trên Java cung cấp thứ tự thực hiện phép toán tăng/giảm với phép toán gán, thứ tự này được gọi là tiền tố (prefix) hay hậu tố (postfix). Do đó ta có thể viết:

x = y++; // Hậu tố

Khi lệnh này được thực hiện thì phép gán sẽ được thực hiện trước tiên, sau đó mới đến phép toán tăng.

Kết quả là x = 10 và y = 11.

Còn đối với trường hợp tiền tố:

x = ++y; Khi đó phép tăng sẽ được thực hiện trước tức là giá trị của biến y sẽ là 11 và cuối cùng phép gán được thực hiện. Kết quả cả hai biến x và y điều có giá trị là 11.


Hình số 10 : Toán tử tăng giảm tiền tố và hậu tố

3.2 Toán tử quan hệ.

Thường dùng cho phép so sánh, thể hiện sự tương quan giữa 2 giá trị. Kết quả của phép toán quan hệ thường trả về giá trị thuộc kiểu bool tương ứng với 2 trạng thái true (Đúng), false (sai).

Ví dụ : Ví dụ toán tử so sánh lớn hơn (>) trả về giá trị là true nếu giá trị bên trái của toán tử lớn hơn giá trị bên phải của toán tử. Do vậy 5 > 2 trả về một giá trị là true, trong khi

3 > 5 trả về giá trị false.


Bảng số 2 : Bảng mô tả toán tử quan hệ

3.3 Toán tử logic

Thường dùng cho mục đích phối hợp nhiều biểu thức logic với nhau để cho ra 1 giá trị logic duy nhất. Toán tử logic bao gồm && : Khi các biểu thức logic đồng thời cùng mang giá trị true thì kết quả phối hợp của chúng sẽ trả về là true. Trong trường hợp có 1 biểu thức false hoặc tất cả cùng false thì kết quả phối hợp sẽ là false.

Áp dụng toán tử logic trong các câu lệnh if, while …,do…while …


Bảng số 3 : Toán tử logic của 2 biến x,y làm minh họa.

4. Độ ưu tiên của toán tử

Trình biên dịch phải xác định thứ tự thực hiện các toán tử trong trường hợp một biểuthức có nhiều phép toán, giả sử, có biểu thức sau:

x = 10+8*3;

Biểu thức trên có ba phép toán để thực hiện bao gồm (=, +,*). Ta thử xét các phép toán theo thứ tự từ trái sang phải, đầu tiên là gán giá trị 10 cho biến x, sau đó cộng 8 vào 10 là 18 cuối cùng là nhân với 3, kết quả trả về là 54, điều này thật sự có vấn đề, không đúng với mục đích yêu cầu của chúng ta.

Do vậy việc xây dựng một trình tự xử lý các toán tử là hết sức cần thiết. Các luật về độ ưu tiên xử lý sẽ bảo trình biên dịch biết được toán tử nào được thực hiện trước trong biểu thức.Tương tự như trong phép toán đại số thì phép nhân có độ ưu tiên thực hiện trước phép toán cộng, do vậy 10+8*3 cho kết quả là 34 đúng hơn kết quả 54. Và cả hai phép

toán cộng và phép toán nhân điều có độ ưu tiên cao hơn phép gán. Như vậy trình biên dịch sẽ thực hiện các phép toán rồi sau đó thực hiện phép gán ở bước cuối cùng. Kết quả đúng của câu lệnh trên là biến x sẽ nhận giá trị là 34.

Trong ngôn ngữ Java, dấu ngoặc được sử dụng để thay đổi thứ tự xử lý, điều này cũng giống trong tính toán đại số.

Khi đó muốn kết quả 54 cho biến x có thể viết:

x = (10+8) * 3;

Biểu thức trong ngoặc sẽ được xử lý trước và sau khi có kết quả là 18 thì phép nhân được

thực hiện.

5. Boxing và Unboxing

Boxing: là quá trình tạo ra đối tượng từ lớp bao để bọc giá trị nguyên thủy hay giá trị cơ bản.

Có 3 cách để bao giá trị nguyên thủy như sau :

+ Integer a = Integer.valueof(5); Bao tường minh, chú ý Integer là một lớp nó sẽ bao giá trị 5 (giá trị có kiểu int) vào đối tượng a;

+ Integer a = new Integer(5) ; Bao tường mình thông qua phương thức khởi tạo.

+ Integer a = 5; Bao không tường minh.

Unboxing: là quá trình thực hiện ngược lại với Boxing. Có nghĩa là mở ra để lấy giá trị nguyên thủy đã được bao bởi đối tượng.

Có 2 cách mở bao để lấy giá trị nguyên thủy :

+ int b = a.intValue() ; // Mở bao tường minh thông qua phương thức của lớp

+ int b = a; // Mở bao ngầm định thông qua phương thức gán.


Bảng số 4 : Boxing và Unboxing với một số kiểu dữ liệu

vertical_align_top
share
Chat...