ملفات الترويسات (Header Files) ومعالجة التاريخ والوقت باستخدام الترويسة
في عالم البرمجة بلغة C++، يعتبر العمل مع التاريخ والوقت من أهم العمليات التي قد يحتاج المبرمجون إلى تنفيذها، سواء لحساب فترات زمنية، تنفيذ عمليات بناءً على الوقت، أو حتى إجراء اختبارات تعتمد على الوقت. ومع تقدم لغة C++، تم إدخال العديد من الأدوات التي تسهل هذه العمليات، واحدة منها هي مكتبة ، التي توفر وسائل مرنة وقوية للتعامل مع التاريخ والوقت. في هذا المقال، سنستعرض تفاصيل ملفات الترويسات (header files) وكيفية استخدامها في C++، مع التركيز على مكتبة .
1. ما هي ملفات الترويسات (Header Files)؟
تعتبر ملفات الترويسات في C++ جزءًا أساسيًا من البنية الهيكلية للغة، حيث تحتوي على التعريفات الأولية للوظائف والأنواع والصفوف التي ستستخدم في البرنامج. عادة ما تكون ملفات الترويسات عبارة عن ملفات نصية تحتوي على تعليمات برمجية تسهم في تنظيم البرنامج وتوسيع قابليته للاستخدام من خلال تضمين ملفات ترويسات أخرى.
تتمثل فائدة ملفات الترويسات في:
-
التقليل من التكرار: لا يحتاج المبرمج إلى إعادة كتابة تعريفات الوظائف والأنواع، بل يمكنه تضمين الملفات المخصصة لكل وظيفة في المشروع.
-
إدارة الأوامر والمكتبات: عبر تضمين ملفات الترويسات المناسبة، يمكن للمبرمج الوصول إلى العديد من المكتبات القياسية أو المكتبات التي كتبها آخرون.
2. مقدمة إلى مكتبة
مكتبة هي إحدى المكتبات القياسية في C++ التي توفر أنواعًا وأدوات لمعالجة الوقت والتاريخ. تم تقديم هذه المكتبة في C++11، مما جعل التعامل مع الزمن أمرًا بسيطًا ومرنًا، إذ توفر طريقة متكاملة لتخزين الوقت وحسابه. يمكن استخدام هذه المكتبة لعدة أغراض، مثل:
-
قياس الزمن: تحديد الوقت المنقضي بين نقطتين.
-
إيقاف العد التنازلي: إجراء عمليات معينة بناءً على الزمن.
-
التحويل بين الوحدات الزمنية: تحويل الوقت بين الثواني، الدقائق، الساعات، وهكذا.
3. الهيكل الأساسي لمكتبة
تتضمن مكتبة العديد من الأنواع والوظائف التي تسهم في تسهيل العمل مع التاريخ والوقت. بعض من الأنواع الأكثر شيوعًا في هذه المكتبة هي:
-
std::chrono::duration: يمثل مدة الزمن أو الفرق بين نقطتين زمنتين. -
std::chrono::time_point: يمثل نقطة معينة في الزمن. -
std::chrono::system_clock: يمثل الساعة الزمنية للنظام. -
std::chrono::steady_clock: ساعة ثابتة تُستخدم لقياس الوقت المنقضي بدقة.
4. كيفية تضمين مكتبة
لتتمكن من استخدام مكتبة , يجب تضمينها في برنامجك باستخدام التعليمة #include . إليك كيفية فعل ذلك في كود C++:
cpp#include
#include
int main() {
// الحصول على الوقت الحالي باستخدام system_clock
auto start = std::chrono::system_clock::now();
// بعض العمليات التي تأخذ وقتًا
for (int i = 0; i < 100000; ++i);
// الحصول على الوقت بعد تنفيذ العمليات
auto end = std::chrono::system_clock::now();
// حساب الوقت المنقضي
std::chrono::duration<double> elapsed_seconds = end - start;
std::cout << "Time taken: " << elapsed_seconds.count() << " seconds.\n";
return 0;
}
في هذا المثال، قمنا باستخدام system_clock لقياس الوقت المنقضي بين نقطتين باستخدام std::chrono::duration.
5. التعامل مع الزمن باستخدام std::chrono::duration
تعتبر std::chrono::duration أحد الأنواع الأساسية في مكتبة . هذا النوع يُستخدم لتخزين مدة الزمن، مثل عدد الثواني أو الدقائق. يمكن تخصيص duration ليشمل أي وحدة زمنية مثل الثواني (seconds)، الدقائق (minutes)، أو الساعات (hours).
مثال:
cpp#include
#include
int main() {
// مدة 5 ثوانٍ
std::chrono::seconds sec(5);
// تحويل المدة إلى دقائق
std::chrono::minutes min = std::chrono::duration_cast(sec);
std::cout << "5 seconds is equal to " << min.count() << " minute(s).\n";
return 0;
}
في هذا المثال، استخدمنا std::chrono::seconds لتحديد مدة زمنية مقدارها 5 ثوانٍ، ثم قمنا بتحويل هذه المدة إلى دقائق باستخدام std::chrono::duration_cast.
6. التعامل مع time_point في
النوع الآخر المهم في مكتبة هو time_point. يتم استخدام هذا النوع لتمثيل نقطة معينة في الزمن. يمكن استخدام time_point لتمثيل أي وقت معين مثل الوقت الحالي أو توقيت تنفيذ عملية معينة.
مثال:
cpp#include
#include
int main() {
// الحصول على الوقت الحالي
auto now = std::chrono::system_clock::now();
// تحويله إلى time_t لتنسيق الوقت البشري
std::time_t now_c = std::chrono::system_clock::to_time_t(now);
std::cout << "Current time: " << std::ctime(&now_c) << std::endl;
return 0;
}
في هذا المثال، نستخدم system_clock::now() للحصول على الوقت الحالي، ثم نقوم بتحويله إلى تنسيق يمكن للبشر قراءته باستخدام std::ctime.
7. استخدام std::chrono::steady_clock
النوع std::chrono::steady_clock يُستخدم لقياس الوقت المنقضي بين نقطتين بدقة عالية. هذه الساعة ثابتة، مما يعني أن الوقت المقاس باستخدامها لن يتأثر بتغييرات في الساعة النظامية.
مثال:
cpp#include
#include
int main() {
// بدء قياس الزمن باستخدام steady_clock
auto start = std::chrono::steady_clock::now();
// بعض العمليات التي تأخذ وقتًا
for (int i = 0; i < 1000000; ++i);
// انتهاء القياس
auto end = std::chrono::steady_clock::now();
// حساب الوقت المنقضي
std::chrono::duration<double> elapsed_seconds = end - start;
std::cout << "Elapsed time: " << elapsed_seconds.count() << " seconds.\n";
return 0;
}
في هذا المثال، نستخدم steady_clock لقياس الوقت المنقضي بين نقطتين، مما يوفر دقة أكثر للعمليات التي تتطلب قياسًا زمنيًا ثابتًا.
8. الحسابات الزمنية والتنسيقات المختلفة
مكتبة تقدم أيضًا أدوات للتعامل مع التواريخ بشكل كامل، مثل إضافة مدة إلى وقت معين أو حساب الفرق بين نقطتين زمنتين. يمكن القيام بذلك باستخدام الأنواع مثل std::chrono::days و std::chrono::months في النسخ الحديثة من C++.
مثال:
cpp#include
#include
int main() {
// الوقت الحالي
auto now = std::chrono::system_clock::now();
// إضافة 5 أيام
auto future_time = now + std::chrono::days(5);
// طباعة الوقت بعد إضافة 5 أيام
std::time_t future_time_t = std::chrono::system_clock::to_time_t(future_time);
std::cout << "Date after 5 days: " << std::ctime(&future_time_t) << std::endl;
return 0;
}
هنا، نضيف مدة 5 أيام إلى الوقت الحالي باستخدام std::chrono::days.
9. الخلاصة
توفر مكتبة في C++ أدوات قوية ومرنة لمعالجة التاريخ والوقت. يمكن استخدامها لقياس الزمن بدقة، إضافة أو طرح فترات زمنية، وتحويل الوحدات الزمنية المختلفة. تعتبر هذه المكتبة من الأدوات الأساسية التي يجب على أي مبرمج C++ التعود عليها في عمله، حيث تسهل التعامل مع العمليات الزمنية التي تتطلب دقة ومرونة.

