3

这个学期参加了 VB 课,我一直被一个我想弄清楚的问题难住了。我们被要求在电影租赁场所为电影片名创建价格计算器。额外的功劳是将它们存储在一个列表中并能够打印该列表。我已经做到了这一点,现在我想更进一步,将标题添加到该列表中并附上附加价格。我认为最简单的方法可能是使用数组,但我没有太多使用数组的经验。

我正在考虑存储每个标题(如其添加)以及变量中的价格以在列表框的每一行中给出“电影标题 - 2.93 美元”格式。为了解决这个问题,我将发布我的完整源代码,这可能会让我更容易看到我想要完成的事情。任何帮助将非常感激。感谢堆栈溢出社区!我的项目截图可以在这里查看:http: //puu.sh/54SgI.jpg

公开课形式1
    '全局声明,因为我可能会在 btnAdd_Click 事件之外使用它们
    Const decDiscount As Double = 0.9 '1-.10 折扣 = .9
    常量 decDVD 作为十进制 = 2D
    常量 decBlueray 作为十进制 = 2.5D
    常量 decDVDNew 作为十进制 = 3.25D
    常量 decBluerayNew 作为十进制 = 3.5D

Dim intCount As Integer Dim decCost, decTotal As Decimal Dim decDayTotal As Decimal Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load AcceptButton = btnAdd End Sub Private Sub chkDiscount_Click(sender As Object, e As EventArgs) Handles chkDiscount.Click If chkDiscount.CheckState = 1 Then chkDiscount.Enabled = False End If End Sub Private Sub btnAdd_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnAdd.Click 'Display error when no title entered If txtAdd.Text = "" Then MessageBox.Show("Please enter a movie title and select the appropriate item details.", "Complete details", MessageBoxButtons.OK, MessageBoxIcon.Error) Else listMovies.Items.Add(txtAdd.Text) listMovies.SelectedIndex = listMovies.SelectedIndex + 1 End If 'update list 'clear txtbox txtAdd.Text = "" 'Decision Statements to calculate correct price If radDVD.Checked = True Then decCost = CDec(decDVD.ToString("c")) If chkNew.Checked = True Then decCost = CDec(decDVDNew.ToString("c")) End If ElseIf radBlueray.Checked = True Then decCost = CDec(decBlueray.ToString("c")) If chkNew.Checked = True Then decCost = CDec(decBlueray.ToString("c")) End If End If If chkDiscount.Checked = True Then decCost = CDec((decCost * decDiscount).ToString("c")) End If 'display cost txtCost.Text = CStr(CDec(decCost)) 'calc total decTotal = CDec(decTotal + decCost) 'display total txtTotal.Text = CStr(CDec(decTotal)) 'clear chkNew every item added to list chkNew.CheckState = 0 End Sub 'Public so summary message box can access variable Public Sub btnFinish_Click(sender As Object, e As EventArgs) Handles btnFinish.Click 'Add +1 to counter & update txtCounter intCount = CInt(Val(intCount) + 1) 'add to day total decDayTotal = CDec(Val(decDayTotal) + decTotal) 'Set Everything back to empty/enabled chkDiscount.Enabled = True chkDiscount.CheckState = 0 chkNew.CheckState = 0 txtAdd.Text = "" txtCost.Text = "" txtTotal.Text = "" decTotal = 0 decCost = 0 'Instead of clearing radios each time, a more desirable result would be to have DVD always set back to the default checked radio radDVD.Checked = True radBlueray.Checked = False listMovies.Items.Clear() End Sub Private Sub btnSummary_Click(sender As Object, e As EventArgs) Handles btnSummary.Click If decTotal > 0 Then MessageBox.Show("Please finish your current order before viewing a daily summary.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error) Else MessageBox.Show(("Your total cutomer count is: " & intCount) + Environment.NewLine + ("Your total sales today is: $" & decDayTotal), "Daily Summary", MessageBoxButtons.OK) End If End Sub Private Sub btnRemove_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnRemove.Click listMovies.Items.Remove(listMovies.SelectedItem) End Sub

4

2 回答 2

0

我不会在这里走太远,因为你需要做这项工作。但是,我会从一门课开始:

Public Class Movie

Public Title As String = ""
Public Cost As Decimal

' prevents you from adding a movie without critical info
Public Sub New(ByVal t As String, ByVal c As Decimal)
    Title = t
    Cost = c

End Sub

End Class

这将保存有关一部电影片名租借的信息,并将其保存在一起(并且可以添加到其中以便完全按照您显示的方式打印)。计划(就我了解您所追求的而言)是为每部租借的电影创建其中一个,并将其添加到List(Of Movie)在这种情况下,这比字典更合适。

要创建电影:

Dim m As New Movie(theTitle, theCost)

我会做的事情:

  • 您在将数字声明为数字方面做得很好。修复将其转换为字符串并返回数字的代码。(编辑你的帖子)
  • 您可以使用电影类单独填充“购物车”列表框;在这一点上,listMovies.Items将是额外的信用列表。但是使用/了解它不会有什么坏处List (Of T). (顺便说一句,“打印”是指在打印机上的纸张吗?)
  • 你在做什么chkDiscount?如果他们检查它,您将禁用它(并且从不启用)。您的意思是禁用新版本检查吗?在那种情况下,他们真的也不是一对收音机吗?
  • 无论哪种方式,CheckChanged对于评估来说都是一个更好的事件,并且没有理由为用户手动设置自行发生的检查状态。

查看 List(of T) 和 HTH

于 2013-11-01T01:32:30.857 回答
0

在做这样的作业时(尤其是在学习第一语言时)要考虑的一件好事是考虑算法(实现目标所需的步骤)。

第一,确定实现目标所需的所有步骤。

第二,我认为这是您的问题更重要的一点,找出步骤需要的顺序(或者更好的是,它们最有效的顺序)。

在您的情况下,我认为您首先将电影名称添加到列表中,然后再尝试将价格添加到行中,这有点像滑冰上山。除非作为作业的一部分请求了这种功能,否则我会要求用户在接受之前输入名称价格(就像您当前使用名称一样)。像这样:

If txtAdd.Text <> "" AND txtCost.Text <> "" Then  'requiring both fields to not be null
    ''add moive code
Else
    ''MessageBox.Show("Yadda Yadda Yadda")
End If

我同意 Plutonix 的观点,虽然在你的情况下创建一个类有点矫枉过正,但它是一个好主意,因为它可以让你在合适的时候练习。一旦你有了一个电影类,你就可以像这样创建电影列表:

Dim MovieList as new List(of Movie)

因此,每次按下 btnAdd 按钮时,您都可以将值传递给电影并将其添加到列表中。

Dim m As Movie
Dim MovieList as new List(of Movie)

Private Sub btnAdd_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnAdd.Click
    'Display error when no title entered
    If txtAdd.Text <> "" And txtCost.Text <> "" Then
        myMovie = New Movie(txtAdd.Text, txtCost.Text)
        myMovieList.Add(myMovie)
        listMovies.Items.Clear()

        For Each X As Movie In myMovieList
            listMovies.Items.Add(X.DisplayMovie)
        Next
    Else
        MessageBox.Show("Please enter a movie title and select the appropriate item details.", "Complete details", MessageBoxButtons.OK, MessageBoxIcon.Error)
    End If
    'Other Code
End Sub

请注意ListMovies.Items.Add(X.DisplayMovie)行,我在 Movie 类中添加了一个函数(如下所示),以便它按照您的建议进行格式化。

 Public Function DisplayMovie()
    Return Title & " - $" & Cost
 End Function

这将为您带来很多好处。尝试推断 Plutonix 和我自己解释的内容,以进一步完善您的代码。例如,尝试将调整后的价格计算封装在它自己的函数中,以便您可以从任何地方调用它。

于 2013-11-14T05:18:52.603 回答