[Java] tip: 커피 주문 프로그램 만들기 (Scanner, if문, while문, continue문, break문)

febCho·2023년 10월 8일

Java

목록 보기
17/53

커피 주문 프로그램 만들기 - 문제

		 * [실습]
		 * 동전을 넣고 커피를 주문하면 커피를 판매하는 자판기 프로그램
		 * 자판기는 자판기 보유 동전(1000), 커피(10), 프림(10), 설탕(10)을
		 * 보유하고 있고 커피를 주문할 때 마다 자판기 보유 동전 - 거스름돈,
		 * 커피 5 차감, 프림 3 차감, 설탕 1 차감, 0이 되면 판매를 중단 함.
		 * 
		 * [입력 및 출력 예시]
		 * 동전을 넣으세요(커피값: 400): 500 - 구매 동전은 보유 동전에 쌓이지 X
		 * 
		 * 거스름돈 : 100원
		 * 맛 좋은 커피가 준비되었습니다.
		 * ==========현재 자판기 정보============
		 * 커피양: 5
		 * 프림양: 7
		 * 설탕양: 1
		 * 자판기 보유 동전 금액: 900원
		 * 투입한 동전 금액: 500원
		 * ==================================
		 * 
		 * or
		 * 동전을 넣으세요(커피값: 400): 300
		 * (고객이 투입한 동전이 커피값보다 작으면) 투입한 동전이 부족합니다.
		 * 
		 * or
		 * 동전을 넣으세요(커피값: 400): 1000
		 * (커피가 부족하면) 커피가 부족합니다.
		 * (프림이 부족하면) 프림이 부족합니다.
		 * (설탕이 부족하면) 설탕이 부족합니다.
		 * (자판기 보유 동전이 부족하면) 거스름돈이 부족합니다.

커피 주문 프로그램 만들기 - 풀이

package kr.s05.operation;

public class WhileMain09 {
	public static void main(String[] args) {
		
		int price = 400;
		
		int content_coffee = 5;
		int content_cream = 3;
		int content_sugar = 1;
		
		int coffee = 10;
		int cream = 10;
		int sugar = 10;
		
		int amount = 0;
		int coin = 1000;
		
		java.util.Scanner input = new java.util.Scanner(System.in);
		
		while(true) {
			System.out.print("1: 커피 마시기, 2: 종료> ");
			int num = input.nextInt();
			if(num == 1) {
				System.out.print("동전을 넣으세요(커피값 " + price + "원): ");
				int money = input.nextInt();
				
				int change = money - price;
				
				if(coffee < content_coffee) {
					System.out.println("커피가 부족합니다");
					continue;//커피가 부족하면 그 다음 내용을 수행하지 않음
				}
				
				if(cream < content_cream) {
					System.out.println("프림이 부족합니다.");
					continue;//설탕이 부족하면 그 다음 내용을 수행하지 않음
				}
				
				if(sugar < content_sugar) {
					System.out.println("설탕이 부족합니다.");
					continue;//설탕이 부족하면 그 다음 내용을 수행하지 않음
				}
				
				if(money < price) {
					System.out.println("투입한 동전이 부족합니다.");
					continue;//투입한 동전이 구매금액보다 작음
				}
				if(coin < change) {
					System.out.println("거스름돈이 부족합니다.");
					continue;//거스름돈으로 주어야 할 금액이 자판기 보유 금액보다 적음
				}
				
				coffee -= content_coffee;
				cream -= content_cream;
				sugar -= content_sugar;
				coin -= change;
                
				amount += money;
				
				System.out.printf("거스름돈: %,d원%n", change);
				System.out.println("맛 좋은 커피가 준비가 되었습니다.");
				
				System.out.println("=====현재 자판기 정보=====");
				System.out.printf("커피양: %d%n", coffee);
				System.out.printf("프림양: %d%n", cream);
				System.out.printf("설탕양: %d%n", sugar);
				System.out.printf("자판기 보유 동전 금액: %,d원%n", coin);
				System.out.printf("투입한 동전 금액: %,d원%n", amount);
				System.out.println("======================");
				
				}else if(num == 2) {
				System.out.println("자판기 프로그램 종료");
				break;
			}else {
				System.out.println("잘못 입력했습니다.");
			}
		}
		
		
		input.close();
		
	}
}

이번 실습 문제는 이전에 작성한 커피 주문 프로그램보다 고도화된 프로그램으로, 메뉴를 반복하며 커피, 설탕, 프림, 보유 동전이 부족한 경우 주문이 되지 않는 기능현재 자판기 정보를 제공하는 기능이 추가되었다.

참고) Scanner, if, while을 활용해 간단한 커피 주문 프로그램 만들기

프로그램을 구현하기 위해 필요한 조건 나누기
① 자판기의 커피 보유량이 커피 한 잔에 필요한 커피 양보다 많거나 같다.
→ 적다면, 판매 중단: "커피가 부족합니다."
② 자판기의 프림 보유량이 커피 한 잔에 필요한 프림 양보다 많거나 같다.
→ 적다면, 판매 중단: "프림이 부족합니다."
③ 자판기의 설탕 보유량이 커피 한 잔에 필요한 설탕 양보다 많거나 같다.
→ 적다면, 판매 중단: "설탕이 부족합니다."
④ 자판기의 동전 보유량이 내주어야 할 거스름돈보다 많거나 같다.
→ 적다면, 판매 중단: "거스름돈이 부족합니다."
⑤ 투입된 금액이 커피 한 잔을 주문하기 위해 필요한 금액보다 많거나 같다.
→ 적다면, 판매 중단: "투입한 동전이 부족합니다."

⑥ 위 조건을 모두 만족한다면 정상 주문으로 거스름돈, 커피, 자판기 정보를 제공한다.

  1. 400원이라는 커피 가격을 반복해 사용하고, 연산도 하기 위해 int price = 400; price라는 정수형 변수에 값을 대입한다.
    같은 이유로 커피 한 잔에 들어갈 재료의 양과 커피에 들어갈 재료의 현재 보유량, 투입한 누적 금액과 자판기가 보유한 동전도 변수에 저장해 준다.
//커피 한 잔에 들어갈 재료의 양
int content_coffee = 5;
int content_cream = 3;
int content_sugar = 1;

//커피에 들어갈 재료의 현재 보유량
int coffee = 10;
int cream = 10;
int sugar = 10;

//투입한 금액 누적
int amount = 0;
//자판기 보유 동전: 거스름돈으로 내어줄 금액
int coin = 1000;

이때 정수형 변수 amount는 투입한 금액을 누적해줄 변수로, 자판기가 보유한 동전과는 별개다. 즉 커피를 구매하고자 투입한 금액은 거스름돈으로 나갈 수 없도록 하기 위해 정수형 변수 coin과는 별도로 만들어 주었다.

  1. while문을 무한루프 형태로 만들고, System.out.print("1. 커피 마시기, 2: 종료> "); 안내 문구 출력 후 Scanner를 통해 int num = input.nextInt(); 메뉴 번호를 입력 받는다.

  2. if(num == 1) { 메뉴 1번을 선택하면, System.out.print("동전을 넣으세요(커피값 " + price + "원): "); 안내 문구 출력 후 Scanner를 통해 int money = input.nextInt(); 동전을 입력 받는다.

  3. 그렇게 입력 받은 지불 금액(money)에서 커피 한 잔 가격(price)을 빼 제공할 거스름돈(change)에 대입한다. int change = money - price;

  4. 이후 커피가 정상 주문될 수 있는 환경인지 if문을 활용해 조건 체크를 한다.
    이때, if(coffee < content_coffee) { 보유 커피량(coffee)이 커피 한 잔에 필요한 커피 양(content_coffee)보다 작다면, System.out.println("커피가 부족합니다."); 안내 문구 출력 후, continue;으로 그 이하의 수행문들은 포기하고 다시 System.out.print("1. 커피 마시기, 2: 종료> "); 처음으로 돌아가게 한다.
    이 과정을 커피는 물론, else if로 프림, 설탕, 거스름돈, 투입한 동전까지 모두 체크해준다.

  5. 위 조건 체크가 모두 false가 되어 정상 주문이 된다면, 자판기 보유량에서 커피 한 잔에 필요한 재료 및 거스름돈으로 나갈 금액을 차감한다.

coffee -= content_coffee;
cream -= content_cream;
sugar -= content_sugar;
coin -= change;
  1. 그리고 투입한 금액은 정수형 변수 amount에 누적한다. amount += money;

  2. 4번에서 연산한 거스름돈(change)과 안내 문구, 현재 자판기 정보를 출력한다.

System.out.printf("거스름돈: %,d원%n", change);
System.out.println("맛 좋은 커피가 준비되었습니다.");
				
System.out.println("======현재 자판기 정보======");
System.out.printf("커피양: %d%n", coffee);
System.out.printf("프림양: %d%n", cream);
System.out.printf("설탕양: %d%n", sugar);
System.out.printf("자판기 보유 동전 금액: %,d원%n", coin);
System.out.printf("투입한 동전 금액: %,d원%n", amount);
System.out.println("=======================");
  1. 3번에서 만들어준 if문에서 else if(num == 2) { 2번을 선택한다면, System.out.println("자판기 프로그램 종료"); 자판기 프로그램을 종료한다는 안내 문구 출력 후에 break;로 무한루프 형태인 while문 전체를 빠져나온다.

  2. 그리고 1번과 2번이 아닌 숫자를 입력한다면, System.out.println("잘못 입력했습니다."); 문구를 출력한다.

  3. 이 과정이 모두 끝나면 input.close(); 해준다.

profile
Done is better than perfect.

0개의 댓글