0Pricing
C++ Academy · درس

المدد والساعات

قِس الفواصل الزمنية

المدد والساعات درس مجاني في C++ Academy على CoddyKit. هذا هو الدرس 1 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في C++ Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة C++ Academy 4 دروس في المجموع.

لماذا <chrono>؟

تمنح مكتبة <chrono> لغة C++ طريقة آمنة من ناحية الأنواع للتعامل مع الوقت. فبدلًا من الأعداد الصحيحة المجرّدة، تستخدم مددًا ونقاطًا زمنية ذات أنواع قوية، بحيث يكتشف المصرّف أخطاء الوحدات.

  • لن تخلط بعد الآن بين الثواني والمللي ثوانٍ.
  • تُعدّ الوحدات جزءًا من نظام الأنواع.
#include <iostream>
#include <chrono>

int main() {
    using namespace std::chrono;
    seconds s{5};
    std::cout << "Duration: " << s.count() << " seconds\n";
    return 0;
}

ما المقصود بالمدة؟

تمثّل std::chrono::duration فترة زمنية. فهي تخزّن عددًا من النبضات، بالإضافة إلى نسبة تصف فترة النبضة. وتغطي الأسماء المستعارة المحددة مسبقًا الوحدات الشائعة.

  • hours وminutes وseconds
  • milliseconds وmicroseconds وnanoseconds
#include <iostream>
#include <chrono>

int main() {
    using namespace std::chrono;
    milliseconds ms{1500};
    std::cout << ms.count() << " ms\n";
    return 0;
}

القيم الحرفية للمدد

تتيح لك مساحة الأسماء std::chrono_literals كتابة المدد باستخدام لواحق مثل 5s أو 200ms، مما يجعل الشيفرة مقروءة كأنها نص عادي.

#include <iostream>
#include <chrono>

int main() {
    using namespace std::chrono_literals;
    auto wait = 3s;
    auto blink = 250ms;
    std::cout << wait.count() << "s, " << blink.count() << "ms\n";
    return 0;
}

تحويل المدد

تحوّل duration_cast بين الوحدات. ويؤدي التحويل من وحدة أدق إلى وحدة أخشن إلى اقتطاع القيمة، ولذلك تصبح 1500 ms مساوية لـ 1 s.

#include <iostream>
#include <chrono>

int main() {
    using namespace std::chrono;
    milliseconds ms{1500};
    seconds s = duration_cast<seconds>(ms);
    std::cout << s.count() << " whole seconds\n";
    return 0;
}

العمليات الحسابية على المدد

تدعم المدد العمليات + و- و* و/. وعند دمج الوحدات، تُرقّى تلقائيًا إلى أدق وحدة مشتركة.

#include <iostream>
#include <chrono>

int main() {
    using namespace std::chrono;
    auto total = minutes{2} + seconds{30};
    std::cout << total.count() << " seconds total\n";
    return 0;
}

المدد ذات الفاصلة العائمة

يمكنك استخدام تمثيل ذي فاصلة عائمة للحفاظ على القيم الكسرية عند التحويل، وتجنّب اقتطاع المدد ذات الأعداد الصحيحة.

#include <iostream>
#include <chrono>

int main() {
    using namespace std::chrono;
    milliseconds ms{1500};
    duration<double> secs = ms;
    std::cout << secs.count() << " seconds\n";
    return 0;
}

ما المقصود بالساعة؟

توفّر الساعة الوقت الحالي. وتوفر المكتبة القياسية ثلاث ساعات:

  • system_clock — وقت الساعة الفعلي
  • steady_clock — لا تعود إلى الوراء أبدًا، ومثالية لقياس الوقت
  • high_resolution_clock — أدق نبضة متاحة
#include <iostream>
#include <chrono>

int main() {
    using namespace std::chrono;
    auto now = steady_clock::now();
    std::cout << "Got a time point: " << (now.time_since_epoch().count() > 0) << '\n';
    return 0;
}

system_clock

تتتبّع system_clock وقت التقويم الفعلي، ويمكن تحويلها إلى time_t لعرضه. وقد تقفز قيمتها إذا عُدّلت ساعة النظام.

#include <iostream>
#include <chrono>

int main() {
    using namespace std::chrono;
    auto tp = system_clock::now();
    auto secs = duration_cast<seconds>(tp.time_since_epoch());
    std::cout << "Seconds since epoch is positive: " << (secs.count() > 0) << '\n';
    return 0;
}

steady_clock

تتصف steady_clock بأنها رتيبة؛ فهي تتحرك إلى الأمام فقط بمعدل ثابت. استخدمها كلما قست الوقت المنقضي، ولا تستخدم system_clock لهذا الغرض.

#include <iostream>
#include <chrono>

int main() {
    using namespace std::chrono;
    auto a = steady_clock::now();
    auto b = steady_clock::now();
    std::cout << "Monotonic: " << std::boolalpha << (b >= a) << '\n';
    return 0;
}

دقة الساعة

تكشف كل ساعة عن period الخاص بها على هيئة نسبة تُحدّد في وقت الترجمة. ويمكنك أيضًا التحقق في وقت الترجمة مما إذا كانت الساعة ثابتة.

#include <iostream>
#include <chrono>

int main() {
    using namespace std::chrono;
    std::cout << "steady_clock is_steady: " << std::boolalpha << steady_clock::is_steady << '\n';
    std::cout << "system_clock is_steady: " << system_clock::is_steady << '\n';
    return 0;
}

تجميع المفاهيم

اجمع بين الساعات والمدد: اقرأ نقطتين زمنيتين واحسب الفرق بينهما على هيئة مدة بالوحدة التي تختارها.

#include <iostream>
#include <chrono>

int main() {
    using namespace std::chrono;
    auto start = steady_clock::now();
    long sum = 0;
    for (int i = 0; i < 1000000; ++i) sum += i;
    auto end = steady_clock::now();
    auto us = duration_cast<microseconds>(end - start);
    std::cout << "Loop took at least 0 us: " << (us.count() >= 0) << '\n';
    return 0;
}

تحقق سريع

اختبر مدى فهمك للساعة التي ينبغي استخدامها لقياس الوقت.

مراجعة

تعلّمت أن <chrono> توفر:

  • المدد — فترات زمنية آمنة من ناحية الأنواع، مع قيم حرفية مثل 5s
  • duration_cast لتحويل الوحدات، مع اقتطاع الأعداد الصحيحة
  • الساعات — system_clock وsteady_clock وhigh_resolution_clock
  • استخدم steady_clock لقياس الفواصل الزمنية

بعد ذلك، ستمثّل لحظات زمنية محددة باستخدام النقاط الزمنية.

الأسئلة الشائعة

هل درس «المدد والساعات» مجاني؟

نعم — نص درس «المدد والساعات» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة C++ Academy، انتقل إلى CoddyKit PRO. تتضمن دورة C++ Academy 4 دروس في المجموع.

ماذا ستتعلم في «المدد والساعات»؟

قِس الفواصل الزمنية تتمرن على C++ Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ C++ Academy؟

لا تُشترط خبرة سابقة. C++ Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 1 من أصل 4.

كم من الوقت يستغرق درس «المدد والساعات»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس C++ Academy هذا؟

نعم. كل درس في C++ Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. المدد والساعات
  2. النقاط الزمنية
  3. قياس أداء التعليمات البرمجية
  4. التقويم والمناطق الزمنية
← العودة إلى C++ Academy