logo

كتابة كود C/C++ بكفاءة في البرمجة التنافسية

أولا وقبل كل شيء تحتاج إلى معرفته نموذج وحدات الماكرو و المتجهات قبل الانتقال إلى المرحلة التالية! 

  • القوالب هي أساس البرمجة العامة التي تتضمن كتابة التعليمات البرمجية بطريقة مستقلة عن أي نوع معين.
  • الماكرو هو جزء من التعليمات البرمجية التي تم تسميتها باسم. كلما تم استخدام الاسم يتم استبداله بمحتويات الماكرو.
  • المتجهات هي نفس المصفوفات الديناميكية مع القدرة على تغيير حجم نفسها تلقائيًا عند إدراج عنصر أو حذفه مع معالجة تخزينها تلقائيًا بواسطة الحاوية.


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

    باستخدام النطاق القائم على الحلقة: هذه ميزة رائعة جدًا في C++ 11 وستعتبر الأفضل إذا كنت تريد التكرار من البداية إلى النهاية. يوضح هذا الكود كيفية استخدام حلقات للتكرار من خلال مصفوفة ومتجه: 
CPP
// C++ program to demonstrate range based for // loops for accessing vector and array elements #include   #include  using namespace std; int main() {  // Create a vector object that  // contains 5 elements  vector<int> vec = {0 1 2 3 4};  // Type inference by reference using auto.  // Range based loops are preferred when no  // modification is needed in value  for (const auto &value : vec)  cout << value << ' ';  cout << 'n';  // Basic 5 element integer array  int array[]= {1 2 3 4 5};  for (const auto &value: array)  cout << value << ' ';  return 0; } 

الإخراج:



0 1 2 3 4 1 2 3 4 5
    قائمة التهيئة:يُستخدم هذا النوع للوصول إلى القيم الموجودة في قائمة تهيئة C++. هنا يتم إنشاء الكائنات من هذا النوع تلقائيًا بواسطة المترجم من إعلانات قائمة التهيئة وهي قائمة من العناصر المفصولة بفواصل والمحاطة بأقواس. 
CPP
#include   template<typename T> void printList(std::initializer_list<T> text) {  for (const auto & value: text)  std::cout << value << ' '; } // Driver program int main() {  // Initialization list  printList( {'One' 'Two' 'Three'} );  return 0; } 

الإخراج: 

One Two Three
    تعيين القيمة القصوى أو الدنيا:هذا مفيد لتجنب الجهد الإضافي في كتابة دالة max() أو min(). 
CPP
#include   // Call by reference is used in x template<typename T typename U> static inline void amin(T &x U y) {  if (y < x)  x = y; } // call by reference is used in x template<typename T typename U> static inline void amax(T &x U y) {  if (x < y)  x = y; } // Driver program to find the Maximum and Minimum value int main() {  int max_val = 0 min_val = 1e5;  int array[]= {4 -5 6 -9 2 11};  for (auto const &val: array)  // Same as max_val = max (max_val val)  // Same as min_val = min (min_valval)  amax(max_val val) amin (min_val val);  std::cout << 'Max value = ' << max_val << 'n'  << 'Min value = ' << min_val;  return 0; } 

الإخراج:

Max value = 11 Min value = -9
    الإدخال والإخراج السريع في C/C++:في البرمجة التنافسية، يجب عليك قراءة الإدخال/الإخراج بأسرع ما يمكن لتوفير الوقت الثمين. 
C
#include    template<typename T> void scan(T &x) {  x = 0;  bool neg = 0;  register T c = getchar();  if (c == '-')  neg = 1 c = getchar();  while ((c < 48) || (c > 57))  c = getchar();  for ( ; c < 48||c > 57 ; c = getchar());  for ( ; c > 47 && c < 58; c = getchar() )  x= (x << 3) + ( x << 1 ) + ( c & 15 );  if (neg) x *= -1; } template<typename T> void print(T n) {  bool neg = 0;  if (n < 0)  n *= -1 neg = 1;  char snum[65];  int i = 0;  do  {  snum[i++] = n % 10 + '0';  n /= 10;  }  while (n);  --i;  if (neg)  putchar('-');  while (i >= 0)  putchar(snum[i--]);  putchar('n'); } // Driver Program int main() {  int value;  // Taking input  scan(value);  // Printing output  print(value);  return 0; } 
Input: 756 Output: 756

لمعرفة المزيد عن سرعة الإدخال والإخراج اقرأ هذا المقال . 

    استخدام وحدات الماكرو كحلقة: ربما لن يكون من الجيد استخدام وحدات الماكرو هذه لأنها ستقلل من إمكانية قراءة التعليمات البرمجية ولكن لكتابة تعليمات برمجية سريعة يمكنك تحمل هذه المخاطرة! 
CPP
#include    using namespace std; #define rep(in) for (i = 0; i < n; ++i) #define REP(ikn) for (i = k; i <= n; ++i) #define REPR(ikn) for (i = k; i >= n; --i) // Driver program to test above Macros int main() {  int i;  int array[] = {4 5 6 9 22 11};  int size= sizeof(array)/sizeof(array[0]);    // Default 0 index based loop  rep(i size)   cout << array[i] << ' ';  cout<<'n';    // Starting index based loop  REP(i 1 size-1)   cout << array[i] << ' ';  cout<<'n';    // Reverse for loop  REPR(i size-10)   cout << array[i] << ' ';  return 0; } 

الإخراج  

4 5 6 9 22 11 5 6 9 22 11 11 22 9 6 5 4
    باستخدام "bits/stdc++.h":بدلاً من إضافة الكثير من خطوط #include، استخدم فقط #include تتضمن الملفات جميع ملفات الرأس التي ستحتاجها في البرمجة التنافسية مما يوفر الكثير من وقتك.الحاويات:إن استخدام حاويات مختلفة مثل خريطة قائمة المتجهات وما إلى ذلك يمكّن الشخص من استخدام الوظائف المحددة مسبقًا ويقلل حجم الكود إلى حد كبير (في أغلب الأحيان)سين وكوت سريع:إذا كنت تستخدم cin وcout للإدخال/الإخراج، فما عليك سوى إضافة السطر التالي بعد main() مباشرةً. 
std::ios_base::sync_with_stdio(false);
    آلي:يمكن أن يؤدي استخدام تلقائي للإعلان عن أنواع البيانات إلى توفير الكثير من الوقت أثناء مسابقات البرمجة. عندما يتم تعريف متغير كمترجم تلقائي يحدد نوعه أثناء وقت الترجمة.المكتبات والوظائف المحددة مسبقًا:استخدام وظائف مدمجة مثل __gcd(AB) المبادلة _builtin_popcount(R) _builtin_clz(R) وما إلى ذلك أينما يمكن تطبيق ذلك. حاول أن تتعلم الوظائف المختلفة المتوفرة في خوارزمية مكتبة C++. فهي مفيدة في معظم الأوقات في البرامج


في النهاية، باستخدام هذه الحيل الذكية، يمكنك بسهولة كتابة التعليمات البرمجية في أقل قدر ممكن من الوقت والكلمات.

إنشاء اختبار