2014-10-08 25 views
-5

我正在編寫一個程序,詢問用戶的年齡以及他們成爲會員的年數,我試圖通過使用select case來做到這一點。然而,它似乎沒有工作,所有的年齡都很好,但如果我使用複選框來說他們是一個老兵,應該得到一個折扣,這是行不通的。此外,他們成爲會員的年數不會改變價格/類別,我的計劃很簡單,我不確定它爲什麼不起作用。節目的使用select case的Visual Basic會員計劃?

屏幕截圖:http://gyazo.com/ebab66526068f4c81a30c624aada7f7c

代碼:

Public Class Form1 

Private Sub btnCalc_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnCalc.Click 
    Dim x As Integer 
    Dim y As Integer 

    x = Val(txtAge.Text) 
    y = Val(txtYears.Text) 


    Select Case x 
     Case Is <= 18 
      lblPrice.Text = ("£60") 
      lblCategory.Text = ("Junior") 
     Case 19 To 49 
      lblPrice.Text = ("£120") 
      lblCategory.Text = ("Senior") 
     Case Is >= 50 
      lblPrice.Text = ("£80") 
      lblCategory.Text = ("Over 50") 
     Case chkVeteran.Checked 
      lblPrice.Text = ("£50") 
     Case Is <= 18 And y >= 2 
      lblPrice.Text = ("£40") 
      lblCategory.Text = ("2 year junior discount") 
     Case Is >= 50 And y >= 10 
      lblPrice.Text = ("£90") 
      lblCategory.Text = ("10 year senior discount") 
     Case chkVeteran.Checked And y >= 10 
      lblPrice.Text = ("£20") 
      lblCategory.Text = ("10 year veteran discount") 
    End Select 


End Sub 

末級

+2

定義 「這是行不通的。」它有什麼作用?當你在調試器中完成這一步時,觀察到的行爲與預期的行爲有什麼不同?發生這種情況時的運行時間值是什麼? – David 2014-10-08 16:38:20

+2

'Select Case x'指定了一個'x'的選擇,然後將它與不相關的'Case chkVeteran.Checked'進行比較。我會把值和字符串放在變量中,然後在案例後應用複選框邏輯,然後更新UI – 2014-10-08 16:39:27

回答

2

只有一個Case塊可以運行,但你似乎在期待多塊運行。考慮您的條款的這個子集:

Case Is <= 18 
    lblPrice.Text = ("£60") 
    lblCategory.Text = ("Junior") 
Case chkVeteran.Checked 
    lblPrice.Text = ("£50") 
Case Is <= 18 And y >= 2 
    lblPrice.Text = ("£40") 
    lblCategory.Text = ("2 year junior discount") 

如果x小於或等於18那麼第一Case塊將運行。其他人將被忽略,無論chkVeterany的狀態如何。一系列Case子句需要基本上相互排斥才能使邏輯合理。例如:

這兩個條款是排他性的,所以只有其中一個可以隨時申請。每個子句將按從頭到尾的順序進行檢查,並且匹配的第一個子句將執行。所以你應該設置你的邏輯,使得第一個條款匹配應該是只有條款匹配。


編輯:針對一個單獨的評論跟帖......

您定義的邏輯爲:

體育俱樂部有三類會員負責。青少年(年齡不超過18歲)每年支付60英鎊,老年人(19-49)支付120英鎊,退伍軍人(50歲以上)支付80英鎊。已經成爲會員2年或更長的青少年可獲得20英鎊的減免。已經成爲會員10年或更長時間的老年人和退伍軍人得到30英鎊的減免。

這聽起來好像是2個有條件的序列。第一個將定義的基本速率,這樣的事情:

If age < 19 Then 
    rate = 60 
Else If age < 50 Then 
    rate = 120 
Else 
    rate = 80 
End If 

第二個將定義一個折扣的基礎速率,這樣的事情:

If age < 19 And tenure > 1 Then 
    rate = rate - 20 
Else If age > 18 And tenure > 9 Then 
    rate = rate - 30 
End If 

兩個獨立的條件的序列,每個檢查正是條件中明確要求定義。然後你可以進一步重構它們,使語義更清晰。例如,提取的定義「大三,大四,和退伍軍人」到單獨的邏輯:

If IsJunior(age) Then 
    rate = 60 
Else If IsSenior(age) Then 
    rate = 120 
Else If IsVeteran(age) Then 
    rate = 80 
End If 

您可以爲每個那些創造的功能,如:

Function IsJunior(ByVal age As Integer) As Boolean 
    Return age < 19 
End Function 

這將提取的細節實現爲更小的幫助函數,並允許頂層邏輯用語義概念而不是實現細節表示,從而使邏輯的整體表達更加清晰地與要求給出的描述相匹配。

+0

這一切都沒有意義,所以我決定將它作爲if語句來執行。 – Finn 2014-10-08 16:58:45

+0

如果我使用Elseif,爲什麼它不起作用,如果我做'Elseif x = 19到49「 – Finn 2014-10-08 16:59:10

+0

@Finn:定義」不起作用「。是否有錯誤?什麼是更新的代碼以及它的行爲如何當你調試它時? – David 2014-10-08 17:06:40

0

這是非常艱難的使用選擇情況下的Cuzü將無法x和y的兩個值傳遞一起當u使用代碼類似的情況是< = 18,Y> = 2

更好,如果使用然後其他

公共類Form1中

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click 
    Dim x As Integer 
    Dim y As Integer 

    x = Val(txtAge.Text) 
    y = Val(txtYears.Text) 


    If x <= 18 Then 
     lblPrice.Text = ("£60") 
     lblCategory.Text = ("Junior") 
    ElseIf x >= 19 And x <= 49 Then 
     lblPrice.Text = ("£120") 
     lblCategory.Text = ("Senior") 
    ElseIf x >= 50 And y < 10 Then 
     lblPrice.Text = ("£80") 
     lblCategory.Text = ("Over 50") 
    ElseIf chkVeteran.Checked And y> Then 
     lblPrice.Text = ("£50") 
    ElseIf x <= 18 And y >= 2 Then 
     lblPrice.Text = ("£40") 
     lblCategory.Text = ("2 year junior discount") 
    ElseIf x >= 50 And y >= 10 Then 
     lblPrice.Text = ("£90") 
     lblCategory.Text = ("10 year senior discount") 
    ElseIf chkVeteran.Checked And y >= 10 Then 
     lblPrice.Text = ("£20") 
     lblCategory.Text = ("10 year veteran discount") 
    Else 
     MessageBox.Show("Some of the fields are empty") 
    End If 
End Sub 

末級