タスクの削除
CoddyのC++ジャーニー「論理と制御フロー」セクションの一部 — レッスン 21/56。
チャレンジ
簡単タスクリストツールを拡張して、リストから特定のタスクを削除する機能を実装しましょう。これは、位置番号を指定してタスクを削除する機能を追加することで、前回のレッスンをさらに発展させたものです。
以下の入力が提供されます:
- 最初に追加するタスクの数を示す整数
n - 次に、タスクの説明を示す
n個の文字列 - 削除するタスク番号を示す整数
taskNumber(1から始まるインデックス)
プログラムの動作:
- 前回のレッスンと同じセットアップ(
tasksという名前の空のstd::vector<std::string>とウェルカムメッセージ)から開始します。 cin >> nでタスクの数を読み取り、次にcin.ignore()を呼び出して、getline()でタスク文字列を読み取る前に残っている改行文字を破棄します。push_back()を使用して、各タスクの説明をベクターに追加します。- 削除するタスク番号を読み取ります。
- タスク番号が有効な範囲(1からベクターのサイズまで)内にあることを検証します。
- タスク番号が無効な場合は、エラーメッセージを表示します。
- タスク番号が有効な場合は、
.erase()メソッドを使用して指定された位置のタスクを削除します。 - どのタスクが削除されたかを示す確認メッセージを表示します。
- 残りのタスクを番号付きリスト形式で表示します。
- 更新されたタスクの総数を表示します。
重要 — cin と getline() の混用:
cin >> n で整数を読み取ると、入力バッファに改行文字('\n')が残ります。その後に getline() を呼び出すと、実際の入力ではなく、その残った改行文字を空の文字列として即座に読み取ってしまいます。これを修正するには、cin >> n の直後に cin.ignore() を呼び出して、残った改行文字を破棄します:
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);
}以下の正確な出力形式を使用してください:
無効なタスク番号の場合:
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].有効なタスク削除の場合:
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() にはイテレータが必要であるため、tasks.erase(tasks.begin() + index) を使用してください。ここで index は0から始まる位置(taskNumber - 1)です。taskNumber が0より大きく、かつ tasks.size() 以下であるかを確認して入力を検証してください。削除後にリストが空になった場合は、残りのタスクリストの代わりに "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;
}