Được tạo bởi Blogger.
RSS

Lệnh lặp không xác định WHILE… DO…


Cách viết lệnh:
WHILE Biểu thức boolean DO Lệnh cần lặp;
     Điều khiển sự lặp lại của lệnh sau DO là giá trị của biểu thức logic sau WHILE. Trước mỗi khi thực hiện lênh cần lập biểu thức logic này được xem xét giá nếu giá trị TRUE thì lệnh sau DO thực hiện, còn có giá trị là FALSE thì lệnh sẽ không thực hiện và vòng lặp kết thúc.

Lệnh lặp không xác định WHILE… DO…

     “Biến điều khiển lặp” ở đây thường phải là một hay một số toán hạng nằm trong biểu thức Boolean và để điều khiển được vòng lặp giá trị của nó phải được thay đổi sau mỗi lần lặp. Tức là trong lệnh cần lăp sau DO phải có một lệnh làm thay đổi giá trị (gán, vào dữ liệu bằng READLN. READKRY..) của biến điều khiển nếu không sẽ không ra khỏi. Do đó lệnh lặp sau DO thường phải là một lệnh ghép. Số lần lặp ở đây chưa được xác định một cách cụ thể như trong vòng lặp FOR mà tuỳ thuộc vào “tốc độ” thay đổi giá trị của các biến điều khiển.
     Các biến điều khiển ở vòng lặp WHILE không bị khống chế về kiểu dữ liệu và có thể phối hợp nhiều điều kiện khác nhau để điểu khiển nó.
Ví dụ 1: Vẫn tính giá trị của biểu thức h(n) = i + 1/2 + 1/3 + … + 1/n nhưng dùng vòng lặp WHILE…. DO
PROGRAM Chương_trình_3;
VAR n, h : real;
BEGIN
write(‘ Cho giá trị n = ‘);readln(n); h := 0;
WHILE n >0 DO begin h := h + 1/n; n ;= n -1 ;
end;
write(‘Tổng h = / h); readln;
Một số nhận xét:
- Biến n trong chương trình 3 được dùng luôn làm biến điều khiển nên không cần sử dụng thêm biến nhưng kết thúc chương trình n sẽ có giá trị là 0 và không còn giá trị ban đầu nữa.
- Trong chương trình 3 cứ sau khi số hạng được cộng vào tổng thì n giảm đi 1 tương đương với chuyển sang số hạng trước nó, còn trong chương trình 4 thì cộng dồn từ trái sang phải và vị trí số hạng được xác định bởi biến trung gian nên giá trị của biến n vẫn còn nguyên như khi nhập vào.
- Chương trình theo kiểu này có thể tính được tổng h với cả những giá trị n lớn hơn. Đặc biệt với các dãy số có khoảng cách đều giữa các số thì việc chuyển số hạng đơn giản bằng cộng thêm (hay bớt đi) cho biến điều khiển một giá trị đúng bằng khoảng cách giữa các số. Trong ví dụ trên khoảng cách là 1 nên biến n (hoặc biến i) được bớt (hoặc thêm) 1.
    Ví dụ 2:Tìm ước số chung lớn nhất của 2 số nguyên.
    Thuật giải: Cách truyền thống là phân tích các số nguyên X và y thành các thừa số nguyên tố và ước số chung lớn nhất u của 2 số nguyên X và y sẽ là tích của các thừa số nguyên tố có mặt trong cả 2 số với số cao nhất. Tuy nhiên thuật giải này trình bày trong Pascal khả phức tạp có thể thay thế bằng nhiều cách khác dễ thể hiện.
   Ví dụ:
- Nếu số lớn chia hết cho số bé thì u bằng chính số bé, còn không thì giảm dần số bé cho đến khi cả 2 số X và y đều chia hết cho số đang xét thì dừng và lấy kết quả ra. Đương nhiên không cần giới hạn cận dưới vì khi giảm số xem xét đến 1 thì cả 2 số đều sẽ chia hết.
- Nếu khi một trong hai số bằng 0 thìu chính là số còn lại. Mặt khác X và y đều chia hết cho u nên (X MOD y) cũng chia hết cho u nên có thể thay thế tìm USCLN của X và y bằng tìm USCLN của số bé và phần dư của số lớn chia cho số bé cho đến khi một trong hai số bằng 0.
- X và y đều chia hết cho u nên (x-y). cũng chia hết cho u nên có thể thay thế tìm USCLN của X và y bằng tìm USCLN của số bé và hiệu của số lớn và số bé cho đến khi hai số bằng nhau….
     Cần chú ý rằng khái niệm bé ở đây là về giá trị tuyệt đối của chúng chứ không phải giá trị thực. Do vậy cần sử dụng hàm ABS để chuyển đổi trước khi tính.
PROGRAM Chương_trình;
VAR X, y, us : integer;
BEGIN
Write(’Cho X : ‘); readln(x);
Write(‘Cho y :’); readln(y); if abs(x)>abs(y) then us:= abs(y) else us:=abs(x);
WHILE (x mod us <> 0) or (y mod us <> 0) DO
us:=us-1;
Write(‘USCLN cua ‘.X,’ va ‘,y,’ la:    us);
Readln;
Một số nhận xét:
- Theo cách giải quyết trong chương trình 5 trước hết biến us sẽ nhận giá trị tuyệt đối của X hay của y tuỳ theo tương quan giữa chúng. Tiếp đó kiểm tra tính chia hết của X và y với USCLN giả định cho đến khi cả X và y chia hết cho giá trị đó. Nếu hai số ban đầu chia hết cho nhau thì vòng lặp While sẽ không thực hiện lần lặp nào và sẽ đưa ra kết quả là giá trị của số bé.
- Trong chương trình 6 việc xét giá trị tuyệt đối chỉ cần giải quyết với kết quả cuối cùng và không cần tìm số bé vì chỉ sau 1 lần lặp số dư nhất định sẽ nhỏ hơn hoặc bằng số bé. Giải quyết bài toán qua số dư của 2 số sẽ ít lăp hơn trong chương trình 5.

Từ khóa tìm kiếm nhiều: tin học đại cương, cấu trúc máy tính

  • Digg
  • Del.icio.us
  • StumbleUpon
  • Reddit
  • RSS

Lệnh lặp có bước lặp xác định FOR

     Khi một nhóm lệnh được lặp đi lặp lại một số lần xác định trong chương trình thì có thể thay cả một nhóm lệnh đó bằng một lệnh lặp có bước lặp xác định,số bước lặp được xác đinh bằng một biến điều khiển (control variable) có-kiểu đếm được. Lệnh này có thể có 2 dạng tuỳ thuộc sự thay đổi giá trị của biến điều khiển là tăng hay giảm như sau:
FOR Tên biến điểu khiển := Giá trị đầu TO Giá trị cuối DO Lệnh cần lặp;
hoặc
FOR Tên biến diều khiển:=Gỉá trị đầu DOWNTO Giá trị cuối DO Lệnh cần lặp;

Lệnh lặp có bước lặp xác định FOR

    Trong đó sau DO chỉ có thể là một lệnh (đơn giản hay lệnh ghép của một nhóm lệnh). Bắt đầu lệnh lặp này biến điều khiển nhận giá trị đầu. Mỗi khi lệnh sau DO được thực hiện là đã qua một lần lặp và biến điều khiển nhận giá trị tiếp theo nếu làdạng FOR…TO…DO (hay nhận giá trị ngay trước nó nếu là dạng FOR…DOWNTO…DO). Lệnh kết thúc sau khi lần lập cuối cùng được thực hiện khi mà biến điều khiển nhận giá trị cuối. Như vậy số giá trị từ giá trị đầu đến giá trị cuối của biến điều khiển kiểu đếm được này sẽ xác định số-lần lập của lệnh sau DO phải thực hiện và số giá trị này là xác định.
Một vài nhận xét:
-  Hai chương trình trên về cơ bản là giống nhau, chỉ khác một dùng FOR tiến chương trình còn lại dùng FOR lùi.
- Trong chương trình 1 hoàn toàn có thể gán h:=1/n; thay cho việc gán h:=0; và khi đó giá trị đầu của biến điều khiển sẽ là n-1 chứ không còn là n nữa.
- Việc nhập giá trị cho biến n ở chương trình 1 có thông báo nên dễ nhập hơn ở chương trình 2 phải nhập “mò” nghĩa là người chạy chương trình phải biết lúc đó chương trình đang chờ nhập giá trị cho biến n mà không có thống báo.
- Giá trị của tổng h ở chương trình 1 sẽ được đưa ra dưới dạng không có qui cách nên sẽ khó nhìn hơn ở chương trình 2 giá trị h được viết trên 12 vị trí trong đó có 10 vị trí sau dấu phẩy.
- Trong chương trình 2 lệnh lặp ngoài việc tính h còn đưa ra màn hình biểu thức tính h từ số hạng thứ 1 đến số hạng thứ n nên phải được bao bằng BEGIN và END, còn ở chương trình 1 chỉ có một lệnh tính tổng nên không cần dùng lệnh hợp thành.


Đọc thêm tại:

  • Digg
  • Del.icio.us
  • StumbleUpon
  • Reddit
  • RSS