बड़ी संख्या में परीक्षण मामलों पर रनटाइम त्रुटि


यहाँ मेरा पूरा कोड है

सी++
<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をコピーしました