Một lỗi kinh điển khi dùng macro có tham số (function-like macro) trong C là quên đặt ngoặc bảo vệ quanh tham số và toàn bộ thân macro: tiền xử lý chỉ thay thế văn bản thuần túy, không hề biết đến thứ tự ưu tiên toán tử.
Cho n định nghĩa macro dạng NAME(p_1,p_2,\dots,p_k)=BODY, trong đó BODY là một biểu thức chỉ gồm các tham số p1,…,pk, hằng số nguyên, và các toán tử + - * / (không có dấu ngoặc, không khoảng trắng, không macro nào gọi macro khác). Cho tiếp m lời gọi macro dạng NAME(a_1,a_2,\dots,a_k), mỗi đối số ai là một biểu thức đơn giản chỉ gồm số nguyên và các toán tử + - * / (không ngoặc, không khoảng trắng).
Với mỗi lời gọi, hãy thực hiện đúng như tiền xử lý C thật sự làm: thay trực tiếp từng token tham số trong BODY bằng chuỗi văn bản của đối số tương ứng (giữ nguyên các toán tử của đối số, không thêm ngoặc), rồi in ra biểu thức kết quả dưới dạng văn bản — không rút gọn, không tính toán giá trị.
Ví dụ: SQUARE(x)=x*x. Gọi SQUARE(1+2) sẽ cho kết quả là chuỗi 1+2*1+2 (không phải 9), vì phép thay thế là thuần văn bản: x*x → 1+2*1+2.
Dòng đầu tiên chứa số nguyên n (1≤n≤50). n dòng tiếp theo, mỗi dòng là một định nghĩa macro đúng cú pháp NAME(p_1,p_2,\dots,p_k)=BODY (không có khoảng trắng thừa; 0≤k≤6; tên macro và tham số chỉ gồm chữ cái/số/gạch dưới, bắt đầu bằng chữ hoặc _).
Dòng tiếp theo chứa số nguyên m (1≤m≤50). m dòng tiếp theo, mỗi dòng là một lời gọi NAME(a_1,\dots,a_k) với k đúng bằng số tham số của macro NAME, mỗi ai là biểu thức không rỗng chỉ gồm chữ số và + - * / (không có ký tự trừ đơn ở đầu để tránh mơ hồ).
In ra m dòng, dòng thứ j là biểu thức kết quả (dạng văn bản) sau khi thay thế văn bản cho lời gọi thứ j.
Ví dụ:
Đầu vào:
1
ZERO()=0
1
ZERO()
Đầu ra:
0
Đầu vào:
2
SQUARE(x)=x*x
ADD3(a,b,c)=a+b+c
3
SQUARE(1+2)
SQUARE(5)
ADD3(1,2*3,4)
Đầu ra:
1+2*1+2
5*5
1+2*3+4
Đang tải editor...