मैं सी के लिए बहुत नया हूं, और सामान्य रूप से प्रोग्रामिंग करता हूं, इसलिए अगर मेरी समस्या हल करने में बहुत आसान है तो मैं पहले से क्षमा चाहता हूं। मैंने इसी तरह के प्रश्नों की खोज की है लेकिन कोई भी मेरे विशिष्ट मुद्दे का उत्तर नहीं देता है।

मैं एक अभ्यास कर रहा हूं जो एक प्रोग्राम लिखने के लिए कहता है जो दो उपयोगकर्ता-इनपुट पूर्णांकों के बीच सभी संख्याओं को प्रिंट करता है। मैंने यह सुनिश्चित करके अभ्यास पर विस्तार किया है कि यदि पहला इनपुट दूसरे से छोटा है, तो प्रोग्राम (2, 4, 6, आदि) की गणना करता है और पहले होने पर (6, 4, 2, आदि) गिना जाता है। इनपुट दूसरे से बड़ा है। मैंने उपयोगकर्ता को प्रयास करते रहने का अवसर भी दिया है, लेकिन सटीक समान इनपुट (जैसे 2 और 22) दर्ज करने के बावजूद, प्रोग्राम सही आउटपुट को बेतरतीब ढंग से प्रिंट करेगा, या कुछ भी प्रिंट नहीं करेगा .

मैंने अपना कोड, आउटपुट के साथ, चित्रण में मदद करने के लिए शामिल किया है। शुक्रिया...

`#include <stdio.h>

int i, num1, num2;
char agn;

int main(void)
{
        printf("Display all even numbers falling between two integers.\n\n");
    do {
        printf("Enter your first number: ");
        scanf(" %d", &num1);
        printf("\nEnter your second number: ");
        scanf(" %d", &num2);

        printf("\n");

        if (num1 % 2 != 0)
        {
            num1++;
            i = num1;
        }
            // The following if statement decrements if the first number   entered is greater than the second.
            if (i >= num2)
            {
                while (i >= num2 + 2) // Adding 2 to num2 prevents i decrementing to the even number below num2
                    // eg. the printf function below decrements x2, so if the second input is 3, when i = 3 its actual value decrements to 1, therefore making 2 become the last number plotted. This is wrong because 2 is less than the input value of 3. The last number plotted should be 4.
                    printf("%d, ", i -= 2);
            }
            // The else if statement incements if the second number entered is higher than the first, so we must reduce the incremented value of num1 by -2.
            else if (num1 <= num2)
            {
                i = num1 - 2; // num1 was initially incremented by 1. This now decrements num1 by -2
                    while (i <= num2 - 2)
                    printf("%d, ", i += 2);
            }
                    printf("\n\nWould you like to try again? (Y/N): ");
                    scanf(" %c", &agn); // Remember to put a space before %c

                if (agn == 'n')
                        {
                            agn = 'N';
                        }
        }
    while (agn != 'N');

            printf("\n\n");
    return 0;
}`

आउटपुट: दो पूर्णांकों के बीच आने वाली सभी सम संख्याओं को प्रदर्शित करें।

अपना पहला नंबर दर्ज करें: 2

अपना दूसरा नंबर दर्ज करें: 22

2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22,

क्या आप फिर से कोशिश करना चाहेंगे? (Y/N): y अपना पहला नंबर दर्ज करें: 22

अपना दूसरा नंबर दर्ज करें: 2

20, 18, 16, 14, 12, 10, 8, 6, 4, 2,

क्या आप फिर से कोशिश करना चाहेंगे? (वाई/एन): वाई

अपना पहला नंबर दर्ज करें: 22

अपना दूसरा नंबर दर्ज करें: 2

(---कोई आउटपुट नहीं---)

क्या आप फिर से कोशिश करना चाहेंगे? (Y/N): y अपना पहला नंबर दर्ज करें: 2

अपना दूसरा नंबर दर्ज करें: 22

2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22,

क्या आप फिर से कोशिश करना चाहेंगे? (वाई/एन): नहीं

प्रोग्राम एग्जिट कोड के साथ समाप्त हुआ: 0

c
1
ozfader 27 अक्टूबर 2019, 02:40
stackoverflow.com/a/8798071/11639518 से जुड़ी समस्याओं के बारे में बात की जाती है; अन्य समान उत्तरों की पेशकश की गई fflush पर आगे विस्तार करें (वे बेहतर विकल्प प्रदान करते हैं)। क्या आपने यह सुनिश्चित करने के लिए प्रिंटफ डिबगिंग की कोशिश की है कि आपके मूल्य वही हैं जो आप उनसे होने की उम्मीद करते हैं? या स्कैनफ के बजाय fgets?
 – 
jhelphenstine
27 अक्टूबर 2019, 02:57
2
आप केवल i = num1; सेट करते हैं यदि num विषम है। i = num1; को if-statement के ब्रेसिज़ से हटा दें।
 – 
Mathias Schmid
27 अक्टूबर 2019, 02:57
आपके समाधान ने माथियास का काम किया, हालांकि मेरे पास अभी भी एक और छोटी सी समस्या है जिस पर मैं अभी काम कर रहा हूं। मुझे पूरा यकीन है कि वीजीएल का जवाब हाजिर है, लेकिन इससे पहले कि मैं इसे लागू कर सकूं, मेरे ज्ञान के स्तर में सुधार की जरूरत है। धन्यवाद दोस्तों...
 – 
ozfader
27 अक्टूबर 2019, 07:36

2 जवाब

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

आप हमेशा i को इनिशियलाइज़ नहीं कर रहे हैं। यदि पहली संख्या विषम है, तो आप i = num1 को इनिशियलाइज़ करते हैं, और आप इंक्रीमेंटिंग ब्रांच में i = num1 - 2 को इनिशियलाइज़ करते हैं, लेकिन डिक्रीमेंटिंग ब्रांच में आप इसे इनिशियलाइज़ नहीं करते हैं। चूंकि आपने पहले वेतन वृद्धि शाखा चलाई थी, i को इस प्रकार छोड़ दिया गया था:

i = num1 - 2; // i = 0
while (i <= num2 - 2) // i <= 20
  printf("%d, ", i += 2); // i is left as 22

तो जब आप घटते लूप को चलाते हैं, i दुर्घटना पर पूरी तरह से सही ढंग से सेट हो जाता है:

if (i >= num2) // true, i = 22 from before, num2 = 2
{
    while (i >= num2 + 2) // i >= 4
        printf("%d, ", i -= 2); // i = 2
}

लेकिन फिर जब आप डिक्रीमेंटिंग लूप को ठीक बाद में फिर से चलाने का प्रयास करते हैं, तो i 2 है, 22 नहीं। तो आपको मिलता है

if (i >= num2) // true, i = 2, num2 = 2
{
    while (i >= num2 + 2) // i >= 4, immediately false
        printf("%d, ", i -= 2); // never runs
}

मैं जो सुझाव दूंगा वह आपके कोड को दो कार्यों में फिर से तैयार कर रहा है। main() को उपयोगकर्ता इनपुट और प्रोग्राम की स्थिति (num1, num2) को संभालना चाहिए, जो तब एक हेल्पर फंक्शन printSequence (या दो, printForward और printReverse) में पास हो जाते हैं। जिसका एक स्थानीय चर i है। यह इस तरह के बग के साथ मदद करेगा, क्योंकि सभी लंबे समय तक रहने वाले राज्य main() तक ही सीमित रहेंगे।

3
vgel 27 अक्टूबर 2019, 02:59
इतने विस्तृत उत्तर के लिए बहुत धन्यवाद, बहुत सराहना की। मुझे पचने और आजमाने के लिए एक घंटा दें। चीयर्स... oz
 – 
ozfader
27 अक्टूबर 2019, 04:05

ऐसा लगता है कि मैं इस समस्या के साथ अपनी क्षमताओं से आगे निकल गया हूं, सी सीखने में केवल कुछ हफ़्ते हैं। सहायक कार्यों के लिए मूल्यों को पारित करना कुछ ऐसा है जो मुझे इसकी संरचना को बदलने से पहले खुद को गति में लाना होगा। कार्यक्रम। हालांकि एक समाधान के रूप में, मैं माथियास द्वारा पेश किए गए समाधान के साथ गया हूं, जो कि केवल i = num1 को हटाना था; अगर कथन ब्रेसिज़ से। यह काम करता है, हालांकि मुझे अभी भी कुछ मुद्दों को हल करना है। इस खेल के बारे में मुझे यही पसंद है - इसमें आने वाली चुनौतियाँ। धन्यवाद ढेर, दोस्तों। मैं सचमुच आपकी सहायता की सराहना करता हूं।

0
ozfader 27 अक्टूबर 2019, 07:31