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] Suy diễn kiểu biểu thức số học ngầm định

    Trong giai đoạn phân tích ngữ nghĩa (semantic analysis) của một trình biên dịch, mỗi biến được khai báo với kiểu dữ liệu cơ bản là int hoặc float. Khi xác định kiểu của một biểu thức số học chỉ gồm các phép toán + - * /, biến, hằng số và dấu ngoặc, trình biên dịch áp dụng luật ép kiểu ngầm định (usual arithmetic conversion):

    • Nếu biểu thức có ít nhất một toán hạng (biến hoặc hằng số) kiểu float, kết quả toàn biểu thức có kiểu float.
    • Nếu tất cả toán hạng đều kiểu int, kết quả có kiểu int.

    Hằng số chứa dấu chấm thập phân (ví dụ 3.14, 0.5) có kiểu float; hằng số chỉ gồm chữ số (ví dụ 10, 007) có kiểu int.

    Cho bảng khai báo biến và một biểu thức, hãy xác định kiểu kết quả của biểu thức.

    Ví dụ

    Input:
    2
    a int
    b float
    (a + 3) * b
    
    Output:
    float
    
    • Định dạng đầu vào:
      • Dòng 1: số nguyên nnn (0≤n≤1000 \le n \le 1000≤n≤100) — số biến được khai báo.
      • nnn dòng tiếp theo, mỗi dòng dạng <tên biến> <kiểu> với kiểu ∈{int,float}\in \{\text{int}, \text{float}\}∈{int,float}.
      • Dòng cuối: biểu thức (chỉ gồm chữ cái, chữ số, khoảng trắng, và các ký tự + - * / ( ); mọi biến xuất hiện trong biểu thức đều đã được khai báo ở trên).
    • Định dạng đầu ra:

      In ra đúng một dòng là kiểu của biểu thức: int hoặc float.

    Ví dụ:

    Đầu vào:

    0
    42
    

    Đầu ra:

    int
    

    Đầu vào:

    2
    a int
    b float
    (a + 3) * b
    

    Đầu ra:

    float
    

    Đang tải editor...