Bài 3. Câu lệnh có cấu trúc

1. Câu lệnh rẽ nhánh

a. Dạng không đầy đủ

Cú pháp:

if <dieu_kien> then <cong_viec>;

Nếu điều kiện là đúng thì thực hiện công việc (ngược lại là điều kiện sai thì không thực hiện công việc).

b. Dạng đầy đủ

Cú pháp:

if <dieu_kien> then <cong_viec_1>
else <cong_viec_2>;

Nếu điều kiện là đúng thì thực hiện công việc 1, ngược lại là điều kiện sai thì thực thi công việc 2.
Chú ý trước ELSE không có dấu ; (chấm phẩy).

* Nếu công việc thực hiện có từ 2 câu lệnh trở lên ta phải đặt chúng trong cặp từ khóa BEGINEND;


2. Câu lệnh lựa chọn (rẽ nhiều nhánh)

a. Dạng không đầy đủ

Cú pháp:

case <bieu_thuc> of
    Hang_1: <cong_viec_1>;
    Hang_2: <cong_viec_1>;
    ...
    Hang_n: <cong_viec_1>;
end;

Nếu giá trị của biểu thức rơi vào hằng nào thi công việc tương ứng sẽ được thực hiện rồi kết thúc lệnh case of.
Nếu giá trị của biểu thức không bằng một hằng nào thì sẽ kết thúc lệnh case of mà không làm gì.

b. Dạng đầy đủ
Cú pháp:

case <bieu_thuc> of
    Hang_1: <cong_viec_1>;
    Hang_2: <cong_viec_2>;
    ...
    Hang_n: <cong_viec_n>
        else <cong_viec_n+1>;
end;

Nếu giá trị của biểu thức rơi vào hằng nào thi công việc tương ứng sẽ được thực hiện rồi kết thúc lệnh case of.
Nếu giá trị của biểu thức không bằng một hằng nào thì sẽ thực hiện công việc thứ n+1 và thoát.
Lưu ý:
+ Các giá trị hang_1, hang_2,…,hang_n phải là kiểu đếm được (không phải là kiểu số thực).
+ Các giá trị hang_1, hang_2,…,hang_n có thể là kiểu liệt kê hay kiểu đoạn con.

Ví dụ:
Kiểu liệt kê:

  • 1,3,5,7
  • a,c,d

Kiểu đoạn con:

  • 1..10 (2 dấu chấm)
  • a..z

3. Câu lệnh lặp với số lần biết trước (vòng lặp FOR)

a. Dạng 1 (lặp tiến)

for <bien>:=<gia_tri_dau> to <gia_tri_cuoi> do
    <cong_viec>;

– Bước 1: Kiểm tra giá trị đầu có <= (nhỏ hơn hoặc bằng) giá trị cuối hay không. Nếu đúng thì gán giá trị đầu cho biến và thực thi công việc.
– Bước 2: Kiểm tra giá trị biến <> (khác) giá trị cuối hay không. Nếu đúng thì tăng thêm biến một đơn vị (bien:=SUCC(bien)) rồi thực hiện công việc.
– Lập lại bước 2, cho đến khi giá trị biến bằng giá trị cuối thì kết thúc câu lệnh.
Lưu ý:Biến sau từ khoá for phải là biến đếm được và giá trị đầu phải <= giá trị cuối.

b. Dạng 2 (lặp lùi)

for <bien>:=<gia_tri_dau> downto <gia_tri_cuoi> do
    <cong_viec>;

– Bước 1: Kiểm tra giá trị đầu có >= (nhỏ hơn hoặc bằng) giá trị cuối hay không. Nếu đúng thì gán giá trị đầu cho biến và thực thi công việc.
– Bước 2: Kiểm tra giá trị biến <> (khác) giá trị cuối hay không. Nếu đúng thì giảm biến xuống một đơn vị(bien:=PRED(bien)) rồi thực hiện công việc.
– Lập lại bước 2, cho đến khi giá trị biến bằng giá trị cuối thì kết thúc câu lệnh.

Lưu ý:

  • Biến sau từ khoá for phải là biến đếm được và giá trị đầu phải >= giá trị cuối.
  • Không giống với các ngôn ngữ khác, Pascal không kiểm tra (biến>cuối) trong câu lệnh FOR … TO … DO để kết thúc vòng lặp mà là kiểm tra (biến=cuối) để thực hiện lần lặp cuối cùng. Vì lẽ đó việc can thiệp vào biến đếm có thể gây ra sự cố “vòng lặp vô tận”. Ngay cả khi bien đã duyệt qua hết phạm vi của kiểu dữ liệu (tức giá trị 255) thì bien quay lai giá trị 0 … và mọi thứ lại tiếp tục …trừ khi gõ Ctrl – Break.

4. Câu lệnh lặp với số lần chưa biết trước

a. Vòng lặp WHILE

Cú pháp:

while <dieu_kien> do
    <cong_viec>;

Khi gặp vòng lặp chương trình sẽ kiểm tra điều kiện, nếu điều kiện đúng thì thực thi công việc, sau đó quay lại kiểm tra điều kiện. Cứ tiếp tục như thế cho tới khi nào điều kiện sai thì kết thúc.
{Trong khi điều kiện đúng thì làm công việc}.

b. Vòng lặp REPEAT

Cú pháp:

repeat
   <cong_viec>
until <dieu_kien>;

Khi gặp vòng lặp chương trình sẽ thực thi công việc, sau đó kiểm tra điều kiện, nếu điều kiện sai thì tiếp tục thực hiện công việc sau đó kiểm tra điều kiện. Cứ tiếp tục như thế cho tới khi nào điều kiện đúng thì kết thúc. {Làm công việc cho đến khi điều kiện đúng}.

Lưu ý:

+ Không giống với vòng lặp For cả hai vòng lặp While và Repeat đều là vòng lặp không xác định trước số lần lặp. Cần phải có câu lệnh thay đổi giá trị biến điều khiển vòng lặp để có thể thoát ra khỏi vòng lặp.
+ Trong vòng lệnh while thì điều kiện sẽ được kiểm tra trước, nếu điều kiện đúng thì thực hiện công việc. Còn trong lệnh repeat thì ngược lại, công việc được làm trước rồi mới kiểm tra điều kiện, nếu điều kiện đúng thì vòng lặp kết thúc. Như vậy đối với vòng lặp repeat bao giờ thân vòng lặp cũng được thực hiện ít nhất một lần, trong khi thân vòng lặp while có thể không được thực hiện lần nào.
+ Nếu dùng 2 lệnh này để giải cùng một bài toán, cùng một giải thuật như nhau thì điều kiện sau while và điều kiện sau until là phủ định nhau.
+ Các câu lệnh trong vòng lặp repeat không cần phải đặt trong cặp từ khóa BEGIN và END;

 

* Một số lệnh khác liên quan

a. Lệnh goto

– Cú pháp: goto nhan;
Trong đó nhan là một nhãn, tên nhãn được đặt theo quy tắc đặt tên {đã biết} hoặc là số nguyên từ 0 đến 9999
– Hoạt động: Khi gặp lệnh goto chương trình nhảy vô điều kiện đến câu lệnh sau nhãn.
– Lưu ý: Lệnh goto cho phép nhảy từ vị trí này đến vị trí khác trong cùng 1 thân hàm, thủ tục, nhảy từ trong vòng lặp ra ngoài, không cho phép nhảy từ ngoài vào trong vòng lặp, hàm, thủ tục, khối lệnh

b. Lệnh break

– Cú pháp: break;
– Hoạt động: lệnh break hoạt động khi được đặt trong thân các vòng lặp for, while, repeat. Khi gặp lệnh break; thì máy sẽ thoát khỏi chu trình của vòng lặp, nếu có nhiều vòng lặp lồng nhau sẽ thoát vòng lặp trong nhất chứa lệnh break;

c. Lệnh exit

– Cú pháp: Exit;
– Hoạt động: Lệnh exit sẽ làm chấm dứt chương trình con nếu nó được đặt trong ctc, làm chấm dứt chương trình chính nếu nó ở chương trình chính

d. Lệnh halt

– Cú pháp: halt;
– Hoạt động: Khi gặp lệnh halt thì máy sẽ dừng ngay chương trình đang chạy. Lệnh này thường dùng khi thuật toán gặp 1 TH không thể tiếp tục được.