質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

2回答

6332閲覧

自動販売機のお釣り機能

monatos

総合スコア3

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

0クリップ

投稿2020/05/18 08:06

編集2020/05/18 08:23

「自動販売機内にあるお金が足りない時に販売できない」というプログラムを作成しています。

javaで飲み物の自動販売機のプログラムを作成しています。現在お釣りを出すプログラムを作成しているのですが、
「自動販売機内にあるお金が足りない時に販売できない」
というプログラムが思った通りに動きません。
どのように改善すれば動くでしょうか。
例)
150円の飲み物を購入するために200円投入したが、自動販売機内に50円玉,10円玉がないため購入できない。

該当のソースコード

java

1コード 2package vending_machine; 3import java.util.*; 4 5public class Last { 6 7 public static void main(String[] args) { 8 Scanner scan = new Scanner(System.in); 9 // 商品フロー 10 List<Product> list = ExProduct.getList(); 11 12 // 現金or IC選択フロー 13 int flg = 1; 14 int error_flg = 1; 15 int cash_balance = 0; 16 Cash_flow cf = new Cash_flow(); 17 IC_flow ic = new IC_flow(100); 18 System.out.println("こんにちは"); 19 do { 20 System.out.println("現金の場合は1,ICの場合は0を入力してください"); 21 flg = scan.nextInt(); 22 } while(flg > 1 || flg < 0); 23 24 int p_number = 0; 25 System.out.println("商品番号を選んでください"); 26 for(int i = 0; i < list.size(); i++) { 27 System.out.printf("%2s:", i); 28 System.out.println(list.get(i)); 29 } 30 do { 31 System.out.print("商品番号(0~12):"); 32 p_number = scan.nextInt(); 33 } while(p_number < 0 || p_number > 12); 34 do { 35 do { 36 //現金フロー 37 if(flg == 1) { 38 39 //硬貨投入 40 41 int judge = 0; 42 int sum = 0; 43 int In_money = 0; 44 45 //自販機内の各コイン枚数(引数1:500円,引数2:100円,引数3:50円,引数4:10円) 46 //今回は自販機内硬貨枚数すべて0枚に設定 47 cf.set_coin(0, 0, 0, 0); 48 do { 49 do { 50 System.out.println("一枚ずつ硬貨を投入してください(1,5,10,50,100,500)"); 51 In_money = scan.nextInt(); 52 } while(!(cf.each_judge(In_money))); 53 54 if(cf.judge(In_money)) { 55 sum += In_money; 56 } else { 57 System.out.println(In_money + "円玉が排出されました"); 58 } 59 60 cf.set_In(In_money); 61 System.out.println("合計金額=" + sum + "円"); 62 do { 63 System.out.print("続けて硬貨を投入しますか?(Yes:0,No:1):"); 64 judge = scan.nextInt(); 65 } while(!(judge == 1 || judge == 0)); 66 } while(judge == 0); 67 68 error_flg = cf.Purchase(sum, list.get(p_number).getPrice()); 69 70 if(error_flg == 0) { 71 cf.get[0] += cf.getIn500(); 72 cf.get[1] += cf.getIn100(); 73 cf.get[2] += cf.getIn50(); 74 cf.get[3] += cf.getIn10(); 75 //cash_balanceはおつり 76 cash_balance = sum - list.get(p_number).getPrice(); 77 System.out.println(cash_balance); 78 79 //お釣りの枚数計算 80 for(int i = 0; i < 4; i++) { 81 while(cash_balance >= cf.money[i] && cf.get[i] > 0) { 82 cf.count[i]++; 83 cash_balance -= cf.money[i]; 84 cf.get[i]--; 85 } 86 } 87 88 } else { 89 cash_balance = cf.total_cash(); 90 } 91 break; 92 93 } else { 94 //ICフロー 95 96 error_flg=ic.IC_judge(ic.getBalance(), list.get(p_number).getPrice()); 97 } 98 } 99 break; 100 } while(true); 101 102 //エラー処理 103 if(flg == 1) { 104 105 if(error_flg == 0) { 106 System.out.println(list.get(p_number).getName() + "を排出します"); 107 if(cf.exist_balance()) { 108 System.out.println("おつりは"); 109 for(int i = 0; i < cf.count.length; i++) { 110 System.out.println(cf.money[i] + "円:" + cf.count[i] + "枚"); 111 } 112 System.out.println("払いだされます"); 113 } else { 114 System.out.println("お釣りはありません"); 115 } 116 } else { 117 System.out.println("購入不可"); 118 System.out.println(cash_balance + "円払い出し"); 119 } 120 121 } else { 122 if(error_flg == 0) { 123 System.out.println(list.get(p_number).getName() + "を排出します"); 124 System.out.println("IC残高は" + (ic.getBalance() - list.get(p_number).getPrice())); 125 } else { 126 System.out.println("残高不足(" + (ic.getBalance() - list.get(p_number).getPrice()) * (-1) + "円不足)"); 127 } 128 } 129 break; 130 } while(true); 131 } 132} 133 134package vending_machine; 135public class Cash_flow extends Throw_cash_flow { 136 //メインメソッドでおつり定義 137 int[] get = new int[4];//自販機内のもともとの数 138 int[] count = new int[4]; 139 int[] money = { 500, 100, 50, 10 }; 140 141 public int Purchase(int sum, int Shohin_price) { 142 if(sum >= Shohin_price) { 143 return 0; 144 } else { 145 return 1; 146 } 147 } 148 149 //初期値のセット 150 public void set_coin(int n1, int n2, int n3, int n4) { 151 get[0] = n1; 152 get[1] = n2; 153 get[2] = n3; 154 get[3] = n4; 155 } 156 157} 158package vending_machine; 159public class Error_flow { 160 161 public boolean judge_Cash(int flg) { 162 if(flg == 1) { 163 return true; 164 } else { 165 return false; 166 } 167 } 168 169 //cash_balance=countおつり 170 public void cash_error(int[] count, Product[][] shohin, int cash_balance, int error_flg) { 171 if(error_flg == 1) { 172 System.out.println(cash_balance); 173 } else { 174 System.out.println("商品排出"); 175 System.out.println("おつり表示"); 176 } 177 } 178 179 public void IC_error(int balance,Product[][]shohin,int error_flg) { 180 if(error_flg==1) { 181 System.out.println("残高不足"); 182 }else { 183 System.out.println("商品排出"); 184 System.out.println("残高表示"); 185 } 186 } 187} 188 189package vending_machine; 190public class IC_flow { 191 private int balance=0; 192 public IC_flow(int balance) { 193 this.balance=balance; 194 } 195 196 public int getBalance() { 197 return balance; 198 } 199 200 public void setBalance(int balance) { 201 this.balance = balance; 202 } 203 204 public int IC_judge(int IC_balance,int shohin_price) { 205 if(IC_balance>=shohin_price) { 206 return 0; 207 }else { 208 return 1; 209 } 210 211 } 212} 213 214package vending_machine; 215 216public class Product { 217 private String name; 218 private int price; 219 220 public Product(String name, int price) { 221 this.name = name; 222 this.price = price; 223 } 224 225 public String getName() { 226 return name; 227 } 228 229 public void setName(String name) { 230 this.name = name; 231 } 232 233 public int getPrice() { 234 return price; 235 } 236 237 public void setPrice(int price) { 238 this.price = price; 239 } 240 241 @Override 242 public String toString() { 243 return name + ", 値段:" + price + "円"; 244 } 245 246} 247 248package vending_machine; 249public class Throw_cash_flow { 250 private int In500 = 0; 251 private int In100 = 0; 252 private int In50 = 0; 253 private int In10 = 0; 254 255 public int getIn500() { 256 return In500; 257 } 258 259 public int getIn100() { 260 return In100; 261 } 262 263 public int getIn50() { 264 return In50; 265 } 266 267 public int getIn10() { 268 return In10; 269 } 270 271 public void setIn500(int in500) { 272 this.In500 = in500; 273 } 274 275 public void setIn100(int in100) { 276 this.In100 = in100; 277 } 278 279 public void setIn50(int in50) { 280 this.In50 = in50; 281 } 282 283 public void setIn10(int in10) { 284 this.In10 = in10; 285 } 286 287 //1枚ずつコインを入れているか判断するメソッド 288 public boolean each_judge(int money) { 289 switch (money) { 290 case 1: 291 case 5: 292 case 10: 293 case 50: 294 case 100: 295 case 500: 296 return true; 297 default: 298 return false; 299 } 300 } 301 302 public boolean judge(int In_money) { 303 //1円か5円かを判断する 304 if(In_money % 10 == 1 || In_money % 10 == 5) { 305 return false; 306 } else { 307 return true; 308 } 309 } 310 311 public void set_In(int money) { 312 if(money == 500) { 313 In500++; 314 } else if(money == 100) { 315 In100++; 316 } else if(money == 50) { 317 In50++; 318 } else { 319 In10++; 320 } 321 } 322 323 //お釣りがあるかないか判断 324 public boolean exist_balance() { 325 if(In500 > 0 || In100 > 0 || In50 > 0 || In10 > 0) { 326 return true; 327 } else { 328 return false; 329 } 330 } 331 332 333 334 //合計投入金額 335 public int total_cash() { 336 int sum = In500 * 500 + In100 * 100 + In50 * 50 + In10 * 10; 337 return sum; 338 } 339 340} 341 342package vending_machine; 343 344import java.util.Arrays; 345import java.util.List; 346 347public class ExProduct { 348 349 public static List<Product> getList() { 350 List<Product> list = Arrays.asList(new Product("天然水", 100), 351 new Product("緑茶", 150), 352 new Product("ウーロン茶", 150), 353 new Product("炭酸水", 150), 354 new Product("コーラ", 150), 355 new Product("オレンジジュース", 150), 356 new Product("桃の天然水", 150), 357 new Product("アイスコーヒー", 150), 358 new Product("ホットコーヒー", 150), 359 new Product("リンゴジュース", 150), 360 new Product("おしるこ", 150), 361 new Product("コーンポタージュ", 150), 362 new Product("モンスター", 200)); 363 364 return list; 365 } 366}

試したこと

こんにちは
現金の場合は1,ICの場合は0を入力してください
1
商品番号を選んでください
0:天然水, 値段:100円
1:緑茶, 値段:150円
2:ウーロン茶, 値段:150円
3:炭酸水, 値段:150円
4:コーラ, 値段:150円
5:オレンジジュース, 値段:150円
6:桃の天然水, 値段:150円
7:アイスコーヒー, 値段:150円
8:ホットコーヒー, 値段:150円
9:リンゴジュース, 値段:150円
10:おしるこ, 値段:150円
11:コーンポタージュ, 値段:150円
12:モンスター, 値段:200円
商品番号(0~12):10
一枚ずつ硬貨を投入してください(1,5,10,50,100,500)
100
合計金額=100円
続けて硬貨を投入しますか?(Yes:0,No:1):0
一枚ずつ硬貨を投入してください(1,5,10,50,100,500)
100
合計金額=200円
続けて硬貨を投入しますか?(Yes:0,No:1):1
50
おしるこを排出します
おつりは
500円:0枚
100円:0枚
50円:0枚
10円:0枚
払いだされます

本来であれば購入不可であるのですが、購入できてしまいます。
お釣りの枚数計算
の箇所に自分なりに追加してみましたがうまくいくことはありませんでした。

アドバイスでも何でもいいので教えていただけたら幸いです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

y_waiwai

2020/05/18 08:12

このままではコードが読みづらいので、質問を編集し、<code>ボタンを押し、出てくる’’’の枠の中にコードを貼り付けてください
monatos

2020/05/18 11:11

面倒なやり方ですが自分なりに解決することが出いました。 y_waiwaiさん asahina1979さん AMKさん ありがとうございました。
guest

回答2

0

自己解決

for(int i = 0; i <=cf.get[0]; i++) {   for(int j = 0; j <= cf.get[1]; j++) {     for(int k = 0; k <= cf.get[2]; k++) {             for(int l = 0; l <= cf.get[3]; l++) {         if(cash_balance != (500 * i + 100 * j + 50 * k + 10 * l))           {error_flg = 1;} } } } }

自販機内の硬貨でできる組み合わせを作成し、それに一致するものがなければエラーを返すことにしました。

投稿2020/05/18 11:16

monatos

総合スコア3

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

商品購入時に、金額が満たしているか?の処理の後に
お釣りの残金を確認させてお釣りが出せない時はエラーを返して
購入できないようにしたらどうですか?

IFを1つ追加すれば解決だと思いますよ

投稿2020/05/18 08:29

編集2020/05/18 08:36
AMK

総合スコア765

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

monatos

2020/05/18 10:24

例えば、自販機内に50円玉は一枚もなくて10円玉が10枚あるとします。 140円の飲み物を購入した時,10円6枚として払い出ししたいときも同じような解決法になりますでしょうか。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問