-
※ 문제. 분식집 주문 프로그램을 만들어보세요.
(1. 메뉴선택 2. 수량선택 3. 추가주문선택 4. y면 1번부터 다시 시작. 단 데이터는 누적 5. n면 주문결과서 출력)
메뉴
김밥류 ===================
1.원조김밥===========1500원
2.치즈김밥===========2000원
3.참치김밥===========2300원
라면류 ===================
4.그냥라면===========3000원
5.치즈라면===========3500원
6.짬뽕라면===========4000원
분식류 ===================
7.떡볶이=============2500원
8.순대==============2500원
9.오뎅==============1000원
기타 ====================
10.음료수===========1000원
결과
주문하신 정보는 다음과 같습니다.
----------------------------
치즈라면: 3개 - 10500원
그냥라면: 3개 - 9000원
음료수: 3개 - 3000원
----------------------------
합계 : 22500원더보기123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293public void test() {Scanner sc = new Scanner(System.in);char yn = 'y';String menuName = "";int price = 0;int sum = 0;String total = "";do {System.out.println("메뉴\n"+ "김밥류 ===================\n"+ "1. 원조김밥 =========1500원\n"+ "2. 치즈김밥 =========2000원\n"+ "3. 참치김밥 =========2300원\n"+ "라면류 ===================\n"+ "4. 그냥라면 =========3000원\n"+ "5. 치즈라면 =========3500원\n"+ "6. 짬뽕라면 =========4000원\n"+ "분식류 ===================\n"+ "7. 떡볶이 ==========2500원\n"+ "8. 순대 ===========2500원\n"+ "9. 오뎅 ===========1000원\n"+ "기타 ====================\n"+ "10. 음료수 =========1000원\n");System.out.println();System.out.println("메뉴를 선택하세요 : ");int menu = sc.nextInt();switch(menu) {case 1 :menuName = "원조김밥";price = 1500;break;case 2 :menuName = "치즈김밥";price = 2000;break;case 3 :menuName = "참치김밥";price = 2300;break;case 4 :menuName = "그냥라면";price = 3000;break;case 5 :menuName = "치즈라면";price = 3500;break;case 6 :menuName = "짬뽕라면";price = 4000;break;case 7 :menuName = "떡볶이";price = 2500;break;case 8 :menuName = "순대";price = 2500;break;case 9 :menuName = "오뎅";price = 1000;break;case 10 :menuName = "음료수";price = 1000;break;default :System.out.println("잘못 입력하셨습니다.");continue;}System.out.println("수량을 선택하세요 : ");int cnt = sc.nextInt();System.out.println("추가주문하시겠습니까?(y/n) : ");yn = sc.next().charAt(0);total += menuName + ": " + cnt + "개 - " + price*cnt +"원\n";sum += price*cnt;// if(yn == 'n' || yn == 'N')// break;}while(yn == 'y' || yn == 'Y');System.out.println("결과\n"+ "주문하신 정보는 다음과 같습니다.\n"+ "------------------------");System.out.println(total);System.out.println("------------------------\n"+ "합계 : " + sum + "원");}cs switch랑 do-while문 활용.
뼈대는 비슷한데 변수 사용이 조금 다르다.
더보기123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899private void test() {Scanner sc = new Scanner(System.in);String menu = "김밥류 ===================\n"+ "1.원조김밥===========1500원\n"+ "2.치즈김밥===========2000원\n"+ "3.참치김밥===========2300원\n"+ "라면류 ===================\n"+ "4.그냥라면===========3000원\n"+ "5.치즈라면===========3500원\n"+ "6.짬뽕라면===========4000원\n"+ "분식류 ===================\n"+ "7.떡볶이=============2500원\n"+ "8.순대==============2500원\n"+ "9.오뎅==============1000원\n"+ "기타 ====================\n"+ "10.음료수===========1000원\n";char moreOrder = ' ';String order = "";int sum = 0;do {System.out.print(menu);System.out.print("메뉴선택 => ");String menuNum = sc.next();System.out.print("수량선택 => ");int count = sc.nextInt();int price = 0;switch (menuNum) {case "1":price = 1500*count;sum += price;order+="원조김밥: "+count+"개 - "+price+"원";break;case "2":price = 2000*count;sum += price;order+="치즈김밥: "+count+"개 - "+price+"원";break;case "3":price = 2300*count;sum += price;order+="참치김밥: "+count+"개 - "+price+"원";break;case "4":price = 3000*count;sum += price;order+="그냥라면: "+count+"개 - "+price+"원";break;case "5":price = 3500*count;sum += price;order+="치즈라면: "+count+"개 - "+price+"원";break;case "6":price = 4000*count;sum += price;order+="짬뽕라면: "+count+"개 - "+price+"원";break;case "7":price = 2500*count;sum += price;order+="떡볶이: "+count+"개 - "+price+"원";break;case "8":price = 2500*count;sum += price;order+="순대: "+count+"개 - "+price+"원";break;case "9":price = 1000*count;sum += price;order+="오뎅: "+count+"개 - "+price+"원";break;case "10":price = 1000*count;sum += price;order+="음료수: "+count+"개 - "+price+"원";break;default: System.out.println("잘못누르셨습니다.");break;}System.out.print("추가주문하시겠습니까?(y/n) => ");moreOrder = sc.next().toLowerCase().charAt(0);//개행문자추가if(moreOrder=='y') order+="\n";} while (moreOrder == 'y');System.out.println("주문하신 정보는 다음과 같습니다.\n----------------------------");System.out.println(order);System.out.println("----------------------------");System.out.println("합계 : "+sum+"원");}cs price변수에 처음부터 cnt를 곱해 가격을 출력했다.
내 코드는 가격만 price변수에 지정하고 나중에 cnt를 곱하는 방식이었다.
String 또한 내 코드는 마지막에 합쳐서 지정하는 반면, 선생님의 코드에는 switch문에 처음부터 들어가 있는 것을 볼 수 있다.
이 문제의 경우 똑같은 메뉴를 나중에 선택하면 영수증을 출력할 때에 언제 시켰는지에 따라 따로따로 출력이 되는데, 이를 오늘 배운 배열을 활용해서 해결할 수 있을 것 같다.
※문제. 1~100 사이의 임의의 난수를 발생시키고 정수 한 개를 입력 받아, 난수가 입력 받은 정수보다 작으면 "입력하신 정수보다 작습니다." 출력, 난수가 입력 받은 정수보다 크면 "입력하신 정수보다 큽니다." 출력. 단, 정답을 맞출 때까지 정수를 계속 입력 받아 프로그램이 반복되도록 하고, 정답인 경우 "정답입니다. 5회 만에 정답을 맞추셨습니다."와 같이
몇 회 만에 정답을 맞추었는지 출력하도록 작성.더보기1234567891011121314151617181920212223public void test() {Random rnd = new Random();Scanner sc = new Scanner(System.in);int cnt = 1;int randomNum = rnd.nextInt(100)+1;// System.out.println(randomNum);while(true) {System.out.println("정수를 입력하세요 : ");int inputNum = sc.nextInt();String bool = (randomNum > inputNum)?"입력하신 정수보다 큽니다." : "입력하신 정수보다 작습니다.";if(randomNum != inputNum) {System.out.println(bool);cnt++;continue;}elsebreak;}System.out.printf("정답입니다. %d회 만에 정답을 맞추셨습니다.", cnt);}cs 난수와 입력한 정수가 같으면 바로 while문을 탈출하고, 아닌 경우 삼항연산자를 통해 크기 비교를 하는 식으로 작성했다.
cnt 변수를 뒤쪽에 두어 시작부터 cnt = 1로 루프를 시작했지만 변수 자리가 이동하면 cnt = 0 으로 시작해도 무방하다.
※문제. 2보다 큰 정수를 입력 받고, 입력 받은 정수가 소수이면 "소수다", 소수가 아니면 "소수가 아니다." 출력하고 프로그램을 종료하는 코드를 작성. (입력 받은 정수가 2보다 작은 경우 "잘못 입력하셨습니다. 다시 입력하세요." 출력 후 다시 정수를 입력 받도록 하세요.)
더보기1234567891011121314151617181920public void test() {Scanner sc = new Scanner(System.in);int cnt = 0;while (true) {System.out.println("정수를 입력하시오(2~) : ");int num = sc.nextInt();if (num < 2) {System.out.println("잘못 입력하셨습니다. 다시 입력하세요.");continue;}for (int i = 1; i <= num; i++) {if (num % i == 0)cnt++;}String bool = (cnt == 2) ? "소수다." : "소수가 아니다.";System.out.println(bool);break;}}cs 소수는 1과 자기 자신을 제외한 moduler연산에서 0을 얻을 수 없으니 for문을 이용해서 1부터 해당 num까지 모듈러 연산을 반복, 나머지가 0이 나오는 경우 cnt를 증가시켜 cnt가 2인 경우와 아닌 경우로 나누었다.
이렇게 코드를 짜도 답은 나오지만 연산을 지나치게 많이 하는 느낌이 든다.
더보기1234567891011121314151617181920212223242526public void answer() {// 2를 제외한 짝수는 소수가 아님. 짝수를 제외하면 계산량을 줄일 수 있음.Scanner sc = new Scanner(System.in);while(true) {System.out.println("2보다 큰 정수를 입력하세요 : ");int num = sc.nextInt();boolean isPrimeNum = true; // 일단 소수라고 가정//유효성 검사if(num <= 2) {System.out.println("올바른 수가 아닙니다. 다시 입력하세요.");continue;}for (int i = 2; i < num/2; i++) {System.out.printf("%d, %b%n", i, num % i == 0);if (num % i == 0) {isPrimeNum = false;break;}}System.out.println(isPrimeNum? "소수입니다. " : "소수가 아닙니다. ");}}cs 먼저, 소수의 특성을 알아보면
1. 2를 제외한 짝수는 소수가 될 수 없다.
2. 해당 num/2를 넘는 수는 소수가 될 수 없다.
이를 바탕으로 for문에서 i의 조건문 범위를 줄일 수 있다.
또한, i의 범위를 2부터 시작해 모듈러 연산을 실행하고, 한번이라도 나머지가 0이 나오는 경우 break를 이용해 해당 루프를 탈출하면 더 효율적인 코드를 만들 수 있다.
'혼자 있는 방 > Java' 카테고리의 다른 글
Homework(7) (0) 2021.06.25 Homework(6) (0) 2021.06.24 Homework(4) (0) 2021.06.22 Homework(3) (0) 2021.06.21 Homework(2) (0) 2021.06.18 댓글