[Java] 명품 자바 Programming 제2장 110p 연습문제 - 실습문제 풀이

hyeonseong_lim·2023년 8월 22일

JAVA

목록 보기
4/5
post-thumbnail

1.

Scanner 클래스를 이용하여 원화를 입력받아 달러로 바꾸어 다음 예시와 같이 출력하는 프로그램을 작성하라. (환율은 현시세를 적용하여 $1=1341.17원으로 계산. 2023/08/21 기준)

package ch02.ex01;

import java.util.Scanner;

public class Exam_110_01 {
	// 상수 DOLLAR = 1341.17
	public static final double DOLLAR = 1341.17;

	public static void main(String[] args) {
		// 1. 변수선언(원화, 환율값)
		// 2. 변수초기값설정
		Scanner scan = new Scanner(System.in);
		int won = 0;
		double resultValue = 0.0;

		// 3. 입력(원화입력)
		System.out.print("원화를 입력하세요(단위 원)>>>");
		won = scan.nextInt();

		// 3. 연산, 처리 (원화)/(1달러) = 환율이적용된 값
		resultValue = (double) won / DOLLAR;

		// 4. 출력
		System.out.printf("%d원은 $%.1f입니다.\n", won, resultValue);
		// 5. 종료
		scan.close();
		System.out.println("종료");

	}
}

2.

Scanner 클래스를 이용하여 2자리의 정수(10~99사이)를 입력받고, 십의 자리와 1의 자리가 같은지 판별하여 출력하는 프로그램을 작성하라.

package ch02.ex01;

import java.util.Scanner;

public class Exam_110_02 {

	public static void main(String[] args) {
		Scanner scan = new Scanner(System.in);
		int number = 0, tenDigit = 0, oneDigit = 0;
		String resultValue = null;

		// 1.변수선언, 초기값(번호, 10의자리, 1의자리, 결과내용)

		System.out.print("2자리 숫자를 입력(10~99)>> ");
		number = scan.nextInt();

		// 2.정수입력 (2자리만 입력받는다)

		// 3. 연산 10의자리 정수/10, 1의자리 정수 % 10, 자릿수비교
		tenDigit = number / 10;
		oneDigit = number % 10;

		if (tenDigit == oneDigit) {
			resultValue = "YES! 10의자리와 1의자리가 같습니다.";
		} else {
			resultValue = "NO! 10의자리와 1의자리가 일치하지 않습니다";
		}

		// 4. 출력
		System.out.printf("10의자리는 %d입니다 1의자리는 %d입니다 \n", tenDigit, oneDigit);
		System.out.printf("%s\n", resultValue);

		// 5.종료
		scan.close();
		System.out.println("the end");

	}

}

3.

Scanner 클래스를 이용하여 정수로 된 돈의 액수를 입력받아 오만 원권, 만 원권, 천 원권, 500원짜리 동전, 100원짜리 동전, 50원 짜리 동전, 10원짜리 동전, 1원짜리 동전 각 몇 개로 변환되는지 출력하라.

package ch02.exam;

import java.util.Scanner;

public class Ex_110_3_1 {
	public final static int 오만원 = 50_000;
	public final static int 만원 = 10_000;
	public final static int 천원 = 1000;
	public final static int 오백원 = 500;
	public final static int 백원 = 100;
	public final static int 십원 = 10;
	public final static int 일원 = 1;

	public static void main(String[] args) {
		//1. 변수선언, 초기값 (돈, 몫)
		int res = 0, money = 0;
		
		//2. 입력(돈입력)
		Scanner scan = new Scanner(System.in);
		System.out.println("input money>>>");
		money = scan.nextInt();
		
		//3. 연산
		res = money / 오만원;
		money = money - (오만원 * res);
		System.out.printf("%d권 %d매 \n",오만원,res); // 오만원권 매수 표시
		
		res = money / 만원;
		money = money - (만원 * res);
		System.out.printf("%d권 %d매 \n",만원,res); // 만원권 매수 표시
		
		res = money / 천원;
		money = money - (천원 * res);
		System.out.printf("%d권 %d매 \n",천원,res); // 천원권 매수 표시
		
		res = money / 오백원;
		money = money - (오백원 * res);
		System.out.printf("%d권 %d매 \n",오백원,res); // 오백원권 매수 표시
		
		res = money / 백원;
		money = money - (백원 * res);
		System.out.printf("%d권 %d매 \n",백원,res); // 백원권 매수 표시
		
		res = money / 십원;
		money = money - (십원 * res);
		System.out.printf("%d권 %d매 \n",십원,res); // 십원권 매수 표시
		
		res = money / 일원;
		money = money - (일원 * res);
		System.out.printf("%d권 %d매 \n",일원,res); // 일원권 매수 표시
		
		scan.close();
		System.out.println("The end");
	}

}

4.

Scanner 클래스로 정수 3개를 입력받고 3개의 숫자 중 중간 크기의 수를 출력하라.
평균값을 구하는 것이 아님에 주의하라.

package ch02.exam;

import java.util.Scanner;

public class Ex_110_04 {
	public static void main(String[] args) {

		// 1.변수선언, 초기값설정 (3개수, 중간값)
		int num1 = 0, num2 = 0, num3 = 0, median = 0;

		// 2.입력
		Scanner scan = new Scanner(System.in);

		System.out.print("정수 3개 입력>>>");
		num1 = scan.nextInt();
		num2 = scan.nextInt();
		num3 = scan.nextInt();

		// 3. 연산

		if ((num2 <= num1 && num1 <= num3) || (num3 <= num1 && num1 <= num2)) {
			median = num1;
		} else if ((num1 <= num2 && num2 <= num3) || (num3 <= num2 && num2 <= num1)) {
			median = num2;
		} else {
			median = num3;
		}
		//4. 출력
		System.out.printf("%d %d %d 중간 값은: %d\n",num1, num2, num3, median);
		
		//5. 종료
		scan.close();
		System.out.println("The end");

	}
}

5.

Scanner를 이용하여 삼각형의 변의 길이를 나타내는 정수를 3개 입력받고 이 3개의 수로 삼각형을 만들 수 있는지 판별하라. 삼각형이 되려면 두 변의 합이 다른 한 변의 합보다 커야 한다.

//문제: 삼각형이 되는 조건 프로그램
package ch02.exam;

import java.util.Scanner;

public class Ex_110_05 {

	public static void main(String[] args) {
		// 1.변수선언, 초기값설정 (3개수, 중간값)
		int num1 = 0, num2 = 0, num3 = 0;
		boolean isTriangle = false;

		// 2.입력
		Scanner scan = new Scanner(System.in);

		System.out.print("정수 3개 입력>>>");
		num1 = scan.nextInt();
		num2 = scan.nextInt();
		num3 = scan.nextInt();

		// 3. 연산 (2변을 합쳐서 한변보다 적은 것이 하나라도 있으면 안된다!)
		if (((num1 + num2) < num3) || ((num1 + num3) < num2) || ((num2 + num3) < num1)) {
			isTriangle = false;
		} else {

			isTriangle = true;
		}
		// 4. 출력
		System.out.printf("%d %d %d 삼각형이 %s\n", num1, num2, num3, (isTriangle) ? ("된다") : ("안된다"));

		// 5. 종료
		scan.close();
		System.out.println("The end");

	}

}

6.

369게임을 간단히 작성해보자. 1~99까지의 정수를 입력받고 정수에 3, 6, 9 중 하나가 있는 경우는 "박수짝"을 출력하고 두 개 있는 경우는 "박수짝짝"을 출력하는 프로그램을 작성하라. 예를 들면, 키보드로 입력된 수가 13인 경우 "박수짝"을, 36인 경우 "박수짝짝"을 출력하면 된다.

//문제6 : 369 박수, 박수짝, 박수짝짝 
package ch02.exam;
import java.util.Scanner;

public class Ex_110_06 {
	public static void main(String[] args) {
		// 1.변수선언, 초기값설정 (정수입력)
		int number = 0, tensDigit = 0, onesDigit = 0, count = 0;
		Scanner scan = new Scanner(System.in);

		// 2.입력
		System.out.print("정수입력(1~99)>>>");
		number = scan.nextInt();

		// 3. 연산 
		if (1 <= number && number <= 99) {
			onesDigit = number % 10; // 1의자리
			tensDigit = number / 10; // 10의자리
			if (onesDigit != 0 && onesDigit % 3 == 0) {
				count++;// >>> count = count + 1; 같은의미

			}
			if (tensDigit != 0 && tensDigit % 3 == 0) {
				count++;
			}

			if (count == 0) {
				System.out.printf("박수\n");
			} else {
				System.out.printf("박수 %s\n", (count == 1) ? ("짝") : ("짝짝"));
			}

			// 4. 출력
		} else {
			System.out.println("숫자범위를 벗어났습니다.");
		}

		// 5. 종료
		scan.close();
		System.out.println("The end");

	}

}

7.

2차원 평면에서 직사각형은 왼쪽 상단 모서리와 오른쪽 하단 모서리의 두 점으로 표현한다. (100, 100)과 (200, 200)의 두 점으로 이루어진 사각형이 있을 때, Scanner 를 이용하여 정수 x와 y의 값을 입력받고 점 (x, y)가 이 직사각형 안에 있는지를 판별하는 프로그램을 작성하라.

// (x,y)가 (100,100) (200,200) 사이에 존재하는가 조사하는 프로그램
package ch02.exam;

import java.util.Scanner;

public class Ex_110_07 {

	public static void main(String[] args) {
		// 1. 변수 선언 입력받을 x,y좌표 사각형안에 있는지 확인 checkBox
		int x = 0, y = 0;
		String checkBox = null;

		// 2. 입력 및 연산처리
		Scanner scan = new Scanner(System.in);
		System.out.printf("점 x,y의 좌표를 입력하시오");
		x = scan.nextInt();
		y = scan.nextInt();

		// 3. 연산처리
		if ((100 <= x && x <= 200) && (100 <= y && y <= 200)) {
			checkBox = "사각형 안에 있습니다";
		}
		else {
			checkBox = "사각형 안에 없습니다";
		}
		// 4. 출력
		System.out.printf("(%d,%d)는 %s\n", x, y, checkBox);

		// 5. 종료
		scan.close();
		System.out.println("종료");
	}

}

8.

2차원 평면에서 직사각형은 문제 7번처럼 두 점으로 표현된다. 키보드로부터 직사각형을 구성하는 두 점(x1, y1), (x2, y2)를 입력받아 (100, 100), (200, 200) 의 두 점으로 이루어진 직사각형과 충돌하는지 판별하는 프로그램을 작성하라.

//입력된 두점이 사각형 안에 있으면 충돌판명한다. 또한 한점도 있어도 충돌로 판정한다.
// 두점 모두가 사각형 안에 없으면 충돌이 아니라고 판정한다.
package ch02.exam;

import java.util.Scanner;

public class Ex_110_8_1 {//다음은 점 (x,y)가 (rectx1, recty1), (rectx2, recty2)의 사각형 안에 있으면 true를 리턴하는 메소드이다. 이 메소드를 활용하라.
	public static boolean inRect(int x, int y, int rectx1, int recty1, int rectx2, int recty2) {
		if ((rectx1 <= x && x <= rectx2) && (recty1 <= y && y <= recty2)) {
			return true;
		}else {
			return false;
		}
	}
	// 클래스상수
	public static final int RECTX1 = 100, RECTX2 = 200, RECTY1 = 100, RECTY2 = 200;

	public static void main(String[] args) {
		// 1. 변수선언(x1, y1)(x2,y2)
		// 2.변수초기값 설정
		int x1 = 0, y1 = 0, x2 = 0, y2 = 0;
		boolean result1 = false;
		boolean result2 = false;

		// 2. 입력
		Scanner scan = new Scanner(System.in);
		System.out.print("x1 y1 x2 y2 >>");
		x1 = scan.nextInt();
		y1 = scan.nextInt();
		x2 = scan.nextInt();
		y2 = scan.nextInt();

		// 3.연산, 처리
		//4. 출력
		result1 = inRect(x1, y1, RECTX1, RECTY1, RECTX2, RECTY2);
		result2 = inRect(x2, y2, RECTX1, RECTY1, RECTX2, RECTY2);

		if (result1 || result2) {
			System.out.println("충돌발생\n");
		} else {
			System.out.println("충돌발생안함\n");
		}
		// 5. 종료
		scan.close();
		System.out.println("종료");

	}

}

9.

원의 중심을 나타내는 한 점과 반지름을 실수 값으로 입력받아라. 그리고 실수 값으로 다른 점 (x, y)를 입력받아 이 점이 원의 내부에 있는지 판별하여 출력하라.
힌트) 중심에서 점 (x,y) 사이의 거리가 반지름보다 작거나 같으면 원의 내부에 있다. 변수 x에 대한 제곱근의 값은 Math.sqrt(x)를 이용하면 된다.

package ch02.exam;

import java.util.Scanner;

public class Ex_110_09 {
	public static void main(String[] args) {
		// 1.변수선언및 초기값(한점좌표, 반지름, 다른한점, 두점사이거리)
		int x1 = 0, y1 = 0, x2 = 0, y2 = 0; 
		double distance = 0.0, radius = 0.0;

		// 2.입력
		Scanner scan = new Scanner(System.in);
		System.out.printf("원의 중심과 반지름 입력:");
		x1 = scan.nextInt();
		y1 = scan.nextInt();
		radius = scan.nextDouble();
		
		System.out.printf("다른 점 입력:");
		x2 = scan.nextInt();
		y2 = scan.nextInt();

		// 3.연산 두점사이거리
		distance = Math.sqrt(Math.pow(x2 - x1, 2) + Math.pow(y2 - y1, 2));
		
		if (distance <= radius) {
			System.out.printf("점(%d,%d)는 %s\n", x2, y2, "원안에 있다");
		} else {
			System.out.printf("점(%d,%d)는 %s\n", x2, y2, "원안에 없다");
		}

		// 5.종료
		scan.close();
		System.out.println("The end");
	}
}

10.

원의 정보를 받기 위해 키보드로부터 원의 중심을 나타내는 한 점과 반지름을 입력받는다. 두 개의 원을 입력받고 두 원이 서로 겹치는지 판단하여 출력하라.

package ch02.exam;

import java.util.Scanner;

public class Ex_110_10 {

	public static void main(String[] args) {

		// 1.변수선언및 초기값(한점좌표, 반지름, 다른한점, 두점사이거리)
		int x1 = 0, y1 = 0, radius1 = 0, x2 = 0, y2 = 0, radius2 = 0;
		double distance = 0.0;

		// 2.입력
		Scanner scan = new Scanner(System.in);
		System.out.printf("원의 1번 중심과 반지름 입력:");
		x1 = scan.nextInt();
		y1 = scan.nextInt();
		radius1 = scan.nextInt();

		System.out.printf("원의 2번 중심과 반지름 입력:");
		x2 = scan.nextInt();
		y2 = scan.nextInt();
		radius2 = scan.nextInt();

		// 3.연산(두원의 중심점으로 거리구하기)
		distance = Math.sqrt(Math.pow((x2 - x1), 2) + Math.pow((y2 - y1), 2));
		if (distance <= (radius1 + radius2)) {
			System.out.printf("%s\n", "두원은 겹친다");
		} else {
			System.out.printf("%s\n", "두원은 겹치지 않는다");
		}

		// 5.종료
		scan.close();
		System.out.println("The end");

	}

}

11.

숫자를 입력받아 3~5는 "봄", 6~8은 "여름", 9~11은 "가을", 12,1,2의 경우 "겨울"을, 그 외 숫자를 입력한 경우 "잘못입력"을 출력하는 프로그램을 작성하라.(if-else문/switch문)

package ch02.exam;

import java.util.Scanner;

public class Ex_110_11 {

	//클래스상수 =  정적멤버상수 = 글로벌 상수
	public static final String SPRING = "봄", SUMMER = "여름", FALL = "가을", WINTER = "겨울";
	public static void main(String[] args) {
		//1 변수선언 , 초기값(달)
		int month = 0;
		
		//2 입력
		Scanner scan = new Scanner(System.in);
		System.out.print("달을 입력하세요(1~12)>>>");
		month = scan.nextInt();
		
		//3 연산 3~5 봄,  ... 출력
		switch(month) {
		case 3: case 4: case 5:
			System.out.printf("3~5월은 %s %n",SPRING );
			break;
		case 6: case 7: case 8:
			System.out.printf("6~8월은 %s %n",SUMMER );
			break;
		case 9: case 10: case 11:
			System.out.printf("9~11월은 %s %n",FALL );
			break;
		case 12: case 1: case 2:
			System.out.printf("12~2월은 %s %n",WINTER );
			break;
		default:
			System.out.printf("%d월은 %s %n",month, "잘못입력");
			break;
		}
		
		// 5.종료
				scan.close();
				System.out.println("The end");
	}

}

12.

사칙 연산을 입력받아 계산하는 프로그램을 작성하고자 한다. 연산자는 +, =, *, /의 네 가지로 하고 피연산자는 모두 실수로 한다. 피연산자와 연산자는 실행 사례와 같이 빈 칸으로 분리하여 입력한다. 0으로 나누기 시 "0으로 나눌 수 없습니다."를 출력하고 종료한다.(연산 식을 구분할 때 if-else 문을/switch 문을 이용하여 프로그램을 작성하라.)

힌트)연산자는 scanner.next()를 이용하여 문자열로 입력받으면 된다. 문자열 s가 "+"와 같은지 검사하려면 if(s.equals("+"))를 이용하며, true이면 s와 "+"가 같다.

package ch02.exam;

import java.util.Scanner;

public class Ex_110_12 {
	public static void main(String[] args) {
		// 1. 변수선언(사칙연산구조,수1,연산자,수2, 계산결과값)
		// 2. 변수초기값설정
		double num1 = 0.0, num2 = 0.0, result = 0.0;
		String operator = null;

		// 3. 입력 수1, 연산자 ,수2
		Scanner scan = new Scanner(System.in);
		System.out.print("연산>>");
		num1 = scan.nextDouble();
		operator = scan.next();
		num2 = scan.nextDouble();

		// 4. 연산, 처리 .equals는 문자열끼리 비교함! ==을 써버리면 안됨.객체참조변수에는 값이 있는게 아니라 주소가 있다. 주소끼리는
		// 비교할 수 없다. 객체끼리 비교할 때는 equals를 쓴다.operator가 객체참조변수, ("+")는 문자열 리터럴 상수
		switch (operator) {
		case "+":
			result = num1 + num2;
			break;
		case "-":
			result = num1 - num2;
			break;
		case "*":
			result = num1 * num2;
			break;
		case "/":
			if (num2 == 0.0) {
				System.out.printf("0으로 나눌 수 없습니다.\n");
				scan.close();
				System.out.println("The end");
				return;
			}
			result = num1 / num2;
			break;
		default:
			System.out.printf("없는 산술연산자입니다.\n");
			scan.close();
			System.out.println("The end");
			return;
		}
//		if (operator.equals("+")) {
//			result = num1 + num2;
//		}else if (operator.equals("-")) {
//			result = num1 - num2;
//		}else if (operator.equals("*")) {
//			result = num1 * num2;
//		}else if (operator.equals("/")) {
//			if(num2 == 0.0) {
//				System.out.printf("0으로 나눌 수 없습니다.\n");
//				scan.close();
//				System.out.println("The end"); 
//				return;
//			}
//			result = num1 / num2;
//		}else {
//			System.out.printf("없는 산술연산자입니다.");
//			scan.close();
//			System.out.println("The end"); 
//			return;//프로그램 끝내는 것이 리턴
//		}

		// 5. 출력
		System.out.printf("%.2f %s %.2f = %.2f \n", num1, operator, num2, result);

		// 6. 종료
		scan.close();
		System.out.println("The end");
	}
}

profile
Backend developer

0개의 댓글