JAVA/Consol < 반복문 제어문의 활용 > 자판기 제작 빨코모 2018. 6. 12. 18:15 Avm_00.java import java.util.Scanner; public class Avm_00 { // TODO Auto-generated method stub static int count = 8; static int ChargeUnit = 5; static int[] ibeverageNumber = new int[count]; // 주문 번호 static String[] ibeverage = new String[count]; // 음료 이름 static int[] ibeveragevalue = new int[count]; // 음료 가격 static int[] ibeveragecount = new int[count]; // 현재 있는 음료 개수 static int[] iChargeUnit = new int[ChargeUnit]; static int[] iChargeUnitCount = new int[ChargeUnit]; static int[] iReturnUnitCount = new int[ChargeUnit]; static String[] sbeveragesonoff = new String[count]; // // 구매 가능할 경우,■ static int iInsertMoney = 0; // 임금한 금액 public static void main(String[] args) { // TODO Auto-generated method stub int charge = 0; // 잔돈 boolean bflag = false; // 99 입력시 true Scanner scan = new Scanner(System.in); while (true) { MenuSetting(); // 음료 이름 및 가격 세팅 Menu(iInsertMoney); // 파라메타 : 입금한 잔액 InsertCoin(bflag); // 가격 입력 받는 곳 if (iInsertMoney != 0) { Menu(iInsertMoney); } SelectBeverage(); } } static void SelectBeverage() { // 음료 선택 boolean bflag = false; int inumber = 0; Scanner scan02 = new Scanner(System.in); do { System.out.println("구매하고자 하는 음료의 번호를 선택해주세요"); inumber = scan02.nextInt(); BuyableChk(inumber); // 번호가 맞는지와 구매 가능한지 체크 Menu(iInsertMoney); } while (!bflag); } static void BuyableChk(int inumber) // 번호가 맞는지와 구매 가능한지 체크 { if (inumber == 0) // 돈 반환 { ReturnChargeChk(iInsertMoney); // ChargeMenuSetting(iInsertMoney); ReturnChargePrint(); System.out.println("으로 총 " + iInsertMoney + "원이 환불되었습니다."); iInsertMoney = 0; Menu(iInsertMoney); InsertCoin(false); } else if ((inumber < 0) || (inumber > 8)) { System.out.println("번호를 잘못 눌렀습니다.\n다시 제대로 된 번호를 입력해주세요."); } else { if (ibeveragecount[inumber - 1] == 0) { System.out.println("- 매진된 음료입니다.\n- 구매 가능한 음료의 번호를 선택해주세요.\n남은 금액은 " + iInsertMoney + "원 입니다."); } else { // 매진이 아닌데, 금액이 부족할 경우 if (iInsertMoney < ibeveragevalue[inumber - 1]) LowMoneyChk(inumber); else { iInsertMoney -= ibeveragevalue[inumber - 1]; System.out.println(ibeverage[inumber - 1] + "를 구매하였습니다. \n남은 금액은 " + iInsertMoney + "원 입니다.\n잔돈 반환을 원할 경우, 0번을 눌러주세요."); ibeveragecount[inumber - 1] -= 1; } } } } static void LowMoneyChk(int iSelectNum) { Scanner scan03 = new Scanner(System.in); int iselctnum = 0; boolean bflag = false; System.out.println("- 금액이 부족합니다."); do { System.out.println("- 추가로 금액을 넣을 경우,1번을\n다른 메뉴 구매를 원할 경우 2번을 눌러주세요."); iselctnum = scan03.nextInt(); if (iselctnum == 1) { bflag = false; InsertCoin(bflag); bflag = true; } else if (iselctnum == 2) { Menu(iInsertMoney); System.out.println("\n구매하고자 하는 음료의 번호를 선택해주세요"); System.out.println("\n남은 금액은 " + iInsertMoney + "원 입니다.\n잔돈 반환을 원할 경우, 0번을 눌러주세요."); iselctnum = scan03.nextInt(); BuyableChk(iselctnum); bflag = true; } else { System.out.println("- 잘못 입력하셨습니다. \n- 1번 또는 2번을 입력해주세요."); } } while (!bflag); // else } static void InsertCoin(boolean bflag) { // 돈받기 반복문 Scanner scan01 = new Scanner(System.in); int iinsertMoneyTemp = 0; // 가격 입력 받는 곳 while (!bflag) { System.out.print( "\n-------------------------------------------------------------------------------------------------" + "\n- 동전을 그만 넣고 싶을 경우,99를 입력해주세요\n- 환불하실 경우, 0을 눌러주세요.\n" + "\n* 돈을 넣어주세요 : "); iinsertMoneyTemp = scan01.nextInt(); if (iinsertMoneyTemp == 0 && iInsertMoney != 0) { System.out.println(iInsertMoney + "이 환불되었습니다."); iInsertMoney = 0; Menu(iInsertMoney); } else if (iinsertMoneyTemp == 0 && iInsertMoney == 0) { System.out.println("※ 넣으신 돈이 0원입니다.\n※ 음료를 구매할 수 없습니다."); } // 입금한 금액이 있고, 환불 받을 경우 else if (iinsertMoneyTemp == 99 && iInsertMoney != 0) { if (iInsertMoney < ibeveragevalue[0]) System.out.println("※ 현 잔액으로 구매할 수 있는 음료가 없습니다.\n※ 추가로 입금해주세요."); else bflag = true; } // 그만 돈을 넣고 싶고, 넣은 돈이 0이 아닐 때 즉, 음료 주문 가능 else if (iinsertMoneyTemp == 99 && iInsertMoney == 0) { System.out.println("※ 넣으신 돈이 0원입니다.\n※ 음료를 구매할 수 없습니다."); } else { // 이곳에 동전 체크하기 (50, 100, 500...등등) if (InputMoneyUnitChk(iinsertMoneyTemp)) { if (!Chargeable(iinsertMoneyTemp)) { iInsertMoney += iinsertMoneyTemp; System.out.println("총 넣으신 금액은 : " + iInsertMoney + "원 입니다"); } else {// 잔돈이 꽉 차서 음료 주문할 수 있도록 iInsertMoney += iinsertMoneyTemp; System.out .println("총 넣으신 금액이(" + iInsertMoney + "원)이 잔돈보다 커 더 이상 입금이 불가능합니다.\n" + "음료를 주문해주세요!"); bflag = true; } RefreshInputMoneyCharge(iinsertMoneyTemp); } else { System.out.println("※ 금액은 10단위,50단위, 100단위, 500단위의 숫자로 입력해주세요"); } } } } static void Menu(int iMoney) {// 메뉴판 노출 String stext = ""; System.out.print( "\n########################################## 자판기 ################################################\n"); ChargeMenuSetting(iMoney); if (iMoney != 0) { for (int i = 0; i < ibeverage.length; i++) { // 가격에 구매할 수 있는 음료 체크 if (ibeveragevalue[i] <= iMoney && ibeveragecount[i] != 0) sbeveragesonoff[i] = "■ "; else sbeveragesonoff[i] = "□ "; if (ibeveragecount[i] != 0) stext = ibeverageNumber[i] + "." + ibeverage[i] + "" + ibeveragevalue[i] + "원" + sbeveragesonoff[i] + "(" + ibeveragecount[i] + "개)" + "\t"; else stext = ibeverageNumber[i] + "." + ibeverage[i] + "" + ibeveragevalue[i] + "원" + sbeveragesonoff[i] + "(매진)" + " "; // 4개씩 끊어 메뉴판 노출 System.out.print(stext); if (i == (ibeverage.length / 2) - 1) System.out.println(""); } System.out.println(); } else { for (int i = 0; i < ibeverage.length; i++) { if (ibeveragecount[i] != 0) stext = ibeverageNumber[i] + "." + ibeverage[i] + "" + ibeveragevalue[i] + "원" + "(" + ibeveragecount[i] + "개)" + "\t"; else stext = ibeverageNumber[i] + "." + ibeverage[i] + "" + ibeveragevalue[i] + "원" + "(매진)" + "\t"; System.out.print(stext); if (i == (ibeverage.length / 2) - 1) System.out.println(""); } } } static boolean Chargeable(int iMoney) { // 잔돈 반환 가능 체크 boolean bChargeChk = false; // false일 경우, 기존대로 진행 , true일 경우, 입금 stop, 음료 선택 if (iMoney == 0) // 입금된 금액이 0일 때 // 입금된 금액이 없기 때문에 항상 잔돈 있음 가능 { bChargeChk = false; } else { if (ChargeCalculate() < iMoney) // 입금한 금액보다 내 잔돈이 작을 경우, 바로 음료 선택 { bChargeChk = true; } else // 입금한 금액보다 잔돈이 클 경우, 입금할 지 말지 계속 진행 { bChargeChk = false; } } return bChargeChk; } static boolean InputMoneyUnitChk(int iMoney) { // 10으로만 나눌 수 있으면 모든 수 가능 최소 기준 단위가 10이기 때문에 for (int i = 0; i < iChargeUnitCount.length; i++) { if ((iMoney == iChargeUnit[i])) return true; } return false; } static void RefreshInputMoneyCharge(int iMoney) { for (int i = 0; i < iChargeUnitCount.length; i++) if (iChargeUnit[i] == iMoney) iChargeUnitCount[i]++; } static void ReturnChargeChk(int iMoney) { // 돈 반환해주기 int ishare = 0; // 몫 int iMoneytemp = iMoney; for (int i = (iChargeUnitCount.length - 1); i > 0; i--) { // 큰 돈으로 나눠서 ishare = iMoneytemp / iChargeUnit[i]; if (iChargeUnitCount[i] >= ishare) { iMoneytemp -= (iChargeUnit[i] * ishare); iReturnUnitCount[i] = ishare; iChargeUnitCount[i] -= ishare; } else { iMoneytemp -= (iChargeUnit[i] * iChargeUnitCount[i]); iReturnUnitCount[i] = iChargeUnitCount[i]; iChargeUnitCount[i] -= iChargeUnitCount[i]; } } } static void ReturnChargePrint() { // 잔돈 반환 시, 개수 노출 String sText = "===>>"; for (int i = 0; i < iChargeUnitCount.length; i++) if (iReturnUnitCount[i] != 0) sText += iChargeUnit[i] + "원 " + iReturnUnitCount[i] + "개 "; System.out.print(sText); } static void ChargeMenuSetting(int iMoney) // 잔돈 노출 print 문만 { String sCharge = ""; // 000원 000개 String sChargeMark = "\t잔돈 "; // 잔돈 있을 경우, ■ 없을 경우, □ if (!Chargeable(iMoney)) sChargeMark += "있음 ● >>"; else { sChargeMark += "부족 ○ >>"; } for (int i = 0; i < iChargeUnit.length; i++) { sCharge += "\t" + iChargeUnit[i] + "원 : " + iChargeUnitCount[i] + "개 "; } System.out.println("\n" + sChargeMark + sCharge + "\t"); System.out.println( "-------------------------------------------------------------------------------------------------"); } static int ChargeCalculate() // 잔돈 총액 계산 { int iTotalCharge = 0; for (int i = 0; i < iChargeUnitCount.length; i++) { iTotalCharge += (iChargeUnit[i] * iChargeUnitCount[i]); } return iTotalCharge; } static void MenuSetting() { // 메뉴판 초기 세팅 int ibasicvalue = 0; int evenNumcnt = 0; // 잔돈 10원단위 체크 int oddNumcnt = 1; // 잔돈 50원단위 체크 ibeverage[0] = "블랙커피"; ibeverage[1] = "설탕커피"; ibeverage[2] = "프림커피"; ibeverage[3] = "고급커피"; ibeverage[4] = "코카콜라"; ibeverage[5] = "비타워터"; ibeverage[6] = "환타레몬"; ibeverage[7] = "환타포도"; for (int i = 0; i < ibeveragevalue.length; i++) { ibeverageNumber[i] = i + 1; ibasicvalue += 300; ibeveragevalue[i] = ibasicvalue; ibeveragecount[i] = (int) ((Math.random() * 10)); } // 잔돈 단위 개수 10.50,100,500,1000~~~ for (int i = 0; i < iChargeUnit.length; i++) { iReturnUnitCount[i] = 0; iChargeUnitCount[i] = (int) ((Math.random() * 10)); if (i % 2 == 0) // 10 , 100,100단위로 증가 { iChargeUnit[i] = 1; for (int j = 0; j <= evenNumcnt; j++) iChargeUnit[i] *= 10; evenNumcnt++; } else // 50, 500,5000 단위로 증가 { iChargeUnit[i] = 5; for (int j = 1; j <= oddNumcnt; j++) iChargeUnit[i] *= 10; oddNumcnt++; } } } }