• 締切済み

自販機での金銭収受を想定したプログラムについて

こんにちは。 自販機での金銭収受を想定したプログラムについての質問です。 下記のプログラムに、もしお釣りが100円だとして、100円玉が無い場合に50円玉2枚を代替して支払うような機能が欲しいのですが、いい考えが浮かびません。どなたかヒントなどを教えて下さい。お願いします。 (・・・は続くことを示しています) Dim kouka(4) As Integer '自販機にあるつり銭の枚数 Dim zandaka(4) As Integer 'その金種が必要な枚数 Dim kekka(4) As Integer '硬貨の設定 kouka(1)=500 以下、100、50、10を入れる 'つり銭残金の設定 zandaka(1)=Val(TextBox21) 以下2,3,4同様 '入れた金額と買う金額 sounyu=(Val(TextBox1) * kouka(1)) + ・・・ kounyu=Val(TextBox5) If sounyu<kounyu Then TextBox100="販売不可能" Else oturi = sounyu – kounyu TextBox6 = oturi 'つり銭の残高総計 zandakasum=(zandaka(1)*kouka(1))+・・・ If zandakasum< oturi Then TextBox100 = "おつりがありません" Else '各金額のお返し枚数を決める For i=1To4 kekka(i)=oturi\kouka(i) oturi=oturiModkouka(i) zandaka(i)=zandaka(i) - kekka(i) Next i For i=1To4 If zandaka(i)<0 Then TextBox100 = "おつりが合わないので販売できません。" End If Next i 'おつりの内訳表示 TextBox11=kekka(1) 以下2,3,4同様 '各金種の残り枚数(残高)の表示 TextBox21=zandaka(1) 以下2,3,4同様 End If End If

みんなの回答

回答No.1

『おつりとして出せる金種を引いていく』というのはどうでしょう。 以下、日本語で書きます。 おつりは980円 →500円を出す。 →100円を出す。 →100円を出す。 →100円を出す。 →100円を出す。 →50円を出す。 →10円を出す。 →10円を出す。 →10円を出す。 金種を格納した配列[500,100,50,10]を用意すれば、簡潔なコーディングができると思います。 100円→50円2枚というのも、100円が無くなれば金種配列の添字を動かし50円を指すようにし、(金額的に、または枚数的に)引けるだけ引いていけば良いと思います。 伝わり難かったらごめんなさい。

1724
質問者

お礼

アドバイスありがとうございました。 自動販売機内のつり銭と返さなければならない両金種の枚数を500から順々に比較していき、それぞれ適切な処理を行うかたちで、無事できました。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • プログラミングVisual Basicの質問です。

    任意の数字を入力し、Len関数とMid関数を使って2進数を10進数に変換するというプログラムを作っているのですが、うまくいきません。 コードは Dim a  As Integer Dim b  As Integer Dim i  As Integer a = Val(TextBox1.Text) For i = Len(a) To 1 Step -1 If Mid(a, Len(a), 1) = "1" Then b += 2 ^ (i - 1) End If Next Label3.Text = b    End Sub 上記のものが作ったコードです。 問題点の指摘をよろしくお願いします。

  • 1から入力された数までの素因数を数えるプログラム

    こんにちは 1から入力された数(N)までの素因数を数えるプログラムを 作成したいのですが、うまくいきません。 たとえば10と入力すると2と表示されてしまいます。 どこがおかしいのかわかりません。 どなたか教えてください。おねがいします。 N個の配列を用意し、1を入れていき、 素因数でない数の要素には0をいれて、 最終的に1が入っている配列の数を数えて1~Nまでの 素因数の数を数える方法を考えています。 Dim M As Integer Dim N As Integer Dim i As Integer Dim j As Integer Dim sum As Integer Dim L(1000) As Double N = Val(TextBox1) M = N i = 1 Do Until i > N L(i) = 1 i = i + 1 Loop i = 2 Do Until i > M j = i * 2 Do Until j > M L(j) = 0 j = j + 1 Loop i = i + 1 Loop sum = 0 For i = 2 To N If L(i) = 1 Then sum = sum + 1 End If Next i

  • VB2005で、Structureの配列を返すプログラムを以下のように書きたい

    VB2005で、Structureの配列を返すプログラムを以下のように書きたいのですが、そもそもVB6しか使ったことが無いもので、以下のような素数の結果を返すこのプログラムの書き方はVB2005らしいでしょうか? Module Module1 Public Structure SosuuStatus Public num As Integer Public status As String End Structure Class Sosuu Function SosuuCheck(ByVal st As Integer, ByVal ed As Integer) As SosuuStatus() Dim i As Integer, j As Integer Dim sosuu(0 To ed - st) As SosuuStatus Dim cnt As Integer = 0 For i = st To ed sosuu(cnt).num = i sosuu(cnt).status = "" '初期化 If 1 = i Then sosuu(cnt).status = "素数ではない" ElseIf 0 = (i Mod 2) Then sosuu(cnt).status = "素数ではない" Else For j = 3 To Math.Sqrt(ed) If 0 = (i / j) Then sosuu(cnt).status = "素数ではない" End If Next j End If If sosuu(cnt).status = "" Then sosuu(cnt).status = "素数である" End If cnt = cnt + 1 Next i SosuuCheck = sosuu End Function End Class End Module

  • VBA書き込み数値の加算?

    エクセル2000のVBAにて下記のコードを書き込み コマンドボタン1にてエクセルに入力処理後 Label8数値の加算をエクセル関数SUNを使用して =SUM(E4:E1000)を行ったのですが、加算数値が0になってしまいます。 =E4+E5+E6・・・・だと加算した数値が表示されます。 (さすがにこれは避けたいです) 何か方法があると思いますが教えていただけますでしょうか? Dim i As Integer Dim k As Integer Private Sub CommandButton1_Click() With ActiveSheet For k = 4 To 1000 If .Cells(k, 1) = "" Then .Cells(k, 1) = TextBox1 .Cells(k, 2) = Label6 .Cells(k, 3) = Label7 .Cells(k, 4) = TextBox2 .Cells(k, 5) = Label8 TextBox1 = "" Label6 = "" TextBox2 = "" Label7 = "" Label8 = "" Exit Sub End If Next k End With End Sub Private Sub TextBox2_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer) If KeyCode = 13 Then Label8 = Application.WorksheetFunction.Round(Val(Label7) * Val(TextBox2), 0) Label8 = Format(Label8, "#,##0") End If End Sub

  • エクセル VBA MsgBox

    1)下記の記述だと コンボが空白ならエラー表示が出て Okをクリックすると ”記録しますか?” となります! そこをエラー表示されたら UserFormに戻り 空白が無くなったら ”記録しますか?” というMegBoxにしたいのですが どう変化すれば良いのでしょうか? 教えて下さい! Private Sub CommandButton1_Click() Dim i As Integer For i = 1 To 10 If Controls("ComboBox" & i).Text = "" Then MsgBox "選択されていません確認して下さい!", vbInformation, "良く見て下さい!" Exit For End If Next If MsgBox("記録しますか?", vbOKCancel) = vbOK Then With UesrForm From.TextBox1 = Val(UesrFrom.ComboBox1) + _ Val(UesrFrom.ComboBox2) + Val(UesrFrom.ComboBox3) + _ Val(UesrFrom.ComboBox4) + Val(UesrFrom.ComboBox5) From.TextBox2 = Val(UesrFrom.ComboBox6) + _ Val(UesrFrom.ComboBox7) + Val(UesrFrom.ComboBox8) + _ Val(UesrFrom.ComboBox9) + Val(UesrFrom.ComboBox10) End With MsgBox " 記録します!" Unload Me Else MsgBox " キャンセル!!" End If End Sub

  • エクセル VBA OptionButtonからTextBox

    すいません! OptionButtonなら 下記の記述でエラー表示を 簡単にできるのですが これがOptionButtonではなく TextBoxならどのように変化したら 良いのでしょうか? すいません、教えて下さい! Private Sub 記録_Click() Dim i As Integer Dim Cnt As Integer Cnt = 0 For i = 1 To 6 Step 1 If Me.Controls("OptionButton" & i).Value Then Cnt = i Exit For End If Next i If Cnt = 0 Then MsgBox "選択されていません" Exit Sub End If If Me.Controls("Combobox" & Cnt).Value = "" Then MsgBox Me.Controls("OptionButton" & Cnt).Caption & " の内容が選択されていません" Exit Sub End If With 記入フォーム .TextBox5.Value = Me.Controls("OptionButton" & Cnt).Caption .TextBox6.Value = Me.Controls("Combobox" & Cnt).Value End With Unload Me End Sub

  • TextBox操作で質問

    TextBox操作で質問 開発環境:Visual Web Developer 2008 express 言語:Visual Basic TextBoxを縦5行横3列に並べ、2列目のTextBox(番号…2,5、8、11、14)に文字列があり、1列目のTextBox(番号…1、4、11、10、13)に文字がなかったら、1列目のTextBoxに”あ”の文字列を付加する、のようなことをしたいのですが、2列目に文字列がなくても、1列目に"あ"の文字列が入ってしまいます。どこが悪いのか分かりませんのでご教授願います。 ###入力フォーム###   ううう おおお い ううう おおお   ううう おおお      ↓ ###現状の出力結果#### あ ううう おおお い ううう おおお あ ううう おおお あ あ ###実際に出したい結果### あ ううう おおお い ううう おおお あ ううう おおお Dim i As Integer Dim j As Integer For i = 1 To 13 Step 3 For j = 2 To 14 Step 3 If CType(FindControl("TextBox" & j), TextBox).Text = "" Then If CType(FindControl("TextBox" & i), TextBox).Text = Nothing Then CType(FindControl("TextBox" & i), TextBox).Text = "あ" End If End If Next Next

  • ExcelのVBAソースコード(一部)の翻訳

    ソースコードの一部ですが、開発者が他界し訊けずにおります。 今後自分でもVBAを勉強しますが、お教えいただけますでしょうか。 なお冒頭は Function process_new(m0 As Integer, m As Integer, d As Variant, ans As Double) As Integer Dim a(501), b(501), s(501), r(501) As Double Dim w(501), g(11), xx As Double Dim s1 As Double Dim k(501) As Integer Dim i, j, flg As Integer でスタートしています。 =(以下、質問内容)==== s1 = s(k(0)) * 1.618 flg = 0 For i = m0 To m - 3 If Not i = k(0) Then If s1 > s(i) Then flg = flg + 1 End If End If Next i =(以上)====

  • VB添削

    このプログラムは 例えば3 3 4とテキストボックスに数字が打ち込まれると 3×3行列が4個分 のテキストボックスがでてきます。 ここに数字を打ち込んでいき、ボタン2を押すと3×3のテキスト トボックスが出てくると同時に足し算した結果が出てくるようにしたいです。 以下のプログラムはできたところまで作成しています。 どこを直せばよいのでしょうか。 Public Class Form1 Private number As Integer Private rows As Integer Private columns As Integer Private Sub Form11_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load For i As Integer = 1 To 3 AddHandler Me.Controls("TextBox" & i).TextChanged, AddressOf TextBox_TextChanged Next End Sub Private Sub TextBox_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) If System.Text.RegularExpressions.Regex.IsMatch(CType(sender, TextBox).Text, "[^0-9]") Then MessageBox.Show("数字で入力してください", Me.Text, MessageBoxButtons.OK, MessageBoxIcon.Error) With CType(sender, TextBox) .Text = .Text.Substring(0, .Text.Length - 1) .SelectionStart = .Text.Length End With End If Dim cnt1 As Integer Dim cnt2 As Integer Dim cnt3 As Integer If Integer.TryParse(TextBox1.Text, cnt1) And Integer.TryParse(TextBox2.Text, cnt2) And Integer.TryParse(TextBox3.Text, cnt3) Then For k = 1 To cnt3 For i = 1 To cnt1 For j = 1 To cnt2 Dim tb As TextBox = New TextBox() tb.Name = "tb" + i.ToString() Me.Controls.Add(tb) tb.Top = (i - 1) * 28 + 55 tb.Left = (j - 1) * 30 + 40 * (cnt2 * (k - 1)) + 10 tb.Width = 25 Next Next Next End If End Sub Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Me.Bounds = New Rectangle(10, 10, 1350, 800) Me.AutoScroll = True End Sub Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click Dim sum As Double Dim cnt As Integer = 0 For i As Integer = 1 To rows For j As Integer = 1 To columns Dim tb As TextBox = New TextBox() cnt += 1 : If cnt > rows * columns Then cnt = 1 tb.Name = "tb" + cnt.ToString Me.Controls.Add(tb) tb.Top = (i - 1) * 30 + (80 + 40 * rows) tb.Left = (j - 1) * 60 + 10 tb.Width = 40 sum = 0 For k As Integer = 1 To number sum += Double.Parse(CType(Me.Controls("tb" + (cnt + (rows * columns * (k - 1))).ToString()), TextBox).Text) Next tb.Text = sum.ToString() Next Next End Sub Private Sub TextBox1_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox1.TextChanged End Sub Private Sub TextBox2_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox2.TextChanged End Sub Private Sub TextBox3_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox3.TextChanged End Sub End Class

  • VBのGUI 行列の和を求める

    VBのGUIです。 行列の足し算を行うプログラムをつくりたいです。 以下のプログラムはできたところまで作成しています。 □個の□行□列(□はテキストボックス)の所に例えばユーザーが3 3 3と入力したとします。 ボタン1を押すと3×3の3個個分のテキストボックスがでてきて、要素を打ち込めるようになります。 そしてユーザが要素を打ち込みます。次に要素が 1 2 1  2 1 2   2 1 2 2 1 2  1 2 1   1 2 1 1 2 1  2 1 2   1 2 1 というように入力されたとします。 ボタン2を押すと 3×3のテキストボックスが出てきて この3つの行列の和を足した 5 4 5 4 5 4 4 5 4というようにテキストボックスに表示されるようにしたいです。 3この3行3列の和だけでなく何個の何行何列の場合でもできるようにしたいです。 どのようなソースでこのプログラムはできるのでしょうか。 Public Class Form1 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Me.Bounds = New Rectangle(10, 10, 1300, 800) Dim number As Integer Dim rows As Integer Dim columns As Integer If Not Integer.TryParse(TextBox3.Text, number) Then MessageBox.Show("数字で入力してください", Me.Text, MessageBoxButtons.OK, MessageBoxIcon.Error) Exit Sub End If If Not Integer.TryParse(TextBox1.Text, rows) Then MessageBox.Show("数字で入力してください", Me.Text, MessageBoxButtons.OK, MessageBoxIcon.Error) Exit Sub End If If Not Integer.TryParse(TextBox2.Text, columns) Then MessageBox.Show("数字で入力してください", Me.Text, MessageBoxButtons.OK, MessageBoxIcon.Error) Exit Sub End If For k = 1 To number For i = 1 To rows For j = 1 To columns Dim tb As TextBox = New TextBox() tb.Name = "R" & i.ToString() & "C" & j.ToString() & "No" & k.ToString() Me.Controls.Add(tb) tb.Top = (i - 1) * 30 + 80 tb.Left = (j - 1) * 60 + 70 * (columns * (k - 1)) + 10 tb.Width = 50 Next Next Next End Sub Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click Dim number As Integer Dim rows As Integer Dim columns As Integer Dim r As Integer Dim n As Integer Dim m As Integer Dim sum As Double sum = 0 For n = 1 To columns For m = 1 To rows sum = 0 For r = 1 To number Next For i As Integer = 1 To rows For j As Integer = 1 To columns Dim tb As TextBox = New TextBox() tb.Name = "R" & i.ToString() & "C" & j.ToString() Me.Controls.Add(tb) tb.Top = (i - 1) * 30 + 80 tb.Left = (j - 1) * 60 + 10 tb.Width = 40 Next Next Next Next End Sub End Class