إزالة مهمة
جزء من قسم Logic & Flow في رحلة C++ على Coddy — الدرس 21 من 56.
التحدي
سهلقم بتوسيع أداة قائمة المهام الخاصة بك عن طريق تنفيذ وظيفة الإزالة لحذف مهام محددة من القائمة. يعتمد هذا على الدرس السابق من خلال إضافة القدرة على إزالة المهام حسب رقم موقعها.
سيتم توفير المدخلات التالية:
- عدد صحيح
nيمثل عدد المهام المراد إضافتها في البداية - ثم
nمن السلاسل النصية التي تمثل أوصاف المهام - عدد صحيح
taskNumberيمثل رقم المهمة المراد إزالتها (فهرسة تبدأ من 1)
يجب أن يقوم برنامجك بما يلي:
- البدء بنفس الإعداد من الدرس السابق (
std::vector<std::string>فارغ باسمtasksورسالة ترحيب) - قراءة عدد المهام باستخدام
cin >> n، ثم استدعاءcin.ignore()للتخلص من سطر جديد متبقي قبل قراءة سلاسل المهام باستخدامgetline() - إضافة وصف كل مهمة إلى المتجه (vector) باستخدام
push_back() - قراءة رقم المهمة المراد إزالتها
- التحقق من أن رقم المهمة يقع ضمن النطاق الصالح (من 1 إلى حجم المتجه)
- إذا كان رقم المهمة غير صالح، قم بطباعة رسالة خطأ
- إذا كان رقم المهمة صالحاً، استخدم طريقة
.erase()لإزالة المهمة في الموقع المحدد - طباعة رسالة تأكيد توضح المهمة التي تمت إزالتها
- عرض المهام المتبقية في تنسيق قائمة مرقمة
- إظهار العدد الإجمالي المحدث للمهام
هام — الخلط بين cin و getline():
عندما تقرأ عدداً صحيحاً باستخدام cin >> n، فإنه يترك حرف سطر جديد ('\n') في مخزن الإدخال المؤقت. إذا قمت بعد ذلك باستدعاء getline()، فسيقرأ فوراً ذلك السطر الجديد المتبقي كسلسلة فارغة بدلاً من إدخالك الفعلي. لإصلاح ذلك، استدعِ cin.ignore() مباشرة بعد cin >> n للتخلص من السطر الجديد المتبقي:
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() يتطلب مكرراً (iterator)، لذا استخدم 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;
}جميع دروس Logic & Flow
1المؤشرات والذاكرة
ما هو المؤشر؟معامل العنوان (Address-Of)معامل الوصول للقيمة (Dereference)المؤشرات الفارغة (Null Pointers)المؤشرات والمصفوفاتالذاكرة الديناميكية باستخدام 'new'تحرير الذاكرة باستخدام 'delete'مراجعة - تمارين على المؤشرات2المتجهات (المصفوفات الديناميكية)
مقدمة إلى std::vectorإنشاء Vectorإضافة العناصرالوصول إلى العناصرحجم الـ Vectorالتكرار باستخدام For Loopالـ Range-Based For Loopإزالة العناصرملخص - عمليات الـ Vector