Với các bạn đang học Nhập môn lập trình thì bài tập vòng lặp ngoài giúp làm quen với cách dùng vòng lặp còn giúp phát triển tư duy lập trình, giải thuật. Mình sẽ giới thiệu một số dạng bài tập vòng lặp cơ bản, một số ví dụ cùng với hướng giải quyết. Tất cả code tham khảo đều được viết dưới dạng hàm trong ngôn ngữ C/C++.
Ở Phần 1 mình sẽ hướng dẫn cách làm dạng bài vẽ hình. Các dạng bài khác sẽ được trình bày ở các phần tiếp theo.
Bài 1: Vẽ hình chữ nhật đặc có chiều dài n và chiều rộng m. Ví dụ: m = 4, n = 5
Bài 2: Vẽ hình chữ nhật rỗng chiều dài n và chiều rộng m. Ví dụ: m = 4, n = 5
Bài 3: Vẽ tam giác vuông cân đặc có chiều cao h. Ví dụ: h = 4
Bài 4: Vẽ tam giác vuông cân rỗng có chiều cao h. Ví dụ: h = 5
Bài 5: Vẽ tam giác cân đặc có chiều cao h. Ví dụ: h = 5
Bài 6: Vẽ tam giác cân rỗng có chiều cao h. Ví dụ: h = 5
Mời các bạn xem tiếp phần 2
Dạng 1: Vẽ hình
Cách giải quyết chung nhất của dạng này là duyệt hình theo ma trận và xác định vị trí đang xét có thuộc hình hay không.Bài 1: Vẽ hình chữ nhật đặc có chiều dài n và chiều rộng m. Ví dụ: m = 4, n = 5
* * * * * * * * * * * * * * * * * * * *Hướng làm: Cứ duyệt hết ma trận và in ra dấu * thôi.
1
2
3
4
5
6
7
8
9
| void ChuNhatDac( int m, int n) { for ( int i = 1; i <= m; ++i) { for ( int j = 1; j <= n; ++j) printf ( "* " ); printf ( "\n" ); } } |
Bài 2: Vẽ hình chữ nhật rỗng chiều dài n và chiều rộng m. Ví dụ: m = 4, n = 5
* * * * * * * * * * * * * *Hướng làm: Ta phải xác định được vị trí nào in dấu * và vị trí in dấu cách. Gọi biến i là biến duyệt dòng, biến j là biết duyệt cột thì ta nhận thấy những dòng in dấu * là i = 1, i = m, j = 1, j = n.
1
2
3
4
5
6
7
8
9
10
11
12
| void ChuNhatRong( int m, int n) { for ( int i = 1; i <= m; i++) { for ( int j = 1; j <= n; j++) if (i == 1 || j == 1 || i == m || j == n) printf ( "* " ); else printf ( " " ); printf ( "\n" ); } } |
* * * * * * * * * *Hướng làm: Gọi i là biến duyệt dòng, j là biến duyệt cột thì ta thấy số dấu * mỗi dòng tăng đều theo i. Vậy sẽ in dấu * ở những vị trí j <= i.
1
2
3
4
5
6
7
8
9
| void TamGiacVuongCanDac( int h) { for ( int i = 1; i <= h; i++) { for ( int j = 1; j <= i; j++) printf ( "* " ); printf ( "\n" ); } } |
* * * * * * * * * * * *Hướng làm: Cách làm tương tự bài 3 nhưng ta phải xác định đoạn in dấu * và vị trí in dấu cách. Nhìn ví dụ ta nhận thấy các đoạn in dấu * là i = h, j = 1 và j = i.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
| void TamGiacVuongCanRong( int h) { for ( int i = 1; i <= h; i++) { for ( int j = 1; j <= i; j++) { if (j == 1 || j == i || i == h) printf ( "* " ); else printf ( " " ); } printf ( "\n" ); } } |
* * * * * * * * * * * * * * * * * * * * * * * * *Hướng làm: Nhìn ví dụ ta nhận thấy tam giác cân này có chiều cao h thì có đáy là 2h-1. Vì vậy ta dùng 2 biến m và n để xác định khoảng sẽ in dấu *. m và n ban đầu sẽ bằng h, sau đó m sẽ giảm và n sẽ tăng để mở rộng khoảng in dấu * ra đến đáy.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
| void TamGiacCanDac( int h) { int m = h, n = h; for ( int i = 1; i <= h; i++) { for ( int j = 1; j <= 2 * h - 1; j++) { if (j >= m && j <= n) printf ( "*" ); else printf ( " " ); } m--; n++; printf ( "\n" ); } } |
* * * * * * * * * * * * * * * *Hướng làm: Tương tự cách làm của bài 5 nhưng ta chỉ cần xác định đoạn in dấu *. Các đoạn in dấu * là i = h, j = m và j = n.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
| void TamGiacCanRong( int h) { int m = h, n = h; for ( int i = 1; i <= h; i++) { for ( int j = 1; j <= 2 * h - 1; j++) { if (j == m || j == n || i== h) printf ( "*" ); else printf ( " " ); } m--; n++; printf ( "\n" ); } } |
Mời các bạn xem tiếp phần 2
http://cunglaptrinh.blogspot.com/
0 nhận xét:
Đăng nhận xét