Câu lệnh lặp biết trước só lần lặp (FOR TO DO)

Một phần của tài liệu Ngôn ngữ lập trình Pascal ĐH Hoa Lư (Trang 51)

a. Câu lệnh FOR dạng 1

Cú pháp , lưu đồ, cách thức hoạt động:

Cú pháp:

FOR biến:= m1 TO m2 DO LệnhP;

biến phải thuộc kiểu dữ liệu đơn giản đếm được, thường là kiểu nguyên, ký tự hay lôgic, không thể là kiểu thực hay chuỗi.

m1, m2 là các biểu thức có cùng kiểu dữ liệu với biến.

LệnhP có thể là một lệnh đơn giản, lệnh có cấu trúc, hoặc là một lệnh ghép gồm nhiều lệnh đặt trong khối begin và end.

sơ đồ khối của lệnh For với b là viết tắt của biến.

Cách thức hoạt động của FOR:

Bước 1: Định giá cận: nếu m1 ≤ m2 thì tiếp tục, nếu không thoả, dừng.

Bước 2: Gán giá trị biến:= m1;

Bước 3: Thực hiện LệnhP

Bước 4: Nếu biến  m2thì tăng giá trị của biến: Inc(biến); rồi rồi quay lại bước 3. Ngược lại thì chuyển sang lệnh kế tiếp ở phía dưới.

Tóm lại:LệnhP sẽ được làm đi làm lại, bắt đầu khi biến=m1, và kết thúc khi biến =m2, cả

thảy là m2-m1+1 lần. Vì thế, người ta gọi FOR là vòng lặp có số lần lặp đã biết trước.

b. Câu lệnh FOR dạng 2

Cú pháp:

FOR biến:= m1 DOWNTO m2 DO LệnhP;

Cách thức hoạt động của FOR dạng 2:

Bước 1: Định giá cận: nếu m1 ≥ m2 thì tiếp tục, nếu không thoả, dừng.

Bước 2: Gán giá trị biến:= m1;

Bước 3: Thực hiện LệnhP b:=m1 m1≤ m2 LệnhP b = m2 Lệnh kế tiếp b:=b+1 False True False True False Cấu trúc lệnh FOR dạng 1.

Bước 4: Nếu biến  m2thì giảm giá trị của biến: Dec(biến); rồi rồi quay lại bước 3. Ngược lại thì chuyển sang lệnh kế tiếp ở phía dưới.

Các ví dụ cơ bản:

Ví dụ 4: Bài toán tính tổng:

Hãy tính tổng: S= 12 + 22+ 32+...+ 102

Thuật toán:

Bước 0: gán S:=0; { gán giá trị ban đầu cho S} Bước 1: gán S:=S+1*1; { được S=12 }

Bước 2: gán S:=S+2*2; { được S=12+22} Bước 3: gán S:=S+3*3; { S=12+22+32}

Bước 10: gán S:=S+10*10; { được S=12+22+32+...+102}

Quá trình từ bước 1 đến bước 10 được gọi là phép cộng dồn vào biến S. Tại bước thứ i, lấy giá trị của biến S cộng với i2, kết quả lại được gán cho biến S, do đó giá trị của biến S được tăng thêm một lượng bằng i2. Khi i thay đổi từ 1 đến 10 thì các số 12, 22, 32, ..., 102 đều được cộng vào S, kết quả là sau bước thứ 10 giá trị của S đúng bằng tổng 12 + 22 + 32 + ... + 102.

Tóm lại, lệnh: S:=S + i*i; được làm cả thảy 10 lần, ứng với i=1, 2, ..., 10. Quá trình này được diễn đạt bằng vòng lặp FOR, như sau:

For i:=1 To 10 DO S:=S+ i*i ;

b:=m1 m1≥ m2 LệnhP b = m2 Lệnh kế tiếp b:=b-1 False True False True False Cấu trúc lệnh FOR dạng 2.

Một cách tổng quát, để tính tổng:S= 12 + 22+ 32+...+ N2 , trong đó N là một số nguyên dương bất kỳ, ta dùng hai lệnh:

S:=0;

For i:=1 To N DO S:=S+ i*i ;

Dưới đây là chương trình cụ thể:

PROGRAM VIDU4_4; { Tính tổng các bình phương các số tự nhiên <=N}

Var N, i: Integer; S: LongInt; Begin Write(‘ Nhập N:’); Readln(N); S:=0;

For i:=1 to N do S:=S+i*i ; Writeln(‘S= ‘, S);

Readln End.

Mở rộng bài toán tính tổng: Tính tổng đan dấu: S = 12 - 22 + 32 - 42 +...+(-1)N-1 N2

Ví dụ 5: Bài toán tính lũy thừa:

Nhập số tự nhiên N và một số thực x bất kỳ, tính S= xN . Đầu tiên ta gán S:=1, sau đó tại mỗi bước lặp, ta nhân dồn x vào S bằng lệnh S:=S*x. Sau N bước như vậy, S sẽ được nhân với x đúng N lần. Vậy hai lệnh cần dùng là:

S:=1; For i:=1 TO N DO S:=S*x; 4. Câu lệnh lặp WHILE..DO a. Cú pháp, lưu đồ, cách thức hoạt độngCú pháp: WHILE Ðiềukiện DO LệnhP;

Ý nghĩa: Chừng nào Ðiềukiện còn đúng thì cứ làm LệnhP, cho đến khi Ðiềukiện sai thì không làm LệnhP nữa mà chuyển sang

lệnh kế tiếp ở phía dưới.

Cách thức hoạt động của WHILE:

Bước 1: Nếu Ðiềukiện sai thì chuyển ngay sang lệnh kế tiếp sau LệnhP, ngược lại, nếu Ðiềukiện đúng thì làm LệnhP, rồi quay lại bước 1

LệnhP được gọi là thân của vòng lặp WHILE. Nếu Ðiềukiện không bao giờ sai thì LệnhP sẽ phải thực hiện mãi, lúc đó ta có vòng lặp vô hạn. Trong trường hợp này, để dừng

chương trình, hãy gõ đồng thời hai phím Ctrl và Pause (viết tắt là ^Pause).

Ðể tránh các vòng lặp vô hạn, trong thân của vòng WHILE cần có ít nhất một lệnh có tác dụng làm biến đổi các đại lượng tham gia trong Ðiềukiện để đến một lúc nào đó thì Ðiềukiện sẽ sai và do đó vòng lặp sẽ kết thúc.

b. Ví dụ

Ví dụ 6: Nhập số tự nhiên N, tính S=N!:

PROGRAM VID3_4; { Tinh S=N! bằng lệnh WHILE..}

Var N, i: Integer; S: LongInt; Begin Write(‘ Nhập N > 0: ‘ ); Readln(N); S:=1; i:=1; {7} While i<= N do begin S:=S*i; i:=i+1 {11} end;

Writeln(‘ Giai thua = ‘, S); Readln End. Đkiện P Đúng Sai Lệnh kế tiếp

Khởi đầu biến i được gán giá trị 1 (dòng {7}). Trong vòng lặp WHILE, sau mỗi lệnh S:=S*i; biến i được tăng lên 1 đơn vị bằng lệnh i:=i+1; (dòng {11}). Khi i=N+1 thì điều kiện i<=N bị sai và lúc đó vòng lặp kết thúc, kết quả là lệnh S:=S*i; được thực hiện đúng N lần ứng với i=1, 2, 3, ..., N.

Trong chương trình trên, nếu không có dòng lệnh {11}: i:=i+1;

thì i luôn luôn bằng 1 nên điều kiện i<=N luôn luôn đúng (vì N 1), và do đó vòng lặp sẽ vô hạn .

Sự khác nhau của lệnh WHILE so với FOR là ở chỗ: trong lệnh FOR, biến i được tự động gán giá trị ban đầu và sau mỗi bước lặp được tự động tăng lên, còn trong WHILE thì không, ta phải viết các lệnh đó.

Tất cả các bài toán giải quyết được bằng lệnh FOR thì đều giải quyết được bằng lệnh WHILE. Ðặc điểm chung của các bài toán dạng này là số lần lặp của các vòng lặp đã được biết trước.

Lệnh WHILE đặc biệt thích hợp với các vòng lặp có số lần lặp chưa biết trước, trong khi lệnh FOR không giải quyết được. Ðây chính là điểm mạnh của lệnh WHILE. 5. Câu lệnh lặp REPEAT ..UNTIL

a. Cú pháp, lưu đồ, cách thức hoạt động

Cú pháp

REPEAT LệnhP;

UNTIL Ðiềukiện ;

Ý nghĩa: Chừng nào Ðiềukiện còn sai thì cứ làm LệnhP, cho đến khi Ðiềukiện đúng thì không làm LệnhP nữa mà chuyển sang lệnh kế tiếp ở phía dưới.

Cách thức hoạt động của REPEAT:

Bước 1: Làm LệnhP.

Bước 2: Kiểm tra Ðiềukiện, nếu Ðiềukiện đúng thì chuyển sang lệnh tiếp theo ở phía dưới, ngược lại, nếu Ðiềukiện sai thì quay lại bước 1.

LệnhP cũng được gọi là thân của vòng lặp REPEAT, nếu nó gồm nhiều lệnh thì các lệnh đó

không cần phải đặt trong khốibegin end.

ĐKiệ n P Đúng Sai Lệnh kế tiếp

Hình 3.4. Lưu đồ thực hiện của vòng lặp

Nếu Ðiềukiện không bao giờ đúng thì LệnhP sẽ phải thực hiện mãi, lúc đó ta có vòng lặp vô hạn. Trong trường hợp này, muốn ngắt chương trình, hãy gõ đồng thời hai phím Ctrl và Break.

Ðể tránh các vòng lặp vô hạn, trong thân của lệnh REPEAT cần có ít nhất một lệnh có tác dụng làm biến đổi các đại lượng tham gia trong Ðiềukiện để đến một lúc nào đó thì Ðiềukiện sẽ đúng và do đó vòng lặp sẽ kết thúc.

Các vòng lặp có số lần lặp biết trước đều có thể giải được bằng lệnh REPEAT. Ðặc biệt, cũng như lệnh WHILE, lệnh REPEAT rất thích hợp với các vòng lặp có số lần lặp không

biết trước

b. Ví dụ về lệnh Repeat

Ví dụ 7: Ðảm bảo tính hợp lý của dữ liệu nhập từ bàn phím.

Khi giải phương trình bậc hai Ax2+Bx+C=0, ta thường giả thiết A ≠ 0; khi tính S=N!, ta thường yêu cầu N ≠ 0. Sự hạn chế phạm vi đối với các dữ liệu nhập sẽ đảm bảo tính hợp lý của chúng và làm giảm bớt các phức tạp khi biện luận.

Ðể buộc người sử dụng phải nhập A 0, nếu nhập A=0 thì bắt nhập lại cho tới khi nhập A 0 mới thôi, ta dùng cấu trúc:

Repeat

Write(‘Nhập A khác không: ‘); Readln(A);

Until A<> 0;

Ðể đảm bảo chắc chắn nhập N thỏa điều kiện 0<N<20, ta dùng cấu trúc:

Repeat

Write(‘ Nhập N (0<N<20): ‘); Readln(N);

If (N<=0) or (N>=20) then write(#7); Until (0<N) and (N<20) ;

Lệnh write(chr(7) ) hay write(#7) có công dụng phát ra tiếng kêu bip để cảnh báo người dùng đã nhập dữ liệu sai yêu cầu.

c. So sánh các lệnh For, While và Repeat:

• Lệnh For dùng cho các vòng lặp có số lần lặp đã biết trước.

• Lệnh While hay Repeat tổng quát hơn lệnh For, dùng được cho tất cả các loại vòng lặp, nhưng thường dùng cho các vòng lặp có số lần lặp chưa biết trước.

• Lệnh While và Repeat khác nhau ở điểm sau: lệnh While kiểm tra điều kiện trước, nếu đúng mới thực hiện các lệnh ghi trong thân của nó (lệnhP ), còn lệnh Repeat thực hiện lệnhP rồi mới kiểm tra điều kiện. Vì thế, lệnh Repeat sẽ thực hiện các lệnh ghi trong thân của nó ít nhất được một lần.

• Ngoài ra, lệnh While kết thúc khi điều kiện sai, lệnh Repeat kết thúc khi điều kiện đúng.

BÀI TẬP

Bài 1: Viết chương trình nhập vào N số nguyên từ bàn phím. Hãy tính và in ra màn hình tổng của các số vừa được nhập vào.

Bài 2: Tính tổng: A= n 1 .... 3 1 2 1 1+ + + + , n nhập từ bàn phím.

Bài 3:Viết chương trình nhập vào số nguyên N. In ra màn hình tất cả các ước số của N.

Bài 4: Viết chương trình tìm các số có 3 chữ số abc sao cho abc= a3 +b3 + c3.

Bài 5: Viết chương trình in ra màn hình bảng cửu chương

Bài 6: Nhập các số nguyên dương a, b, c. Tìm các nghiệm nguyên dương của phương trình: ax + by =c

Bài 7: Viết chương trình để tìm lời giải cho bài toán sau: Vừa gà vừa chó

Bó lại cho tròn

Đủ 36 con, 100 chân chẵn Hỏi có mấygà mấy chó?

Bài 8: Viết chương trình để tìm lời giải cho bài toán sau: Trăm trâu trăm cỏ

Trâu đứng ăn năm Trâu nằm ăn ba Lọm khọm trâu già Ba trâu ăn một

Hỏi có bao nhiêu trâu đứng, trâu nằm, trâu già?

Bài 9: Viết chương trình nhập một số nguyên dương n, sau đó đếm xem từ 1 đến n có bao nhiêu số chia hết cho 7, in ra màn hình tất cả các ước số của nó là số chẵn.

Bài 10: Số hoàn thiện là số tự nhiên có tổng các ước của nó (không kể chính nó) bằng chính nó. Viết phương trình kiểm tra xem một số được nhập vào từ bàn phím có phải là số hoàn thiện hay không? Ví dụ: 6, 28, là các số hoàn thiện.

Bài 11: Viết chương trình nhập vào số nguyên cho đến khi nào gặp số 0 thì kết thúc. Hãy đếm xem có bao nhiêu số chẵn vừa được nhập vào.

Bài 12: Viết chương trình tính số Pi với độ chính xác Epsilon, biết: Pi/4 = 1- 1/3 + 1/5 – 1/7 +....

Hướng dẫn: Lặp tới khi t =4/(2*i/+1)≤ Epsilon thì dừng.

Bài 13: Viết chương trình tìm USCLN và BSCNN của 2 số a, b được nhập từ bàn phím

Bài 14: Viết chương trình làm các công việc sau: Tính diện tích hình chữ nhật, diện tích tam giác, hình tròn. Dùng lệnh Repeat để lập một Menu lựa chọn công việc theo mẫu TINH DIEN TICH CAC HINH

1: Hinh chu nhat 2: Hinh tam giac 3: Hinh tron 4: Kết thúc

Lựa chọn một mục của Menu bằng cách ấn số tương ứng

Bài 15: Viết chương trình yêu cầu gõ vào từ bàn phím mật khẩu gồm 4 số 1 9 9 8 ứng với Chr (49), Chr (57), Chr(57), Chr(56), các ký tự này không hiện lên màn hình (chỉ hiện dấu *); nếu gõ sai mật khẩu chương trình yêu cầu gõ lại cho đến khi đúng

Bài 16: Bạn có số tiền ban đầu là a đem gửi ngân hàng với lãi suất 1,5% mỗi tháng. Sau mỗi tháng lãi được nhập vào vốn để tính lãi tháng sau. Bạn muốn để dành đến khi số tiền là x ( x nhập từ bàn phím x > a )mới rút ra. Vậy phải bạn phải gửi trong thời gian mấy tháng

Bài 17: Viết chương trình nhập một số từ bàn phím kiểm tra xem nó có là số nguyên tố không (số nguyên tố là số chia hết cho 1 và chính nó)

Bài 18: Viết chương trình phân tích một số ra thừa số nguyên tố. Ví dụ: N = 100 sẽ in ra màn hình: 100 2 50 2 25 5 5 5 1

Bài 5: CHƯƠNG TRÌNH CON

1. Khái niệm chương trình con

Chương trình con (subprogram) là một đoạn chương trình có chức năng giải quyết một vấn đề chuyên biệt mà chương trình chính cần phải thực hiện một số lần ứng với các giá trị khác nhau của tham số.

Chẳng hạn, nếu phải tính một loạt các giá trị e1, e2, e3, ..., e10 thì ta nên viết một chương trình con có nhiệm vụ tính ex với x la đối số bất kỳ & đặt tên là EXP(x). Mỗi khi cần tính một trong các giá trị e1, e2, ..., e10 , ta chỉ cần gọi tên chương trình con đó nhưng thay x bằng một giá trị cụ thể 1, 2, ...,10. Tương tự như thế, khi cần nhập dữ liệu cho hai ma trận A và B, thay vì phải viết hai đoạn chương trình nhập riêng cho A và cho B thì ta chỉ cần viết một chương trình con có nhiệm vụ nhập dữ liệu cho một ma trận X bất kỳ. Sau đó trong chương trình chính, để nhập dữ liệu cho A, ta gọi chương trình con đó nhưng thay X bằng A, và để nhập dữ liệu cho B, ta gọi chương trình con đó nhưng thay X bằng B. Như vậy mỗi chương trình con thay thế được cho một hay nhiều đoạn chương trình có bản chất giống nhau.

Việc sử dụng chương trình con không chỉ có tác dụng làm cho chương trình chính bớt rườm rà, bớt dài dòng mà còn đặc biệt có ý nghĩa trong việc tổ chức chương trình.

Khi phải giải quyết một bài toán lớn, người ta tìm cách chia nó ra thành nhiều bài toán nhỏ. Mỗi bài toán nhỏ được giải quyết riêng rẽ bằng một chương trình con sẽ dễ dàng hơn khi phải kiểm tra lỗi và kiểm tra thuật toán. Việc còn lại là ghép các chương trình con này để tạo thành một chương trình lớn, đó là chương trình chính. Số lệnh trong thân của chương trình chính sẽ không nhiều, chủ yếu là các lời gọi chương trình con, vì thế người thảo chương dễ có được một cái nhìn tổng quan toàn bộ chương trình trước khi xem xét từng chương trình con một cách chi tiết. Ðiều này tương tự như trong dây chuyền sản xuất công nhiệp, người ta lắp ráp các sản phẩm (như xe máy, ô tô, ti vi, ...) từ các phụ tùng và các bán sản phẩm được chế tạo sẵn từ nơi khác chuyển đến mà không cần phải tìm hiểu xem họ đã chế tạo như thế nào.

Có hai loại chương trình con là hàm và thủ tục. Sự khác nhau cơ bản của hàm và thủ tục là ở chỗ: hàm luôn luôn trả về một giá trị duy nhất thông qua tên hàm và do đó có thể sử dụng hàm như sử dụng một biểu thức, còn thủ tục thì không trả về giá trị nào qua tên thủ tục và nó được sử dụng như một lệnh đơn giản.

2. Hàm (FUNCTION)

a. Các đặc trưng của hàm

Các yếu tố đặc trưng cho một hàm gồm có:

Tên hàm

Kiểu dữ liệu của các tham số

Kiểu dữ liệu của giá trị hàm

o Hàm Sqrt(x): cho căn hai của x. Tên hàm là Sqrt, tham số x là nguyên hay thực còn giá trị hàm kiểu thực, ví dụ Sqrt(4)=2.0.

o Hàm Chr(k): cho ký tự có mã là k. Tên hàm là Chr, tham số k kiểu nguyên còn giá trị hàm kiểu ký tự, ví dụ Chr(65)=‘A’.

o Hàm Odd(k): cho True hay False tùy theo k là lẻ hay chẵn. Tên hàm là Odd, tham số k kiểu nguyên và giá trị hàm kiểu lôgic, ví dụ Odd(4)=False.

o Hàm Copy(St, k, n): cho chuỗi con gồm n ký tự của St tính từ vị trí k. Tên hàm là Copy, có ba tham số là St kiểu chuỗi, k và n kiểu nguyên, và giá trị hàm kiểu chuỗi, ví dụ Copy(‘ABCD’, 2, 3) = ‘BCD’.

o Hàm Readkey: không có tham số, giá trị hàm kiểu ký tự, hàm nhận một ký tự được gõ từ bàn phím.

Tóm lại, hàm có thể không có tham số hoặc có một đến nhiều tham số, nhưng hàm luôn trả về một giá trị duy nhất.

Một phần của tài liệu Ngôn ngữ lập trình Pascal ĐH Hoa Lư (Trang 51)