خطأ في وقت التشغيل في حالات الاختبار ذات العدد الأكبر


هنا هو الكود الكامل الخاص بي

سي ++
<pre>#include <iostream>
#include <string>
using namespace std;

int main() {
    int T;
    cin >> T;
    while(T--)
    {
        string str;
        cin >> str;
        int index=-1;
        for(int i=1;i<str.size();++i)
        {
            if(str[i]!='0')
            {
                index=i+1;
                break;
            }
        }
        string a=str.substr(0,index-1);
        string b=str.substr(index-1);
        int str_a=stoi(a);
        int str_b=stoi(b);
        if(str_b>str_a)
        {
            cout << str_a << " " << str_b << endl;
        }
        else
        {
            cout << "-1" << endl;
        }
    }

    return 0;
}

ما حاولت:

إذا اختبرت 5 حالات اختبار، فلا بأس، وعندما اختبرت 1000 حالة اختبار، تظهر لي رسالة “رمز الخروج هو 3، خطأ في وقت التشغيل”. لماذا يقول مثل هذا؟ ما هو السبب وراء ذلك؟ كيف يمكنني إصلاح هذه المشكلة؟

الحل 1

التجميع لا يعني أن الكود الخاص بك صحيح! :يضحك:
فكر في عملية التطوير ككتابة بريد إلكتروني: التجميع الناجح يعني أنك كتبت البريد الإلكتروني باللغة الصحيحة – الإنجليزية، بدلاً من الألمانية على سبيل المثال – وليس أن البريد الإلكتروني يحتوي على الرسالة التي تريد إرسالها.

والآن تدخل المرحلة الثانية من التطوير (في الواقع هي المرحلة الرابعة أو الخامسة، ولكنك ستصل إلى المراحل السابقة لاحقًا): الاختبار وتصحيح الأخطاء.

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

Input   Expected output    Actual output
  1            2                 1
  2            4                 4
  3            6                 9
  4            8                16

إذن فمن الواضح إلى حد ما أن المشكلة تكمن في الشيء الذي يضاعفه – فهو لا يضيف نفسه إلى نفسه، أو يضربه في 2، بل يضربه في نفسه ويعيد مربع الإدخال.
وبذلك، يمكنك إلقاء نظرة على الكود ومن الواضح أنه موجود في مكان ما هنا:

ج #
private int Double(int value)
   {
   return value * value;
   }

بمجرد أن تكون لديك فكرة عما قد يحدث من خطأ، ابدأ في استخدام مصحح الأخطاء لمعرفة السبب. ضع نقطة توقف على السطر الأول من الطريقة، وقم بتشغيل التطبيق الخاص بك. عندما يصل إلى نقطة التوقف، سيتوقف مصحح الأخطاء ويسلم التحكم إليك. يمكنك الآن تشغيل التعليمات البرمجية الخاصة بك سطرًا تلو الآخر (يُسمى “الخطوة الفردية”) وإلقاء نظرة على (أو حتى تغيير) المحتويات المتغيرة حسب الضرورة (يمكنك حتى تغيير التعليمات البرمجية والمحاولة مرة أخرى إذا كنت بحاجة إلى ذلك).
فكر في ما يجب أن يفعله كل سطر في الكود قبل تنفيذه، وقارن ذلك بما فعله بالفعل عندما تستخدم زر “التخطي” لتنفيذ كل سطر بدوره. هل فعلت ما كنت تتوقعه؟ إذا كان الأمر كذلك، انتقل إلى السطر التالي.
إذا لم يكن الأمر كذلك، لماذا لا؟ كيف تختلف؟
نأمل أن يساعدك ذلك في تحديد أي جزء من هذا الرمز به مشكلة وما هي المشكلة.
هذه مهارة تستحق التطوير لأنها تساعدك في العالم الحقيقي وفي التطوير أيضًا. ومثل كل المهارات، فهي تتحسن فقط بالاستخدام!

الحل 2

بعض الأشياء للتحقق:
1) ماذا يحدث إذا لم يكن هناك “0” في سلسلة الإدخال؟
2) ماذا يحدث إذا كانت السلسلة التي تمررها إلى stoi() أكبر من INT_MAX؟

コメント

タイトルとURLをコピーしました