2013-10-07 1 views
0

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

например: I input 1 Snowboard and 1 Snowboard with Boots, это работает, 1 показано в сводке для сноубордов и сноубордов с сапогами. Однако, когда я пытаюсь ввести снова, чтобы сохранить текущее количество продаж, у меня есть проблема, я ввожу 1 сноуборд и 1 сноуборд с сапогами, а в итогах показаны 11, а не 2. Почему это происходит?

' Declare module-level variables and constants. 
Private SnowBoardsSold, BootsSold, SaleCount As Integer 
Private ItemsSold As Integer 
Private TotalSales As Decimal 
Const SNOWBOARD_RATE As Decimal = 20D 
Const BOOTS_RATE As Decimal = 30D 


Private Sub CalculateButton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CalculateButton.Click 
    ' Calculate the prices 
    Dim SnowBoards, Boots As Integer 
    Dim SnowBoardSale, BootsSale, ThisSale, AverageSalesEver As Decimal 

    Try 
     ' Convert the Snowboard input to numeric variable. 
     SnowBoards = Integer.Parse(SnowboardsTextBox.Text) 

     Try 
      ' Convert Boots if Snowboard was successful. 
      Boots = Integer.Parse(WithBootsTextBox.Text) 
      ' Calculate values for sale. 
      SnowBoardSale = SnowBoards * SNOWBOARD_RATE 
      BootsSale = Boots * BOOTS_RATE 
      ThisSale = SnowBoardSale + BootsSale 

      ' Calculate summary values. 
      TotalSales += ThisSale 
      BootsSold += BootsSale 
      SnowBoardsSold += SnowBoardSale 
      SaleCount += 1 
      AverageSalesEver = TotalSales/SaleCount 

      ' Format and display prices for the sale. 
      SnowBoardsPriceTextBox.Text = SnowBoardSale.ToString("c") 
      BootsPriceTextBox.Text = BootsSale.ToString("c") 
      TotalPriceTextBox.Text = ThisSale.ToString("c") 

      ' Format and display values for the summary. 
      SnowBoardRentalTextBox.Text += SnowBoards.ToString() 
      BootsRentalTextBox.Text += Boots.ToString() 
      TotalChargesTextBox.Text = TotalSales.ToString("c") 
      AverageChargeTextBox.Text = AverageSalesEver.ToString("c") 

     Catch BootsException As FormatException 
      ' Handle a Boots exception. 
      MessageBox.Show("Please enter numbers.", "Data Entry Error", 
          MessageBoxButtons.OK, MessageBoxIcon.Error) 
      With WithBootsTextBox 
       .Focus() 
       .SelectAll() 
      End With 
     End Try 

    Catch SnowBoardsException As FormatException 
     ' Handle a SnowBoard exception. 
     MessageBox.Show("Please enter numbers.", "Data Entry Error", 
         MessageBoxButtons.OK, MessageBoxIcon.Error) 
     With SnowboardsTextBox 
      .Focus() 
      .SelectAll() 
     End With 

    Catch AnException As Exception 
     'Handle any other exception. 
     MessageBox.Show("Error: " & AnException.Message) 
    End Try 
End Sub 
+1

какие переменные являются неправильными, поэтому мы можем сузить то, на чем мы фокусируемся. – Plutonix

+0

Переменная MediumChargeInteger неверна, а SnowboardSaleCountInteger и WithBootsSaleCountInteger не суммируются, как ожидалось. –

+1

Я бы создал функцию для каждого вычисления. Фактически разбивайте каждую абстракцию на отдельный суб или лямбду. Это упростит чтение кода. Мое другое предложение - пример того, какие результаты вы получаете и какими должны быть. – jcwrequests

ответ

0

Во-первых, вы можете изменить способ захватить цифры:

'Convert snowboard input value to numeric variable. 
SnowboardInteger = Integer.Parse(SnowboardsTextBox.Text) 

к:

Dim SnowboardInteger As Integer 
If TryParse.Integer(SnowboardsTextBox.Text, SnowboardInteger) = False then 
' if it parses, SnowboardInteger will have the value, 
'else the function returns false 
    MessageBox.Show("Please enter numbers") 
End if 

Кроме того, вы разбора текстовых полей дважды. Однажды в декларации сразу. Это не выглядит правильно:

SnowboardSaleCountInteger += 1 
WithBootsSaleCountInteger += 1 
TotalSaleCountInteger += TotalChargesSumInteger ' ????? 
AverageChargeInteger = TotalChargesSumInteger/TotalSaleCountInteger 

Добавление «сборов» в «счетчик» не кажется правильным. Если вы хотите, чтобы в среднем не должно это быть:

TotalSaleCountInteger = SnowboardSaleCountInteger + WithBootsSaleCountInteger 

Если вы хотите фракции, такие как «XX.YY» в результате AverageChargeInteger должен быть двойной или Decimal, если целые доллары не будут нормально для задания.

Если вам нужно накапливать предыдущие клики, вам необходимо переместить некоторые декларации из процедуры вверх на SnowboardSumInteger, WithBootsSumInteger, чтобы они могли накапливаться. Как бы то ни было, WithBootsSaleCountInteger, TotalSaleCountInteger не делают ничего и всегда 1. Я задаюсь вопросом, не следует ли в качестве «SaleCounter» увеличить значение в текстовом поле, а не только 1 (у меня нет заданий передо мной).

Еще одна вещь, которую вы, возможно, придется сделать это здесь:

SnowboardPriceInteger = SnowboardInteger * SNOWBOARD_RENTAL_RATE 
WithBootsPriceInteger = WithBootsInteger * WITH_BOOTS_RENTAL_RATE 
TotalPriceInteger = SnowboardPriceInteger + WithBootsPriceInteger 

Ваши постоянные Decimal (SNOWBOARD_RENTAL_RATE) так, результат известково должен идти в десятичное вар, но SnowboardPriceInteger и другой являются не. Целое число не может хранить дробный результат из умножения или деления.

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

' sales accumulators 
Private TotalSales As Decimal = 0 
Private ItemsSold As Integer = 0 

Нажмите Событие:

' this sale: 
Dim Snowboards As Integer 
Dim Boots As Integer 

' get the values from the text boxes, then: 
Dim SnowBoardSale As Decimal = (SnowBoards * SnowBoardRate) 
Dim BootsSale As Decimal = (Boots * BootsRate) 
Dim ThisSale As Decimal = SnowBoardSale + BootsSale 

' update accumulators 
TotalSales += ThisSale 
ItemsSold += (Boots + Snowboards) 

' calc the average 
Dim AverageSalesEver AS Decimal = TotalSales/ItemsSold 

' Display results in textboxes 
'(this exercise is left to the student ;) ) 

НТН

Я думаю, вы просто путают себя слишком много переменных и единиц, оставшихся от старых попыток.

+0

Я думаю, вам нужно больше информации. Скорее всего, это связано с целочисленной математикой. В идеале, вместо смешивания целых чисел следует использовать удвоения. – jcwrequests

+0

это тоже, но математика усреднения выглядит неправильно – Plutonix

+0

Было бы неплохо, если бы вычисления были разбиты на функции, а затем прокомментированы примерами, по крайней мере, у нас было бы больше деталей. – jcwrequests

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

  • Нет связанных вопросов^_^