VB程序结构和类的数组

时间:2013-08-17 16:04:55

标签: vb.net

在我开始之前,我知道这不是最有效的方式来实现这个项目,而是为了学校。

项目是一个应该通过计算物品数量和每件物品价格来计算客户欠款的项目。所以说有两个项目,每个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属性'ProductName'是'ReadOnly'。

非常感谢任何帮助。

P.S。我知道有些事情可能会丢失,比如将变量传递给班级,但我已经玩了大约3个小时,试图让它做我想做的事情,我只是把自己弄得太过分了。 同样是的,我是一个相对初学者的编程水平,这是我的第一个真正的编程类,教师说我们应该学习如何在类的第二部分处理VB的更高级方面做得更好。

再次感谢!

2 个答案:

答案 0 :(得分:1)

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

您的With语句需要在结构成员之前加.,如.Quantity,而不是数量。

您列出的四个错误是由于两个原因 - 代码中不存在numQuantitynumPrice - 您可能正在寻找Quantity和{ {1}},Price来电的结果。第四个错误是因为结构定义中有TryParse,而不是productName(请注意小写与大写首字母。

为避免混淆,我们将您的ProductNameQuantity变量名称(您在Price来电中使用的名称)更改为TryParse和{{ 1}}或类似内容,以避免与结构中的NewQuantityNewPrice成员混淆Quantity

还有其他许多项目,我会采用不同的方式,但由于您正在学习该语言,因此您的教师很可能尚未向您介绍这些语言。这是您当前代码的修改版本,可以修复您列出的错误:

首先,在结构定义中将Price的大小写更改为Product.

productName

其次,为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的数量:

Quantity.value

第四,在创建新产品时使用order(i)表示法以及上面步骤2中的变量名称:

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

答案 1 :(得分:0)

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