2013-06-30 8 views
1

사용자가 텍스트를 입력하는 양식에 텍스트 상자가 있습니다. 각 문자에는 a = 1, b = 2, c = 3 등과 같은 다른 값이 지정됩니다. 내가 텍스트 상자의 문자열을 통해 반복하여 총 가치를 얻을 수 있었다vb.net에서 단어 값 계산

aa = 2 
bb = 4 
dd = 6 
Total value is (12) 

하지만 어떻게 총을 표시 할 예를 들어, 사용자 유형 "AA BB의 CCC"경우처럼 라벨에 출력해야 각 단어마다. 이것은 내가 지금까지 무엇을 가지고 :

Dim listOfWordValues As New List(Of Integer) 
For letter_counter = 1 To word_length 
    letter = Mid(txtBox1.Text, letter_counter, 1) 

    If letter = " " Then 
     totalletter= totalletter + letter_value 
     listOfWordValues.Add(letter_value) 
     letter_value = 0 
    Else 
     letter_value += Asc(letter.ToUpper) - 64 
    End If 
Next letter_counter 

totalletter = totalletter + letter_value 
If Not txtBox1.Text.EndsWith(" ") Then listOfWordValues.Add(letter_value) 
txtBox2.Text = txtBox2.Text & string.Join(", ", listOFWordValues); 
+0

'txtBox2.Text'가 무엇입니까? 또한,'word_length'는 어디에 정의되어 있습니까? – Tim

+0

두 개의 루프가 필요하다고 생각합니다. 각 단어의 외부 루프와 각 단어의 값을 결정하는 내부 루프가 필요합니다. 한 단어에 대한 구분자는 무엇입니까? – Tim

+0

swith 문을 사용할 수 있습니다. Switch (your text) {case "A": later_value = 2; totalletter = totalletter + letter_value; 단절; }이 논리는 당신을 도울지도 모른다 –

답변

2

이 간단한 작은 루틴이 트릭을 수행해야합니다

Private Sub CountLetters(Input As String) 
    Label1.Text = "" 
    Dim total As Integer = 0 
    Dim dicLetters As New Dictionary(Of Char, Integer) 
    dicLetters.Add("a"c, 1) 
    dicLetters.Add("b"c, 5) 
    dicLetters.Add("c"c, 7) 
    For Each word As String In Input.Split 
     Dim wordtotal As Integer = 0 
     For Each c As Char In word 
      wordtotal += dicLetters(Char.ToLower(c)) 
     Next 
     total += wordtotal 
     'Display word totals here 
     Label1.Text += word.PadRight(12) + "=" + wordtotal.ToString.PadLeft(5) + vbNewLine 
    Next 
    'Display total here 
    Label1.Text += "Total".PadRight(12) + "=" + total.ToString.PadLeft(5) 
End Sub 
+0

값이 1 씩 증가하면 제대로 작동하지만 그렇지 않습니다. 예를 들어, a = 1, b = 2. c = 3, d = 4, e = 50, f = 60. 각 문자의 값은 어떻게 지정합니까? 감사! – user2536008

+0

처음에는 알아두면 좋았을 것입니다. 값은 임의적입니까? 아니면 알고리즘에 의해 적용 되었습니까? – tinstaafl

+0

값은 임의 값이 아니지만 값이 변경됩니다. 그래서 각 문자의 값을 코드에서 개별적으로 지정하는 방법을 찾고 있습니다. 유사 : – user2536008

2

이 당신에게 아이디어를 줄 것이다. 하여 사용자가 입력 한 문자열과 ""(공간)라는 단어의 구분은 다음과 같습니다

Dim words As String() = txtBox1.Text.Split(New Char() {" "}, StringSplitOptions.RemoveEmptyEntries) 

Dim totalValue As Integer = 0 
Dim wordValue As Integer = 0 

For Each word As String In words 

    wordValue = 0 

    For letter_counter = 1 To word.Length 

     Dim letter As String = Mid(txtBox1.Text, letter_counter, 1) 
     Select letter.ToUpper() 
      Case "A": 
       wordValue = wordValue + 1 
      Case "B": 
       wordValue = wordValue + 2 
      ' And so on 
     End Select 
    Next 

    totalValue = toalValue + wordValue 
Next 

위의 코드는 먼저 사용자로부터 입력 된 텍스트를 소요하고 그것을 분할 "txtBox1이다 가정"(공간).

다음 두 개의 변수 설정 - 합계 값에 대한 하나의 개별 워드 값을, 0으로

외부 루프는 사용자에 대해 수행 스플릿에서 배열 된 각 단어를 통과로 초기화 입력 된 텍스트. 이 루프를 시작할 때 wordValue 카운터를 0으로 재설정합니다.

내부 루프는 현재 단어를 통과하고 Select 문을 통해 문자의 값을 합산합니다.

내부 루프가 종료되면 해당 단어의 합계 값이 실행중인 totalValue에 추가되고 다음 단어가 평가됩니다.

이 두 루프가 끝나면 모든 단어의 값과 모든 세계의 값이 계산됩니다.

내 견본에 포함되지 않은 것은 라벨을 업데이트하는 것뿐입니다.

+0

위의 코드를 시도해 보았습니다. aa cc ddd를 입력하면 1, 3, 4가됩니다. 각 문자의 값은 a = 1, b = 2, c = 3, d 인 2, 4, 12가되어야합니다. = 4 – user2536008

0

당신이 뭔가를 시도 할 수 있습니다 :

For letter_counter = 1 To word_length 
    letter = Mid(txtBox1.Text, letter_counter, 1) 

    If letter.ToUpper = "A" Then 
     letter_value = 1 
    End If 
    If letter.ToUpper = "B" Then 
     letter_value = 2 
    End If 
    If letter.ToUpper = "C" Then 
     letter_value = 3 
    End If 
    If letter.ToUpper = "D" Then 
     letter_value = 4 
    End If 
    If letter.ToUpper = "E" Then 
     letter_value = 5 
    End If 
    If letter.ToUpper = " " Then  
     letter_value = 0 
    End If 

    totalletter = totalletter + letter_value 

    Label1.Text = Label1.Text & letter_value & " " 
    txtBox2.Text = txtBox2.Text & letter_value & " " 
Next letter_counter 
+0

나는 aa bb를 입력하려고 시도했으며 결과는 "aa = 2, bb = 4"이어야하는 텍스트 상자에 "4"가되었습니다.코드가 계산하는 대신 계산하는 것 같습니다. – user2536008

0

이 시도 ..

Dim s As String = TextBox1.Text 
    Dim c As String = "ABCDE" 
    Dim s0 As String 
    Dim totalletter As Integer 

    For x As Integer = 0 To s.Length - 1 
     s0 = s.Substring(x, 1).ToUpper 
     If c.Contains(s0) Then 
      totalletter += c.IndexOf(s0) + 1 
     End If 
    Next 
    MsgBox(totalletter) 
0

내가 숫자에 각 문자를 매핑하는 사전을 사용하여이 문제를 해결할 것입니다.

Private Shared ReadOnly LetterValues As Dictionary(Of Char, Integer) = GetValues() 

Private Shared Function GetValues() As IEnumerable(Of KeyValuePair(Of Char, Integer)) 
    Dim values As New Dictionary(Of Char, Integer) 
    Dim value As Integer = 0 
    For Each letter As Char In "ABCDEFGHIJKLMNOPQRSTUVWXYZ" 
     value += 1 
     values.Add(letter, value) 
    Next 
    Return values 
End Function 

Public Function CalculateValue(input As String) As Integer 
    Dim sum As Integer = 0 
    For Each letter As Char In input.ToUpperInvariant() 
     If LetterValues.ContainsKey(letter) Then 
      sum += LetterValues.Item(letter) 
     End If 
    Next 
    Return sum 
End Function 

사용 예 :

Dim sum As Integer = 0 
    For Each segment As String In "aa bb ccc".Split() 
     Dim value = CalculateValue(segment) 
     Console.WriteLine("{0} = {1}", segment, value) 
     sum += value 
    Next 
    Console.WriteLine("Total value is {0}", sum) 

    ' Output 
    ' aa = 2 
    ' bb = 4 
    ' ccc = 9 
    ' Total value is 15