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] Kiểm tra tương thích kiểu bản ghi theo cấu trúc

    Nhiều ngôn ngữ lập trình dùng tương thích kiểu theo cấu trúc (structural type equivalence) cho kiểu bản ghi (record/struct): hai kiểu bản ghi được coi là tương thích nếu "hình dạng" (cấu trúc) các trường của chúng giống nhau, bất kể tên kiểu hay tên trường có trùng nhau hay không.

    Cho trước mmm định nghĩa kiểu bản ghi, được định nghĩa tuần tự (một kiểu chỉ có thể tham chiếu tới các kiểu đã định nghĩa trước đó hoặc bốn kiểu cơ bản int, float, bool, string). Mỗi định nghĩa gồm: tên kiểu, số trường fff, và fff cặp tên_trường:kiểu_trường.

    Định nghĩa đệ quy chữ ký cấu trúc (structural signature) của một kiểu TTT:

    • Nếu TTT là kiểu cơ bản: chữ ký của TTT chính là TTT.
    • Nếu TTT là kiểu bản ghi với fff trường theo đúng thứ tự khai báo có kiểu lần lượt T1,…,TfT_1, \dots, T_fT1​,…,Tf​: chữ ký của TTT là dãy có thứ tự (sig(T1),…,sig(Tf))(\text{sig}(T_1), \dots, \text{sig}(T_f))(sig(T1​),…,sig(Tf​)) — không dùng tên trường, chỉ dùng kiểu và thứ tự khai báo.

    Hai kiểu bản ghi AAA, BBB tương thích cấu trúc khi và chỉ khi sig(A)=sig(B)\text{sig}(A) = \text{sig}(B)sig(A)=sig(B) (bằng nhau chính xác, không áp dụng widening int→float ở đây).

    Ví dụ: Point{x:int, y:int} và Point2{a:int, b:int} có cùng chữ ký (int, int) nên tương thích, dù tên kiểu và tên trường khác nhau.

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

      Dòng đầu là số nguyên mmm (1≤m≤2001 \le m \le 2001≤m≤200) — số định nghĩa kiểu bản ghi. mmm dòng tiếp theo, mỗi dòng định nghĩa một kiểu theo thứ tự token: TênKiểu, số nguyên fff (số trường), rồi fff token dạng tên_trường:kiểu_trường (kiểu_trường là một trong 4 kiểu cơ bản hoặc tên một kiểu bản ghi đã định nghĩa ở dòng trước). Dòng cuối cùng gồm hai tên kiểu AAA và BBB (đã được định nghĩa ở trên) cần so sánh.

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

      In ra Compatible nếu hai kiểu AAA, BBB tương thích cấu trúc, ngược lại in ra Incompatible.

    Ví dụ:

    Đầu vào:

    2
    Point 2 x:int y:int
    Point2 2 a:int b:int
    Point Point2
    

    Đầu ra:

    Compatible
    

    Đầu vào:

    2
    Point 2 x:int y:int
    Point2 2 a:int b:float
    Point Point2
    

    Đầu ra:

    Incompatible
    

    Đang tải editor...