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] Trình thông dịch mã ba địa chỉ tuyến tính

    Cho một đoạn mã ba địa chỉ (TAC) tuyến tính (không có nhãn, không có lệnh rẽ nhánh), gồm nnn dòng lệnh, mỗi dòng có một trong hai dạng:

    • x = a (gán trực tiếp)
    • x = a op b (phép hai ngôi, op ∈{+,−,∗,/}\in \{+, -, *, /\}∈{+,−,∗,/})

    trong đó x luôn là tên biến, còn a, b là hằng số nguyên (có thể âm, ví dụ -7) hoặc tên biến. Nếu một biến được dùng trước khi từng được gán, giá trị của nó được coi là 000.

    Phép chia / là phép chia nguyên làm tròn về 0 (truncation toward zero), ví dụ −7/2=−3-7 / 2 = -3−7/2=−3 và −1/3=0-1 / 3 = 0−1/3=0. Đề bảo đảm không có phép chia cho 000.

    Hãy thực thi tuần tự nnn dòng lệnh theo đúng thứ tự xuất hiện, sau đó với mỗi biến được truy vấn, in ra giá trị cuối cùng của nó.

    Ví dụ: với đoạn mã a=-7; b=2; c=a/b; d=a*b; e=d+c và truy vấn c d e, kết quả là c=-3, d=-14, e=-17.

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

      Dòng 1: số nguyên nnn — số lệnh TAC. nnn dòng tiếp theo: các lệnh TAC theo đúng 2 dạng mô tả ở trên (các token cách nhau đúng 1 khoảng trắng). Dòng tiếp theo: số nguyên kkk — số biến cần truy vấn. Nếu k>0k>0k>0: một dòng chứa kkk tên biến cách nhau bởi khoảng trắng, theo đúng thứ tự cần in ra kết quả (có thể trùng lặp). Nếu k=0k=0k=0, dòng này có thể để trống hoặc không xuất hiện.

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

      In kkk dòng, mỗi dòng có dạng <ten_bien> = <gia_tri>, theo đúng thứ tự các biến được truy vấn (nếu k=0k=0k=0 thì không in dòng nào).

    Ví dụ:

    Đầu vào:

    1
    x = 5
    1
    x
    

    Đầu ra:

    x = 5
    

    Đầu vào:

    5
    a = -7
    b = 2
    c = a / b
    d = a * b
    e = d + c
    3
    c d e
    

    Đầu ra:

    c = -3
    d = -14
    e = -17
    

    Đang tải editor...