tek4

[Lập trình C từ 0 đến 1] Bài 11. Vòng lặp for trong C

by - September. 21, 2021
Kiến thức
Học
<h1>[Lập tr&igrave;nh C từ 0 đến 1] B&agrave;i 11. V&ograve;ng lặp for trong C</h1> <p>B&agrave;i viết &ldquo;[Lập tr&igrave;nh C từ 0 đến 1] B&agrave;i 11. V&ograve;ng lặp for trong C&rdquo; l&agrave; b&agrave;i viết tiếp theo nằm trong series hướng dẫn học lập tr&igrave;nh C của <a href="https://tek4.vn/" target="_blank" rel="noopener">tek4.vn</a>.</p> <p>Độc giả c&oacute; thể tham khảo c&aacute;c b&agrave;i viết kh&aacute;c trong series b&agrave;i viết n&agrave;y&nbsp;<a href="https://tek4.vn/lap-trinh-c-co-ban-den-nang-cao/" target="_blank" rel="noopener">tại đ&acirc;y</a></p> <p>B&agrave;i viết n&agrave;y sẽ cung cấp đến độc giả c&aacute;c cấu tr&uacute;c v&ograve;ng lặp for v&agrave; c&aacute;ch sử dụng, ứng dụng trong c&aacute;c b&agrave;i tập. Trong loạt b&agrave;i hướng dẫn [Lập tr&igrave;nh C từ 0 đến 1], IDE được sử dụng l&agrave; Code::Blocks</p> <h2><span id="1_Vi_du_mo_dau">V&iacute; dụ mở đầu</span></h2> <p>Việc in ra t&ecirc;n của bạn rất đơn giản phải kh&ocirc;ng. Một chương tr&igrave;nh viết rất đơn giản.</p> <pre class="EnlighterJSRAW" data-enlighter-language="c">#include &lt;stdio.h&gt; int main() { &nbsp;&nbsp;&nbsp;&nbsp;printf("Nguyen Cog Thanh\n"); &nbsp;&nbsp;&nbsp;&nbsp;return 0; }</pre> <div> <div id="highlighter_185075" class="syntaxhighlighter cpp">Vậy b&acirc;y giờ t&ocirc;i muốn bạn in ra 10 lần t&ecirc;n bạn?</div> <div> <pre class="EnlighterJSRAW" data-enlighter-language="generic">#include &lt;stdio.h&gt; int main() { printf("Nguyen Cong Thanh\n"); printf("Nguyen Cong Thanh\n"); printf("Nguyen Cong Thanh\n"); printf("Nguyen Cong Thanh\n"); printf("Nguyen Cong Thanh\n"); printf("Nguyen Cong Thanh\n"); printf("Nguyen Cong Thanh\n"); printf("Nguyen Cong Thanh\n"); printf("Nguyen Cong Thanh\n"); printf("Nguyen Cong Thanh\n"); &nbsp;&nbsp;&nbsp;&nbsp;return 0; }</pre> <p>&nbsp;</p> </div> </div> <p>Kh&aacute; đơn giản, chỉ cần copy th&agrave;nh 10 d&ograve;ng printf l&agrave; xong. Nhưng nếu kh&ocirc;ng phải 10, m&agrave; l&agrave; 1000 hoặc nhiều hơn? R&otilde; r&agrave;ng việc copy l&agrave; kh&ocirc;ng khả thi.</p> <p>Trong thực tế, c&aacute;c phần mềm sẽ c&oacute; những c&ocirc;ng việc phải lặp đi lặp lại nhiều lần giống như v&iacute; dụ tr&ecirc;n. Hoặc v&iacute; dụ như phần mềm của bạn cần in một danh s&aacute;ch c&aacute;c nh&acirc;n vi&ecirc;n, mỗi nh&acirc;n vi&ecirc;n c&oacute; th&ocirc;ng tin (nội dung) kh&aacute;c nhau nhưng cấu tr&uacute;c th&igrave; rất giống nhau. Hoặc đơn giản hơn l&agrave; bạn lướt facebook v&agrave; thấy c&aacute;c tin b&agrave;i từ bạn b&egrave; của m&igrave;nh, c&aacute;c tin n&agrave;y kh&ocirc;ng giống nhau về nội dung nhưng cấu tr&uacute;c th&igrave; rất giống nhau.</p> <p>Để thực hiện được những c&ocirc;ng việc cần lặp lại nhiều lần như thế, ch&uacute;ng ta sẽ sử dụng cấu tr&uacute;c v&ograve;ng lặp gồm&nbsp;<strong>for, while, do-while</strong>. B&agrave;i n&agrave;y ch&uacute;ng ta sẽ t&igrave;m hiểu về v&ograve;ng lặp&nbsp;<strong>for</strong>.</p> <p>Ch&uacute;ng ta sẽ sửa lại v&iacute; dụ in 10 lần t&ecirc;n bạn như sau:</p> <pre class="EnlighterJSRAW" data-enlighter-language="c">#include &lt;stdio.h&gt; int main() { &nbsp;&nbsp;&nbsp;&nbsp;int i; &nbsp;&nbsp;&nbsp;&nbsp;for (i = 1; i &lt;= 10; i++) &nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("Nguyen Cong Thanh\n"); &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;return 0; }</pre> <div> <div id="highlighter_480427" class="syntaxhighlighter cpp">Như code tr&ecirc;n, t&ocirc;i đ&atilde; sử dụng <strong>v&ograve;ng lặp for</strong>&nbsp;để thực hiện c&ocirc;ng việc in ra t&ecirc;n của m&igrave;nh 10 lần, với 1000 lần cũng thật đơn giản khi t&ocirc;i thay số 10 th&agrave;nh số 1000 (bạn c&oacute; thể thử). Nh&igrave;n v&agrave;o code bạn cũng c&oacute; thể h&igrave;nh dung cơ bản về việc ch&uacute;ng ta l&agrave;m.</div> </div> <h2><span id="2_Cau_truc_vong_for">Cấu tr&uacute;c v&ograve;ng for</span></h2> <p><img class="aligncenter wp-image-7986 size-full" src="https://tek4.vn/wp-content/uploads/2021/01/Capture-191.png" alt="" width="489" height="459" /></p> <center><em>C&uacute; ph&aacute;p, lưu đồ v&agrave; c&aacute;ch hoạt động của v&ograve;ng lặp for</em></center> <p>&nbsp;</p> <p>Nh&igrave;n v&agrave;o h&igrave;nh tr&ecirc;n ta thấy v&ograve;ng for c&oacute; một c&uacute; ph&aacute;p v&agrave; c&aacute;ch hoạt động kh&aacute; r&otilde; r&agrave;ng v&agrave; dễ hiểu. Tuy nhi&ecirc;n c&aacute;c bạn cần lưu &yacute;:</p> <ul> <li>Sau lệnh for kh&ocirc;ng c&oacute; chấm phẩy.</li> <li>3 biểu thức của v&ograve;ng lặp for ngăn c&aacute;ch nhau bằng dấu chấm phẩy (<strong>;</strong>), c&aacute;c biểu thức c&oacute; thể vắng mặt 1,2 hoặc cả 3 nhưng vẫn phải c&oacute; dấy chấm phẩy n&agrave;y.</li> <li>Biểu thức 1 bao giờ cũng chỉ được t&iacute;nh to&aacute;n một lần khi gọi thực hiện for.</li> <li>Biểu thức 2, 3 v&agrave; th&acirc;n for c&oacute; thể thực hiện lặp lại nhiều lần.</li> <li>Biểu thức 1, 2, 3 phải ph&acirc;n c&aacute;ch bằng dấu chấm phẩy ( ; ), c&aacute;c biểu thức c&oacute; thể vắng mặt 1,2 hoặc cả 3 nhưng vẫn phải c&oacute; dấy chấm phẩy n&agrave;y.</li> <li>Nếu biểu thức 2 kh&ocirc;ng c&oacute;, v&ograve;ng for được xem l&agrave; lu&ocirc;n lu&ocirc;n đ&uacute;ng. Muốn tho&aacute;t khỏi v&ograve;ng lặp for phải d&ugrave;ng một trong lệnh break, goto hoặc return.</li> <li>Với mỗi biểu thức c&oacute; thể viết th&agrave;nh một d&atilde;y biểu thức con ph&acirc;n c&aacute;ch nhau bởi dấu phẩy. Khi đ&oacute; c&aacute;c biểu thức con được x&aacute;c định từ tr&aacute;i sang phải. T&iacute;nh đ&uacute;ng sai của d&atilde;y biểu thức con trong biểu thức thứ 2 được x&aacute;c định bởi biểu thức con cuối c&ugrave;ng.</li> <li>Trong th&acirc;n for (khối lệnh) c&oacute; thể chứa một hoặc nhiều cấu tr&uacute;c điều khiển kh&aacute;c, v&ograve;ng lặp kh&aacute;c.</li> <li>Khi gặp lệnh break, cấu tr&uacute;c lặp s&acirc;u nhất sẽ tho&aacute;t ra.</li> <li>Trong th&acirc;n for c&oacute; thểd&ugrave;ng lệnh goto để tho&aacute;t khỏi v&ograve;ng lặp đến vị tr&iacute; mong muốn.</li> <li>Trong th&acirc;n for c&oacute; thể sử dụng return để trở về một h&agrave;m n&agrave;o đ&oacute;.</li> <li>Trong th&acirc;n for c&oacute; thể sử dụng lệnh continue để chuyển đến đầu v&ograve;ng lặp (bỏ qua c&aacute;c c&acirc;u lệnh c&ograve;n lại trong th&acirc;n).</li> </ul> <p>Quay trở lại code của v&iacute; dụ tr&ecirc;n:</p> <div> <div id="highlighter_686187" class="syntaxhighlighter cpp"> <pre class="EnlighterJSRAW" data-enlighter-language="generic">#include &lt;stdio.h&gt; int main() { &nbsp;&nbsp;&nbsp;&nbsp;int i; &nbsp;&nbsp;&nbsp;&nbsp;for (i = 1; i &lt;= 10; i++) &nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("Nguyen Cong Thanh\n"); &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;return 0; }</pre> <p>Qu&aacute; tr&igrave;nh hoạt động như sau:</p> </div> </div> <ul> <li>Bước 1: Chạy biểu thức 1 tức l&agrave; g&aacute;n i = 1.</li> <li>Bước 2: Chạy biểu thức 2 tức l&agrave; kiểm tra i &lt;= 10 kh&ocirc;ng. Do i = 1 n&ecirc;n c&aacute;i n&agrave;y đ&uacute;ng =&gt; Chạy khối lệnh tức l&agrave; in ra t&ecirc;n.</li> <li>Bước 3: Chạy biểu thức 3 tức l&agrave; tăng i l&ecirc;n 1 đơn vị. Giờ th&igrave; i = 2.</li> <li>Bước 4: Quay lại biểu thức 2. Kiểm tra i &lt; 10 kh&ocirc;ng. Do i = 2 n&ecirc;n vẫn đ&uacute;ng =&gt; Chạy khối lệnh, tức l&agrave; in ra t&ecirc;n.</li> <li>Bước 5: Chạy biểu thức 3 tức tăng i l&ecirc;n 1. Giờ i = 3.</li> <li>Bước 6. Quay lại biểu thức 2,&hellip;</li> <li>Bước&hellip;.</li> <li>Bước x: Chạy biểu thức 3, tăng i l&ecirc;n 1. Giờ i = 10.</li> <li>Bước x+1: Quay lại biểu thức 2 tức kiểm tra i &lt;= 10. Vẫn đ&uacute;ng =&gt; Chạy khối lệnh in ra t&ecirc;n.</li> <li>Bước x+2: Chạy biểu thức 3, tăng i l&ecirc;n 1. Giờ i = 11.</li> <li>Bước x+3: Quay lại biểu thức 2, kiểm tra i &lt;=10. Giờ th&igrave; sai v&igrave; i đang l&agrave; 11 =&gt; Tho&aacute;t khỏi v&ograve;ng for. Thực hiện lệnh tiếp theo ngang h&agrave;ng v&ograve;ng for (lệnh return 0 b&ecirc;n dưới).</li> </ul> <h3>V&iacute; dụ</h3> <table width="70%"> <tbody> <tr> <td> <pre class="EnlighterJSRAW" data-enlighter-language="c">/*Chương tr&igrave;nh minh họa v&ograve;ng for */ #include &lt;stdio.h&gt; void&nbsp; main() { int time;&nbsp;/* Biến&nbsp;đếm. */ /* V&ograve;ng lặp bắt&nbsp;đầu ở đ&acirc;y. */ for(time = 1; time &lt;= 5; time = time + 1) printf("Gi&aacute; trị của biến&nbsp;đếm time = %d \n",time); /* V&ograve;ng lặp dừng ở&nbsp;đ&acirc;y. */ printf("Kết th&uacute;c v&ograve;ng lặp."); }</pre> </td> </tr> <tr> <td> <p>Kết quả:</p> <p>Gi&aacute; trị của biến&nbsp;đếm time =1</p> <p>Gi&aacute; trị của biến&nbsp;đếm time =2</p> <p>Gi&aacute; trị của biến&nbsp;đếm time =3</p> <p>Gi&aacute; trị của biến&nbsp;đếm time =4</p> <p>Gi&aacute; trị của biến&nbsp;đếm time =5</p> <p>Kết th&uacute;c v&ograve;ng lặp.</p> </td> </tr> </tbody> </table> <h3>B&agrave;i tập minh họa</h3> <table width="70%"> <tbody> <tr> <td> <pre class="EnlighterJSRAW" data-enlighter-language="c">/* Sử dụng cấu tr&uacute;c for&nbsp;để giải quyết b&agrave;i to&aacute;n&nbsp;đổi tiền: T&igrave;m tất cả c&aacute;c c&aacute;ch&nbsp;đổi 1000 đồng bằng c&aacute;c tờ giấy bạc 500 đ, 200đ, 100 đ. */ #include &lt;stdio.h&gt; void main() { int so_cach,to_500,to_200,to_100; so_cach=0; for (to_500=0;to_500&lt;=2; to_500++) for (to_200=0;to_200&lt;=5; to_200++) for (to_100=0;to_100&lt;=10; to_100++) if ( 100*to_100+200*to_200+500*to_500==1000) { so_cach++; printf("\n Tien 1000 d="); if (to_100) printf(" %2dX100d",to_100); if (to_200) printf(" %2dX200d",to_200); if (to_500) printf(" %2dX500d",to_500); } printf("\n Co tat ca %d cach", so_cach); }</pre> <p>&nbsp;</p> </td> </tr> <tr> <td> <p>Kết quả</p> <p>Tien 1000 d= 10X100 d</p> <p>Tien 1000 d= 8X100 d 1X200 d</p> <p>Tien 1000 d= 6X100 d 2X200 d</p> <p>Tien 1000 d= 4X100 d 3X200 d</p> <p>Tien 1000 d= 2X100 d 4X200 d</p> <p>Tien 1000 d= 5X200 d</p> <p>Tien 1000 d= 5X100 d 1X500 d</p> <p>Tien 1000 d= 3X100 d 1X200 d 1X500 d</p> <p>Tien 1000 d= 1X100 d 2X200 d 1 X500 d</p> <p>Tien 1000 d= 2X500 d</p> <p>Co tat ca 10 cach</p> </td> </tr> </tbody> </table> <p>&nbsp;</p> <p>Ch&uacute;ng ta sẽ kết th&uacute;c &ldquo;[Lập tr&igrave;nh C từ 0 đến 1] B&agrave;i 11. V&ograve;ng lặp for trong C&rdquo; trong series [Lập tr&igrave;nh C từ 0 đến 1] ở đ&acirc;y. H&atilde;y c&ugrave;ng đ&oacute;n xem &ldquo;B&agrave;i 12. V&ograve;ng lặp while v&agrave; do&hellip;while&rdquo;.</p> <p>H&atilde;y để lại b&igrave;nh luận v&agrave; theo d&otilde;i series b&agrave;i viết: &ldquo;<a href="https://tek4.vn/tu-khoa/lap-trinh-c-tu-0-den-1/">Lập tr&igrave;nh C từ 0 đến 1</a>&rdquo; để tiếp tục cập nhật những th&ocirc;ng tin mới nhất.</p>