2010-07-12 20 views
6

को कैसे चालू करें मैंने एक छोटा प्रोग्राम बनाया जो 15 अंकों या उससे कम की औसत गणना करता है। 15 टेक्स्ट-बॉक्स हैं, प्रत्येक का डिफ़ॉल्ट मान '0' है। कार्यक्रम सभी टाइप किए गए नंबरों का योग प्राप्त करने और इसे टेक्स्ट बॉक्स की संख्या से विभाजित करने के बारे में जानता है जो '0' वापस नहीं लौटाते हैं। लेकिन यदि उपयोगकर्ता गलती से हटा देता है तो टेक्स्ट बॉक्स में से किसी एक में '0'os' .. रन-टाइम त्रुटि।शून्य से 0

मूल रूप से मैं लिख कर इस problam हल इस "अगर बयान" 15 बार (प्रत्येक पाठ बॉक्स के लिए):

if (t1.Text == "") { tr1 = 0; } 
else 
{ 
    tr1 = Double.Parse(t1.Text); 
} 

इस कोड को जांच करता है कि वहाँ टेक्स्ट बॉक्स में एक बात नहीं है (उदाहरण के लिए, नामित t1), अगर सही है, कार्यक्रम डबल 'tr1' दे रहा है ('t1' के साथ भ्रमित नहीं है) के लिए, का मान '0', अगर झूठे, कोड डबल देता है ' टी 1 '' टी 1 'का पाठ।

मैं इस 'अगर' 15 बार लिखना पड़ा। मैं जानना चाहता था कि क्या मैं एक ही कोड को सरणी और लूप के साथ लिख सकता हूं, और कैसे?

यहाँ पूरे कोड (वर नाम के लिए खेद वर के उपयोग के समान नहीं हैं।) है:

private void goyouidiot_Click(object sender, EventArgs e) 
{ 
    double tr1; 
    double tr2; 
    double tr3; 
    double tr4; 
    double tr5; 
    double tr6; 
    double tr7; 
    double tr8; 
    double tr9; 
    double tr10; 
    double tr11; 
    double tr12; 
    double tr13; 
    double tr14; 
    double tr15; 
    if (t1.Text == "") { tr1 = 0; } 
    else 
    { 
     tr1 = Double.Parse(t1.Text); 
    } 
    if (t2.Text == "") { tr2 = 0; } 
    else 
    { 
     tr2 = Double.Parse(t2.Text); 
    } 

    if (t3.Text == "") { tr3 = 0; } 
    else 
    { 
     tr3 = Double.Parse(t3.Text); 
    } 


    if (t4.Text == "") { tr4 = 0; } 
    else 
    { 
     tr4 = Double.Parse(t4.Text); 
    } 


    if (t5.Text == "") { tr5 = 0; } 
    else 
    { 
     tr5 = Double.Parse(t5.Text); 
    } 

    if (t6.Text == "") { tr6 = 0; } 
    else 
    { 
     tr6 = Double.Parse(t6.Text); 
    } 


    if (t7.Text == "") { tr7 = 0; } 
    else 
    { 
     tr7 = Double.Parse(t7.Text); 
    } 


    if (t8.Text == "") { tr8 = 0; } 
    else 
    { 
     tr8 = Double.Parse(t8.Text); 
    } 

    if (t9.Text == "") { tr9 = 0; } 
    else 
    { 
     tr9 = Double.Parse(t9.Text); 
    } 


    if (t10.Text == "") { tr10 = 0; } 
    else 
    { 
     tr10 = Double.Parse(t10.Text); 
    } 


    if (t11.Text == "") { tr11 = 0; } 
    else 
    { 
     tr11 = Double.Parse(t11.Text); 
    } 


    if (t12.Text == "") { tr12 = 0; } 
    else 
    { 
     tr12 = Double.Parse(t12.Text); 
    } 

    if (t13.Text == "") { tr13 = 0; } 
    else 
    { 
     tr13 = Double.Parse(t13.Text); 
    } 


    if (t14.Text == "") { tr14 = 0; } 
    else 
    { 
     tr14 = Double.Parse(t14.Text); 
    } 


    if (t15.Text == "") { tr15 = 0; } 
    else 
    { 
     tr15 = Double.Parse(t15.Text); 
    } 
    double[] sch = { tr1, tr2, tr3, tr4, tr5, tr6, tr7, tr8, tr9, tr10, tr11, tr12, tr13, tr14, tr15 }; 
    double total = 0; 
    double sorf = 0; 
    for (int i = 0; i != 14; i++) 
    { 

     sorf = sorf + sch[i]; 

     if (sch[i] > 0) 
     { total++; } 

    } 

    double totalic = sorf/total; 
    string glass = totalic.ToString(); 
    result.Text = ("your score: " + glass); 
} 
+0

क्या होगा यदि उपयोगकर्ता किसी एक बॉक्स में शून्य में प्रवेश करता है? क्या आप गलत औसत की गणना नहीं करेंगे? – Shravan

+0

यदि मैं/अन्य मामलों के बजाय मैं कोशिश/पकड़ का उपयोग करूंगा। ऐसा इसलिए है क्योंकि, उपयोगकर्ता भी टेक्स्ट इनपुट कर सकता है, जो अपवाद का कारण बनता है, जब आप Double.Parse (tx.Text) को करने का प्रयास करते हैं; – Biroka

+7

पवित्र प्रतिलिपि/पेस्ट कोड, बैटमैन! – cHao

उत्तर

10
Double.TryParse(t1.Text.Trim(), out tr1); 

पाठ बॉक्स के संख्यात्मक मान के लिए tr1 सेट करेगी, या 0.0 अगर यह किसी कारण से यह बदलने में विफल रहे। यदि रूपांतरण विफल हुआ या विफल हुआ तो यह भी सही हो जाएगा, लेकिन यदि डिफ़ॉल्ट 0.0 है तो आपको रिटर्न वैल्यू की परवाह नहीं है।

जोड़ा गया बोनस: अगर कोई "यह संख्या नहीं है" डालने का फैसला करता है तो यह अपवाद नहीं फेंक देगा। एक टेक्स्ट बॉक्स में। यह सिर्फ 0.

एक सरणी में ऐसा करने के लिए के रूप में मान दिखाई देगा ...

TextBox t[] = { t1, t2, t3, t4, t5, t6, t7, t8, t9, t10, t11, t12, t13, t14, t15 }; 
double tr[] = new double[t.Length]; 

for (int i = 0; i < t.Length; ++i) 
{ 
    Double.TryParse(t[i].Text.Trim(), out tr[i]); 
} 

अद्यतन:

ध्यान दें, यह पूरी तरह उचित औसत गणना करने के लिए सक्षम होने की अपेक्षा करने के लिए

TextBox t[] = { t1, t2, t3, t4, t5, t6, t7, t8, t9, t10, t11, t12, t13, t14, t15 }; 
double tr[] = new double[t.Length]; 
int valid_count = 0; 

for (int i = 0; i < t.Length; ++i) 
{ 
    if (Double.TryParse(t[i].Text.Trim(), out tr[i])) ++valid_count; 
} 

खाली ("") करने के लिए अपने बक्सें 'डिफ़ॉल्ट मान सेट करें, और तब आपको पता चल जाएगा कि कितने थे वैध तरीके से 0 के उपयोगकर्ता और कितने द्वारा दर्ज: ऐसी संख्याओं का यह करने के लिए आदेश में 0. शामिलखाली थे सटीक औसत प्राप्त करने के लिए राशि को valid_count पर विभाजित करें। (लेकिन यकीन है कि valid_count > 0 हो, या आप की संभावना एक डिवाइड-दर-शून्य अपवाद प्राप्त होगा।)

0

रखो एक .Trim() जब पाठ बॉक्स से मूल्यों को पुन: प्राप्त

TR3 = डबल .Parse (t3.Text.Trim());

+0

मैं अपनी समस्या का समाधान करने के लिए इसका उपयोग कैसे कर सकता हूं? क्या .trim() वैसे भी करता है? एक रन-टाइम त्रुटि है जैसे मैंने शून्य को 0 –

7

ज़रूर, एक double tr[15] तथा पाठ खानों के एक इसी सरणी बनाते हैं।

तो बस का उपयोग करें:

for (int i = 0; i < 15; i++) { 
    if (t[i].Text == "") { 
     tr[i] = 0; 
    } else { 
     tr[i] = Double.Parse(t[i].Text); 
    } 
} 
3

अगर यह आपकी if बयान के समक्ष उठाया स्रोत कोड का सिर्फ बड़ी राशि है, तो आप की तरह कुछ के लिए चुनते सकता है:

tr1 = (t1.Text == "") ? 0 : Double.Parse(t1.Text); 
tr2 = (t2.Text == "") ? 0 : Double.Parse(t2.Text); 
: 
tr15 = (t15.Text == "") ? 0 : Double.Parse(t15.Text); 

यह अच्छा और साफ है , बहुत सारी स्क्रीन रीयल-एस्टेट नहीं लेता है और यह इरादा देखने में काफी आसान है।

या, बेहतर अभी तक, कुछ की तरह:

tr1 = 0; try { tr1 = Double.Parse(t1.Text); } catch (Exception e) {}; 
tr2 = 0; try { tr2 = Double.Parse(t2.Text); } catch (Exception e) {}; 
: 
tr15 = 0; try { tr15 = Double.Parse(t15.Text); } catch (Exception e) {}; 

क्योंकि फ़ील्ड अमान्य हो सकता है और गैर खाली। अगर आप अपने डेटा और नियंत्रण को अलग ढंग से की संरचना लेकिन यह केवल पंद्रह मदों के लिए आवश्यक नहीं हो सकता

आप सरणियों के साथ एक ही बात है और एक for पाश कर सकते हैं। निश्चित रूप से यदि आप और जोड़ना चाहते थे, तो मैं उस विकल्प पर गंभीर विचार दूंगा।

और तुम इतनी है कि आप sch की जरूरत नहीं है एक सरणी में सीधे मूल्यों लोड करना चाहते हो सकता है:, आप भी पाठ बॉक्स की एक सरणी बना सकते हैं

double tr[15]; 
: 
tr[ 0] = 0; try { tr[ 0] = Double.Parse(t1.Text); } catch (Exception e) {}; 
tr[ 1] = 0; try { tr[ 1] = Double.Parse(t2.Text); } catch (Exception e) {}; 
: 
tr[14] = 0; try { tr[14] = Double.Parse(t15.Text); } catch (Exception e) {}; 
: 
double total = 0; 
double sorf = 0; 
for (int i = 0; i < 15; i++) { 
    if (tr[i] > 0) { 
     sorf = sorf + tr[i]; 
     total++; 
    } 
} 
: 

एक न्यूनतम कोड समाधान के लिए कि आप से जानकारी खींच रहे हैं।(Untested) की तरह कुछ:

TextBox t[] = {t1, t2, t3, ..., t15}; 
double tr[t.length]; 
: 
for (int i = 0; i < t.length; i++) { 
    tr[i] = 0; try { tr[i] = Double.Parse(t[i].Text); } catch (Exception e) {}; 
} 
: 
double total = 0; 
double sorf = 0; 
for (int i = 0; i < tr.length; i++) { 
    if (tr[i] > 0) { 
     sorf = sorf + tr[i]; 
     total++; 
    } 
} 
: 
+1

में बदलने की कोशिश की है आपके पास 90k प्रतिनिधि है और यह 'ParseDoubleOrZero' फ़ंक्शन' बनाने के लिए कभी नहीं होता है? – Gabe

+1

मेरे पास 90 के प्रतिनिधि हैं लेकिन मैं सी # :-) के लिए एक सापेक्ष नवागंतुक हूं लेकिन आपका मुद्दा लिया गया है, हालांकि मुझे आश्चर्य है कि इसका कितना फायदा है। निश्चित रूप से स्रोत कोड आकार के मामले में कोई भी नहीं। शायद कम ऑब्जेक्ट कोड और अधिक पठनीय क्योंकि आप एक सभ्य फ़ंक्शन नाम का उपयोग कर सकते हैं। – paxdiablo

+0

और मैं इसके बजाय डबल। ट्राईपर्स का उपयोग करूंगा क्योंकि अपवाद नियमित रूप से उत्पन्न होगा यदि कोई उपयोगकर्ता किसी संख्या में प्रवेश कर रहा है। –

2

एक समारोह है कि एक डबल, की तरह कुछ करने के लिए एक पाठ बॉक्स मूल्य धर्मान्तरित लिखें:

private static double ConvertTextboxValueToDouble(string value) 
{ 
    double result; 
    Double.TryParse(value, out result); 

    return result; 
} 

फिर एक बनाने अपने बक्सें से सरणी, युगल को उनके मूल्यों परिवर्तित:

double[] values = 
    { 
     ConvertTextboxValueToDouble(t1.text), 
     ConvertTextboxValueToDouble(t2.text), 
     ConvertTextboxValueToDouble(t3.text), 
... 
     ConvertTextboxValueToDouble(t15.text) 
    } 
1

आप एक NumericUpDown के बजाय एक पाठ बॉक्स का उपयोग करने का विचार किया है?

इसके अलावा बजाय कुछ लिख पंद्रह बार की

तुम सच में अपने कोड refactor और निम्न तरीकों में से एक प्रयास करना चाहिए: अपने सभी प्रवेश बॉक्स

  • रजिस्टर एक घटना है, जहां सभी एक ही कोड

    का उपयोग कर
    public void ValueChanged(Object sender, EventArgs e) 
    { 
        var numericUpDown = sender as NumericUpDown; 
        if(numericUpDown == null) 
         return; 
        //ToDo: Put some check code here 
    } 
    
  • उपयोग कुछ List<T> जहां सभी सेटिंग्स की जाँच करने के इस पर में अपने सभी बक्से डाल दिया और पुनरावृति

    var myList = new List<NumericUpDown>(); 
    //ToDo: Put all your boxes into it 
    myList.Add(numericUpDown1); 
    myList.Add(numericUpDown2); 
    //or get the list from somewhere else 
    myList.AddRange(this.Controls.OfType<NumericUpDown>()) 
    
    //OnButtonClick 
    foreach(var numericUpDown in myList) 
    { 
        //ToDo: Do some checking 
    } 
    
+0

numricupdown संख्या 100, 97, 34 के औसत के मामलों में मदद नहीं करेगा। उपयोगकर्ता को नंबर खोजने के लिए बस मिल जाएगा। –

+0

मुझे आपकी टिप्पणी समझ में नहीं आ रही है। एक न्यूमेरिकअपडाउन एक टेक्स्टबॉक्स है जो मूल्य को कम/घटाने के लिए केवल संख्याओं को दो बटन स्वीकार करता है। तो उपयोगकर्ता इन बटनों का उपयोग कर सकते हैं, लेकिन वह टेक्स्टबॉक्स में इन मानों को सीधे इनपुट भी कर सकता है। – Oliver

+0

इसलिए मुझे नहीं पता कि मुझे न्यूमिकअपडाउन का उपयोग क्यों करना चाहिए। –

0

इस परिस्थितियों और कोड के छोटे हिस्से में नौकरी को पूरा करने के लिए सोचने के लिए, मैं एक गंदे छोटी चाल का उपयोग करता हूं: नियंत्रण को एक पैनल में रखें।

अपने पैनल केवल वांछित नियंत्रण युक्त है (इस मामले, बक्सें में), इस युगल की एक सूची में मान संग्रहीत करने के लिए पर्याप्त हो जाएगा:

private void button1_Click(object sender, EventArgs e) 
    { 
     List<double> doubleList = new List<double>(); 

     foreach (TextBox t in panel1.Controls) 
      doubleList.Add(this.checkTextBox(t)); 
    } 

    private double checkTextBox(TextBox t) 
    { 
     return (t.Text != string.Empty) ? Double.Parse(t.Text.Trim()) : 0; 
    } 

आप एक पैनल केवल नहीं कर सकते हैं बक्सें और डिजाइन बल आप में नियंत्रण मिश्रण करने के लिए, आप एक अतिरिक्त चेक/रूपांतरण करना होगा:

private void button1_Click(object sender, EventArgs e) 
    { 
     List<double> doubleList = new List<double>(); 

     foreach (Control t in panel1.Controls) 
      if(t is TextBox) 
       doubleList.Add(this.checkTextBox((TextBox)t)); 
    } 

    private double checkTextBox(TextBox t) 
    { 
     return (t.Text != string.Empty) ? Double.Parse(t.Text.Trim()) : 0; 
    } 

नमस्ते!

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