0

最初からやり直しましたが、2 つの累積合計を除いてすべてが意図したとおりに機能しています。計算は必要な方法で機能していません。以前の売上を合計に追加する代わりに、最後に新しい売上を追加します...

例: 1 Snowboard と 1 Snowboard with Boots を入力すると、これが機能し、Snowboards と Snowboards with Boots の両方の概要に 1 が表示されます。しかし、現在の売上合計を維持するためにもう一度入力しようとすると、問題が発生します。1 スノーボードと 1 スノーボード ブーツを入力すると、集計に 2 ではなく 11 が表示されます。なぜですか?

   ' 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
4

1 に答える 1

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

また、テキスト ボックスを 2 回解析しています。宣言の直後。これは正しく見えません:

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

「カウンター」に「料金」を追加するのは正しくないようです。平均が必要な場合は、次のようにしてください。

TotalSaleCountInteger = SnowboardSaleCountInteger + WithBootsSaleCountInteger 

結果に 'xx.yy' などの分数が必要な場合AverageChargeIntegerは、割り当てにドル全体が問題ない場合を除き、Double または Decimal にする必要があります。

以前のクリックから累積する必要がある場合は、いくつかの宣言を手順の外に移動して、SnowboardSumInteger, WithBootsSumInteger累積できるようにする必要があります。そのままでは、WithBootsSaleCountInteger, TotalSaleCountInteger何もしないで、常に 1 です。「SaleCounter」として、1 だけでなく、テキスト ボックスの値だけ増加するべきではないのでしょうか (私の前に割り当てを持たないでください)。

あなたがする必要があるかもしれないもう1つのことはここにあります:

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

あなたの定数は Decimal ( SNOWBOARD_RENTAL_RATE) であるため、計算の結果は Decimal var に入る必要がありますが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  ;)  )

HTH

あまりにも多くの変数と古い試みから残った変数で混乱しただけだと思います。

于 2013-10-07T00:44:53.177 に答える