3

今学期に VB のクラスを受講しているのですが、解決しようとしている問題に行き詰っています。映画レンタル店で映画タイトルの価格計算機を作成するように依頼されました。余分な功績は、それらをリストに保存し、リストを印刷できることでした. 私はここまで来ましたが、さらに一歩進んで、実際にそのリストに価格を付けてタイトルを追加したいと考えています。これを行う最も簡単な方法はおそらく配列を使用することだと思いましたが、配列を扱った経験はあまりありません。

リストボックスのすべての行に「映画のタイトル-$ 2.93」形式を与えるために、各タイトル(追加されたもの)と価格を変数に格納するという行に沿って何かを考えていました。この問題のために、完全なソース コードを投稿するだけにします。これにより、何を達成しようとしているのかを簡単に確認できるようになります。どんな助けでも大歓迎です。スタック オーバーフロー コミュニティに感謝します。私のプロジェクトのスクリーンショットはここで見ることができます: http://puu.sh/54SgI.jpg

パブリック クラス Form1
    'btnAdd_Click イベントの外で使用する可能性があるため、グローバルに宣言します
    Const decDiscount As Double = 0.9 '1-.10 割引 = .9
    Const decDVD As Decimal = 2D
    Const decBlueray As Decimal = 2.5D
    Const decDVDNew As Decimal = 3.25D
    Const decBluerayNew As Decimal = 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

このような課題を行うとき (特に母国語を学習するとき) に考えるべき良いことは、アルゴリズム (目標を達成するために必要なステップ) について考えることです。

まず、目標を達成するために必要なすべてのステップを決定します。

2番目に、これがあなたの質問のより重要なポイントだと思います。ステップをどの順序にする必要があるか(または、さらに良いことに、最も効率的な順序)を見つけてください。

あなたの場合、最初に映画の名前をリストに追加し、後で価格を行に追加しようとすることで、丘を登るアイススケートのようなものだと思います. そのような機能が割り当ての一部として要求されない限り、ユーザーは名前と価格の両方を入力してからどちらかを受け入れる必要があります (現在の名前で行っているように)。このように:

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に同意します。Movie のクラスを取得したら、次のように Movie(s) のリストを作成できます。

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 に答える
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

これは、1 つの映画タイトルのレンタルに関する情報を保持し、まとめて保持します (また、示したとおりに印刷するために追加することもできます)。計画は(あなたが何を求めているかを理解している限り)、レンタルした映画ごとにこれらの1つを作成しList(Of Movie)、この場合、辞書よりも適切な辞書に追加することです。

ムービーを作成するには:

Dim m As New Movie(theTitle, theCost)

私がすること:

  • 数値を数値として宣言するという良い仕事をしました。文字列に変換して数値に戻すコードを修正します。(投稿を編集してください)
  • Movie クラスを使用して、"Shopping Cart" リストボックスだけにデータを入力できます。その時点でlistMovies.Items、追加のクレジット リストになります。しかし、それを使用したり、学習したりすることは問題ありませんList (Of T)。(ちなみに、「印刷」とは紙やプリンターを意味しますか?)
  • あなたは何をしていchkDiscountますか?彼らがそれをチェックした場合、あなたはそれを無効にします (決して有効にしないでください)。New Releases チェックを無効にするつもりでしたか? その場合、彼らも本当にラジオのペアではありませんか?
  • いずれにせよ、CheckChanged評価にはより良いイベントであり、それ自体で発生するユーザーのチェック状態を手動で設定する理由はありません。

List(of T) と HTH をチェック

于 2013-11-01T01:32:30.857 に答える