Các lượt nộp
    Danh sách bài
    Trang chủ
    Báo lỗi

    solution

    Đề bài: [Trình biên dịch] Biên dịch Có Điều Kiện Không Lồng Nhau

    Chỉ thị tiền xử lý điều kiện cho phép giữ lại hoặc loại bỏ các dòng mã nguồn tuỳ theo một macro có được định nghĩa hay không. Xét tập con đơn giản gồm 4 chỉ thị, xuất hiện thành các cặp không lồng nhau (không có #ifdef/#ifndef nào nằm trong một #ifdef/#ifndef khác):

    • #ifdef TÊN — giữ các dòng tiếp theo (đến #else hoặc #endif tương ứng) nếu TÊN nằm trong tập macro đã định nghĩa.
    • #ifndef TÊN — giữ các dòng tiếp theo nếu TÊN không nằm trong tập macro đã định nghĩa.
    • #else — đảo ngược điều kiện giữ/loại của khối hiện tại (tuỳ chọn, có thể không xuất hiện).
    • #endif — kết thúc khối điều kiện.

    Các dòng không phải chỉ thị là dòng mã nguồn thông thường, được giữ nguyên nếu nằm ngoài mọi khối điều kiện, hoặc giữ/loại theo quy tắc trên nếu nằm trong khối.

    Hãy in ra mã nguồn sau khi xử lý (loại bỏ mọi dòng chỉ thị, chỉ giữ lại các dòng mã nguồn được kích hoạt), theo đúng thứ tự ban đầu.

    Ví dụ: Với macro đã định nghĩa {DEBUG} và chương trình #ifdef DEBUG / log(x) / #else / prod(x) / #endif, kết quả in ra chỉ có dòng log(x).

    • Định dạng đầu vào:
      • Dòng 1: số nguyên kkk (0≤k≤1000 \le k \le 1000≤k≤100) — số macro đã được định nghĩa.
      • Dòng 2: kkk tên macro cách nhau bởi khoảng trắng (nếu k=0k=0k=0, đây là dòng trống).
      • Dòng 3: số nguyên nnn (0≤n≤10000 \le n \le 10000≤n≤1000) — số dòng chương trình.
      • nnn dòng tiếp theo: mỗi dòng là một dòng chương trình gốc (có thể là chỉ thị #ifdef TÊN, #ifndef TÊN, #else, #endif, hoặc dòng mã nguồn bất kỳ khác không rỗng). Dữ liệu đảm bảo các cặp #ifdef/#ifndef ... #endif hợp lệ, không lồng nhau, mỗi khối có tối đa một #else.
    • Định dạng đầu ra:

      In ra các dòng mã nguồn còn được giữ lại, theo đúng thứ tự, mỗi dòng một dòng. Nếu không có dòng nào được giữ, không cần in dòng nào (in ra chuỗi rỗng).

    Ví dụ:

    Đầu vào:

    1
    DEBUG
    4
    #ifdef DEBUG
    log(x)
    #endif
    done

    Đầu ra:

    log(x)
    done
    

    Đầu vào:

    0
    
    3
    alpha
    beta
    gamma

    Đầu ra:

    alpha
    beta
    gamma
    

    Đang tải editor...