Lập trình C Aptech - Bài 9: Vòng lặp
Mục tiêu:
Kết thúc bài học này, bạn có thể:
Hiểu được vòng lặp ‘for’ trong C
Làm việc với toán tử ‘phẩy’
Hiểu các vòng lặp lồng nhau
Hiểu vòng lặp ‘while’ và vòng lặp ‘do-while’
Làm việc với lệnh ‘break’ và lệnh ‘continue’
Hiểu hàm ‘exit()’.
oặc ‘Y’. Và chương trình kết thúc. 9.2 Lệnh chuyển điều khiểnCác lệnh nhẩy: C có bốn câu lệnh thực hiện sự rẽ nhánh không điều kiện: return, goto, break, và continue. Sự rẽ nhánh không điều kiện nghĩa là sự chuyển điều khiển từ một điểm đến một lệnh xác định. Trong các lệnh chuyển điều khiển trên, return và goto có thể dùng bất kỳ vị trí nào trong chương trình, trong khi lệnh break và continue được sử dụng kết hợp với các câu lệnh vòng lặp. 9.2.1 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 trình. Cú pháp tổng quát của câu lệnh return như sau: Lệnh return được dùng để trở về từ một hàm. Nó khiến sự thực thi trở về vị trí đã gọi thực thi hàm. Lệnh return có thể có một giá trị đi kèm với nó, giá trị này sẽ trả về cho chương trình. Cú pháp tổng quát của lệnh return như sau: 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 trở về khi gặp lệnh return đầu tiên. Lệnh return sẽ được làm rõ hơn sau khi học về hàm. 9.2.2 Lệnh ‘goto’: C là một ngôn ngữ lập trì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 của chương trình: Mặc dù C là một ngôn ngữ lập trình cấu trúc, nhưng nó có một vài hình thức điều khiển chương trình không cấu trúc: goto label Lệnh goto cho phép chuyển quyền điều khiển tới một lệnh 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 trình có cấu trúc. Trong chương trình C, một lệnh goto cho phép chuyển điều khiển không chỉ đến bất kỳ một câu lệnh nào khác trong cùng một hàm, mà còn cho phép nhảy ra khỏi và nhảy đến các khối lệnh. Vì vậy nó vi phạm qui luật của một ngôn ngữ lập trình cấu trúc. Cú pháp tổng quát của một câu lệnh goto là: goto label; Trong đó label là một định danh phải xuất hiện như là 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ác lệnh goto làm cho chương trình khó đọc. Chúng làm giảm độ tin cậy và làm cho chương trình khó bảo trì. Tuy nhiên, chúng vẫn được dùng vì chúng cung cấp các cách thức hữu dụng để thoát ra khỏi những vòng lặp lồng nhau quá nhiều mức.ở đó label là một định danh phải xuất hiện trước (tiếp đầu ngữ) một câu lệnh C 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ác lệnh goto trong chương trình tạo nên sự khó đọc. Chúng làm giảm độ tin cậy và làm chương trình khó bảo trì. Tuy nhiên, chúng được sử dụng vì chúng cung cấp cách thức hữu dụng để thoát ra khỏi những vòng lặp lồng nhau quá sâu. Xét đoạn mã sau: for (...) { for(...) { for(...) { while(...) { if (...) goto error1; ... } } } } error1: printf(“Error !!!”); Như đã thấy, label xuất hiện như là một tiếp đầu ngữ tiền tố của một câu lệnh khác trong chương trình. label: câu_lệnh hoặc label: { Chuỗi các câu lệnh; } Ví dụ 9.10: #include #include void main() { int num clrscr(); label1: printf(“\nEnter a number (1): “); scanf(“%d”, &num); if (num == 1) goto Test; else goto label1; Test: printf(“All done...”); } Một ví dụ về kết quả của chương trình như sauKết quả của chương trình trên được minh họa như sau: Enter a number: 4 Enter a number: 5 Enter a number: 1 All done... 9.2.3 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 câu lệnh switch và/hoặc để kết thúc ngay một vòng lặp, mà bỏ quakhông cần sự kiểm tra điều kiện vòng lặp thông thường. Khi chương trình gặp lệnh break được gặp bên trong một vòng lặp, ngay lập tức vòng lặp được kết thúc và quyền điều khiển chương trình được chuyển đến câu lệnh theo sau vòng lặp. Ví dụ, Ví dụ 9.11: #include void main() { int count1, count2; for (count1= 1,count2 = 0; count1 <= 100; count1++) { printf(“Enter %d Count2: “ count1); scanf(“%d”,count2); if (count2==100) break; } } Kết quả của chương trình trên được minh họa như sau:Một ví dụ về kết quả thực thi chương trình trên như sau: Enter 1 count2: 10 Enter 2 count2: 20 Enter 3 count2: 100 Trong đoạn mã lệnh trên, người dùng có thể nhập giá trị 100 cho jcount2. Tuy nhiên, nếu 100 được nhập vào, vòng lặp kết thúc và điều khiển được chuyển đến câu lệnh kế tiếp. Một điểm khác cần lưu ý là việc sử dụng câu lênh break trong các lệnh lặp lồng nhau. Khi chương trình thực thi đến một lệnh break nằm trong một vòng lặp for lồng bên trong một vòng lặp for khác, quyền điều khiển được chuyển trở về vòng lặp for bên ngoài.Một điểm khác cần lưu ý trong khi sử dụng break là nó tạo ra sư thoát khỏi một vòng lặp bên trong. Điều này có nghĩa là nếu một vòng lặp for lồng bên trong một vòng lặp for khác, và một lệnh break được bắt gặp ở vòng lặp bên trong, điều khiển được chuyển trở về vòng lặp bên ngoài. 9.2.4 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ế tiếp. Khi gặp lệnh này trong chương trình, các câu lệnh còn lại trong thân của vòng lặp được bỏ qua và quyền điều khiển được chuyển đến bước đầu của vòng lặp trong lần lặp kế tiếpLệnh continue kết thúc lần lặp hiện hành và bắt đầu lần lặp kế tiếp. Khi lệnh này được gặp trong chương trình, các câu lệnh còn lại trong thân của vòng lặp được bỏ qua và điều khiển được chuyển đến bước đầu của vòng lặp trong lần lặp kế tiếp. Trong trường hợp vòng lặp for, continue thực hiện biểu thức thay đổi giá trị 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 trình được chuyển đến biểu thức kiểm tra điều kiện. Ví dụTrong trường hợp vòng lặp for, continue thực thi biểu thức định trị lại tham số của vòng lặp và sau đó biểu thức kiểm tra điều kiện được thực thi. Trong trường hợp của lệnh while và do …while, điều khiển chương trình được chuyển đến biểu thức kiểm tra điều kiện. Ví dụ: Ví dụ 9.12: #include void main() { int num; for (num = 1; num <= 100; num++) { if (num % 9 == 0) countinue; printf(“%d\t”, num); } } Chương trình trên in ra tất cả các số từ 1 đến 100 không chia hết cho 9. Kết quả chương trình được trình bày như sau: 1 2 3 4 5 6 7 8 10 11 12 13 14 15 16 17 19 20 21 22 23 24 25 26 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 46 47 48 49 50 51 52 53 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 73 74 75 76 77 78 79 80 82 83 84 85 86 87 88 89 91 92 93 94 95 96 97 98 100 9.3 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 vòng lặp, trong khi exit() được sử dụng để thoát khỏi chương trình. Hàm này sẽ ngay lập tức kết thúc chương trình và quyền điều khiển được chuyển trở 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 trình có được thoả mãn hay không. Cú pháp tổng quát của hàm exit() như sauHàm exit() thường được dùng để kiểm tra một điều kiện bắt buộc cho sự thực thi của một chương trình có thoả hay không. Cú pháp tổng quát của hàm exit() như sau: 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 trì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. Tóm tắt bài học Các cấu trúc vòng lặp sẵn có trong C: Vòng lặp for. Vòng lặp while. Vòng lặp do … while. Trong C, vòng lặp for cho phép sự thực thi các câu lệnh được lặp lại. Nó dùng ba biểu thức, phân cách bởi dấu chấm phẩy, để điều khiển quá trình lặp. Phần thân của vòng lặp có thể là một lệnh đơn hoặc lệnh ghép. Toán tử ‘dấu phẩy’ đôi khi hữu dụng trong các lệnh for. Trong C, đây là toán tử có độ ưu tiên thấp nhất. Phần thân của lệnh do được thực hiện ít nhất một lần. Trong C có bốn lệnh thực hiện sự rẽ nhánh không điều kiện: return, goto, break, và continue. Lệnh break cho phép nhanh chóng thoat khỏi một vòng lặp đơn hoặc một vòng lặp lồng nhau. Câu lệnh continue bắt đầu lần lặp kế tiếp của vòng lặp. Một lệnh goto chuyển điều khiển một câu lệnh bất kỳ trong cùng một hàm trong chương trình C, nó cho phép nhảy vào và ra khỏi các khối lệnh. Hàm exit() kết thúc ngay chương trình và điều khiển được chuyển trở về cho hệ điều hành. Kiểm tra tiến độ học tập …………… cho phép một tập các chỉ thị được thực thi cho đến khi một điều kiện xác định đạt được. A. Vòng lặp B. Cấu trúc C. Toán tử D. Tất cả đều sai. Các vòng lặp …………… kiểm tra điều kiện tai đỉnh của vòng lặp, điều này có nghĩa là đoạn mã lệnh của vòng lặp không được thực thi nếu điều kiện là sai tại điểm bắt đầu. A. vòng lặp while B. vòng lặp for C. vòng lặp do … while D. Tất cả đều sai. Một …………… được sử dụng để phân cách ba phần của biểu thức trong một vòng lặp for. A. dấu phẩy B. dấu chấm phẩy C. dấu gạnh nối D. Tất cả đều sai Vòng lặp …………… kiểm tra điều kiện tại cuối vòng lặp, nghĩa là sau khi vòng lặp được thực thi. A. while B. for C. do … while D. Tất cả đều sai Lệnh …………… thực hiện sự trở về một vị trí mà tại đó hàm đã được gọi. A. exit B. return C. goto D. Tất cả đều sai Lệnh …………… vi phạm qui luật của một ngôn ngữ lập trình cấu trúc. A. exit B. return C. goto D. Tất cả đều sai Hàm …………… kết thúc ngay chương trình và điều khiển được chuyển trở về cho hệ điều hành. A. exit B. return C. goto D. Tất cả đều sai Bài tập tự làm Viết chương trình in ra dãy số 100, 95, 90, 85, ….., 5. Nhập vào hai 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. Viết chương trình in ra chuỗi Fibonaci (1, 1, 2, 3, 5, 8, 13,…) Viết chương trình để hiển thị theo mẫu dưới đây: (a) 1 12 123 1234 12345 (b) 12345 1234 123 12 1 Viết chương trình in lên màn hình như sau: ******* ****** ***** **** *** ** *
File đính kèm:
- Lập trình C Aptech - Bài 9 Vòng lặp.doc