2017-03-10 9 views
5

यह एक बहुत ही आसान और सामान्य अभ्यास है हालांकि मैं एक त्रुटि में आ रहा हूं जिसे मैं समझ नहीं पा रहा हूं और मुझे कहीं भी स्पष्टीकरण नहीं मिल रहा है क्योंकि यह बहुत विशिष्ट हो सकता है।सरणी में सबसे बड़ा और सबसे छोटा मूल्य क्रमबद्ध करना सी ++

कार्यक्रम उपयोगकर्ता को यह इंगित करने के लिए प्रेरित करता है कि व्यक्ति 1 से 10 तक कितने पेनकेक्स खाए जाते हैं और फिर प्रिंट करते हैं कि किसी के द्वारा खाए जाने वाले पेनकेक्स की सबसे बड़ी संख्या क्या है। मेरी समस्या यह है कि "हाथ से बना लूप" सबसे बड़ा और सबसे छोटा मूल्य काम करने के लिए हल करता है लेकिन एल्गोरिदम (जिसे हाथ से बने लूप के बजाय उपयोग करने के लिए इस मंच पर अत्यधिक अनुशंसा की जाती है) सही सबसे बड़ा प्रिंट नहीं करता है मान, लेकिन के लिए सबसे छोटे के लिए काम करता है। यहाँ

void pancakes() { 
    int pan[11]; 
    int small, big; 
    for (int i = 1; i < 11; i++) // counts to 11-1 and prompts user for pancakes 
            // eaten by person 1==>10 
    { 
     cout << "How many pancakes did person " << i << " eat?\n"; 
     cin >> pan[i]; 
    } 

    big = small = pan[1]; // assigns element to be highest or lowest value 

    for (int i = 1; i < 11; i++) { 
     if (pan[i] > big) // compare biggest value with current "big" element 
     { 
      big = pan[i]; 
     } 
     if (pan[i] < small) // compares smallest value with current "small" element 
     { 
      small = pan[i]; 
     } 
    } 
    cout << "The person who ate the most pancakes ate " << big << " of them." 
      << endl; // prints biggest value 
    cout << "The person who ate the least pancakes ate " << small << " of them." 
      << endl; // prints smallest value 

    auto minmax = minmax_element(begin(pan), end(pan)); 

    cout << "min element " << *(minmax.first) << "\n"; 
    cout << "max element " << *(minmax.second) << "\n"; 
} 

और क्या सांत्वना रिटर्न दिया गया है::

यहाँ मेरी कोड है

How many pancakes did person 1 eat? 
45 
How many pancakes did person 2 eat? 
64 
How many pancakes did person 3 eat? 
7 
How many pancakes did person 4 eat? 
34 
How many pancakes did person 5 eat? 
87 
How many pancakes did person 6 eat? 
45 
How many pancakes did person 7 eat? 
89 
How many pancakes did person 8 eat? 
32 
How many pancakes did person 9 eat? 
55 
How many pancakes did person 10 eat? 
66 
The person who ate the most pancakes ate 89 of them. 
The person who ate the least pancakes ate 7 of them. 
min element 7 
max element 1606416304 

उत्तर

7

आप एक है कार्रवाई करने के लिए आकार 11 की सरणी, लेकिन आप केवल 10 तत्वों पर लूप करते हैं, जिससे पहले तत्व को अनियंत्रित किया जाता है। इसका मतलब है कि इसमें जंक (अपरिभाषित व्यवहार) शामिल है, उस मामले में 1606416304, जो अधिकतम है, है ना? =)

से अपने छोरों बदलें:

for (int i = 1; i < 11; i++) 

रहे हैं:

for (int i = 0; i < 11; i++) 

std::minmaxelement() तो आप यह काम करना चाहते हैं जाएगा के रूप में।


बाद:

सामान्य तौर पर, एक आम गलती जब कार्यों है कि आप कुछ अलग से अपेक्षित परिणाम अपने डेटा की जांच करने के लिए है के साथ काम करने देना आपको लगता है कि समारोह दे। इस तरह से आप जानते हैं कि डेटा में समस्या है या/और फ़ंक्शन है। आपके मामले में, सरणी को प्रिंट करने से आपको समझ आएगी कि आपका डेटा ठीक नहीं था!

+0

आह मैं देखता हूं! लेकिन वास्तव में कारण मैं 'पैन [0]' शुरू नहीं करता हूं क्योंकि मैं यह नहीं कहना चाहता कि व्यक्ति 0 द्वारा कितने पेनकेक्स खाए गए हैं। क्या व्यावहारिक कारणों से मैंने सरणी के साथ क्या करने की अनुमति नहीं दी है? –

+2

आपको अपने प्रिंट स्टेटमेंट में व्यक्ति 0 के लिए संकेत नहीं देना है, आप '<< i << 'से' << i + 1 <<' – Eddge

+0

बदल सकते हैं हां, अब मैं समझता हूं, मैं 'पैन से शुरू करूंगा [0] 'और' i + 1' बहुत कुछ धन्यवाद! –

9
auto minmax = minmax_element(begin(pan), end(pan)); 

वास्तव में न्यूनतम/अधिकतम पाता है, लेकिन सी ++ में सरणी अनुक्रमण 0 पर शुरू होता है आप 0 सूचकांक से int pan[11]; भरते हैं,

big=small=pan[1]; //assigns element to be highest or lowest value; change to pan[0] 
for (int i = 1; i < 11; i++){...} // change to i=0 

तो pan[0] में जंक होगा (आपके मामले में मूल्य 1606416304) minmax_element द्वारा विचार किया जाएगा।

वास्तव में, एक गैर-प्रारंभिक चर से पढ़ने से सी और सी ++ में अपरिभाषित व्यवहार होता है, कुछ भी हो सकता है, हालांकि अधिकांश समय आप बस उस स्मृति पते पर संग्रहीत होने के लिए पढ़ते हैं।

तो आप का उपयोग सी ++ 11 (जो आप अब तक होना चाहिए), तो आप भी एक range-based for loop उपयोग कर सकते हैं पेनकेक्स :)

for(auto& pancake: pan) // note the reference, we are reading 
{ 
    cin >> pancake; // to read 
} 

और

for(auto pancake: pan) 
{ 
    // further processing here, like 
    if(pancake < small) { small = pancake;} // etc 
} 
2

आपका pan सरणी 11 तत्वों के रूप में परिभाषित किया गया है, लेकिन आप केवल उनमें से 10 प्रारंभ करते हैं। ध्यान दें, pan[0] कभी प्रारंभ नहीं किया गया है, और इसमें कुछ यादृच्छिक मूल्य होगा। मुझे लगता है कि आपका यादृच्छिक मूल्य 1606416304 होना था।

संबंधित मुद्दे