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] Phân loại chỉ thị tiền xử lý

    Giai đoạn tiền xử lý (preprocessing) đọc mã nguồn theo từng dòng và nhận diện các chỉ thị tiền xử lý (preprocessor directive) — những dòng mà sau khi bỏ các khoảng trắng đầu dòng, ký tự đầu tiên là #.

    Với một chỉ thị, ngay sau dấu # (có thể có vài khoảng trắng xen giữa # và từ khoá) là một từ khoá gồm các chữ cái liên tiếp (A-Z, a-z, _), ví dụ define, ifdef, ... Từ khoá được xác định là dãy ký tự chữ cái/gạch dưới dài nhất bắt đầu ngay sau # (bỏ qua khoảng trắng đứng giữa).

    Cho nnn dòng mã giả lập, hãy phân loại từng dòng vào đúng một trong 13 nhóm sau:

    • 11 loại chỉ thị chuẩn: define, undef, include, ifdef, ifndef, if, elif, else, endif, pragma, error (dòng bắt đầu bằng # và từ khoá trùng khớp chính xác với một trong 11 tên này);
    • unknown: dòng bắt đầu bằng # nhưng từ khoá (nếu trích được) không thuộc 11 tên trên, hoặc không trích được từ khoá nào ngay sau # (ví dụ chỉ có dấu #, hoặc sau # là chữ số);
    • code: dòng không bắt đầu bằng # (sau khi bỏ khoảng trắng đầu dòng).

    Ví dụ: với dòng # include <a.h> — bỏ khoảng trắng đầu được # include <a.h>, bắt đầu bằng #, từ khoá trích được là include → thuộc nhóm include.

    Đếm số dòng thuộc mỗi nhóm trong 13 nhóm trên.

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

      Dòng đầu tiên chứa số nguyên nnn (0≤n≤10000 \le n \le 10000≤n≤1000) — số dòng mã.

      nnn dòng tiếp theo, mỗi dòng là một dòng mã nguồn (có thể chứa khoảng trắng đầu dòng, có thể là dòng rỗng, độ dài mỗi dòng không quá 200 ký tự, không chứa ký tự xuống dòng).

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

      In đúng 13 dòng, theo đúng thứ tự sau, mỗi dòng có dạng <tên nhóm>: <số lượng> (giữa dấu : và số có đúng một khoảng trắng):

      define: <sl>
      undef: <sl>
      include: <sl>
      ifdef: <sl>
      ifndef: <sl>
      if: <sl>
      elif: <sl>
      else: <sl>
      endif: <sl>
      pragma: <sl>
      error: <sl>
      unknown: <sl>
      code: <sl>
      

    Ví dụ:

    Đầu vào:

    0
    

    Đầu ra:

    define: 0
    undef: 0
    include: 0
    ifdef: 0
    ifndef: 0
    if: 0
    elif: 0
    else: 0
    endif: 0
    pragma: 0
    error: 0
    unknown: 0
    code: 0
    

    Đầu vào:

    5
    #define X 5
    #  include <stdio.h>
    int main() {
    #ifdef X
        return 0;
    

    Đầu ra:

    define: 1
    undef: 0
    include: 1
    ifdef: 1
    ifndef: 0
    if: 0
    elif: 0
    else: 0
    endif: 0
    pragma: 0
    error: 0
    unknown: 0
    code: 2
    

    Đang tải editor...