0

始める前に、これがこのプログラムを行う最も効率的な方法ではないことを知っています。それは学校のためです.

このプロジェクトは、アイテムの数量とアイテムごとの価格を入力することによって、顧客が負っているものを計算することになっているものです。したがって、2 つのアイテムとそれぞれ 2.50 があるとします。支払総額は現在 5 で、次に 3.00 に 1 つの項目があり、支払総額は 8 です。

これは通常、関数、構造体、またはクラスを使用して、変数を宣言するだけで簡単になります。

私が問題を抱えているのは、このプロジェクトではクラスだけでなく、構造体の配列 (配列と構造体の使用をカバーする) の使用が必要なことです。

私がインストラクターと話をしたとき、彼は別のシナリオで配列を使用する方法の例を教えてくれました. 私はそのアイデアを使用して、製品名のテキスト ボックスを追加したので、一致する場合 (3 番目のアイテムが追加され、アイテム 1 と同じであるとします)、配列内の既存のエントリに数量を追加するだけです。理論的には、数量と価格を計算して合計に追加するだけなので、合計支払額も同様に簡単です。

非常に簡単なので、すべての変数「新しい順序」をクリアするボタンをコーディングしていません。

私はまた、自分自身を完全に混乱させました。このような単純なタスクを達成するためのプログラムの不必要な複雑さのために感じますが、メインプログラムは次のとおりです。

Public Class FrmMain

  Dim order(-1) As product
  Public totalDue As Decimal

  Structure product
    Public Quantity As Long
    Public Price As Decimal
    Public productName As String
  End Structure


Private Sub btnExit_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnExit.Click
    Me.Close()
End Sub

Private Sub btnAdd_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnAdd.Click
    ' adds the total price to the amount the customer owes

    Dim book As New BookSale
    Dim Quantity As Long
    Dim Price As Decimal


    Long.TryParse(txtQuantity.Text, Quantity)
    Decimal.TryParse(txtPrice.Text, Price)


    'when a user adds an item by id (could be UPC)......  This could be a click event
    'boolean to declare if item was found
    Dim bolFound As Boolean = False
    'upc number of product
    Dim strProduct As String = txtProduct.Text
    'loop through array to see if product has already been added, if so, just update quantity
    For i As Integer = 0 To order.Length - 1
        If order(i).productName = strProduct Then
            Quantity += numQuantity.value
            bolFound = True
            Exit For
        End If
    Next i
    'if product was not found, add it to the array
    If bolFound = False Then
        'never found, add the new item
        ReDim Preserve order(order.Length)
        With order(order.Length - 1)
            ProductName = txtProduct.Text
            Price = numPrice.value
            Quantity = numQuantity.value
        End With
    End If

    totalDue = book.TotalDueTotal
    lblTotalDue.Text = totalDue.ToString("N0")

End Sub
End Class

次に、クラス「bookSale」があります

Public Class BookSale
 Private _Quantity As Integer
 Private _Price As Decimal

 Public Property TotalDue As Integer
    Get
        Return _Quantity
    End Get
    Set(ByVal value As Integer)
        If value > 0 Then
            _Quantity = value
        Else
            _Quantity = 0
        End If
    End Set
 End Property
 Public Property Price As Decimal
    Get
        Return _Price
    End Get
    Set(ByVal value As Decimal)
        If value > 0 Then
            _Price = value
        Else
            _Price = 0
        End If
    End Set
 End Property

 Public Sub New()
    ' default constructor
    _Quantity = 0
    _Price = 0
 End Sub

 Public Function TotalDueCalc() As Decimal
    Return _Price * _Quantity
 End Function

 Public Function TotalDueTotal() As Decimal
    Dim FinalTotal As Decimal
    Return FinalTotal + TotalDueCalc()
 End Function

End Class

これまでに受信したエラーは、エラー 3 'numPrice' が宣言されていません。保護レベルにより、アクセスできない場合があります。エラー 1 'numQuantity' が宣言されていません。保護レベルにより、アクセスできない場合があります。エラー 4 'numQuantity' が宣言されていません。保護レベルにより、アクセスできない場合があります。エラー 2 プロパティ 'ProductName' は 'ReadOnly' です。

どんな助けでも大歓迎です。

PSクラスに変数を渡すなど、いくつかのことが欠けている可能性があることは知っていますが、私はすでに約3時間これを試して、自分がやりたいことをやらせようとしていて、あまりにも混乱しました。また、はい、私はプログラミングの比較的初心者レベルです。これは私の最初の実際のプログラミング クラスであり、インストラクターは、VB のより高度な側面を扱うクラスの第 2 部でこれを行う方法をもう少しよく学ぶべきだと言いました。

再度、感謝します!

4

2 に答える 2

1

注意すべき点がいくつかありますが、順不同です。

あなたWithのステートメントは、構造体のメンバーの前に., like .Quantity, not Quantity を付ける必要があります。

リストした 4 つのエラーは、2 つの理由によるものであり、コードには存在numQuantityしません。おそらく呼び出しの結果をnumPrice探しているでしょうQuantity。4 番目のエラーは、構造体の定義に(小文字と大文字の最初の文字に注意してください。PriceTryParseproductNameProductName

混乱を避けるために、構造内のandメンバーとの混乱を避けるためにQuantityPrice変数名 (TryParse呼び出しで使用する名前) をNewQuantityandNewPriceまたはそのようなものに変更します。QuantityPriceProduct.

私が別の方法で行う項目は他にもたくさんありますが、言語を学習しているので、講師がまだそれらを紹介していない可能性が高いです。リストしたエラーを修正する現在のコードの修正版を次に示します。

まず、構造定義で の大文字と小文字を変更productNameProductNameます。

Structure product
    Public Quantity As Long
    Public Price As Decimal
    Public ProductName As String
End Structure

次に、TryParse呼び出しの結果に別の変数名を使用します。

Dim newQuantity As Long
Dim newPrice As Decimal

Long.TryParse(txtQuantity.Text, newQuantity)
Decimal.TryParse(txtPrice.Text, newPrice)

Product3 番目に、既存の注文を更新するループで、配列内の正しいものを参照する必要があります。value があったとしてもQuantity.value、その製品の Quantity は更新されません。プログラムに の Quantity を更新するように指示する必要がありますorder(i)

For i As Integer = 0 To order.Length - 1
    If order(i).ProductName = strProduct Then
        order(i).Quantity += newQuantity
        bolFound = True
        Exit For
    End If
Next i

4 番目に、.上記のステップ 2 の変数名とともに新しい Product を作成するときに表記を使用します。

With order(order.Length - 1)
    .ProductName = txtProduct.Text
    .Price = newPrice
    .Quantity = newQuantity
End With
于 2013-08-17T19:55:06.230 に答える