나의 수업일지

인천 일보 아카데미 4일차 up&down게임_만들기 / 숫자 랜덤 출력

GUPING 2023. 2. 24. 23:40
  • 응용_검색_성적표만들기
package day4;

import java.util.Scanner;

public class Ex01_grade {

    public static void main(String[] args) {
        // TODO Auto-generated method stub

        Scanner sc = new Scanner(System.in);

        while (true) {
            System.out.println("=====성적=====");
            System.out.print("이름>");
            String name = sc.next();
            System.out.print("국어점수 입력>");
            int kor = sc.nextInt();
            System.out.print("영어점수 입력>");
            int eng = sc.nextInt();
            System.out.print("수학점수 입력>");
            int mat = sc.nextInt();
            int total = kor + eng + mat;
            double avg = total / 3.;
            char grade = ' ';

            if (avg > 90) {
                grade = 'a';
            } else if (avg > 80) {
                grade = 'b';
            } else if (avg > 70) {
                grade = 'c';
            } else if (avg > 60) {
                grade = 'd';
            } else {
                grade = 'f';
            }
            System.out.printf("이름\t국어\t영어\t수학\t총점\t평균\t학점\n");
            System.out.printf("%s\t%d\t%d\t%d\t%d\t%.2f\t%c\n",name,kor,eng,mat,total,avg,grade);
            // %d = 숫자 , %s = 문자열 , %f = 실수 , %c = 문자
            System.out.print("다시입력(Y/y)>");
            String reStart = sc.next();

//            if(reStart.equals("Y") || reStart.equals("y")) {
//                continue; 이런경우 컨티뉴가 없어도 반복한다 그러니까 이 if문은 있으나 없으나 똑같다
//            }
                if(!(reStart.equals("Y") || reStart.equals("y"))){
                System.out.println("종료합니다");
                break;
            }
            
>4일차에는 새로운 프로그램 언어를 배우는 시간보다 그동안 배운것들을 응용하여 만들어보는 시간을 가졌습니다
>먼저 콘솔에 검색하여 성적표를 가져오는 코딩입니다
>Scanner를 이용하여 콘솔에 사용자가 작성 가능하게 하였습니다
>while에 true을 대입하여 스코프를 나오기 전까지 계속 반복하게 하였습니다
>사용자가 각항목의 작성위치를 알기쉽게 프린트하고 입력 받은 국어 , 영어 , 수학의 점수를 각각의 함수에 대입하게 하였습니다
>이후 3과목의 점수를 합치고 total변수에 대입하고 소수점까지 알아보기 위해 duoble변수를 이용하여 total을 3으로 나눠 대입하였습니다
>이후 char변수를 grade로 선언 후 문자를 대입하기 위해 ' '만 대입하고 비웠습니다
>이제 if문을 사용하여 평균을 담은 double변수의 이름인 avg가 각점수 이상일 경우
>각 학점을 변수 grade에 대입하도록 만들었습니다
>이후 프린트를 이용하여 보기 좋게 콘솔에 프린트하였습니다 
> // %d = 숫자 , %s = 문자열 , %f = 실수 , %c = 문자 꾸미기에 사용된 코드입니다
>이후 다른 사람이 학점을 검색할 경우를 대비해 다시 하기와 종료하기를 if문으로 설정하였습니다

 

  • 응용 _ 계산기 만들기
package day4;

import java.util.Scanner;

public class Ex02_calculator2 {

    public static void main(String[] args) {
        // TODO Auto-generated method stub

        Scanner sc = new Scanner(System.in);
        boolean run = true;
        double result = 0;

        while (run) {
            System.out.println("====계산기====");
            System.out.println("1.더하기 2.빼기 3.곱하기 4.나누기 5.나머지 0.종료");
            System.out.print("선택한 메뉴는? >");
            int menu = sc.nextInt();

            if (menu == 0) {
                System.out.println("프로그램 종료");
                break;
            } else if (menu > 5 || menu < 0) {
                System.out.println("0~5까지만 입력가능합니다");
                continue;
            }

            System.out.print("첫번째 숫자 입력>");
            int num1 = sc.nextInt();
            System.out.print("두번째 숫자 입력>");
            int num2 = sc.nextInt();

            switch (menu) {
            case 1:
                System.out.printf("%d + %d = %d \n", num1, num2, num1 + num2);
                result = num1 + num2;
                break;
            case 2:
                System.out.printf("%d - %d = %d \n", num1, num2, num1 - num2);
                result = num1 - num2;
                break;
            case 3:
                System.out.printf("%d * %d = %d \n", num1, num2, num1 * num2);
                result = num1 * num2;
                break;
            case 4:
                System.out.printf("%d / %d = %.2f \n", num1, num2, num1 / (double) num2);
                result = num1 / (double) num2;
                break;
            case 5:
                System.out.printf("%d %% %d = %d \n", num1, num2, num1 % num2);
                result = num1 % num2;
                break;
                }
                
>switch를 이용하여 계산기를 만들어봤습니다
>먼저 Scanner를 이용하여 사용자가 콘솔에 입력 가능하게 만들었습니다
>이후 while문을 이용하여 사용자가 작성할 위치와 명령문을 반복하게 만들었습니다
>먼저 사용자가 원하는 공식을 변수 menu로 가져와 대입하였고
>if문과 switch문에 대입하여 menu에 각 수가 대입될 경우의 조건을 설정했습니다
>처음 if문에는 0을 입력하면 종료 else if문에는 음수와 6이상의 수가 입력되면 특정 문구가 출려되고
>이후 continue;를 이용하여 while문 처음으로 돌아가게 설정하였습니다
>맞는 조건이 없다면 아래로 내려와 계산할 수를 입력하고 switch에 대입된 변수에 따라 계산 , 출력됩니다
>계산과 출력이 완료된 경우 break;를 이용하여 반복문을 탈출하게 됩니다

 

  • 계산기 _ 추가 _ 응용
System.out.println();
            System.out.println("1.이어하기 2.새로하기 0.종료");
            System.out.println("메뉴선택>");
            menu = sc.nextInt();
            switch (menu) {
            case 1:
                while (true) {
                    System.out.println("1.더하기 2.빼기 3.곱하기 4.나누기 5.나머지 0.종료");
                    System.out.print("선택한 메뉴는? >");
                    menu = sc.nextInt();
                    ;
                    System.out.println("숫자입력>");
                    int num = sc.nextInt();

                    if (menu == 1) {
                        System.out.printf("%.2f + %d = %.2f", result, num, result + num);
                    } else if (menu == 2) {
                        System.out.printf("%.2f - %d = %.2f", result, num, result - num);
                    } else if (menu == 3) {
                        System.out.printf("%.2f * %d = %.2f", result, num, result * num);
                    } else if (menu == 4) {
                        System.out.printf("%.2f / %d = %.2f", result, num, result / num);
                    } else if (menu == 5) {
                        System.out.printf("%.2f %% %d = %.2f", result, num, result % num);
                    }
                    System.out.println();
                    System.out.println("1.이어하기 2.새로하기 0.종료");
                    System.out.println("메뉴 선택>");
                    menu = sc.nextInt();
                    if (menu == 1) {

                    } else if (menu == 2) {
                        break;
                    } else if (menu == 0) {
                        System.out.println("종료합니다");
                        run = false;
                        break;
                    } else if (menu < 0 || menu > 2) {
                        System.out.println("0~2까지 입력가능합니다");
                    }
                }

>위에서 계산을 마친 후  이어하기 , 새로하기 , 종료를 추가하는 응용 방법입니다
>위에서 계산을 마치고 break;로 빠져 나왔기에 위에서 사용한 while문 밖에서 menu를 새로 출력하고
>여기서 사용된 변수 menu는 위의 변수menu와 이름이 같지만 처음 사용된 while문은 이미 지나왔기에 문제 없습니다
>1번인 이어하기를 누른경우 위에서 계산한 값에서 새로운 매뉴로 추가 계산을 하는것이기에
>미리 result에 전에 계산한 변수를 담았습니다 이렇게 대입받은 변수로 if문을 이용하여 계산식을 작성하고 출력
>아래의 if문에서는 menu에 1을 대입하면 2번째 while문을 다시 반복하게 만들었습니다
>이후는 else if를 이용하여 종료와 지정 수 이외의 번호를 입력하면 입력 가능한 수 범위를 프린트하게 하였습니다

 

  • 정렬_범위를 받고_오름차 순_내림차 순_출력
public class Ex03_sort {

    public static void main(String[] args) {
        // TODO Auto-generated method stub

        Scanner sc = new Scanner(System.in);
        while (true) {
            System.out.println("====정렬====");
            System.out.println("숫자입력>");
            int num = sc.nextInt();

            System.out.println("1.오름차순 2.내림차순");
            System.out.println("메뉴선택>");
            int menu = sc.nextInt();

            if (menu == 1) {
                for (int i = 1; i <= num; i++) {
                    System.out.println(i);
                }
            }
            ============내림차순 3가지 예시============
            else if (menu == 2) {
                for (int j = 0; num > j; num--) {
                    System.out.println(num);
                }
                for(int j=num; j > 0; j--) {
                    System.out.println("j");
                }

                for(int j = 1 ; num > 0 ; num = num-j) {
                    System.out.println(num);
                }    
            ============내림차순 3가지 예시============

            } else {
                System.out.println("메뉴는 1~2까지 선택 가능합니다");
            }

        }
        
        >범위를 지정받고 1부터 오름차순 범위부터 1까지 내림차순을 출력합니다
        >Scanner로 사용자가 입력 가능하게 하였습니다
        >이후 while문을 사용하여 반복하게 만들었습니다
        >사용자가 작성할 위치를 쉽게 찾을 수 있게 입력칸을 프린트하였습니다 입력받은 범위는 num에 저장합니다
        >1~2까지의 menu만 작성 가능하게 하였고 외의 수를 입력하면 범위를 프린트하고 처음부터 다시 시작합니다
        >if문을 이용하여 변수 menu에 대입되는 수에 따라 특정 for문이 사용되게 만들었습니다
        >menu 1번은 오름차순입니다 오름차순은 가장 기본적인 for문을 이용하기 때문에 넘어가겠습니다
        >문제는 menu 2번입니다 여러가지 출력 방법이 있지만 제가 사용한 방법은 3번입니다
        >menu에 2가 대입되어 else if가 작동되는 경우 안에있는 for문이 실행됩니다
        >for문의 해석은 변수 j 에 1을 넣고 변수 num이 0 보다 크다면 num - j를 한다
        >조건이 참이기 위해서 num은 0보다 커야하기 때문에 입력받은 num을 1씩 빼며 1까지
        >출력하게 하였습니다

 

  • 정렬_시작 범위_마지막 범위_받고 오름차 순_내림차 순_출력
        Scanner sc = new Scanner(System.in);
        boolean con = true;
        while (con) {
            System.out.println("====정렬====");
            System.out.print("첫번째 숫자 입력> ");
            int num1 = sc.nextInt();
            System.out.print("두번째 숫자 입력> ");
            int num2 = sc.nextInt();

            if (num1 > num2) {
                int temp = num1;
                num1 = num2;
                num2 = temp;
            }

            System.out.println("1.오름차순 2.내림차순");
            int menu = sc.nextInt();

            if (menu == 1) {
                    for (int i = num1; i <= num2; i++) {
                        System.out.println(i);
                }
            } else if (menu == 2) {
                for (int i = num2; i >= num1; i--) {
                    System.out.println(i);

                }

>위에서 만들었던 출력문의 응용입니다
>위에서는 범위를 받고 1까지 출력했다면 이번에는 시작과 끝의 범위를 받고 menu에따라 정렬합니다
>Scanner를 이용해 사용자가 콘솔창에 입력이 가능하도록 하였습니다
>wlie문을 이용하여 스코프 안의 실행문을 반복하도록 하였습니다
>입력 공간을 찾기 쉽게 출력후 num1 , num2 변수에 각각 가져와 대입하였습니다
>먼저 변수 num1,num2중 어떤 수가 대입되었는지 모르기에 둘중 더 큰수가 num2 작은수가 num1로 대입되게 if문을 써줍니다
>만약 num1이 num2보다 크면 변수 temp에 num1을 대입하고 num1에 num2를 대입 이후 num2에 temp를 대입함으로
>전에 변수에 있던 수가 덮어씌워져 사라지는것을 방지했습니다
>num1에 큰수가 들어가는 경우에 num2로 남기는 과정을 거쳤기 때문에 num2는 굳이 조건을 설정할 필요가 없습니다
>이제 사용자가 선택한 menu를 가져옵니다 이후는 위에서 설명한 정렬 방식을 이용하여 출력합니다

 

  • 응용_up&down게임_만들기
package day4;

import java.util.Scanner;


public class Ex04_updown {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		
		// 문제 )숫자를 계속 입력 받으면서 정답을 맞추는 게임
		// 정답이 입력받은 숫자보다 크면 up 출력
		// 정답이 입력받은 숫자보다 작으면 down 출력
		// 정답을 맞추면 정답 출력후 반복문 out 빠져나오기

		Scanner sc = new Scanner(System.in);

		double answer = (int) (Math.random() * 31) + 1;
        
		>Math.random의 뜻은 0.1부터 1전까지의 랜덤한 숫자를 넣어줌
		>int 강제 변형하였지만 이럴경우 int는 정수만 출력하기에 소수점을 제외하여 0만출력됨
		>그렇기에 *31을하여 0이상의 수로 만들고 소수점은 지워짐
		>+1은 굳이 *31을 안해도 된다는 설명임

		double q = answer;

		boolean con = true;
		int j = 0;
		int v = 10;

		while (con) {
			System.out.print("정답은 무엇일까요? >");
			int i = sc.nextInt();
			j++;
			v--;
			
			if (i == q) {
				System.out.println("정답입니다!\n");
				System.out.println(j + "번 만에 정답을 맞췄습니다");
				if (j <= 1) {
					System.out.println("perfect");
					break;
				} else if (j <= 3) {
					System.out.println("great");
					break;
				} else if (j <= 5) {
					System.out.println("good");
					break;
				} else if (j <= 10) {
					System.out.println("normal");
					break;
				}

			} else if (i != q && i > q) {
				System.out.println("\n정답이 아닙니다! down");
				System.out.println(j+"번 틀렸습니다");
				if(j >= 10) {
					System.out.println("game over");
					break;
				}
				System.out.println("기회가"+v+"번 남았습니다\n");
				continue;

			} else if(i !=q && i < q){
				System.out.println("\n정답이 아닙니다! up");
				System.out.println(j+"번 틀렸습니다");
				if(j >= 10) {
					System.out.println("game over");
					break;
				}
				System.out.println("기회가"+v+"번 남았습니다\n");
				continue;
			}
			

		}

	}

}

>이건 31사이의 랜덤한 숫자를 찾는 게임이기 때문에
>반복문과 조건문에 변수만 잘 대입하고 출력해주면 되는 문제임
>설명으로하면 너무 길어지기 때문에 위에서 부터 읽어보며 이해를 하는게 더 빠름
>변수 설정은 정답은 변수 q 사용자가 입력한 답은 변수 i에 저장했음
>몇번 틀렷는지 알기 위해 변수 j에 0을 대입함 기회는 10번로 설정 남은 기회를 알려주기 위해 변수 v에 10을 대입함
>반복문 while을 이용 특정 조건에 맞지 않으면 계속 반복하게함
>조건문 if에는 정답 , 오답up , 오답 down 을 대분류로 생각하고 만들면 편함
>이제 조건문만 잘 설정해주면 완성할 수 있음 내용은 위를 참고