मैं मूल्य के साथ-साथ इसके प्रकार को प्रिंट करना चाहता हूं

इनपुट:

1
3
5
78
10

आउटपुट:

Odd 1
Odd 3
Odd 5
Even 78
Odd 11
#include <stdio.h>

int main()
{
    int a[4],b,c;


    for(b=0 ; b<=4 ; b++)
    {
        scanf("%d",&a[b]);
    }
    for (c=0 ; c<=4 ; c++)
    {
            switch (a[c]%2)
            {
                case 0 :
                    printf ("Even %d\n",a[c]);
                    break;
                case 1 :
                    printf ("Odd %d\n",a[c]);
                    break;

            }
    }

    return 0;
}

Even 10 के बजाय अंतिम आउटपुट Odd 11 क्यों है?

c
2
A K ARAFAT 22 जिंदा 2020, 20:05
क्या 11? आपके द्वारा प्रदान किए गए इनपुट में कोई 11 नहीं है।
 – 
Eugene Sh.
22 जिंदा 2020, 20:07
5
यह 5 नंबर है, 4 नहीं। इसे int a[5] में बदलें।
 – 
Tyler
22 जिंदा 2020, 20:07
2
बस थोड़ा और विस्तार, int a[4] 4 ints के साथ एक सरणी बनाता है। ये अनुक्रमित हैं a[0], a[1], a[2], और a[3]। जब b == 4, आप a[4] तक पहुंच रहे हैं, जो आपके सरणी की सीमा से बाहर है और अपरिभाषित व्यवहार को आमंत्रित करता है। आपको या तो अपनी सरणी घोषणा को int a[5] में बदलना होगा या अपनी लूप स्थिति को b<4 में बदलना होगा। यह भी ध्यान दें, <= arraySize-1 के बजाय सरणियों < arraySize पर लूप करना आम बात है। आपकी सरणी में 4 तत्व हैं, इसलिए उन सभी को स्पर्श करने के लिए, b < 4 को लूप करें।
 – 
yano
22 जिंदा 2020, 20:26
अगर यह सिर्फ दो स्थितियां हैं, तो if . के बजाय स्विच का उपयोग क्यों करें
 – 
user12211554
23 जिंदा 2020, 08:01

3 जवाब

सबसे बढ़िया उत्तर

एक सही कार्यक्रम के लिए आपको केवल a[4] की घोषणा को a[5] में बदलना होगा। पुनरावृत्तियों की सीमाएं सही हैं।

जब आप अपना कोड चलाते हैं तो क्या होता है कि चार पहले इनपुट मान सरणी a[4] में जाते हैं और पांचवें एक वेरिएबल b में जाते हैं जो आपके मामले में तुरंत सरणी के पीछे आवंटित किया जाता है। यह एक प्रोग्रामिंग त्रुटि है और अप्रत्याशित परिणाम देता है, यह इस बात पर निर्भर करता है कि कंपाइलर मेमोरी कैसे आवंटित कर रहा है।

आपके मामले में, हम यह निष्कर्ष निकाल सकते हैं कि चर b को सरणी a[4] के पीछे संग्रहीत किया जाता है, और आपके द्वारा पांचवें तत्व को आपके विचार से सरणी में संग्रहीत करने के बाद एक बार बढ़ा दिया जाता है। वह स्थान जहां ऐसा होता है, लूप के लिए b++ स्टेटमेंट होता है।

मैं इस व्यवहार को पुन: पेश नहीं कर सका क्योंकि मेरा कंपाइलर शायद b को a[4] के ठीक पीछे आवंटित नहीं करता है।

4
Pierre François 22 जिंदा 2020, 23:40
अच्छी व्याख्या।
 – 
S.S. Anne
23 जिंदा 2020, 08:01
विवरण के लिए धन्यवाद
 – 
A K ARAFAT
23 जिंदा 2020, 15:54

आपने आकार 4 की सरणी बनाई है लेकिन आप इसमें 5 मान दर्ज कर रहे हैं। तो आप केवल सरणी का आकार बढ़ा सकते हैं या लूप को <= के साथ <चिह्न का आदान-प्रदान करके 4 मान दर्ज कर सकते हैं। आशा है कि इससे सहायता मिलेगी।

0
Aakash Gupta 22 जिंदा 2020, 21:56

आप पांच नंबर दर्ज कर रहे हैं, चार नहीं। int a[4] को int a[5] में बदलें। फिर स्पष्टता के लिए वैकल्पिक रूप से अपनी सभी शर्तों को <5 में बदलें, क्योंकि आमतौर पर सी प्रोग्रामर यही अपेक्षा करते हैं।

0
S.S. Anne 23 जिंदा 2020, 07:59
यह कोड काम कर रहा है, मुझे नहीं पता कि सरणी 4 से अधिक तत्वों को कैसे स्वीकार कर रही है लेकिन यह है। क्या सी के सरणी कार्यान्वयन में कुछ बदल गया है?
 – 
Ashwani
22 जिंदा 2020, 22:47
यह सरणी की सीमा से एक अतीत लिख रहा है। आकार 4 की एक सरणी और तत्व 0, 1, 2, 3, और 4। आकार की एक सरणी के तत्व n 0 से n-1 तक जाते हैं।
 – 
S.S. Anne
22 जिंदा 2020, 22:56
हां मुझे पता है। लेकिन यह कोड चल रहा है। यह बाध्य त्रुटि से बाहर नहीं फेंक रहा है जो इसे करना चाहिए।
 – 
Ashwani
22 जिंदा 2020, 22:58
सी में सीमा से बाहर त्रुटियां नहीं हैं, इसमें अपरिभाषित व्यवहार है। मुझे लगता है कि आप गलत टैग में हैं।
 – 
S.S. Anne
22 जिंदा 2020, 22:59
2
यही कारण है कि आपको सी में अधिक सावधान रहना होगा। यह आपके लिए इन चीजों को नहीं पकड़ता है। आप उस मेमोरी को एक्सेस/संशोधित करना शुरू कर देंगे जिसे आप करने का इरादा नहीं है या आप उस मेमोरी को एक्सेस करेंगे जो प्रोग्राम के स्पेस से बाहर है।
 – 
Warpstar22
22 जिंदा 2020, 23:23