Menu
CoddyTech

Xóa công việc

Thuộc phần Logic và luồng chương trình trong hành trình C++ của Coddy. Bài học 21 trên 56.

challenge icon

Thử thách

Dễ

Mở rộng công cụ danh sách công việc bằng cách triển khai chức năng xóa để xóa các công việc cụ thể khỏi danh sách. Bài học này tiếp nối bài học trước, bổ sung khả năng xóa công việc theo số thứ tự.

Chương trình sẽ nhận các đầu vào sau:

  • Một số nguyên n biểu thị số công việc cần thêm ban đầu
  • Sau đó là n chuỗi mô tả công việc
  • Một số nguyên taskNumber biểu thị số thứ tự công việc cần xóa (chỉ số bắt đầu từ 1)

Chương trình của bạn cần:

  1. Bắt đầu với phần thiết lập như trong bài học trước, gồm std::vector<std::string> trống có tên tasks và lời chào
  2. Đọc số lượng công việc bằng cin >> n, sau đó gọi cin.ignore() để loại bỏ ký tự xuống dòng còn lại trước khi đọc các chuỗi công việc bằng getline()
  3. Thêm từng mô tả công việc vào vector bằng push_back()
  4. Đọc số thứ tự công việc cần xóa
  5. Kiểm tra xem số thứ tự công việc có nằm trong phạm vi hợp lệ hay không (từ 1 đến kích thước của vector)
  6. Nếu số thứ tự công việc không hợp lệ, in thông báo lỗi
  7. Nếu số thứ tự công việc hợp lệ, dùng phương thức .erase() để xóa công việc tại vị trí đã chỉ định
  8. In thông báo xác nhận cho biết công việc nào đã bị xóa
  9. Hiển thị các công việc còn lại dưới dạng danh sách được đánh số
  10. Hiển thị tổng số công việc đã cập nhật

Quan trọng: kết hợp cin và getline():
Khi bạn đọc một số nguyên bằng cin >> n, ký tự xuống dòng ('\n') vẫn còn trong bộ đệm đầu vào. Nếu sau đó bạn gọi getline(), hàm này sẽ đọc ngay ký tự xuống dòng còn lại đó thành một chuỗi rỗng thay vì đọc nội dung đầu vào thực tế. Để khắc phục, hãy gọi cin.ignore() ngay sau cin >> n để loại bỏ ký tự xuống dòng còn lại:

cin >> n;
cin.ignore(); // discard the leftover newline
for (int i = 0; i < n; i++) {
    string task;
    getline(cin, task); // now reads correctly
    tasks.push_back(task);
}

Dùng định dạng đầu ra chính xác sau:

Khi số thứ tự công việc không hợp lệ:

Welcome to Task List Tool!

Menu Options:
1. Add Task
2. View Tasks
3. Quit

Task list system initialized and ready!
Error: Invalid task number. Please enter a number between 1 and [total tasks].

Khi xóa công việc thành công:

Welcome to Task List Tool!

Menu Options:
1. Add Task
2. View Tasks
3. Quit

Task list system initialized and ready!
Task "[removed task description]" removed successfully!
Remaining Tasks:
1. [first remaining task]
2. [second remaining task]
...
Total tasks: [updated number of tasks]

Hãy nhớ rằng .erase() cần một iterator, vì vậy hãy dùng tasks.erase(tasks.begin() + index), trong đó index là vị trí bắt đầu từ 0 (taskNumber - 1). Kiểm tra đầu vào bằng cách xác nhận taskNumber lớn hơn 0 và nhỏ hơn hoặc bằng tasks.size(). Nếu danh sách trống sau khi xóa, hãy in "No tasks remaining." thay vì danh sách công việc còn lại.

Tự làm thử

#include <iostream>
#include <vector>
#include <string>

int main() {
    std::vector<std::string> tasks;
    
    std::cout << "Welcome to Task List Tool!" << std::endl;
    std::cout << std::endl;
    std::cout << "Menu Options:" << std::endl;
    std::cout << "1. Add Task" << std::endl;
    std::cout << "2. View Tasks" << std::endl;
    std::cout << "3. Quit" << std::endl;
    std::cout << std::endl;
    std::cout << "Task list system initialized and ready!" << std::endl;
    
    int n;
    std::cin >> n;
    
    for (int i = 0; i < n; i++) {
        std::string task;
        std::cin >> task;
        tasks.push_back(task);
    }
    
    if (tasks.empty()) {
        std::cout << "No tasks available." << std::endl;
    } else {
        std::cout << "Your Tasks:" << std::endl;
        for (int i = 0; i < tasks.size(); i++) {
            std::cout << (i + 1) << ". " << tasks[i] << std::endl;
        }
        std::cout << "Total tasks: " << tasks.size() << std::endl;
    }
    
    return 0;
}

Tất cả bài học trong Logic và luồng chương trình

Tự luyện tập: Trình biên dịch C++ online