2013-11-21 3 views
5

मेरे पास एक असाइनमेंट है जहां मुझे सरणी में सभी संख्याओं के उत्पाद को खोजने की ज़रूरत है, मुझे यकीन नहीं है कि यह कैसे करें।सरणी में सभी मानों को गुणा कैसे करें?

int[] numbers = new int[SIZE]; 

    Console.WriteLine("Type in 10 numbers"); 
    Console.WriteLine("To stop, type in 0"); 
    for (int input = 0; input < SIZE; input++) 
    { 
     userInput = Console.ReadLine(); 
     numberInputed = int.Parse(userInput); 

     if (numberInputed == ZERO) 
     { 
      numberInputed = ONE; 
      break; 
     } 
     else 
     { 
      numbers[input] = numberInputed; 
     } 

    } 

यह वह जगह है जहां मैं सरणी में सभी संख्याओं का उत्पाद ढूंढने की कोशिश कर रहा हूं।

foreach (int value in numbers) 
    { 
     prod *= value; 
    } 

    Console.WriteLine("The product of the values you entered is {0}", prod); 

मैं foreach स्टेटमेंट में क्या गलत कर रहा हूं? धन्यवाद अग्रिम में

संपादित करें, मेरे घोषित मूल्यों

const int SIZE = 10; 
    const int ZERO = 0; 
    string userInput; 
    int numberInputed; 
    int prod = 1; 

अब यह काम करता है जब मैं सभी दस मूल्यों में टाइप बाहर छोड़ दिया लेकिन अगर मैं आदेश पाश तोड़ने के लिए एक 0 डाल तो सब कुछ बराबर होती है 0. कैसे कर मैं 0 को सरणी में प्रवेश करने से रोकता हूं?

int prod = 1; 
foreach (int value in numbers) 
{ 
    prod *= value; 
} 

आप किए जा सकेंगे:

+0

क्या साथ गलत हो रहा है तुम्हारा कोड? –

उत्तर

19

इसका मतलब है कि जो कोई बात नहीं क्या संख्या आपके सरणी में कर रहे हैं, prod 0. रहेगा सुनिश्चित करें कि आप सही परिणाम प्राप्त करने के लिए 1 के लिए इसे प्रारंभ करें कि आप prod को 0 प्रारंभ संभव है,

using System.Linq; // put with other using directives 

int prod = numbers.Aggregate(1, (a, b) => a * b); 

अप: भी एक ही बात करने के लिए Linq के Aggregate विस्तार विधि का उपयोग दिनांक

वास्तविक समस्या (जिसे मैं पहले नोटिस करने में विफल रहा) यह है कि यदि आप अपने लूप को जल्दी से तोड़ते हैं तो आपकी सरणी पूरी तरह से आबादी नहीं जा रही है। इसलिए किसी भी सरणी प्रविष्टियों आप सेट नहीं किया अभी भी 0 पर प्रारंभ कर रहे हैं इसे ठीक करने के लिए, एक List<int> बजाय एक int[] की:

using System.Collections.Generic; // put with other using directives 

List<int> numbers = new List<int>(SIZE); // Capacity == SIZE 

... 

for (int input = 0; input < SIZE; input++) 
{ 
    ... 
    if (numberInputed == ZERO) 
    { 
     break; 
    } 
    else 
    { 
     numbers.Add(numberInputed); 
    } 
} 
+2

+1। आप हमेशा चीजों को करने के एक से अधिक तरीके प्रदान करते हैं। Kudos :) –

+0

+1 'फोल्ड' के लिए +1 ... मेरा मतलब है,' कुल '। –

+0

क्षमा करें, मैंने घोषित मूल्यों के साथ अपनी पोस्ट अपडेट की है। मेरे पास प्रोड बराबर था 1. मैंने आपकी विधि की कोशिश की लेकिन मुझे "त्रुटि 'सिस्टम.एरे' में 'कुल' के लिए परिभाषा नहीं है और कोई 'एक्सटेंशन' प्रकार 'सिस्टम' के पहले तर्क को स्वीकार नहीं करता है। ऐरे 'पाया जा सकता है (क्या आप एक प्रयोग निर्देश या असेंबली संदर्भ खो रहे हैं?) "सिस्टम 0Linq का उपयोग कर त्रुटि – user2781666

1

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

रखें ट्रैक वहाँ पाश बाहर पाश चर रखकर कर रहे हैं:

int input = 0; 
while (input < SIZE) 
{ 
    userInput = Console.ReadLine(); 
    numberInputed = int.Parse(userInput); 
    if (numberInputed == ZERO) { 
     break; 
    } 
    numbers[input] = numberInputed; 
    input++; 
} 

अब आप केवल आइटम है कि वास्तव में आवंटित कर रहे हैं का उपयोग कर सकते हैं:

for (int i = 0; i < input; i++) { 
    prod *= numbers[i]; 
} 
संबंधित मुद्दे