Tiếp theo của dạng bài vẽ pattern sử dụng vòng lặp, hôm nay chúng ta sẽ đến với 2 bài tập (44 và 45) được trích trong quyển "250 bài tập kỹ thuật lập trình C" của tác giả Dương Thiên Tứ.
Các dạng bài vẽ tam giác trong tiếng Anh có tên gọi "pyramid pattern". Các bạn có thể google từ khoá này để tìm hiểu thêm về các đề bài khác, rất đa dạng và phong phú.
Vẽ tam giác bằng ký tự '*'
Bài thứ nhất là một bài tập huyền thoại của môn kỹ thuật lập trình: vẽ tam giác cân đặc và rỗng bằng ký tự '*' có độ cao n nhập từ bàn phím.
n=9
*
* * *
* * * * *
* * * * * * *
* * * * * * * * *
* * * * * * * * * * *
* * * * * * * * * * * * *
* * * * * * * * * * * * * * *
* * * * * * * * * * * * * * * * *
*
* *
* *
* *
* *
* *
* *
* *
* * * * * * * * * * * * * * * * *
Bài tập này không khó nhưng rất tốt để rèn luyện tư duy phân tích khi mới bắt đầu học lập trình. Điểm chung của cả 2 tam giác đặc và rỗng là đều có độ cao bằng n - 1 và độ dài cạnh đáy bằng 2n - 1.
Dạng bài này chắc chắn phải sử dụng 2 vòng lặp lồng nhau.
Đối với tam giác đặc, vòng lặp đầu tiên sẽ quét theo hàng từ i=0 tới n - 1, còn vòng lặp thứ hai sẽ quét theo cột từ j=0 tới n - 1 + i. Khi cột j < n - 1 - i thì chúng ta in khoảng trắng, ngược lại in ký tự '*'.
Đối với tam giác cân, cấu trúc vòng lặp vẫn như cũ, chỉ khác là lần này chúng ta chỉ in ký tự '*' khi j = n - 1 - i (đường chéo trái) hoặc j = n - 1 + i (đường chéo phải) hoặc khi i = n - 1 (cạnh đáy).
#include <stdio.h>
int main()
{
int n;
printf("n=");
scanf("%d", &n);
for (int i = 0; i < n; i++, putchar('\n'))
for (int j = 0; j <= n - 1 + i; j++)
j < (n - 1 - i) ? printf(" ") : printf("* ");
for (int i = 0; i < n; i++, putchar('\n'))
for (int j = 0; j <= n - 1 + i; j++)
j == (n - 1 - i) || (j == n - 1 + i) || (i == n - 1) ? printf("* ") : printf(" ");
return 0;
}
Vẽ hai tam giác đối đỉnh
Vẽ hai tam giác cân có độ cao n nhập từ bàn phím đối đỉnh nhau như bên dưới:
n=7
* * * * * * * * * * * * *
* * * * * * * * * * *
* * * * * * * * *
* * * * * * *
* * * * *
* * *
*
* * *
* * * * *
* * * * * * *
* * * * * * * * *
* * * * * * * * * * *
* * * * * * * * * * * * *
Lời giải:
#include <stdio.h>
int main()
{
int n;
printf("n=");
scanf("%d", &n);
for (int i = 0; i < 2 * n - 1; i++, putchar('\n'))
for (int j = 0; j < 2 * n - 1; j++)
(j >= i && j < 2 * n - 1 - i) || (j >= 2*n - 2 - i && j <= i) ? printf("* ") : printf(" ");
return 0;
}
Vẽ hai tam giác số đối đỉnh theo chiều ngang
Tương tự như bài trên, hãy vẽ hai tam giác số đối đỉnh theo chiều ngang.
n=9
1 9
1 2 8 9
1 2 3 7 8 9
1 2 3 4 6 7 8 9
1 2 3 4 5 6 7 8 9
1 2 3 4 6 7 8 9
1 2 3 7 8 9
1 2 8 9
1 9
Lời giải:
#include <stdio.h>
int main()
{
int n;
printf("n=");
scanf("%d", &n);
for (int i = 0; i < n; i++, putchar('\n'))
for (int j = 0; j < n; j++)
(j > i && j < n - 1 - i) || (j > n - 1 - i && j < i) ? printf(" ") : printf("%d ", j + 1);
return 0;
}