0

现在,在我开始之前,我知道这不是执行此计划的最有效方式,它适用于学校。

该项目应该通过输入商品的数量和每件商品的价格来计算客户的欠款。所以说有 2 个项目,每个项目 2.50。到期总数现在是 5,接下来是 3.00 的一项,现在到期总数是 8。

这通常只需声明变量就很容易,可能使用函数、结构或类。

我遇到的问题是该项目需要使用结构数组(因此涵盖使用数组和结构)以及类。

当我与我的导师交谈时,他给了我一个示例,说明如何在另一个场景中使用数组,基本上是在没有任何内容的情况下启动数组,并允许程序在循环中检查 UPC。我使用了这个想法并为产品名称添加了一个文本框,所以如果它匹配(假设添加了第三个项目并且与第一个项目相同),那么它只是将数量添加到数组中的现有条目中。理论上,应付总额同样简单,因为它可以计算数量和价格并将其添加到总额中。

我没有编写按钮来清除所有变量“新顺序”,因为这很容易。

我自己也彻底糊涂了,我觉得由于完成如此简单的任务的程序不必要的复杂性,但这是我的主程序:

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 属性“产品名称”是“只读”。

任何帮助将不胜感激。

PS 我知道有些东西可能会丢失,比如将变量传递给班级,但我已经玩了大约 3 个小时,试图让它做我想做的事情,我只是让自己太困惑了。另外,是的,我处于编程的相对初学者水平,这是我的第一个真正的编程课程,讲师说我们应该在课程的第二部分学习如何更好地做到这一点,处理 VB 的更高级方面。

再次感谢!

4

2 回答 2

1

有几点需要注意,没有特别的顺序。

您的With声明需要在结构成员之前加上., like .Quantity,而不是 Quantity。

您列出的四个错误有两个原因 -您的代码numQuantitynumPrice不存在 - 您可能正在寻找QuantityPrice,您的TryParse调用结果。第四个错误是因为您productName在结构定义中,而不是ProductName(注意小写与大写的第一个字母。

为避免混淆,我会将您的QuantityandPrice变量名称(您在TryParse调用中使用的名称)更改为NewQuantityandNewPrice或类似的名称,以避免与结构中的QuantityandPrice成员混淆Product.

还有许多其他项目我会做不同的事情,但是由于您正在学习语言,您的讲师很可能还没有向您介绍它们。这是您当前代码的修改版本,它将修复您列出的错误:

首先,在结构定义中更改productNameto的大小写:ProductName

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)

第三,在你的循环中更新一个现有的命令,你需要Product在数组中引用正确的。即使您有 value Quantity.value,它也不会更新该产品的 Quantity - 您需要告诉程序更新order(i)Quantity:

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

第四,.在创建新产品时使用符号以及上面第 2 步中的变量名称:

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

与其使用数组,List(Of Product)不如将 a 设为更好的选择,我也将其设为 aclass而不是structure. 不在Redim这里,只是.Add(New Product)。您遇到的问题是您的数组已设置为-1并且您在添加新元素之前没有增加大小 - aList将简化此过程。至于你numQuantity,它根本不存在,编译器只是让你知道。

于 2013-08-17T17:08:30.670 回答