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] Chọn hàm nạp chồng (overload) phù hợp nhất

    Khi trình biên dịch gặp một lời gọi hàm tới một tên hàm có nhiều phiên bản nạp chồng (overload), nó phải chọn ra đúng một phiên bản dựa trên kiểu các đối số. Cho kkk overload của cùng một hàm, đánh số 1..k1..k1..k theo thứ tự khai báo; overload thứ iii có chữ ký là danh sách kiểu tham số (kiểu ∈{\in\{∈{int,float,bool,string}\}}). Cho một lời gọi với danh sách kiểu đối số thực tế.

    Luật khớp từng vị trí tham số (kiểu tham số ppp, kiểu đối số aaa):

    • Khớp chính xác nếu p=ap = ap=a.
    • Khớp có ép kiểu (không tính là chính xác) nếu p=p=p=float và a=a=a=int.
    • Ngoài hai trường hợp trên: không khớp.

    Một overload được coi là khớp lời gọi nếu số tham số bằng số đối số và mọi vị trí đều khớp (chính xác hoặc ép kiểu). Với các overload khớp, gọi độ ưu tiên là số vị trí khớp chính xác. Chọn overload có độ ưu tiên cao nhất.

    • Nếu không overload nào khớp: in NO MATCH.
    • Nếu có từ hai overload trở lên cùng đạt độ ưu tiên cao nhất: in AMBIGUOUS.
    • Ngược lại: in số thứ tự (đánh từ 1) của overload duy nhất có độ ưu tiên cao nhất.
    • Định dạng đầu vào:

      Dòng đầu là kkk. kkk dòng tiếp theo, dòng thứ iii dạng <p> <t1> ... <tp> mô tả overload thứ iii (ppp = số tham số, rồi ppp kiểu tham số). Dòng tiếp theo là qqq — số lời gọi cần xét. qqq dòng tiếp theo, mỗi dòng dạng <p> <t1> ... <tp> là số lượng và kiểu các đối số của một lời gọi.

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

      In ra qqq dòng, mỗi dòng là số thứ tự overload được chọn, hoặc AMBIGUOUS, hoặc NO MATCH.

    Ví dụ:

    Đầu vào:

    2
    2 int int
    2 float float
    1
    2 int float
    

    Đầu ra:

    2
    

    Đầu vào:

    2
    2 int int
    2 float float
    1
    2 int int
    

    Đầu ra:

    1
    

    Đang tải editor...