[Pascal – TUT] 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 BEGIN và END;
2. Câu lệnh lựa chọn
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
a. Dạng 1:
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:
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.
Lưu ý: 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 writeln('i =',i); i:=i+1; until i>10;
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.
Bài viết gốc : vietsource.net
Bài viết rất hay… Nhất là câu trúc for.. to … do phân tích rất tỉ mỉ. cần chia sẽ một số thuật toán hay nữa. Thank
cho e hỏi, e mới học viết chương trình. khi em làm viết chương trình giải pt bậc nhất 1 ẩn thì khai báo biến, em không khai báo biến x mà chỉ khai báo biến a,b hay khi em khai báo cả x thì chương trình vẫn chạy. ( khi e ko khai báo x thì em không gán x mà viết kq vào ngay phần write). nếu chương trình vẫn chạy như thế, e ko khai báo x thì có sao ko ạ.
Không sao em nhé. Biến x chỉ là để lưu lại kết quả, em in ra luôn kết quả thì không cần lưu lại nữa.
chạy được và ra kết quả là được rồi em, em có thể viết đáp án trực tiếp kiểu -b/a hoặc gán x=-b/a rồi viết x ra cũng được
thầy cho e hỏi nếu như lm bài tổng các số chia hết cho 3 thì có cần dùng lệnh for ko thầy
Mình không biết đề bài nên không rõ.
cho mik hỏi lệnh label (nếu có vd dùng lệnh thì càng tốt ạ)
cách dùng lệnh label và 1 vài vd ạ
Nếu em muốn dùng vòng lặp repeat để làm chữ chạy và chữ cứ chạy kiểu title đầu chương trình còn các lệnh ở dưới vẫn chạy bình thường thì làm thế nào ạ? tại vì nếu muốn chữ cứ chạy thì chương trình ko chạy tiếp các câu lệnh ở dưới.
Cái này mình cũng chưa làm thử bao giờ. Bạn tử tìm với từ khóa này trên google xem: “pascal loop and thread”
Bạn tham khảo các hướng ở bài viết này nhé. Mình có hỏi giúp bạn rồi.
https://daynhauhoc.com/t/hoi-ve-da-luong-trong-pascal/81987
cho e hỏi, tại sao điều kiện lại là phép so sánh ?
Kiểu như là nếu trời mưa thì làm abc… khi đó việc trời mưa là giá trị đúng hoặc sai thì phép so sánh cũng có giá trị đúng hoặc sai. 🙂
sau While do nhất thiết phải có câu lệnh hay không. Ví dụ mình viết như thê này
i:= 0;
while i < 1 do;
Xin cảm ơn!
Được nhé nhưng như thế vòng lặp có thể bị vô hạn.
Có thể giúp em cách tính tổng các số nguyên tố từ 2 đến N được không ạ. Cách dễ hiểu một tí ạ.
Thầy gợi ý ch em về bài lập trình này với ạ . Nhập vào dãy số n , in ra dãy số chính phương theo thứ tự tăng dần
em nhập n, sau đó duyệt từ 1-> n, xét từng số i xem số nào là số chính phương thì in ra. số chính phương là số khai căn lên là 1 số nguyên.