2013-07-01 2 views
0

У меня есть следующая функция, которая принимает входные данные от txtbox1 и выводит результат в txtbox2. Главное - подставить каждую букву конкретным числовым значением, вычислить значение каждого слова, а затем отобразить общее количество всех слов. Прямо сейчас эта функция всегда вычисляет значение 13. Если я, например, набираю aaa bbb cc, результат должен быть. Как изменить функцию для этого?Рассчитать каждую букву и общее количество vb.net

aaa = 3 
bbb = 15 
cc = 14 
Total = 32 

Private Sub CountLetters(Input As String) 

    Dim total As Integer = 0 
    Dim dicLetters As New Dictionary(Of Char, Integer) 
    dicLetters.Add("a", 1) 
    dicLetters.Add("b", 5) 
    dicLetters.Add("c", 7) 

    For Each word As String In Input.Split 

     Dim wordtotal As Integer = 0 
     For Each cc As KeyValuePair(Of Char, Integer) In dicLetters 

      wordtotal += cc.Value 
     Next 

     total += wordtotal 

     'Display word totals here 

     txtBox2.Text += word.PadRight(12) + "=" + _ 
         wordtotal.ToString.PadLeft(5) + vbNewLine 
    Next 

    'Display total here 
    txtBox2.Text += "Total".PadRight(12) + "=" + total.ToString.PadLeft(5) 
End Sub 

ответ

4

Как logixologist указано, вопрос у наш цикл через словарь и суммирование значений ключей, а не значений слов.

Если у вас есть значение для каждой буквы, словарь - хороший способ пойти (если это всего лишь несколько букв, чем Select).

Ниже приведен код, который будет получить результат, который вы ищете:

Dim total As Integer = 0 
Dim wordTotal AS Integer 
Dim dicLetters As New Dictionary(Of Char, Integer) 
dicLetters.Add("a", 1) 
dicLetters.Add("b", 5) 
dicLetters.Add("c", 7) 

' charValue will be used to hold the result of the TryGetValue below 
Dim charValue As Integer 

For Each word As String In Input.Split(New Char() { " " }) 

    wordTotal = 0 

    ' Loop through the word 
    For Each character As Char in word 

     wordTotal += If(dicLetters.TryGetValue(character, charValue) = _ 
        True, dicLetters(character), 0) 
    Next 

    total += wordTotal 

    txtBox2.Text += word.PadRight(12) + " = " + _ 
        wordTotal.ToString().PadLeft(5) + vbNewLine 
Next 

txtBox2.Text += "Total:".PadRight(12) + " = " + _ 
       total.ToString().PadLeft(5) 

Наружный контур, по существу, то же самое - разделить строку ввода на «» (пробел).

Сбросить словоОбщий счетчик 0, а затем прокрутить текущее слово (используя для каждого символа прохождение через один символ за раз).

Следующая строка использует TryGetValue по словарю, и если есть значение ключа, он добавляет значение wordTotal, в противном случае она добавляет 0.

выход будет для «ааа ГЭБ куб.см» будет :

 
aaa   =  3 
bbb   = 15 
cc   = 14 
Total:  = 32 
+0

Спасибо @tim! – logixologist

+0

@logixologist - Добро пожаловать. Надеюсь, я не украл твой гром ... – Tim

+0

Мне нравится ваше решение в любом случае :). – logixologist

1

Вот подсказка: Что вы делаете в этом заявлении:

For Each cc As KeyValuePair(Of Char, Integer) In dicLetters 
wordtotal += cc.Value 
Next 

Для каждой пары ключей значение в словаре добавить их ... так что это добавляет 1, 5 и 7 к дать вам 13.

Почему бы не поставить SELECT/саз проверку значения каждой буквы против словаря и добавив, что wordtotal

+0

Спасибо за подсказку, но я все еще не могу получить желаемый результат. – user2536008

+0

Как реализовать инструкцию select/case? – user2536008

+0

Более простой способ сделать это - не использовать словарь с парами значений ключа, если у вас много пар ключ/значение. У меня сейчас нет vb.net, но я посмотрю, когда смогу. – logixologist

Смежные вопросы