x9nd
05-23-2009, 04:28 PM
Bài 9: Ṿng lặp - Lư thuyết
Giới thiệu
- Một trong những điểm mạnh lớn nhất của máy tính là khả năng thực hiện một chuỗi các lệnh lặp đi lặp lại. Điều đó có được là do sử dụng các cấu trúc lặp trong ngôn ngữ lập tŕnh. Trong bài này bạn sẽ t́m hiểu các loại ṿng lặp khác nhau C.
1. Ṿng lặp
- Ṿng lặp là một đoạn mă lệnh trong chương tŕnh được thực hiện lặp đi lặp lại cho đến khi thỏa măn một điều kiện nào đó. Ṿng lặp là một khái niệm cơ bản trong lập tŕnh cấu trúc. Trong C có các loại ṿng lặp sau (for, while, do...while)
- Ta sử dụng các toán tử quan hệ và toán tử logic trong các biểu thức điều kiện để điều khiển sự thực hiện của ṿng lặp.
2. Ṿng lặp "for"
- Cú pháp tổng quát của ṿng lặp "for" như sau:
Code:
for (khởi tạo giá trị cho biến điều khiển; biểu thức điều kiện; biểu thức thay đổi giá trị của biến điều khiển)
{
Cậu lệnh (các câu lệnh);
}
- Khởi tạo giá trị cho biến điều khiển là một câu lệnh gán giá trị ban đầu cho biến điều khiển trước khi thực hiện ṿng lặp. Lênh này chỉ được thực hiện duy nhất một lần. Biểu thức điều kiện là một biểu thức quan hệ, xác định điều kiện thoát cho ṿng lặp. Biểu thức thay đổi giá trị của biến điều khiển xác định biến điều khiển sẽ bị thaddooior thế nào sau mỗi lần ṿng lặp được lặp lại (thường là tăng hoặc giảm giá trị của biến điều khiển). Ba phần trên được phân cách bởi dấu chấm phẩy. Câu lệnh trong than ṿng lặp có thể là một lệnh duy nhất (lệnh đơn) hoặc lệnh phức (nhiều lệnh).
- Ṿng lặp for sẽ tiếp tục được thực hiện chừng nào mà biểu thức điều kiện c̣n [b]đúng (true)[b]. Khi biểu thức điều kiện là sai (false), chương tŕnh sẽ thoát ra khỏi ṿng lặp for
- Toán tử "phẩy (comma)": phần biểu thức trong toán tử for có thể được mở rộng để thêm vào các lệnh khởi tạo hay các lệnh thay đổi giá trị của biến. Cú pháp như sau:
Code:
Biểu_thức_1, Biểu_thức_2
- Các biểu thức trên được phân tách bởi toán tử phẩy ",", và được thực hiên từ trái sang phải. Thứ tự của các biểu thức là quan trọng trong trường hợp giá trị của biểu thức thứ hai phục thuộc vào giá trị của biểu thức thứ nhất. Toán tử này có độ ưu tiên thấp nhất trong các toán tử của C.
3. Ṿng lặp "for" lông nhau
- Một ṿng lặp for được gọi là lông nhau khi nó nằm bên trong một ṿng lặp for khác. Nó sẽ có dạng tương tự như sau:
Code:
for (i = 1; i < max1; i++)
{
...
...
for (j = 1; j < max1; j++)
{
...
...
}
...
}
- Ṿng lặp for khi không có bất kỳ thành phần nào sẽ là một ṿng lặp vô tận. Tùy nhiên, lệnh break bên trong ṿng lặp sẽ cho phép thoát khỏi ṿng lặp.
4. Ṿng lặp "while"
- Cấu trúc lặp thứ hai trong C là ṿng lặp while. Cú pháp tổng quát như sau:
Code:
while (điều_kiện_là_đùng)
câu_lênh;
- Trong đó, câu_lệnh có thể là rỗng, hay một lệnh đơn, hay một khối lệnh. Nếu ṿng lặp while chứa một tập lệnh th́ chúng phải được đặt trong cặp ngoặc xoắn {}. điều_kiện có thể là biểu thức bất kỳ. Ṿng lặp sẽ được thực hiện lặp đi lặp lại khi điều kiện trên là đúng (true). Chương tŕnh sẽ chuyển đến thực hiện lệnh tiếp theo sau ṿng lặp khi điều kiện trên là sai (false).
- Ṿng lặp for có thể được sử dụng khi số lần thực hiện ṿng lặp đă được xác định trước. Khi số lần lặp không biết trước, ṿng lăp while có thể được sử dụng.
5. Ṿng lặp "do...while"
- Ṿng lặp do ... while c̣n được gọi là ṿng lặp do trong C. Không giống như ṿng lặp for và while, ṿng lặp này kiểm tra điều kiện tại cuối ṿng lặp. Điều này có nghĩa là ṿng lặp do...while sẽ được thực hiện ít nhất một lần, ngay cả khi điều kiện la sai (false) ở lần chạy đầu tiên. Cú pháp tổng quát của ṿng lặp do...while viết như sau:
Code:
do
{
câu_lệnh;
} while (điều_kiện);
- Cặp dấu ngoặc "{}" là không cần thiết khi chỉ có một câu lệnh hiện diện trong ṿng lặp, nhưng việc sử dụng dấu ngoặc "{}" là một thói quen tốt. Ṿng lặp do...while lặp đến khi điều_kiện mang giá trị false. Trong ṿng lặp do...while, câu_lệnh (khối các câu lệnh) sẽ được thực thi trước, và sau đó điều_kiện được kiểm tra. Nếu điều_kiện là true, chương tŕnh sẽ quay lại thực hiện lệnh do. Nếu điều kiện là false, chương tŕnh chuyển đến thực hiện lệnh nằm sau ṿng lặp. Tương tự như ṿng lặp for, các ṿng lặp while và do...while cũng có thể *****g vào nhau.
6. Các lệnh nhẩy
a. Lệnh "return"
- Lệnh return dùng để quay lại vị trí gọi hàm sau khi các lệnh trong hàm đó được thực thi xong. Trong lệnh return có thể có một giá trị gắn với nó, giá trị đó sẽ được trả về cho chương tŕnh. Cú pháp tổng quát của cậu lệnh return như sau:
Code:
return biểu_thức
- Biểu thức là một tùy chọn (không bắt buộc). Có thể có hơn một lệnh return được sử dụng trong một hàm. Tuy nhiên, hàm sẽ quay trở về vị trí gọi hàm khi gặp lệnh return đầu tiên.
b. Lệnh "goto"
- C là một ngôn ngữ lệnh tŕnh có cấu trúc, tuy vậy nó vẫn chưa một số câu lệnh làm phá vỡ cấu trúc chương tŕnh. Đó là 2 lệnh goto, label. Lệnh goto cho phép chuyển điều khiển tới một câu lện bất kỳ nằm trong cùng khối lệnh hay khác khối lệnh bên trong hàm đó. V́ vậy nó vi phạm các qui tắc của một ngôn ngữ lập tŕnh có cấu trúc. Cú pháp tổng quát là:
Code:
goto label;
- Trong đó label là một định danh phải xuất hiện như tiền tố (prefix) của một câu lệnh khác trong cùng một hàm. Dấu chấm phẩy
";" sau label đánh dấu sự kết thúc của lệnh goto
c. Lệnh "break"
- Câu lệnh break có hai cách dùng. Nó có thể được sử dụng để kết thúc một case trong một câu lệnh switch hoặc để kết thúc ngay một ṿng lặp, mà không cần kiểm tra điều kiện ṿng lặp.
- Khi chương tŕnh gặp lệnh break trong một ṿng lặp, ngay lập tức ṿng lặp được kết thúc và quyền điều khiển chương tŕnh được chuyển đến câu lệnh theo sau ṿng lặp.
d. Lệnh "continue"
- Lệnh continue kết thúc lần lặp hiện hành và bắt đầu lần lặp kết tiếp. Khi gặp lệnh này trong chương tŕnh, các câu lệnh c̣n lại trong thân của ṿng lặp được bỏ qua và quyền điều khiển được chuyển đến bước đầu của ṿng lặp trong lần lặp kế tiếp. Trong trường hợp for, continue thực hiện biểu thức thay đổi của biến điều khiển và sau đó kiểm tra biểu thức điều kiện. Trong trường hợp của lệnh while và do...while, quyền điều khiển chương tŕnh được chuyển đến biểu thức kiểm tra điều kiện
7. Hàm "exit()"
- Hàm exit() là một hàm trong thư viện chuẩn của C. Nó làm việc tương tự như một lệnh chuyển quyền điều khiển, điểm khác nhau chính là các lệnh chuyển quyền điều khiển thường được sử dụng để thoát khỏi một ṿng lặp, trong khi exit() được sử dụng để thoát khỏi chương tŕnh. Hàm này sẽ ngay lập tức kết thúc chương tŕnh và quyền điều khiển được trả về cho hệ điều hành. Hàm exit() thường được dùng để kiểm tra một điều kiện bắt buộc cho việc thực thi của một chương tŕnh có được thỏa măn hay không. Cú pháp tổng quát của hàm exit() như sau:
Code:
exit (int mă_trả_về);
- Ở đó mă_trả_về là một tùy chọn. Số 0 thường được dùng như một mă_trả_về để xác định sự kết thúc chương tŕnh một cách b́nh thường. Những giá trị khác xác định một vài loại lỗi.
Kết thúc bài 9
Bài tập tự làm
1. Viết chương tŕnh in ra dăy số 100, 95, 90, ..., 5
2. Nhập vào 2 số num1 và num2. T́m tổng của tất cả các số lẻ nằm giữa hai số đă được nhập.
3. Viết chương tŕnh in ra chuỗi Fibonaci (1, 1, 2, 3, 5, 8, 13, ...)
4. Viêt chương tŕnh để hiển thị theo mẫu sau đây.
Code:
1
12
123
1234
12345
Code:
12345
1234
123
12
1
5. Viêt chương tŕnh in lên màn h́nh như sau:
Code:
*******
******
*****
****
***
**
*
Giới thiệu
- Một trong những điểm mạnh lớn nhất của máy tính là khả năng thực hiện một chuỗi các lệnh lặp đi lặp lại. Điều đó có được là do sử dụng các cấu trúc lặp trong ngôn ngữ lập tŕnh. Trong bài này bạn sẽ t́m hiểu các loại ṿng lặp khác nhau C.
1. Ṿng lặp
- Ṿng lặp là một đoạn mă lệnh trong chương tŕnh được thực hiện lặp đi lặp lại cho đến khi thỏa măn một điều kiện nào đó. Ṿng lặp là một khái niệm cơ bản trong lập tŕnh cấu trúc. Trong C có các loại ṿng lặp sau (for, while, do...while)
- Ta sử dụng các toán tử quan hệ và toán tử logic trong các biểu thức điều kiện để điều khiển sự thực hiện của ṿng lặp.
2. Ṿng lặp "for"
- Cú pháp tổng quát của ṿng lặp "for" như sau:
Code:
for (khởi tạo giá trị cho biến điều khiển; biểu thức điều kiện; biểu thức thay đổi giá trị của biến điều khiển)
{
Cậu lệnh (các câu lệnh);
}
- Khởi tạo giá trị cho biến điều khiển là một câu lệnh gán giá trị ban đầu cho biến điều khiển trước khi thực hiện ṿng lặp. Lênh này chỉ được thực hiện duy nhất một lần. Biểu thức điều kiện là một biểu thức quan hệ, xác định điều kiện thoát cho ṿng lặp. Biểu thức thay đổi giá trị của biến điều khiển xác định biến điều khiển sẽ bị thaddooior thế nào sau mỗi lần ṿng lặp được lặp lại (thường là tăng hoặc giảm giá trị của biến điều khiển). Ba phần trên được phân cách bởi dấu chấm phẩy. Câu lệnh trong than ṿng lặp có thể là một lệnh duy nhất (lệnh đơn) hoặc lệnh phức (nhiều lệnh).
- Ṿng lặp for sẽ tiếp tục được thực hiện chừng nào mà biểu thức điều kiện c̣n [b]đúng (true)[b]. Khi biểu thức điều kiện là sai (false), chương tŕnh sẽ thoát ra khỏi ṿng lặp for
- Toán tử "phẩy (comma)": phần biểu thức trong toán tử for có thể được mở rộng để thêm vào các lệnh khởi tạo hay các lệnh thay đổi giá trị của biến. Cú pháp như sau:
Code:
Biểu_thức_1, Biểu_thức_2
- Các biểu thức trên được phân tách bởi toán tử phẩy ",", và được thực hiên từ trái sang phải. Thứ tự của các biểu thức là quan trọng trong trường hợp giá trị của biểu thức thứ hai phục thuộc vào giá trị của biểu thức thứ nhất. Toán tử này có độ ưu tiên thấp nhất trong các toán tử của C.
3. Ṿng lặp "for" lông nhau
- Một ṿng lặp for được gọi là lông nhau khi nó nằm bên trong một ṿng lặp for khác. Nó sẽ có dạng tương tự như sau:
Code:
for (i = 1; i < max1; i++)
{
...
...
for (j = 1; j < max1; j++)
{
...
...
}
...
}
- Ṿng lặp for khi không có bất kỳ thành phần nào sẽ là một ṿng lặp vô tận. Tùy nhiên, lệnh break bên trong ṿng lặp sẽ cho phép thoát khỏi ṿng lặp.
4. Ṿng lặp "while"
- Cấu trúc lặp thứ hai trong C là ṿng lặp while. Cú pháp tổng quát như sau:
Code:
while (điều_kiện_là_đùng)
câu_lênh;
- Trong đó, câu_lệnh có thể là rỗng, hay một lệnh đơn, hay một khối lệnh. Nếu ṿng lặp while chứa một tập lệnh th́ chúng phải được đặt trong cặp ngoặc xoắn {}. điều_kiện có thể là biểu thức bất kỳ. Ṿng lặp sẽ được thực hiện lặp đi lặp lại khi điều kiện trên là đúng (true). Chương tŕnh sẽ chuyển đến thực hiện lệnh tiếp theo sau ṿng lặp khi điều kiện trên là sai (false).
- Ṿng lặp for có thể được sử dụng khi số lần thực hiện ṿng lặp đă được xác định trước. Khi số lần lặp không biết trước, ṿng lăp while có thể được sử dụng.
5. Ṿng lặp "do...while"
- Ṿng lặp do ... while c̣n được gọi là ṿng lặp do trong C. Không giống như ṿng lặp for và while, ṿng lặp này kiểm tra điều kiện tại cuối ṿng lặp. Điều này có nghĩa là ṿng lặp do...while sẽ được thực hiện ít nhất một lần, ngay cả khi điều kiện la sai (false) ở lần chạy đầu tiên. Cú pháp tổng quát của ṿng lặp do...while viết như sau:
Code:
do
{
câu_lệnh;
} while (điều_kiện);
- Cặp dấu ngoặc "{}" là không cần thiết khi chỉ có một câu lệnh hiện diện trong ṿng lặp, nhưng việc sử dụng dấu ngoặc "{}" là một thói quen tốt. Ṿng lặp do...while lặp đến khi điều_kiện mang giá trị false. Trong ṿng lặp do...while, câu_lệnh (khối các câu lệnh) sẽ được thực thi trước, và sau đó điều_kiện được kiểm tra. Nếu điều_kiện là true, chương tŕnh sẽ quay lại thực hiện lệnh do. Nếu điều kiện là false, chương tŕnh chuyển đến thực hiện lệnh nằm sau ṿng lặp. Tương tự như ṿng lặp for, các ṿng lặp while và do...while cũng có thể *****g vào nhau.
6. Các lệnh nhẩy
a. Lệnh "return"
- Lệnh return dùng để quay lại vị trí gọi hàm sau khi các lệnh trong hàm đó được thực thi xong. Trong lệnh return có thể có một giá trị gắn với nó, giá trị đó sẽ được trả về cho chương tŕnh. Cú pháp tổng quát của cậu lệnh return như sau:
Code:
return biểu_thức
- Biểu thức là một tùy chọn (không bắt buộc). Có thể có hơn một lệnh return được sử dụng trong một hàm. Tuy nhiên, hàm sẽ quay trở về vị trí gọi hàm khi gặp lệnh return đầu tiên.
b. Lệnh "goto"
- C là một ngôn ngữ lệnh tŕnh có cấu trúc, tuy vậy nó vẫn chưa một số câu lệnh làm phá vỡ cấu trúc chương tŕnh. Đó là 2 lệnh goto, label. Lệnh goto cho phép chuyển điều khiển tới một câu lện bất kỳ nằm trong cùng khối lệnh hay khác khối lệnh bên trong hàm đó. V́ vậy nó vi phạm các qui tắc của một ngôn ngữ lập tŕnh có cấu trúc. Cú pháp tổng quát là:
Code:
goto label;
- Trong đó label là một định danh phải xuất hiện như tiền tố (prefix) của một câu lệnh khác trong cùng một hàm. Dấu chấm phẩy
";" sau label đánh dấu sự kết thúc của lệnh goto
c. Lệnh "break"
- Câu lệnh break có hai cách dùng. Nó có thể được sử dụng để kết thúc một case trong một câu lệnh switch hoặc để kết thúc ngay một ṿng lặp, mà không cần kiểm tra điều kiện ṿng lặp.
- Khi chương tŕnh gặp lệnh break trong một ṿng lặp, ngay lập tức ṿng lặp được kết thúc và quyền điều khiển chương tŕnh được chuyển đến câu lệnh theo sau ṿng lặp.
d. Lệnh "continue"
- Lệnh continue kết thúc lần lặp hiện hành và bắt đầu lần lặp kết tiếp. Khi gặp lệnh này trong chương tŕnh, các câu lệnh c̣n lại trong thân của ṿng lặp được bỏ qua và quyền điều khiển được chuyển đến bước đầu của ṿng lặp trong lần lặp kế tiếp. Trong trường hợp for, continue thực hiện biểu thức thay đổi của biến điều khiển và sau đó kiểm tra biểu thức điều kiện. Trong trường hợp của lệnh while và do...while, quyền điều khiển chương tŕnh được chuyển đến biểu thức kiểm tra điều kiện
7. Hàm "exit()"
- Hàm exit() là một hàm trong thư viện chuẩn của C. Nó làm việc tương tự như một lệnh chuyển quyền điều khiển, điểm khác nhau chính là các lệnh chuyển quyền điều khiển thường được sử dụng để thoát khỏi một ṿng lặp, trong khi exit() được sử dụng để thoát khỏi chương tŕnh. Hàm này sẽ ngay lập tức kết thúc chương tŕnh và quyền điều khiển được trả về cho hệ điều hành. Hàm exit() thường được dùng để kiểm tra một điều kiện bắt buộc cho việc thực thi của một chương tŕnh có được thỏa măn hay không. Cú pháp tổng quát của hàm exit() như sau:
Code:
exit (int mă_trả_về);
- Ở đó mă_trả_về là một tùy chọn. Số 0 thường được dùng như một mă_trả_về để xác định sự kết thúc chương tŕnh một cách b́nh thường. Những giá trị khác xác định một vài loại lỗi.
Kết thúc bài 9
Bài tập tự làm
1. Viết chương tŕnh in ra dăy số 100, 95, 90, ..., 5
2. Nhập vào 2 số num1 và num2. T́m tổng của tất cả các số lẻ nằm giữa hai số đă được nhập.
3. Viết chương tŕnh in ra chuỗi Fibonaci (1, 1, 2, 3, 5, 8, 13, ...)
4. Viêt chương tŕnh để hiển thị theo mẫu sau đây.
Code:
1
12
123
1234
12345
Code:
12345
1234
123
12
1
5. Viêt chương tŕnh in lên màn h́nh như sau:
Code:
*******
******
*****
****
***
**
*