2010-07-12 73 views
6

Tôi đã xây dựng một chương trình nhỏ tính trung bình 15 số hoặc ít hơn. Có 15 hộp văn bản, giá trị mặc định của mỗi người là '0'. Chương trình biết lấy tổng của tất cả các số đã nhập và chia cho số hộp văn bản không trả về '0'. Nhưng nếu người dùng xóa nhầm một trong những '0'os trong một trong các hộp văn bản .. lỗi thời gian chạy.Cách chuyển đổi null thành 0

Nguyên Tôi giải quyết problam này bằng cách viết này "lệnh if" 15 lần (một cho mỗi text-box):

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

mã này kiểm tra nếu không có một điều trong hộp văn bản (ví dụ, tên t1), nếu đúng, chương trình đang đưa ra đôi 'tr1' (không nhầm lẫn với 't1'), giá trị '0', nếu sai, mã sẽ cho số đôi ' tr1 'văn bản của' t1 '.

tôi phải viết 'nếu' này 15 lần. tôi muốn biết nếu tôi có thể viết cùng một mã với mảng và một vòng lặp for, và làm thế nào?

đây là toàn bộ mã (xin lỗi vì tên var không tương tự như sử dụng var của.):

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

Điều gì sẽ xảy ra nếu người dùng nhập Số không vào một trong các hộp? Bạn sẽ không kết thúc tính toán sai trung bình? – Shravan

+0

Tôi sẽ sử dụng try/catch thay cho những trường hợp if/else. Điều này là bởi vì, người dùng có thể nhập văn bản quá, mà sẽ gây ra một ngoại lệ, khi bạn cố gắng Double.Parse (tx.Text) ;. – Biroka

+7

Thánh chép/dán mã, Batman! – cHao

Trả lời

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

sẽ thiết lập tr1 đến giá trị số vào hộp văn bản, hoặc 0.0 nếu nó thất bại trong việc chuyển đổi nó vì một lý do. Nó cũng sẽ trả về true nếu chuyển đổi thành công hoặc false nếu nó không thành công, nhưng bạn không quan tâm đến giá trị trả về nếu giá trị mặc định là 0.0.

Đã thêm tiền thưởng: nó sẽ không ném ngoại lệ nếu ai đó quyết định đặt "Đây không phải là số". vào một hộp văn bản. Nó sẽ chỉ nhìn thấy giá trị là 0.

Để làm điều này trong một mảng ...

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]); 
} 

UPDATE:

Note, nó hoàn toàn hợp lý để mong đợi để có thể tính toán trung bình số bao gồm 0. để làm điều này:

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; 
} 

Đặt giá trị mặc định textbox của bạn để trống (''), và sau đó bạn sẽ biết có bao nhiêu là hợp pháp 0 của nhập vào bởi người sử dụng và có bao nhiêu trống. Chia số tiền theo số valid_count để nhận số trung bình chính xác. (Tuy nhiên, hãy chắc chắn valid_count > 0, hoặc bạn có thể sẽ nhận được một chia-by-zero ngoại lệ.)

0

Đặt một .Trim() khi lấy các giá trị từ TextBox

TR3 = đúp .Parse (t3.Text.Trim());

+0

làm thế nào tôi có thể sử dụng nó để giải quyết vấn đề của tôi? những gì .trim() không sao? có một lỗi thời gian chạy như tôi đã cố gắng để biến null thành 0 –

7

Chắc chắn, tạo một double tr[15] và một mảng trường văn bản tương ứng.

Sau đó, chỉ cần sử dụng:

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

Nếu nó chỉ là số lượng lớn các mã nguồn đưa lên với if báo cáo của bạn, bạn có thể lựa chọn không cho một cái gì đó như:

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

Đây là đẹp và gọn gàng , không chiếm nhiều bất động sản trên màn hình và khá dễ dàng để xem mục đích.

Hoặc tốt hơn nữa, một cái gì đó như:

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) {}; 

vì các lĩnh vực có thể là không hợp lệ không trống.

Bạn có thể thực hiện tương tự với các mảng và một vòng lặp for nếu bạn cấu trúc dữ liệu và điều khiển khác nhau nhưng có thể không cần thiết chỉ cho mười lăm mục. Chắc chắn nếu bạn đã thêm nhiều hơn, tôi sẽ xem xét nghiêm túc tùy chọn đó.

Và bạn có thể muốn tải các giá trị trực tiếp vào một mảng để bạn không cần 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++; 
    } 
} 
: 

Đối với một giải pháp đang tối thiểu, bạn cũng có thể tạo một mảng của các hộp văn bản bạn đang lấy thông tin từ đó.Một cái gì đó tương tự (chưa được kiểm tra):

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

Bạn có đại diện 90k và nó không bao giờ xảy ra với bạn để thực hiện một hàm 'ParseDoubleOrZero'? – Gabe

+1

Tôi có một đại diện 90K nhưng tôi là một người mới tương đối với C# :-) Nhưng điểm của bạn được thực hiện mặc dù tôi tự hỏi có bao nhiêu lợi thế của nó. Chắc chắn không có gì về kích thước mã nguồn. Có lẽ ít mã đối tượng hơn và dễ đọc hơn vì bạn có thể sử dụng tên hàm phong nha. – paxdiablo

+0

Và tôi sẽ sử dụng double.TryParse thay vì các ngoại lệ sẽ phát sinh thường xuyên nếu người dùng nhập một số. –

2

Viết một hàm có thể chuyển đổi một giá trị textbox vào một đôi, một cái gì đó như:

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

    return result; 
} 

Sau đó tạo một mảng từ textbox của bạn, chuyển đổi các giá trị của họ để đôi:

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

bạn đã xem xét sử dụng một NumericUpDown thay vì một TextBox?

Ngoài ra thay vì viết một cái gì đó mười lăm lần bạn thực sự cần cấu trúc lại mã của bạn và thử một trong các cách sau:

  • Đăng ký cho tất cả các hộp nhập của bạn một sự kiện, nơi mà tất cả bằng cách sử dụng cùng một mã

    public void ValueChanged(Object sender, EventArgs e) 
    { 
        var numericUpDown = sender as NumericUpDown; 
        if(numericUpDown == null) 
         return; 
        //ToDo: Put some check code here 
    } 
    
  • Sử dụng một số List<T> nơi bạn đặt tất cả các hộp của bạn vào và duyệt qua nó để kiểm tra tất cả các thiết lập

    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 sẽ không giúp đỡ trong trường hợp của các averege của các số 100, 97, 34. người dùng sẽ chỉ nhận được tierd của việc tìm kiếm số. –

+0

Tôi không hiểu bình luận của bạn. A NumericUpDown là một TextBox chỉ chấp nhận số cộng với hai nút để vào/giảm giá trị. Vì vậy, người dùng có thể sử dụng các nút này, nhưng anh ta cũng có thể trực tiếp nhập các giá trị này như trong một TextBox. – Oliver

+0

Vì vậy, tôi không thấy lý do tại sao tôi nên sử dụng NumricUpDown. –

0

Đối với trường hợp này và suy nghĩ để hoàn thành công việc trong một phần nhỏ của mã, tôi sử dụng một mẹo nhỏ bẩn: đặt các điều khiển vào một bảng điều khiển.

Nếu bảng điều khiển của bạn chỉ chứa các điều khiển mong muốn (trong trường hợp này, textbox), đây sẽ là đủ để lưu trữ các giá trị trong một danh sách các đôi:

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; 
    } 

Nếu bạn không thể có một bảng điều khiển duy nhất đối với hộp văn bản và thiết kế buộc bạn kết hợp các điều khiển, bạn sẽ phải thực hiện kiểm tra/chuyển đổi bổ sung:

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; 
    } 

Chúc mừng!

Các vấn đề liên quan