JAVA/연습문제

[JAVA] 자바의 정석 연습문제 Chapter3. 연산자

prize1209 2021. 6. 9. 03:22

#3-1 다음 연산의 결과를 적으시오

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

		int x = 2;
		int y = 5;
		char c = 'A'; // 'A'의 문자코드는 65

		System.out.println(1 + x << 33); 
		System.out.println(y >= 5 || x < 0 && x > 2); //true
		System.out.println(y += 10 - x++);  
		System.out.println(x += 2); 
		System.out.println(!('A' <= c && c <= 'Z'));  //false
		System.out.println('C' - c); //2 67-65
		System.out.println('5' - '0'); //53-48(0) 
		System.out.println(c + 1); //66
		System.out.println(++c); //66 'B'
		System.out.println(c++); //66 'B'
		System.out.println(c); 
	}

}

 

1.

'1+x<<3' 는 x의 값이 2이므로 '1+2<<33'가 된다. 덧셈연산자(+)보다 쉬프트연산자(<<)가 순위가 낮으므로 '

3<<33'이다. int는 32bit이므로 33번 쉬프트하지 않고 1번만 쉬프트한다.

'3<<1'은 3에 '2의 1제곱' 인 2를 곱하는 것과 같은 결과를 얻으므로 '3*2'가 되어 결국 6이 된다. 

(왼쪽으로 2번 밀기)

 

2.

x = 2 , y= 5 라서 이 식은 'true || false && false' 이 된다. 

'and(&&)' 'or(||)' 'false && false'  가 되고 최종결과는 가 된다 'true || false' 가 되고 최종 결과는 true

 

3.

y += 10 -x++를 풀어쓰면, 'y = y+(10 - x++)'이 된다. 

x++은 후위형이기 때문에 x의 값이 증가되지 않은 상태에서 (10-x) 는 계산되고 x의 값은 1증가된다. 

그래서 (10-2)로 계산되고, x의 값은 1증가하여 3이 된다. y의 값은 5이므로 식은 'y=5+(10-2)' 가 되어 y에 13이 저장된다.

 

4.

'x+=2'는 'x=x+2'와 같다. 이전의 식에서 x의 값이 1증가하였으므로  이제 x의 값은 3이다. 3+2=5

 

5.

!('A'<=c&& c<='Z')는 문자 c가 대문자인지 확인하는 식이다. 

c가 'A'이므로 'A'<='A' && 'A' <='Z' 가 되고 양쪽 조건식이 true이므로 true && true = true다.

여기에 논리부정연산!을 수행해 true->false로 바뀐다. 

 

6. 

이항연산자는 피연산자가 int보다 작은 타입(byte, short, char)인 경우 int로 변환한 다음 연산을 한다. 

c의 값이 'A'이므로 'C'-c는 'C'-'A' 가 되고, 이것들이  int로 변환되어 '67-65' 가 되고 결과는 2

 

7.

'5'-'0'->'53'-48' 이 되어 결과는 5

 

8. 

c+1->'A'+1 . 이항연산자의 성질(int보다 작은 타입은 int로 변환후 연산)때문에

'A'는 65로 변환되어 '65+1'이 되고 66을 결과로 얻는다. 

*단지 변수 c에 저장된 값을 읽어서 수식을 계산한 것이므로 변수c의 저장된 값은 아무런 변화가 없다. 

 

9.

단항연산자인 '++'은 이항연산자와 달리 int보다 작은 타입도 형변환을 하지 않는다.

이항 연산자는 연산을 위해 피연산자 스택‘ (operand stack)’  을 사용하는데 이 과정에서 형변 환이 발생하는 것이다.

반면에 단항연산자인 증가연산자 ++은 피연산자 스택 을 사용하지 않으므로 형변환도 발생하지 않는다.

그래서  println 은 변수 c를 숫자(int) 로 출력하는 것이 아니라 문자로 출력한다. 

변수 c에 저장된 문자가 실제로 저장된 것은 'A' ( 'A' 의 문자코드인 65)이므로 문자코드의 값이 1증가되어

66('B')의 문자코드 이 변수 에 저장된다.

 

변수 c에 저장된 것은 문자코드. 즉 정수값이다. println 은 이 값을 타입에 따라 어떻게 출력할지를 결정한다.

만일 문자타입이면 저장된 값(문자코드) 에 해당하는 문자를 출력하고 숫자라면 숫자로 출력한다.

 

10.

단항연산자 이 후위형인 경우에는 println()에 의해서 변수c 가 출력된 후에 c에 저장된 값이 증가하므로 문자 'B'가 출력된 후에 변수 c의 값이 1증가해서 문자  'C' 가 저장된다.

 

11.

위 식 진행 후 마지막 c 값인 'C' 출력

 

 

 

 

 

#3-2

아래의 코드는 사과를 담는데 필요한 바구니 버켓 의 수를 구하는 코드이다. 만일 사과의 수가 123개이고 하나의 바구니에는 10개의 사과를 담을 수 있다면 13개의 바구니가 필요할 것이다 (1)에 알맞은 코드를 넣으시오

 

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

		int numOfApples = 123;
		int sizeOfBucket = 10;

		int numOfBucket = numOfApples / sizeOfBucket + ((numOfApples % sizeOfBucket) > 0 ? 1 : 0);
		System.out.println("필요한 바구니 수:" + numOfBucket);
	}

}

int/int 형은 123/10=12.3이 아닌 정수값만 남기고 버림을 해서 12가 된다. 여기에 소수점이 있다면 바구니가 하나 더 필요하단 뜻이기에, 사과 개수 나누기 바구니크기의 나머지가 0보다 크면 1을 반환해 +해준다.

 

->((numOfApples % sizeOfBucket) > 0 ? 1 : 0);

 

 

 

#3-3

 

아래는 변수 num의 값에 따라 ‘양수 ’, ‘음수 ’, ‘0’ 을 출력하는 코드이다.

삼항 연산자를 이용해서 (1) 에 알맞은 코드를 넣으시오 .

 

public class Exercise3 {
	public static void main(String[] args) {
		int num =10;
		System.out.println(num >0 ? "양수" : (num <0 ? "음수": "0"));
	}
}

삼항연산자를 사용하면 2가지 경우의 수를 처리할 수 있다.

삼항연산자에 삼항연산자를 포함시키면 3가지 경우의 수를 처리할 수 있다.

num의 값이 0보다 크면 양수 를 출력하고 끝나지만 num의 값이 0보다 작거나 같으면 괄호안의 삼항연산자가 수행된다 여기서 num의 값이 0보다 작으면 음수 가 출력되고 그렇지 않으면 (num의 값이 이면) '0' 이 출력된다. 

 

#3-4

아래는 변수 num의 값 중에서 백의 자리 이하를 버리는 코드이다. 만일 변수 num의 값이 ‘456’ 이면 ‘400’ ,

‘111’ 이면 ‘100’ 된다. (1)에 알맞은 코드를 넣으시오.

답: num/100*100

 

#3-5

변수 num의 값 중에서 일의 자리를 1로 바꾸는 코드이다. 만일 변수 num의 값이 333이라면 331이 되고, 777이라면 771이 된다. (1)에 코드를 넣으시오.

 

num/10*10+1

 

#3-6

아래는 변수 num의 값보다 크면서도 가장 가까운 10의 배수에서 변수 num의 값을 뺀 나머지를 구하는 코드이다.

예를 들어, 24의 크면서도 가장 가까운 10의 배수는 30이다.  19의 경우 20이고, 81의 경우 90이 된다. 30에서 24를 뺀 나머지는 6이기 때문에 변수 num의 값이 24라면 6을 결과로 얻어야 한다. (1)에 알맞은 코드를 넣으시오.

 

답 (num+10)/10*10%num

 

#3-7

아래는 화씨(Fahrenheit) 를 섭씨(Celcius) 로 변환하는 코드이다.

변환공식이 'C' = 5/9 ×(F - 32)' 라고 할 때 에 알맞은 코드를 넣으시오.

단 변환 결과값은 소수점 셋째자리에서 반올림해야한다 .(Math.round() 를 사용하지 않고 처리할 것 )

public class Excercise7 {
	public static void main(String[] args) {
		int fahrenheit = 100;
		float celcius = celcius=(int)(((5/9f*(fahrenheit-32))*100)+0.5)/100f;
		
	System.out.println("Fahrenheit:"+fahrenheit);	
	System.out.println("Celcius:"+celcius);	
	}
	
}

1. 값에 100을 곱한다

37.77778 *100

2. 1의 결과에 0.5를 더한다.

3777.778+0.5 -> 3778.278

3. 2의 결과를 int타입으로 반환

(int)3778.278 ->3778

4. 3의 결과를 100f로 나눈다(100으로 나누면 소수점 아래의 값을 잃는다)

3778/100f ->37.78

 

#3-8

아래 코드의 문제점을 수정해서 실행결과와 같은 결과를 얻도록 하시오.

public class Exercise8 {
	public static void main(String[] args) {
		byte a = 10;
		byte b = 20;
		byte c = (byte) (a + b);
		// int 보다 작은 타입은 int로 계산되기에 byte로 형변환해준다.
		char ch = 'A';
		ch = (char) (ch + 2);
		// int로 계산되어서 char로 형변환

		float f = 3 / 2f; // float로 형변환
		long l = 3000 * 3000 * 3000L; // long타입으로 형변환

		float f2 = 0.1f;
		double d = 0.1;

		boolean result = (float) d == f2;
		// f2->double은 오차가 있어서 d를 float으로 형변환
		// double 값을 유효 자리수가 적은 float으로 형변환
		System.out.println("c=" + c);
		System.out.println("ch=" + ch);
		System.out.println("f=" + f);
		System.out.println("l=" + l);
		System.out.println("result=" + result);

	}
}

 

#3-9

다음은 문자형 변수 ch가 영문자(대문자 또는 소문자)이거나 숫자일 때만 변수 b 의 값이 true가 되도록 하는 코드이다. (1) 에 알맞은 코드를 넣으시오.

 

public class Exercise9 {
	public static void main(String[] args) {
		char ch = 'z';
		boolean b = (('A' <= ch && ch <= 'Z') || ('a' <= ch && ch <= 'z') || ('0' <= ch && ch <= '9'));

		System.out.println(b);
	}
}

 

#3-10

다음은 대문자를 소문자로 변경하는 코드인데,  문자  ch에 저장된 문자가 대문자인 경우에만 소문자로 변경한다.

문자코드는 소문자가 대문자보다 32만큼 더 크다. 예를 들어 'A'의 코드는 65이고 'a'의 코드는 97이다.

(1)~(2) 에 알맞은 코드를 넣으시오.

public class Exercise10 {
	public static void main(String[] args) {
		char ch = 'A';

		char lowerCase = ('A' <= ch && ch <= 'Z') ? (char) (ch + 32) : ch;
		// ch에 32 더한후 이 결과가 int이므로 형변환해준다.
		System.out.println("ch:" + ch);
		System.out.println("ch to lowerCase:" + lowerCase);
	}
}

'JAVA > 연습문제' 카테고리의 다른 글

[JAVA] 명품 자바 Open challenge 2  (0) 2021.06.11
[JAVA] Java의 정석 chapter 2 변수  (0) 2021.06.06