Problem Solving

  • حل Segmentation Fault في CodeChef باستخدام C++

    في مقالتي هذه، سأسعى إلى فحص الكود الذي قدمته والتركيز على فهم سبب حدوث خطأ الـ segmentation fault الذي تواجهه أثناء تنفيذ برنامجك عند حل مشكلة CodeChef. يتعلق الأمر بمشكلة “Malvika is peculiar about color of balloons” والتي يمكن الوصول إليها عبر الرابط الذي وفرته.

    لنبدأ بتحليل الكود. يبدو أن البرنامج يتوقع عددًا من الحالات (t) ويقوم بقراءة سلسلة الألوان لكل حالة. ثم يقوم بحساب عدد البالونات بألوان ‘a’ وعدد البالونات بألوان ‘b’. يُفضل أن نبدأ بتصحيح الأخطاء المحتملة في الكود:

    1. حجم مصفوفة النتائج:
      في السطر int results[t];، يجب أن يكون حجم المصفوفة results معروفًا في وقت التركيب. يمكن استخدام std::vector بدلاً من ذلك.

    2. قراءة قيمة t:
      يفترض أن يتم قراءة قيمة t قبل إعلان مصفوفة النتائج int results[t];. قم بتحريك السطر std::cin >> t; إلى الأعلى.

    3. تحديد حجم المصفوفة داخل الحلقة:
      int t; هو متغير تم تعريفه داخل الحلقة ويتم قراءتها قبل تحديدها. يُفضل تحديدها خارج الحلقة.

    بعد إجراء هذه التعديلات، يمكننا الاستمرار في تحليل الكود لمعرفة سبب حدوث الـ segmentation fault. سأقوم بإجراء التعديلات المقترحة ومتابعة الشرح بشكل أفضل لضمان حلاً ناجحًا لمشكلتك.

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

    1. تحديد حجم المصفوفة بشكل دينامي:
      استخدم std::vector لتحديد حجم المصفوفة بشكل دينامي وتجنب استخدام متغير ذو حجم غير معروف قبل وقت التشغيل.
    cpp
    #include // ... int main() { int t; std::cin >> t; std::vector<int> results; for (int i = 0; i < t; i++) { // ... results.push_back(result); } for (int x : results) { std::cout << x << std::endl; } return 0; }
    1. التحقق من صحة القيمة المدخلة t:
      قبل دخول الحلقة، تحقق من أن قيمة t ليست سالبة.
    cpp
    // ... int main() { int t; std::cin >> t; if (t <= 0) { std::cerr << "Invalid input for t." << std::endl; return 1; } std::vector<int> results; for (int i = 0; i < t; i++) { // ... results.push_back(result); } for (int x : results) { std::cout << x << std::endl; } return 0; }
    1. تحسين عمليات العد:
      يمكنك تحسين عمليات العد بطريقة أكثر فعالية، مثل حساب عدد البالونات من نوع واحد واستخدام الحد الأدنى منها.
    cpp
    // ... for (int i = 0; i < t; i++) { std::cin >> balloonColors; size_t numberOfAmber = std::count(balloonColors.begin(), balloonColors.end(), 'a'); size_t numberOfBrass = std::count(balloonColors.begin(), balloonColors.end(), 'b'); results.push_back(static_cast<int>(std::min(numberOfAmber, numberOfBrass))); } // ...

    بتنفيذ هذه التحسينات، يجب أن يكون لديك الآن برنامج يعمل بشكل صحيح ويتفادى حدوث segmentation fault. تأكد من تجربة البرنامج مع عدة حالات اختبار لضمان صحة وكفاءة الحلاقة.

    المزيد من المعلومات

    إن تقديم مزيد من المعلومات يمكن أن يساعد في تعميق فهم القضية وتقديم حلاً أكثر دقة. سأقوم بتوفير بعض الملاحظات الإضافية وتوجيه بعض النصائح لتحسين الكود:

    1. التحقق من صحة القيمة المدخلة لعدد الحالات:
      يُفضل أيضًا التحقق من أن عدد الحالات الذي تقوم بإدخاله (t) ليس أكبر من الحد الأقصى المسموح به. قد تكون الذاكرة المخصصة لـ results غير كافية إذا كان t كبيرًا جدًا.
    cpp
    const int MAX_CASES = 1000; // تحديد الحد الأقصى لعدد الحالات int main() { int t; std::cin >> t; if (t <= 0 || t > MAX_CASES) { std::cerr << "Invalid input for t." << std::endl; return 1; } // ... }
    1. التعامل مع حجم كبير للسلسلة:
      قد يؤدي استخدام std::count مع سلسلة ذات حجم كبير إلى أداء ضعيف. يُفضل التفكير في طرق أكثر فعالية لحساب عدد البالونات، مثل فحص كل حرف بشكل فردي دون الحاجة إلى تحليل السلسلة مرتين.
    cpp
    // ... for (int i = 0; i < t; i++) { std::cin >> balloonColors; int countA = 0, countB = 0; for (char c : balloonColors) { if (c == 'a') { countA++; } else if (c == 'b') { countB++; } } results.push_back(std::min(countA, countB)); } // ...
    1. تعزيز قراءة البيانات:
      لضمان استمرار تنفيذ البرنامج دون مشاكل، يُفضل التحقق من نجاح عمليات قراءة البيانات.
    cpp
    // ... for (int i = 0; i < t; i++) { if (!(std::cin >> balloonColors)) { std::cerr << "Failed to read balloon colors for case " << (i + 1) << std::endl; return 1; } // ... }

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

  • Problem Solving كيف أبدا

    ازاي تبدأ Problem Solving ؟

    بوست طويل شوية انا آسف بس الموضوع فيه كلام كتير وده مش كل حاجة اكيد في اكتر من كده ولكن ده كويس كبداية

    أولاً ايه أهمية ال Problem Solving ؟

    بتعلمك اهم مهارتين محتاجهم أي Programmer وهما How To Think وديه هتتعملها من خلال انك هتمر بأفكار كتير منهم السهل ومنها المتوسط وصولا للصعب والاصعب ف ده هيبني عندك خلفية واسعة عن انك تطور من نفسك ومن الحلول المتاحة قدامك لما تقابلك مشكلة في كود بعد كده لما تدخل اي مجال …الحاجة التانية هي How To Search وديه هتتعملها من خلال انم هتواجه Errors , Exceptions , Time Limit Exceeded خلال الحل ف ده هيخليك تبحث وتدور ازاي تحل الError ده لان اكيد مش كل مرة يواجهك Error هتروح تسال في حد او حد أكبر منك مثلا .

    ايه اللي محتاجه علشان تبدأ تحل Problems ؟

    مش محتاج حاجات كتير يعني ممكن مثلا تتعلم Basics بتاع لغة برمجة وتبدأ تحل عليها واثناء حلك تكمل مذاكرة تذاكر Object Oriented Programming + Algorithms + Data Structures لان دول اهم 3 حاجات محتاج تعرفهم بعد ما تتعلم لغة برمجة هيفرقوا معاك جدا وهيوسعوا من نطاق فهمك واستيعابك للي انت بتعمله ايه بقا المصارد والمواقع اللي تحل عليها ؟

    قناة Arabic Competitive Programming ديه تبقا مرجع وقم واحد عندك وانت في البداية الدكتور مصطفى سعد ربنا يباركله على مجهوده يعني هتلاثي محتوى محتوى محترم بدايه من لينك الفيديو ده اللي فيه شيت لمسائل من موقع Codeforces لحد شرح اغلب الاساسيات اللي قولتها ديه بال C++ ده اذا ما كانش كلها يعني هنا هتلاقي شرح للشيت والقناة مليانة شروحات خاصة بال

    https://www.youtube.com/watch?v=c3lmvYBxgwE&t=33s2-

    لو انت هتشتغل ب Java ف انت تقدر تحل نفس الحاجات ديه برضو باي لغة برمجة لكن الحاجة اللي فرقت معايا جدا في وانا في البداية الكورس من ده موقع Hackerrank محتاج تبقا مستوى متوسط في الانجلش علشان تفهمه كويس انما هو كل فيديو وراه Problem مرتبكة بموضوع الفيديو والكورس بصراحة جميل جدا

    https://www.hackerrank.com/domains/tutorials

    ده شيت من جامعة اسيوط ال Problems مترتبة فيه Categories بداية من ال Variables , Loops , Conditions وصولا لمسائل عامة كل اللي مطلوب تعمله تسجل في الموقع وتدخل على اللينك تنزل لتحت هتلاقي Member management تسجل as Participant


    https://codeforces.com/group/MWSDmqGsZm/contests

    البشمهندس محمد أيمن عامل مجهود محترم في الRepository ديه عن ال Problem Solving برضو وكويس جدا ليك شوف المصدر اللي ترتاح معاه وذاكر منه كلهم يأدوا نفس الغرض بس شدوا حيلكم

    https://github.com/cs-MohamedAyman/Problem-Solving-Training?fbclid=IwAR2pWQxGceLuI-wPSiL_KYUft6_mdGwqxSb9_KDk_NjslMIEsw-y9VZOy6g

    ومن الحاجات المهمة اللي ناس كتير بتهملها انها ما تذاكرش من كتاب بجانب الكورس اللي بتشوفه وده غلط جدا لان مفيش كورس هيديك كل حاجة والكتب بيبقا فيها معلومات هتتعب جدا علشان تلاقيها بالوضوح ده في اي كورس ومش مطلوب منك تقرا الكتاب كله طبعا انت تخليه مرجع بحيث ان ملقيتش المعلومة فيه تدور عليها ع النت

    كتاب في لغة ال Java

    https://drive.google.com/file/d/1ymuWO1-KbGYKP_HBa-msTaTMUkrXImy0/view?usp=sharing2-

    كتاب في لعة ال C++

    https://drive.google.com/file/d/1dN2kVq37hl3LhqOpkMkXH7C_zjck4Qzw/view?usp=sharing3

    كتاب عن ال Algorithms + DS بال Java

    https://drive.google.com/file/d/1kxL8HkuTtfUkq3FX_TWRUydOTd-XtkSr/view?usp=sharing4-

    كتاب مهم جدا بس مش دلوقتي لما تذاكر Problem Solving كويس بص ع الافكار اللي هنا من Interviews خاصة باكبر الشركات Google ,Amazon , Microsoft ..etc

    https://drive.google.com/file/d/1aglioqjt_jsp6DLs8S5LZCv7fP1Ah5Wn/view?usp=sharing

    وده لينك الحلول من Github المصدر

    https://drive.google.com/file/d/1U_HQm42Tr9ufNHTBT58r7CSRixfDQzbl/view?usp=sharing5-

    ده كتاب لو حد يعرف لغة C++ ,Java , Python وحابب يراجع عليها مثلا الكتاب ده جميل جدا هتلاقي في بدايته شرح لكل لغة منهم

    https://drive.google.com/file/d/1s7kvvXhDKTOhZdTtmY3ZgSgdkJK6lKdP/view?usp=sharing

    آخر حاجة وديه نصيحة في البداية هتواجه مشاكل كتير في التعامل مع المواقع وهيقابلك Errors , Exceptions وحوارات كتير علشان تكمل لازم نفسك يبقا طويل وتصبر لان اي حد في البداية كده محدش اتولد تنين مجنح في البرمجة والا حد كان بيحبي على Keyboard وهو صغير مثلا لازم تصبر وتكمل علشان لمستوى يرضيك الحاجة التانية مش مطلوب منك تقعد طول عمرك تحل Problems كفاية سنة اولى مثلا او تانية بس تذاكر بضمير هيفرق معاك جدا وبعد كده تذاكر مجال تشتغل بيه ويب – اندرويد – الخ من المجالات يعني واتمنى ليكم كل التوفيق يارب ♥️🙏

زر الذهاب إلى الأعلى
إغلاق

أنت تستخدم إضافة Adblock

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