Hướng dẫn giải của Hoàn thành câu lệnh


Chỉ dùng lời giải này khi không có ý tưởng, và đừng copy-paste code từ lời giải này. Hãy tôn trọng người ra đề và người viết lời giải.
Nộp một lời giải chính thức trước khi tự giải là một hành động có thể bị ban.

Lời giải này đang bị ẩn cho đến khi bạn chọn mở ra.

Chúng tôi khuyên bạn nên tự thử giải bài trước. Việc mở lời giải có thể làm lộ mất ý tưởng chính trước khi bạn có cơ hội tự giải.

Bạn phải đăng nhập để mở lời giải này.

Đăng nhập

Tác giả: Hiếu Nguyễn, nguien_24, tungthanh, LamThanhVu

Editorial for ptit051: Hoàn thành câu lệnh

Hiểu bài toán

Bài toán yêu cầu tạo một chuỗi câu lệnh theo định dạng cụ thể từ ba số nguyên nhập vào: ngày, tháng, và năm. Cú pháp đầu ra phải là 'users setClock \tháng\ngày\năm'. Lưu ý thứ tự của ngày và tháng bị đảo ngược so với đầu vào (tháng trước, ngày sau), và mỗi thành phần được ngăn cách bởi dấu gạch chéo ngược (backslash).

Các cách tiếp cận

Cách Sử dụng ký tự đại diện (Escape Character)
#include <stdio.h>

int main() {
    int a, b, c;
    scanf("%d%d%d", &a, &b, &c);
    printf("users setClock \\%d\\%d\\%d", b, a, c);
    return 0;
}
  • Time Complexity: O(1)
  • Space Complexity: O(1)

Phương pháp này sử dụng trực tiếp hàm printf. Để in ra dấu gạch chéo ngược '\', ta phải sử dụng ký tự đại diện '\' (backslash) trước nó trong chuỗi định dạng. Biến đầu vào được đọc theo thứ tự (ngày, tháng, năm) nhưng khi in ra, ta truyền vào theo thứ tự (tháng, ngày, năm) để đáp ứng yêu cầu.

Cách Sử dụng mã ASCII
#include <stdio.h>

int main() {
    int d, m, y;
    scanf("%d%d%d", &d, &m, &y);
    char s = 92;
    printf("users setClock %c%d%c%d%c%d", s, m, s, d, s, y);
}
  • Time Complexity: O(1)
  • Space Complexity: O(1)

Thay vì dùng ký tự特殊字符, ta có thể khai báo biến ký tự gán bằng mã ASCII của dấu gạch chéo ngược (mã 92). Sau đó, sử dụng format specifier %c để in ra ký tự này xen kẽ giữa các số. Cách này giúp tránh nhầm lẫn về mặt cú pháp in chuỗi.

Cách Cấu trúc dữ liệu và in chi tiết
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

typedef struct {
    int day;
    int month;
    int year;
} date;

typedef struct {
    char* user;
    char* command;
    date time;
} log;

int main() {
    int day, month, year;
    char* user = "users";
    char* command = "setClock";
    scanf("%d %d %d", &day, &month, &year);
    printf("%s %s %c%d%c%d%c%d", user, command, 92, month, 92, day, 92, year);
}
  • Time Complexity: O(1)
  • Space Complexity: O(1)

Phương pháp này sử dụng cấu trúc (struct) để tổ chức dữ liệu ngày tháng năm và thông tin lệnh. Nó thể hiện cách tiếp cận có tổ chức hơn về mặt cấu trúc dữ liệu, dù về bản chất logic in ra vẫn tương tự như cách dùng mã ASCII. Dữ liệu được lưu trữ trong struct trước khi in.

Phân tích độ phức tạp

Cách tiếp cận Time Space Tên
1 O(1) O(1) Sử dụng ký tự đại diện (Escape Character)
2 O(1) O(1) Sử dụng mã ASCII
3 O(1) O(1) Cấu trúc dữ liệu và in chi tiết

Bài học kinh nghiệm

  • Thứ tự ngày và tháng trong đầu ra bị đảo ngược so với thứ tự nhập vào.
  • Ký tự gạch chéo ngược '\' là một ký tự đặc biệt trong C, cần được xử lý cẩn thận khi in ra màn hình (dùng '\' hoặc mã ASCII 92).

Lỗi thường gặp

  • Quên nhân đôi dấu gạch chéo ngược trong chuỗi định dạng của hàm printf, dẫn đến lỗi cú pháp hoặc in ra ký tự không mong muốn.
  • Nhập sai thứ tự các biến trong hàm printf so với yêu cầu đầu ra (phải in tháng trước, ngày sau).

Bình luận

Please read the guidelines before commenting.


Không có bình luận tại thời điểm này.