タスクの削除
CoddyのC++ジャーニー「論理と制御フロー」セクションの一部。レッスン 21/56。
チャレンジ
簡単タスクリストツールを拡張し、リストから特定のタスクを削除する remove 機能を実装してください。これは、位置番号でタスクを削除できる機能を追加することで、前のレッスンを発展させたものです。
次の入力が与えられます:
- 最初に追加するタスク数を表す整数
n - 続いて、タスクの説明を表す
n個の文字列 - 削除するタスク番号(1始まりのインデックス)を表す整数
taskNumber
プログラムでは、次の処理を行ってください:
- 前のレッスンと同じセットアップ(空の
std::vector<std::string>namedtasksと welcome message)から開始する cin >> nでタスク数を読み取り、その後cin.ignore()を呼び出して leftover newline を破棄してから、getline()で task strings を読み取るpush_back()を使用して各 task description を vector に追加する- 削除する task number を読み取る
- task number が有効な範囲(1 から vector の size まで)にあることを検証する
- task number が無効な場合は、エラーメッセージを表示する
- task number が有効な場合は、
.erase()method を使用して指定された位置の task を削除する - どの task が削除されたかを示す confirmation message を表示する
- 残りの tasks を番号付きリスト形式で表示する
- 更新された tasks の合計数を表示する
重要:cin と getline() の混在:
cin >> n で整数を読み取ると、入力バッファには newline character('\n')が残ります。その後に getline() を呼び出すと、実際の入力ではなく、その leftover newline を空の string として直ちに読み取ってしまいます。これを修正するには、cin >> n の直後に cin.ignore() を呼び出して leftover newline を破棄します:
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);
}次の正確な出力形式を使用してください:
無効な task number の場合:
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].有効な task removal の場合:
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].erase() には iterator が必要なので、index が 0-based position(taskNumber - 1)である場合は、tasks.erase(tasks.begin() + index) を使用してください。taskNumber が 0 より大きく、tasks.size() 以下であるかを確認して、入力を検証してください。削除後にリストが空になった場合は、残りの tasks list の代わりに "No tasks remaining." を表示してください。
自分で試してみよう
#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;
}論理と制御フローのすべてのレッスン
自分で練習してみよう: C++オンラインコンパイラ