2014-02-19 3 views
0

В программе, над которой я работаю для своего класса Visual Basic, я должен написать программу, которая рассчитает количество калорий в рецепте.Расчеты в Visual Basic

В моей форме есть 2 списка (lstIngredients и lstRecipe) и текстовое поле для количества (txtQuantity) и кнопка для расчета калорий (btnCalculate). Есть и другие вещи, но те, которые я перечислил, являются единственными, относящимися к этому вопросу.

Я уже написал код, чтобы добавить выбранный элемент с соответствующим количеством в список рецептов, но я зациклился на том, как рассчитать калории.

В списке «Ингредиенты» указаны предметы: яйца (каждая), мука (чашки), молоко (чашки), сахар (чашки) и масло (столовые ложки). С инструкциями нам дали калории для каждого из этих предметов: 1 яйцо = 72 калории, 1 чашка муки = 455 калорий, 1 стакан молока = 86 калорий, 1 стакан сахара = 774 калории и 1 столовая ложка масла = 102 калории. Используя эти значения, элементы, добавленные в список рецептов и их количества, программа должна рассчитывать общее количество калорий в этом рецепте, когда пользователь нажимает кнопку «Вычислить калории».

Я понимаю математику, которая была бы сделана в этом случае, если в рецепте содержится 2 яйца, 3 стакана муки и 2 стакана молока, мне придется умножать каждую калорию ингредиентов на количество, а затем добавьте все эти значения вместе, чтобы получить общее количество калорий для рецепта. Но я не знаю, как подключить калорийные значения к отдельным элементам.

Вот код, который я написал до сих пор.

Public Class Form1 

    Private Sub btnAdd_Click(sender As Object, e As EventArgs) Handles btnAdd.Click 
     Dim i As Integer = lstIngredients.SelectedIndex 
     Dim Quantity As Integer 

     If Trim(txtQuantity.Text = "") Then 
      Quantity = 1 
     Else 
      Quantity = Me.txtQuantity.Text 
     End If 

     Dim intCount As Integer = 0 
     While intCount < Quantity 
      lstRecipe.Items.Add(lstIngredients.Text) 
      intCount += 1 
     End While 
    End Sub 

    Private Sub btnClear_Click(sender As Object, e As EventArgs) Handles btnClear.Click 
     lstRecipe.Items.Clear() 
     txtQuantity.Clear() 
     txtAnswer.Clear() 
    End Sub 

    Private Sub btnCalculate_Click(sender As Object, e As EventArgs) Handles btnCalculate.Click 
     Dim dblCalories As Double 

     If txtQuantity.Text = "" Then 
      txtAnswer.Text = "0 Calories" 
     End If 

    End Sub 
End Class 

Кроме того, будет ли это случай, когда я мог бы использовать набор данных? Я никогда не использовал их раньше, так что понятия не имею, как это работает, но если он может сделать это проще я "м все для него га.

+2

используйте класс для имени и калорий и, возможно, переопределите ToString. Таким образом, каждый ингредиент может поддерживать связанную информацию вместе, а также быть тем, что хранится в LstBox. – Plutonix

ответ

2

Но я не знаю, как соединить калорийности значения отдельных элементов.

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

Class Ingredient 
    Public Property Name As String = "" 
    Public Property Amount As Double = 0 
    Public Property Measure As Measurements = Measurements.Tsp 
    Private Property Calories As Double = 0 
    Private Property CalMeas As Measurements = Measurements.Tsp 
    Public Sub New(_name As String, _calories As Double, _caloriemeasure As Measurements, Optional _amount As Double = 0, Optional _measure As Measurements = Measurements.Tsp) 
     Name = _name 
     Calories = _calories 
     CalMeas = _caloriemeasure 
     Amount = _amount 
     Measure = _measure 
    End Sub 
    Public Function GetCalories() As Double 
     Return (Amount * Measure) * (Calories/CalMeas) 
    End Function 
    Public Overrides Function ToString() As String 
     Return Join({Name.PadRight(10, " "c), (Amount.ToString().PadRight(4, " "c) + [Enum].GetName(GetType(Measurements), Measure)).PadRight(10, " "c), GetCalories.ToString.PadLeft(5, " "c)}, vbTab) 
    End Function 
End Class 
Enum Measurments 
    Unit = 1 
    Tsp = 1 
    Tbsp = 3 
    Cup = 48 
End Enum 

Теперь, если у вас есть List(Of Ingredient) называется Ingredients то простая лямбда в методе Sum даст вам общее количество калорий, Ingredients.Sum(Function(x) x.GetCalories).

Dim Ingredients As New List(Of Ingredient)(
    { 
     New Ingredient("Flour", 455, Measurements.Cup, 3, Measurements.Cup), 
     New Ingredient("Milk", 86, Measurements.Cup, 2, Measurements.Cup), 
     New Ingredient("Sugar", 774, Measurements.Cup, 0.5, Measurements.Cup), 
     New Ingredient("Egg", 72, Measurements.Unit, 2, Measurements.Unit), 
     New Ingredient("Butter", 102, Measurements.Tbsp, 1, Measurements.Cup) 
    }) 

Dim total = Ingredients.Sum(Function(x) x.GetCalories)'3700.0 

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

Установив список в качестве источника данных для списка, в списке будет использоваться переопределение ToString для отображения данных, тогда просто показать количество калорий.

Этот подход имеет то преимущество, что элемент списка, являющийся объектом Ingredient. Таким образом, изменение количества одного ингредиента - это простой вопрос о том, как выбрать выбранный элемент для типа Ингредиент и изменить его.

2

Вы можете создать

Dictionary<string,int> 

(извините за C#), а затем добавить каждый ингредиент в словарь, используя имя ингредиента в качестве ключа и калорий в качестве значения. Затем вы можете легко совместить поиск, нажав клавишу.

Редактировать (спасибо комментарию от davidsbro):

Что-то вроде:

Dictionary<string,int> dIngredients = new Dictionary<string, int>(); 

// Add the code here to add the ingredients 

foreach(string s in lstIngredients) 
{ 
    dblCalories += dIngredients[s]; 
} 
+0

Почему бы вам просто не преобразовать это в vb с помощью developerfusion или что-то подобное? :) – davidsbro

+0

Я сделал сейчас, спасибо за подсказку –