Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> C++

In hình thoi (Diamond) trong C++

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-i khoảng trắng + 2*i-1 sao.
  • Nửa dưới: Dòng i (1-indexed từ 1 đến n-1): i khoảng trắng + 2*(n-i)-1 sao.

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

  1. In hình thoi rỗng (hollow diamond).
  2. In hình thoi với ký tự người dùng nhập.
  3. In hình thoi xoay 90 độ (ngang).
  4. In nhiều hình thoi lồng nhau.
  5. 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.