2010-09-08 177 views
0

當我輸入單詞「Andrea」時,程序崩潰。我猜測,但我認爲這是因爲我在循環內,它不知道何時停止。如果我是正確的,你能告訴我如何擺脫循環。當我休息時告訴我沒有循環結束。循環和while循環

private void button1_Click(object sender, EventArgs e) 
     { 
      do Commission.Text = (Convert.ToDouble(textBox2.Text)/10).ToString(); 
      while (textBox1.Text == "Andrea"); 
     break;   
     do Commission.Text = (Convert.ToDouble(textBox2.Text)/10).ToString(); 
      while (textBox1.Text == "Brittany"); 
     do Commission.Text = (Convert.ToDouble(textBox2.Text)/10).ToString(); 
      while (textBox1.Text == "Eric"); 
     break;   
      MessageBox.Show("The spelling of the name is incorrect", "Bad Spelling"); 
+1

你的程序沒有什麼意義。你想做什麼?什麼是'textBox.Text'應該是? – NullUserException 2010-09-09 00:05:05

+0

如果textbox1等於Andrea那麼我想執行計算。與布列塔尼和埃裏克同樣的事情。 – user770022 2010-09-09 00:09:55

+1

我在代碼中沒有看到Eric的任何地方 – NullUserException 2010-09-09 00:10:56

回答

4

我懷疑是由while你實際上意味着if。否則,當應用程序崩潰時,您是否收到錯誤消息或異常?你可以在try/catch中包裝這個函數來查看異常是什麼?

編輯爲了澄清,試試這個方法體:

private void button1_Click(object sender, EventArgs e) 
     { 
      try 
      { 
       if(textBox1.Text == "Andrea") 
       { 
        Commission.Text = (Convert.ToDouble(textBox2.Text)/10).ToString(); 
       } 
       else if(textBox1.Text == "Brittany") 
       { 
        Commission.Text = (Convert.ToDouble(textBox2.Text)/10).ToString(); 
       } 
       else 
       {  
        MessageBox.Show("The spelling of the name is incorrect", "Bad Spelling"); 
       } 
      } 
      catch(Exception ex) 
      { 
       MessageBox.Show(ex.ToString(), "Bad Spelling"); 
      } 
     } 
    } 
} 
+0

我得到的唯一錯誤是程序已停止響應 – user770022 2010-09-09 00:03:17

+0

只有當我輸入Andrea,Brittany和Eric時纔會發生,如果我輸入任何其他名稱我會收到消息框並且程序保留無任何問題運行 – user770022 2010-09-09 00:04:59

+0

即使您輸入了Andrea或Brittany,它也會始終顯示消息框,告訴您拼寫錯誤。您希望MessageBox.Show在else if之後位於else子句中。 – 2010-09-09 00:15:01

4

一目瞭然,它看起來像你有一個無限循環。只要在textBox1中輸入「Andrea」並單擊button1,它就會永久更新Commission.Text,而不會中斷該線程以處理任何其他輸入。

更大的問題是,究竟發生了什麼這個程序應該做的事情?爲什麼它在一個循環中進行呢?

+0

如何停止循環 – user770022 2010-09-09 00:10:40

+0

a)您更改textBox1.Text的值,b)更重要的是,您爲什麼要啓動循環? – FacticiusVir 2010-09-09 00:12:03

+0

我已經這樣做了if語句,但現在我正在嘗試使用循環做同樣的事情 – user770022 2010-09-09 00:12:08

0

望着這一片:

do Commission.Text = (Convert.ToDouble(textBox2.Text)/10).ToString(); 
    while (textBox1.Text == "Andrea"); 

...你能指望什麼,如果textBox1.Text == "Andrea"發生?

什麼程序做的是檢查你的對比測試,然後如果這是真的,它的作用是do/while塊內,然後它再檢查對比測試,然後如果這是真的,它的作用是do/while內塊,然後它檢查比較測試,那麼如果它是真的,它是做什麼在do/while塊內,然後...

獲得點?

您使用do/while循環,如果條件是要在循環中改變(或者你明確地跳出來)。

你想要什麼,而不是將它更改爲類似

if(textBox1.Text == "Andrea") 
    Commission.Text = (Convert.ToDouble(textBox2.Text)/10).ToString(); 
+0

我已經這樣做了。我完全理解,但我正在尋找循環做同樣的事情。我明白我在做什麼不是最好的方式,甚至任何人都會使用的方式,我只是在學習,並認爲這將是一個很好的測試。 – user770022 2010-09-09 00:20:22

+0

如果你真的想用循環做到這一點,然後使用'break'語句來打破你的循環,因爲Rich建議。 – CanSpice 2010-09-09 00:24:04

6

你有textBox1.Text == "Andrea"textBox1.Text == "Brittany"作爲你的循環條件,但你似乎並不被在代碼的任何地方改變該值。因此,你有一個無限循環,這將導致你的程序崩潰。

我不能確定你的計劃,就是要在做,但你的選項,跳出循環是:

  • 使用break;聲明退出循環。
  • 更改您的循環狀態的東西,最終會導致false
  • 在循環體某處更改textBox.Text財產。

或者,您可以使用if語句檢查一次條件,並在條件爲真時執行一些代碼。

編輯:

我有if語句,但我現在正在試圖做同樣的事情與循環

沒有目的只是想學習如何編程這樣做

爲了迴應上述評論,我會告訴你如何用循環替換if語句。只要做到這一點,像這樣:

// Check the condition before executing the code. 
while (textBox1.Text == "Andrea") { 
    // Execute the conditional code. 
    Commission.Text = (Convert.ToDouble(textBox2.Text)/10).ToString(); 

    // We actually only want to execute this code once like an if statement, 
    // not while the condition is true, so break out of the loop. 
    break; 
} 

在你原來的職位,您使用的是do while循環而不是while循環。你應該記住do while一定要執行一次,不管它的條件是否成立。它只檢查條件是否應該運行額外的時間。另一方面,while循環在執行完畢之前會檢查條件,這意味着您可以用它替換if語句。

您應該記住,這是一個不好的做法。如果您想要根據特定條件執行代碼,請使用if語句。如果您想要重複執行代碼一定次數或某些條件爲真,則使用循環。

+0

當我放入一個break語句時,它告訴我沒有退出循環。 – user770022 2010-09-09 00:31:12

+0

do commission.Text =(Convert.ToDouble(textBox2.Text)/ 10).ToString(); while(textBox1.Text ==「Andrea」); 休息; do Commission.Text =(Convert.ToDouble(textBox2.Text)/ 10).ToString(); (textBox1.Text ==「Brittany」); do Commission.Text =(Convert.ToDouble(textBox2.Text)/ 10).ToString(); while(textBox1.Text ==「Eric」); 休息; MessageBox.Show(「名稱拼寫錯誤」,「拼寫錯誤」); – user770022 2010-09-09 00:31:41

+1

@ randywhite30:這是正確的。您的代碼不包含循環的花括號,因此您只能在其中執行一行。另外,在while條件之後並且完全在循環代碼之外放置'break;'語句。你需要這樣做:'do {[code here] break; } while([condition here]);' – Rich 2010-09-09 00:39:19

0

只是一個猜測,但作爲FacticiusVir說,你可能要改爲使用循環的條件語句:

private void button1_Click(object sender, EventArgs e) 
{ 
    if (textBox1.Text == "Andrea" || textBox1.Text == "Brittany") 
    { 
     Commission.Text = (Convert.ToDouble(textBox2.Text)/10).ToString(); 
    } 
    else 
    { 
     MessageBox.Show("The spelling of the name is incorrect", "Bad Spelling"); 
    } 
} 
+0

在這裏很好的使用'||',但是我想指出@ randywhite30,在這個例子中,如果文本是Andrew或者Brittany,相同的佣金邏輯將會執行。鑑於迄今爲止的例子,這沒什麼問題,但由於我們基於人名分支邏輯,因此我們可能希望根據個人的身份計算不同的佣金。 – 2010-09-09 00:22:08

+0

是的。如果他想沿着這條路線走,我會建議Dictionary commissions和Dictionary.ContainsKey:http://msdn.microsoft.com/en-us/library/kw5aaea4.aspx然後他仍然會只有一個,如果有兩個分支。 – Douglas 2010-09-09 00:28:28

1

添加到什麼FacticiusVir前面說的,你也可以做到這一點在switch語句(因爲我們「再計算相同的佣金爲每個人,也可以組合使用:

private void button1_Click(object sender, EventArgs e) 
{ 
    switch(textBox1.Text) 
    { 
     case "Andrea": 
     case "Brittany": 
      Commission.Text = (Convert.ToDouble(textBox2.Text)/10).ToString(); 
      break; 
     default: 
      MessageBox.Show("The spelling of the name is incorrect", "Bad Spelling"); 
    } 
} 

如果你想要做的每人需要分割它(在現在下面布列塔尼是得到一個不同的佣金值)不同的佣金:

private void button1_Click(object sender, EventArgs e) 
{ 
    switch(textBox1.Text) 
    { 
     case "Andrea": 
      Commission.Text = (Convert.ToDouble(textBox2.Text)/10).ToString(); 
      break; 
     case "Brittany": 
      Commission.Text = (Convert.ToDouble(textBox2.Text)/15).ToString(); 
      break; 
     default: 
      MessageBox.Show("The spelling of the name is incorrect", "Bad Spelling"); 
    } 
} 
+1

由於代碼是相同的,您可以合併這兩個案例部分。 – Douglas 2010-09-09 00:20:54

+0

已更新以反映使用:)謝謝。 – 2010-09-09 00:24:18

1

do { x } while (y)構建運行x一次,然後前進到只要y是真正連續運行x

,因爲你似乎是構建像這樣你沒有任何的成功:

do 
{ 
    // This will just run over and over... 
} 
while (condition); // ...because this is always true. 

break; // This isn't even in the loop! 

換句話說,當你試圖加點你break(基於評論你留在另一個答案)在循環之外,這就是爲什麼你的代碼無限期地運行。現在

,這聽起來像你真的只是想用一個do/while效仿的if聲明,大概爲給自己一個挑戰。如果是這樣,請幫你一個忙,放棄這個想法。

您不能使用do/while循環來模擬一個if條件,因爲do總是至少運行一次。您可以通過在do循環中嵌入if語句來確保其在特定條件下(即if所做的操作)運行一次的唯一方法,這將違反練習的目的。

這就是說,你可以模擬whileif

while (condition) 
{ 
    // Execute code once. 
    break; // Then just quit. 
}