Cấu trúc lặp trong Pascal

Xin chào các bạn, Hôm nay WIKIPASCAL sẽ hướng dẫn các bạn về Cấu trúc lặp trong Pascal  trong Pascal
Cau truc lap trong Pascal - Wiki Pascal
Cấu trúc lặp trong Pascal 

I – Vòng lặp xác định For…do


Trước hết chúng ta xét một ví dụ sau.

Ví dụ 1: giả sử ta phải viết ra trên màn hình các số từ 0 đến 24, mỗi số chiếm một dòng :


0

1

2

...

...

23

24


Việc này có thể thực hiện bằng 25 lệnh writeln như sau :



Code:
Writeln (0) ;

Writeln (1) ;

…………….

Writeln (24) ;

Cách viết này rõ ràng và tẻ nhạt trong khi nó có quy luật. Chúng ta có thể thay thế bằng cách dùng một lệnh Writeln ( I ) trong đó I là một biến nguyên bất kỳ nhận giá trị chạy từ 0 đến 24 như sau :​

Code:
For I := 0 To 24 Do Writeln ( I ) ;



Vòng lặp For này có nghĩa là cho I chạy từ 0 ( giá trị đầu ) tới 24 ( giá trị cuối ), với mỗi giá trị của I, máy sẽ thực hiện công việc viết sau chữ Do, ở đây là viết ra giá trị của I.​


Cụ thể hơn, vòng lặp For này được thực hiện từng bước như sau :

1. Đầu tiên I lấy giá trị 0 là giá trị ban đầu. I nhỏ hơn giá trị cuôí là 24 nên lệnh Writeln ( I ) được thực hiện, viết ra giá trị 0.

2. Sau đó, I nhận giá trị tiếp theo, tức là I := succ ( I ) = I + 1. Lúc này I = 1 và vẫn nhỏ hơn giá trị cuối là 24 nên lệnh writeln ( I ) được thực hiện : viết ra giá trị của I ( bằng 1 ) ra màn hình.

3. Chương trình lại quay vòng về điểm 2 cho đến khi nào I = 25, lớn hơn giá trị cuối (24) thì dừng.​


Mẫu viết tổng quát của ví dụ trên là :


Code:
For Bien_dieu_khien := Gia_tri_dau To Gia_tri_cuoi Do  ;



Nếu ta muốn viết các số từ 24 đến 0 ta lại viết như sau :


Code:
For I := 24 Downto 0 Do Writeln ( I ) ;



Với mẫu viết tổng quát như sau :


Code:
 For Bien_dieu_khien := Gia_tri_dau Downto Gia_tri_cuoi Do  ;



Trong mẫu 2, máy tính sẽ làm theo chiều ngược lại, tức là theo chiều giảm của biến điều khiển : đầu tiên biến điều khiển nhận giá trị ban đầu và sau đó thực hiện chu kì lặp như sau : chừng nào biến điều khiển còn lớn hơn hoặc bằng giá trị cuối thì thực hiện , sau mỗi lần thực hiện, biến điều khiển nhận giá trị trước nó, tức là :
Bien_đieu_khien := Pred (Bien_đieu_khien) ;


Ví dụ 2 : tính tổng các số nguyên từ 50 đến 500 ta viết như sau :

Code:
Var I : integer ;

  Sum : real ;

BEGIN

  Sum := 0 ;

  For I := 50 To 500 Do Sum := Sum + I ;

  (* hoặc For I := 500 Downto 50 Do Sum := Sum + I ; *)

  Writeln ( ' Tong = ', Sum ) ;

END.



Ví dụ 3 : viết hai dòng các chữ cái hoa và nhỏ từ 'A' đến 'Z' ra màn hình với quy cách mỗi chữ chiếm 2 chỗ

Code:
USES CRT ; { đơn vị chương trình CRT để dùng thủ tục Clrscr }

Var ch : char ;

BEGIN

  Clrscr ;

  For ch := 'A' To 'Z' Do Write (ch : 2) ;

  Writeln ;

  For ch := 'a' To 'z' Do Write (ch : 2) ;

  Writeln ;

END. 



Kết quả hiện ra màn hình :


A B C D E F G H I J K L MN O P Q R S T U V WX Y Z

A b c d e f g h I j k l m n o p q r s t u v w x y z


Ví dụ 4 : phép thử biến ngày có phải ngày làm việc hay không được viết như sau :


Code:
 Type ngay = (ChuNhat, Hai, Ba, Tu, Nam, Sau, Bay) ;

Var Ngayx, ng : ngay ;

BEGIN

  Ngayx := nam ;

  For ng := 'hai' To 'bay' Do

  If ngayx = ngay Then Writeln ( ' Ngay lam viec ' );

END.

Cần lưu ý trong sau Do, không nên thay đổi tùy tiện giá trị của biến điều khiển. Làm như vậy rất nguy hiểm vì ta sẽ không còn chủ động kiểm soát được biến điều khiển. Ví dụ không nên dùng :​

Code:
For I := 1 To 10 Do I := I + 2 ;



Ví dụ 5 các vòng For có thể lồng nhau :


Code:
For I := 1 To 5 Do

  For J := 1 To 8 Do

  Begin

  K := I + J ;

  Writeln (K) ;

  End ;



Bạn hãy tự viết kết quả hiện ra màn hình.

II – Vòng lặp không xác định While…do và Repeat…Until


Có hai kiểu thực hiện vòng lặp không xác định :

Với vòng lặp Repeat...until..


Code:
Repeat  



Until  ;

Với vòng lặp While...do...

Code:
While  Do

Begin

 ;

End ;



Trong lệnh Repeat... Until..., máy tính sẽ thực hiệncho đến khi có giá trị True theo chu kì xác định. Giữa Repeat và Until không cần dùng Begin và End. Có thể ví vòng Repeat... Until...với câu "Tiền trảm hậu tấu".

Còn trong vòng lặp While... Do...máy tính sẽ lặp đi lặp lại chu kỳ sau : chừng nào có giá trị True thì đi thực hiệnđược đặt giữa Begin và End.

Như vậy sự khác nhau giữa hai loại vòng lặp trên là ở chỗ với vòng lặp Repeat, máy tính sẽ thực hiệntruớc và thử điều kiện củasau. Còn trong vòng While, máy sẽ thửtrước rồi thực hiệnsau.

Cả hai vòng lặp đều có số lần lặp không xác định trước. Cần phải lưu ý là trong khi thực hiện lặp, ta phải có một lệnh làm thay đổi một biến nằm trong để thay đổi giá trị biểu thức nhằm dừng vòng lặp lại vì nếu không như vậy các vòng lặp sẽ chạy mãi không dừng.​


Ví dụ 1:

Tính tổng sau :

A = 1 + 1/2 + 1/3 +... + 1/N


Ví dụ này hoàn toàn có thể dùng vòng lặp For song ở đây ta áp dụng vòng lặp không xác định để làm ví dụ minh họa.


Code:
 Program Tinh_tong ;

Var I, N : Integer ;

  A : Real ;

BEGIN

  Writeln (' N = ') ; Readln ( N ) ;

    A := 0 ;

  I := 1 ;

  Repeat

  A := A + 1/ I ;

  I := I + 1 ; (* thay đổi giá trị biểu thức Boolean *)

  Until I > N ;

  Writeln (' Tong = ', a :10 : 8 ) ;

END.


Hoặc viết cách khác dưới dạng "đếm lùi" :


Code:
Var N : Integer ;

  A : Real ;

BEGIN

  Writeln (' N = ') ; Readln ( N ) ;

  A := 0 ;

  Repeat

  A := A + 1/N

  N := N - 1 ; (* thay đổi giá trị biểu thức Boolean *)

  Until N = 0 ;

  Writeln (' Tong = ', A :10 : 8 ) ;

END.



Hoặc dùng vòng lặp While:

Code:
 A := 0 ;

   I := 1 ;

   While I <= N Do

   Begin

  A := A + 1/ I ;

   I := I + 1 ; (* thay đổi giá trị biểu thức Boolean *)

   End ;


Vòng lặp While luôn luôn đi với cặp từ khoá Begin và End còn trong vòng lặp Repeat không cần sử dụng cặp Begin và End.​

Ví dụ 2:

Chúng ta thường làm các vòng lặp không xác định như sau để quay vòng theo ý muốn :

Code:
Var Traloi : Char ;

BEGIN

  Repeat

  ...............

  (* thay đổi điều kiện thủ tục *)

  Writeln (' Co tiep tuc nua khong ? ') ;

  Readln ( Traloi ) ;

  Until ( Traloi = 'K' ) or ( Traloi = 'k' ) ;


III – Lệnh nhảy vô điều kiện Goto



Lệnh Goto thuộc loại lệnh đơn giản, cho phép chương trình nhẩy vô điều kiện tới một vị trí trong chương trình thông qua tên nhãn. các nhãn là các số nguyên hoặc tên được khai báo trong phần Label của phần khai báo ở đầu chương trình, đặt cách nhau qua dấu phẩy. Trong chương trình, nhãn được đặt vào vị trí thích hợp theo sau là dấu hai chấm.​

Ví dụ1:

Code:
Program Vi_du_nhan ;

Label 1, 2 ;

Var X, Y, I : Real ;

BEGIN

  ................

  1 :  X := X + 1 ;

  ................

  If X > 5 ThenGoto2 ;

  ................

  2 : I := X + Y ;

  If I < 3 Then Goto1 ;

  ................

END.


Tuy được trang bị lệnh nhảy Goto song có thể nói Pascal rất ít khi dùng hoặc tuyệt đối không nên dùng lệnh Goto vì Goto sẽ làm mất tính "cấu trúc thuật toán " của ngôn ngữ Pascal. Goto chính là khuyết điểm của ngôn ngữ Fortran. Các lệnh While..., Repeat... Until..., If... đã đủ khả năng cho phép người lập trình tránh dùng Goto. Ngôn ngữ Fortran là loại ngôn ngữ nghèo lệnh : nó chỉ có 3 kiểu lệnh : một kiểu vòng lặp Do tương tự như vòng For của Pascal, lệnh If thì chưa có cấu trúc Else và cuối cùng là Goto.

Sự có mặt của Goto trong chương trình chúng tỏ người lập trình chưa học cách nghĩ theo Pascal như lời của giáo sư Writh, tác giả của Pascal chuẩn, đã viết .

Một điều ràng buộc của lệnh Goto là không được dùng Goto để nhảy vào chương trình con mặc dù có thể từ trong chương trình con nhảy ra ngoài.​

Code:
I := 1 ;

While I <= N Do

Begin

  A := A + 1/ I ;

  I := I + 1 ; (* thay đổi giá trị biểu thức Boolean *)

End ;


Vòng lặp While luôn luôn đi với cặp từ khoá Begin và End còn trong vòng lặp Repeat không cần sử dụng cặp Begin và End.​

Ví dụ 2:

Chúng ta thường làm các vòng lặp không xác định như sau để quay vòng theo ý muốn :

Code:
Var Traloi : Char ;

BEGIN

  Repeat

  ........

  (* thay đổi điều kiện thủ tục *)

  Writeln (' Co tiep tuc nua khong ? ') ;

  Readln ( Traloi ) ;

  Until ( Traloi = 'K' ) or ( Traloi = 'k' ) ;

Bài tập :


1. Viết chương trình nhập vào số n. Tính giá trị biểu thức E = 1/1! + 1/2! + ... + 1/n!.
2. Một người gửi tiết kiệm không kì hạn với số tiền A đồng với lãi suất 0.3% mỗi tháng. Hỏi sau bao nhiêu tháng, người đó rút hêt tiền thì sẽ nhận được số tiền ít nhất là B=1.5A đồng. Biết rằng gửi tiết kiệm không kì hạn thì lãi sẽ không được cộng vào tiền gốc.

Nhận xét

Bài đăng phổ biến từ blog này