Vừa

Bộ đệm vòng tự tăng dung lượng: new[n](old) chép sai thứ tự

Class cần viết: ring · cần máy chấm có SystemVerilog · 6 case (2 mẫu) · giới hạn 4 s/case · ~30 phút

dynamic-arrayring-bufferdata-structuretrap

Bộ đệm vòng (ring buffer) là cấu trúc FIFO cổ điển: một mảng cố định, hai chỉ số đuổi nhau. Trong testbench, ta thường muốn nó tự lớn lên khi đầy, như queue [$], nhưng giữ được truy cập theo chỉ số O(1). Viết class ring bằng mảng động int mem[]:

Method Đặc tả
new(int cap = 2) dung lượng ban đầu cap (≥ 1), rỗng
int size() số phần tử đang chứa
int capacity() dung lượng hiện tại
void push(int v) thêm v vào cuối. Nếu đang đầy thì trước đó gấp đôi dung lượng, giữ nguyên thứ tự các phần tử
bit pop(ref int v) lấy phần tử cũ nhất; rỗng thì trả 0, không đổi v
bit peek_at(int i, ref int v) đọc phần tử thứ i tính từ cũ nhất (i = 0 là cũ nhất), không lấy ra; i ngoài [0, size) thì trả 0

Dung lượng chỉ tăng (không bao giờ co lại) và chỉ tăng khi push vào bộ đệm đầy. Ví dụ với cap = 2: push 5 lần cho dung lượng 2 → 4 → 8.

Testbench kiểm size(), capacity() và toàn bộ nội dung qua peek_at sau các chuỗi push/pop có quấn vòng.

Các case

  1. push và pop không quấn vòngmẫu
  2. Quấn vòng khi chưa đầymẫu

Cùng 4 case ẩn kiểm các yêu cầu còn lại của đề. Case ẩn chỉ báo đúng/sai, không nói chi tiết: tự tìm chỗ sai từ đề, hoặc mở gợi ý.

Testbench có mô hình tham chiếu riêng, độc lập với lời giải mẫu. Lời giải mẫu đã chạy qua mọi case trên simulator thật, và 4 bản lỗi mẫu đều bị ít nhất một case bắt. Case mẫu sai sẽ cho biết chỗ sai đầu tiên (giá trị mong đợi so với giá trị nhận được); case ẩn chỉ báo đúng/sai.

Đang kết nối máy chấm…
Đang nạp bản nháp…

Tab để thụt lề. Nhấn Esc rồi Tab để rời trình soạn. Bản nháp tự lưu trong trình duyệt.

Gợi ý

Mỗi gợi ý mở trước khi AC giảm 10% điểm của đề.

Lời giải và phân tích

Lịch sử nộp bài

Chưa có lượt nào.

Độ khó: Vừa. Điểm gốc 40.