Bài tập kinh điển về lồng vòng lặp (nested loops): in hình thoi (diamond) bằng ký tự * dựa trên số hàng nhập vào.
Phân tích hình thoi
Hình thoi có 2*n - 1 dòng (n = số hàng nửa trên).
- Nửa trên (kể cả giữa): Dòng
i(1-indexed):n-ikhoảng trắng +2*i-1sao. - Nửa dưới: Dòng
i(1-indexed từ 1 đến n-1):ikhoảng trắng +2*(n-i)-1sao.
Chương trình C++ cơ bản
#include <iostream>
using namespace std;
int main() {
int n;
cout << "Nhap so hang nua tren (n): ";
cin >> n;
if (n <= 0) { cout << "n phai > 0\n"; return 1; }
// Nua tren (bao gom dong giua)
for (int i = 1; i <= n; ++i) {
// In khoang trang
for (int s = 0; s < n - i; ++s) cout << ' ';
// In sao
for (int s = 0; s < 2*i - 1; ++s) cout << '*';
cout << '\n';
}
// Nua duoi
for (int i = 1; i < n; ++i) {
for (int s = 0; s < i; ++s) cout << ' ';
for (int s = 0; s < 2*(n - i) - 1; ++s) cout << '*';
cout << '\n';
}
return 0;
}
Kết quả n = 4
* *** ***** ******* ***** *** *
Phiên bản nâng cao: Tùy chỉnh ký tự, căn giữa, rỗng bên trong
void printDiamond(int n, char ch = '*', bool hollow = false) {
if (n <= 0) return;
auto printLine = [&](int spaces, int stars) {
cout << string(spaces, ' ');
if (hollow && stars > 2) {
cout << ch << string(stars - 2, ' ') << ch;
} else {
cout << string(stars, ch);
}
cout << '\n';
};
// Top
for (int i = 1; i <= n; ++i)
printLine(n - i, 2*i - 1);
// Bottom
for (int i = 1; i < n; ++i)
printLine(i, 2*(n - i) - 1);
}
int main() {
printDiamond(5, '#', false); // Đặc
cout << "\n---\n";
printDiamond(5, '@', true); // Rỗng
return 0;
}
Kết quả nâng cao
#
###
#####
#######
#########
#######
#####
###
#
---
@
@ @
@ @
@ @
@ @
@ @
@ @
@ @
@
Mẹo thuật toán
- Dùng
string(count, char)constructor thay vì lặp in từng ký tự (ngắn gọn, nhanh). - Tách hàm
printLineđể tránh lặp code. - Tổng quát hóa: hàm nhận
n, char, hollowđể tái sử dụng. - Có thể mở rộng: in tam giác, hình vuông, hexagon, trái tim...
Bài tập mở rộng
- In hình thoi rỗng (hollow diamond).
- In hình thoi với ký tự người dùng nhập.
- In hình thoi xoay 90 độ (ngang).
- In nhiều hình thoi lồng nhau.
- In hình thoi bằng đệ quy.
In hình dạng bằng ký tự là bài tập tuyệt vời để luyện tư duy lồng vòng lặp, chỉ số (index), và xử lý đối xứng — kỹ năng nền tảng cho thuật toán và đồ họa máy tính cơ bản.