Lệnh lặp while Cú pháp
while (điều kiện) { khối lệnh lặp ; }
Thực hiện
Khi gặp lệnh while chương trình thực hiện như sau: đầu tiên chương trình sẽ kiểm tra điều kiện, nếu đúng thì thực hiện khối lệnh lặp, sau đó quay lại kiểm tra điều kiện và tiếp tục. Nếu điều kiện sai thì dừng vòng lặp. Tóm lại có thể mô tả một cách ngắn gọn về câu lệnh while như sau: lặp lại các lệnh trong khi điều kiện vẫn còn đúng.
Đặc điểm
Khối lệnh lặp có thể không được thực hiện lần nào nếu điều kiện sai ngay từ đầu.
Để vòng lặp không lặp vô hạn thì trong khối lệnh thông thường phải có ít nhất một câu lệnh nào đó gây ảnh hưởng đến kết quả của điều kiện, ví dụ làm cho điều kiện đang đúng trở thành sai.
Nếu điều kiện luôn luôn nhận giá trị đúng (ví dụ biểu thức điều kiện là 1) thì trong khối lệnh lặp phải có câu lệnh kiểm tra dừng và lệnh break.
Ví dụ minh hoạ
: Nhân 2 số nguyên theo phương pháp Ấn độ
void main()
{
long m, n, kq; // Các số cần nhân và kết quả kq
cout << “Nhập m và n: “ ; cin >> m >> n ;
kq = 0 ;
while (m)
{
if (m%2) kq += n ;
m >>= 1;
n <<= 1;
}
cout << “m nhân n =” << kq ;
}
Trong chương trình trên câu lệnh while (m) … được đọc là "trong khi m còn khác 0 thực hiện …", ta thấy trong khối lệnh lặp có lệnh m >>= 1, lệnh này sẽ ảnh hưởng đến điều kiện (m), đến lúc nào đó m bằng 0 tức (m) là sai và chương trình sẽ dừng lặp.
Câu lệnh while (m) … cũng có thể được thay bằng while (1) … như sau:
void main()
{
long m, n, kq; // Các số cần nhân và kết quả kq
cout << “Nhập m và n: “ ; cin >> m >> n ;
kq = 0 ;
while (1) {
if (m%2) kq += n ;
m >>= 1;
n <<= 1;
if (!m) break ; // nếu m = 0 thì thoát khỏi vòng lặp
}
cout << “m nhân n =” << kq ;
}
: Bài toán cổ: vừa gà vừa chó bó lại cho tròn đếm dủ 100 chân. Hỏi có mấy gà và mấy con chó, biết tổng số con là 36.
void main()
{
int g, c ;
g = 0 ;
while (g <= 36) {
c = 0 ;
while (c <= 50) {
if (g + c == 36 && 2*g + 4*c == 100) cout << g << c ;
c++;
}
g++;
}
}
: Tìm ước chung lớn nhất (UCLN) của 2 số nguyên m và n.
Áp dụng thuật toán Euclide bằng cách liên tiếp lấy số lớn trừ đi số nhỏ khi nào 2 số bằng nhau thì đó là UCLN. Trong chương trình ta qui ước m là số lớn và n là số nhỏ. Thêm biến phụ r để tính hiệu của 2 số. Sau đó đặt lại m hoặc n bằng r sao cho m > n và lặp lại. Vòng lặp dừng khi m = n.
void main()
{
int m, n, r;
cout << "Nhập m, n: " ; cin >> m >> n ;
if (m < n) { int t = m; m = n; n = t; } // nếu m < n thì đổi vai trò hai số
while (m != n) {
r = m - n ;
if (r > n) m = r; else { m = n ; n = r ; }
}
cout << "UCLN = " << m ;
}
: Tìm nghiệm xấp xỉ của phương trình ex - 1.5 = 0, trên đoạn [0, 1] với độ chính xác 10-6 bằng phương pháp chia đôi.
Để viết chương trình này chúng ta nhắc lại phương pháp chia đôi. Cho hàm f(x) liên tục và đổi dấu trên một đoạn [a, b] nào đó (tức f(a), f(b) trái dấu nhau hay f(a)*f(b) < 0). Ta đã biết với điều kiện này chắc chắn đồ thị của hàm f(x) sẽ cắt trục hoành tại một điểm x0 nào đó trong đoạn [a, b], tức x0 là nghiệm của phương trình f(x) = 0. Tuy nhiên việc tìm chính xác x0 là khó, vì vậy ta có thể tìm xấp xỉ x' của nó sao cho x' càng gần x0 càng tốt. Lấy c là điểm giữa của đoạn [a, b], c sẽ chia đoạn [a, b] thành 2 đoạn con [a, c] và [c, b] và do f(a), f(b) trái dấu nên chắc chắn một trong hai đoạn con cũng phải trái dấu, tức nghiệm x0 sẽ nằm trong đoạn này. Tiếp tục quá trình bằng cách chia đôi đoạn vừa tìm được … cho đến khi ta nhận được một đoạn con (trái dấu, chứa x0) sao cho độ dài của đoạn con này bé hơn độ xấp xỉ cho trước thì dừng. Khi đó lấy bất kỳ điểm nào trên đoạn con này (ví dụ hai điểm mút hoặc điểm giữa của a và b) thì chắc chắn khoảng cách của nó đến x0 cũng bé hơn độ xấp xỉ cho trước, tức có thể lấy điểm này làm nghiệm xấp xỉ của phương trình f(x) = 0.
Trong ví dụ này hàm f(x) chính là ex - 1.5 và độ xấp xỉ là 10-6. Đây là hàm liên tục trên toàn trục số và đổi dấu trên đoạn [0, 1] (vì f(0) = 1 - 1.5 < 0 còn f(1) = e - 1.5 > 0). Sau đây là chương trình.
void main()
{
float a = 0, b = 1, c; // các điểm mút a, b và điểm giữa c
float fa, fc; // giá trị của f(x) tại các điểm a, c
while (b-a > 1.0e-6) // trong khi độ dài đoạn còn lớn hơn e
{
c = (a + b)/2; // tìm điểm c giữa đoạn [a,b]
fa = exp(a) - 1.5; fc = exp(c) - 1.5; // tính f(a) và f(c)
if (fa*fc == 0) break; // f(c) = 0 tức c là nghiệm
if (fa*fc > 0) a = c; else b = c;
}
cout << "Nghiem xap xi cua phuong trinh = " << c ;
}
Trong chương trình trên câu lệnh if (fa*fc > 0) a = c; else b = c; dùng để kiểm tra f(a) và f(c), nếu cùng dấu (f(a)*f(c) > 0) thì hàm f(x) phải trái dấu trên đoạn con [c, b] do đó đặt lại đoạn này là [a, b] (để quay lại vòng lặp) tức đặt a = c và b giữ nguyên, ngược lại nếu hàm f(x) trái dấu trên đoạn con [a, c] thì đặt lại b = c còn a giữ nguyên. Sau đó vòng lặp quay lại kiểm tra độ dài đoạn [a, b] (mới) nếu đã bé hơn độ xấp xỉ thì dừng và lấy c làm nghiệm xấp xỉ, nếu không thì tính lại c và tiếp tục quá trình.
Để tính f(a) và f(c) chương trình đã sử dụng hàm exp(x), đây là hàm cho lại kết quả ex, để dùng hàm này hoặc các hàm toán học nói chung, cần khai báo file nguyên mẫu math.h.
Lệnh lặp do ... while Cú pháp
do { khối lệnh lặp } while (điều kiện) ;
Thực hiện
Đầu tiên chương trình sẽ thực hiện khối lệnh lặp, tiếp theo kiểm tra điều kiện, nếu điều kiện còn đúng thì quay lại thực hiện khối lệnh và quá trình tiếp tục cho đến khi điều kiện trở thành sai thì dừng.
Đặc điểm
Các đặc điểm của câu lệnh do … while cũng giống với câu lệnh lặp while trừ điểm khác biệt, đó là khối lệnh trong do … while sẽ được thực hiện ít nhất một lần, trong khi trong câu lệnh while có thể không được thực hiện lần nào (vì lệnh while phải kiểm tra điều kiện trước khi thực hiện khối lệnh, do đó nếu điều kiện sai ngay từ đầu thì lệnh sẽ dừng, khối lệnh không được thực hiện lần nào. Trong khi đó lệnh do … while sẽ thực hiện khối lệnh rồi mới kiểm tra điều kiện lặp để cho phép thực hiện tiếp hoặc dừng).
Ví dụ minh hoạ
: Tính xấp xỉ số pi theo công thức Euler , với .
void main()
{
int n = 1; float S = 0;
do S += 1.0/(n*n) while 1.0/(n*n) < 1.0e-6;
float pi = sqrt(6*S);
cout << "pi = " << pi ;
}
: Kiểm tra một số n có là số nguyên tố.
Để kiểm tra một số n > 3 có phải là số nguyên tố ta lần lượt chia n cho các số i đi từ 2 đến một nửa của n. Nếu có i sao cho n chia hết cho i thì n là hợp số ngược lại n là số nguyên tố.
void main()
{
int i, n ; // n: số cần kiểm tra
cout << "Cho biết số cần kiểm tra: " ; cin >> n ;
i = 2 ;
do {
if (n%i == 0) {
cout << n << "là hợp số" ;
return ; // dừng chương trình
}
i++;
} while (i <= n/2);
cout << n << "là số nguyên tố" ;
}
: Nhập dãy kí tự và thống kê các loại chữ hoa, thường, chữ số và các loại khác còn lại đến khi gặp ENTER thì dừng.
void main()
{
char c; // kí tự dùng cho nhập
int n1, n2, n3, n4 ; // số lượng các loại kí tự
n1 = n2 = n3 = n4 = 0;
cout << “Hãy nhập dãy kí tự: \n” ;
do
{
cin >> c;
if (‘a’ <= c && c <= ‘z’) n1++; // nếu c là chữ thường thì tăng n1
else if (‘A’ <= c && c <= ‘Z’) n2++; // chữ hoa, tăng n2
else if (‘0’ <= c && c <= ‘9’) n3++; // chữ số, tăng n3
else n4++; // loại khác, tăng n4
cout << n1 << n2 << n3 << n4 ; // in kết quả
} while (c != 10) ; // còn lặp khi c còn khác kí tự ¿
}
Chia sẻ với bạn bè của bạn: |