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 đương cấu trúc của kiểu bản ghi

    Một kiểu bản ghi (record type) được định nghĩa bởi một dãy có thứ tự các kiểu trường (tên trường không ảnh hưởng đến kiểu nên được lược bỏ khỏi đề bài này). Kiểu của một trường có thể là:

    • kiểu cơ sở: int, float, bool, string;
    • kiểu mảng cơ sở, viết X[n] (không khoảng trắng), với XXX là kiểu cơ sở và nnn là kích thước cố định;
    • hoặc tên của một kiểu bản ghi khác đã được định nghĩa trước đó (bản ghi lồng nhau, không có tham chiếu vòng vì chỉ được tham chiếu tới bản ghi định nghĩa trước).

    Hai kiểu bản ghi AAA và BBB được gọi là tương đương cấu trúc (structural equivalence) nếu khi "mở" đệ quy toàn bộ tham chiếu bản ghi lồng nhau về dạng chuẩn (chỉ còn kiểu cơ sở, kiểu mảng cơ sở, và cấu trúc lồng bản ghi), hai bản ghi có cùng số trường và tại mỗi vị trí, kiểu đã mở là giống hệt nhau về cấu trúc (một bản ghi lồng kkk trường không tương đương với chính kiểu của 111 trong các trường đó dù k=1k=1k=1, vì đó vẫn là hai tầng cấu trúc khác nhau).

    Ví dụ: nếu Inner là bản ghi 1 trường kiểu int, và OuterA là bản ghi 1 trường kiểu Inner, còn OuterB là bản ghi 1 trường kiểu int, thì OuterA và OuterB không tương đương (một bên là bản ghi lồng bản ghi, một bên là trường int trực tiếp).

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

      Dòng đầu là rrr — số kiểu bản ghi được định nghĩa (theo đúng thứ tự, bản ghi sau chỉ được tham chiếu tới bản ghi đã định nghĩa trước nó). rrr dòng tiếp theo, dòng thứ iii dạng <Tên> <f> <field1> ... <fieldf> (fff = số trường, mỗi field là một token duy nhất: kiểu cơ sở, X[n], hoặc tên một bản ghi đã định nghĩa trước). Dòng tiếp theo là qqq — số cặp cần so sánh. qqq dòng tiếp theo dạng <TênA> <TênB>.

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

      In ra qqq dòng, mỗi dòng là EQUIVALENT hoặc DIFFERENT.

    Ví dụ:

    Đầu vào:

    2
    PointA 2 int int
    PointC 2 int float
    1
    PointA PointC
    

    Đầu ra:

    DIFFERENT
    

    Đầu vào:

    2
    PointA 2 int int
    PointB 2 int int
    1
    PointA PointB
    

    Đầu ra:

    EQUIVALENT
    

    Đang tải editor...