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] Định giá biểu thức hằng của #if

    Chỉ thị #if BIEUTHUC của C yêu cầu BIEUTHUC là một biểu thức hằng nguyên được định giá tại thời điểm tiền xử lý. Cho một tập mmm macro đã được định nghĩa, mỗi macro gắn với một giá trị nguyên (có thể âm), hãy định giá qqq biểu thức dạng này.

    Biểu thức chỉ gồm các thành phần sau (các token trong biểu thức luôn được phân tách bởi đúng một khoảng trắng — kể cả dấu ngoặc):

    • số nguyên (có thể có dấu - phía trước, coi như một token riêng biệt hoặc là toán tử một ngôi);
    • tên một macro: nếu macro đó có trong tập đã cho, giá trị của token là giá trị nguyên gắn với nó; nếu không có trong tập, theo đúng chuẩn C, macro không xác định được coi bằng 000;
    • defined ( NAME ) hoặc defined NAME: cho giá trị 111 nếu NAME có trong tập macro đã cho (bất kể giá trị của nó là gì, kể cả 000), ngược lại 000;
    • toán tử một ngôi: ! (phủ định logic), -, +;
    • toán tử hai ngôi, theo đúng thứ tự ưu tiên tăng dần của C: ||, &&, == !=, < > <= >=, + -, * / %;
    • dấu ngoặc ( ) để nhóm.

    Phép chia / và phép chia lấy dư % thực hiện theo kiểu C với số nguyên: thương làm tròn về 000 (ví dụ −7/2=−3-7 / 2 = -3−7/2=−3), và a%ba \mathbin{\%} ba%b thoả a=(a/b)⋅b+(a%b)a = (a/b) \cdot b + (a \mathbin{\%} b)a=(a/b)⋅b+(a%b) với phần dư luôn cùng dấu với aaa (hoặc bằng 000). Đề bảo đảm không có phép chia cho 000.

    Một biểu thức được coi là đúng (TRUE) nếu giá trị của nó khác 000, và sai (FALSE) nếu bằng 000.

    • Định dạng đầu vào:

      Dòng đầu tiên chứa số nguyên mmm (0≤m≤500 \le m \le 500≤m≤50) — số macro đã định nghĩa.

      mmm dòng tiếp theo, mỗi dòng gồm NAME VALUE (NAME là tên macro, VALUE là số nguyên, cách nhau một khoảng trắng).

      Dòng tiếp theo chứa số nguyên qqq (1≤q≤501 \le q \le 501≤q≤50) — số biểu thức cần định giá.

      qqq dòng tiếp theo, mỗi dòng là một biểu thức mà mọi token (số, tên macro, defined, (, ), toán tử) đều cách nhau bởi đúng một khoảng trắng.

    • Định dạng đầu ra:

      In ra qqq dòng, mỗi dòng là TRUE nếu biểu thức tương ứng khác 000, hoặc FALSE nếu bằng 000.

    Ví dụ:

    Đầu vào:

    3
    A 1
    B 0
    C -3
    4
    A && B
    A || B
    A + C
    ( A + C ) * 2
    

    Đầu ra:

    FALSE
    TRUE
    TRUE
    TRUE
    

    Đầu vào:

    2
    A 5
    B 0
    3
    defined ( A )
    defined ( C )
    ! defined ( B )
    

    Đầu ra:

    TRUE
    FALSE
    FALSE
    

    Đang tải editor...