Tìm Hiểu Kĩ Hơn Về Vòng 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 tốn thời gian 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 := 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 <Lenh_Can_Thuc_Hien> ;

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 <Lenh_Can_Thuc_Hien> ;

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 := Bien_đieu_khien – 1 ; 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 <Lenh_Can_Thuc_Hien> Until <Bieu_thuc_Boolean>;

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

Code: While <Bieu_thuc_Boolean> Do Begin <Bieu_thuc_Boolean> End ;

Trong lệnh Repeat… Until…, máy tính sẽ thực hiện cho đến khi Bieu_thuc_Boolean 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ể hiểu vòng Repeat… Until… là thực hiệc một số câu lệnh giữa Repeat Until rồi  kiểm tra Bieu_thuc_Boolean, nếu Bieu_thuc_Boolean còn giá trị False thì tiếp tục thực hiện dãy câu lệnh đó.

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 Bieu_thuc_Boolean có giá trị True thì dãy câu lệnh  giữa Begin và End tiếp tục thực hiên, đến khi nào Bieu_thuc_Boolean có giá trị False thì thoát vòng lặp. Ta thấy  vòng lặp này ngược với Repeat Until.

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ện truớc và thử điều kiện của sau. Còn trong vòng While, máy sẽ thử trước rồi thực hiện sau.

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 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ệnhGotothuộ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ầnLabelcủ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.

Chia sẻ:

  • Facebook
  • Email
  • Thêm
  • Twitter
Thích Đang tải...

Từ khóa » Sử Dụng Vòng Lặp For Trong Pascal