연산자 연습문제
▶문제 1
다음 연산의 결과를 적으시오.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
|
package day03;
public class main01 {
public static void main(String[] args) {
int x = 2;
int y = 5;
char c = 'A';//'A'의 문자코드는 65
//***************문제 1***********************
System.out.println(y >= 5 || x < 0 && x > 2);
//A || (B && C)
//True || (False && False)
//답: True
//***************문제 2***********************
System.out.println(y += 10 - x++);
//y += 10 - x++
//y += 10 - 2
//y = 5 + 8
//답: 13
////***************문제 3***********************
System.out.println(x += 2);
//이전 식에서 x는 1이 증가하여 3
//x = x + 2
//답: 5
////***************문제 4***********************
System.out.println( !('A' <= c && c <='Z') );
//(!(True && Flase))
//(!(Flase))
//답: True
////***************문제 5***********************
System.out.println('C'-c);
//67-65 = 2
//답: 2
////***************문제 6***********************
System.out.println('5'-'0');
//53 - 48 = 5
//답: 5
////***************문제 7***********************
System.out.println(c+1);
//65 + 1
//답: 66
////***************문제 8***********************
System.out.println(++c);
//65 + 1
//답: 66
//C는 65에서 +1 된 66값으로 저장됨
//답: B
////***************문제 9**********************
System.out.println(c++);
//답: A
////***************문제 10**********************
System.out.println(1 + x << 33);
//답: 6
}
}
|
cs |
[풀이]
-. 문제2
해당 식은 y의 값을 찾는 것이다. y += 10 - X++ 란 뜻으로 y = 10 - x 로 계산해야한다. 이 때 X는 ++, 후위증감으로 식이 실행된 다음 +1이 됨으로 해당 식에서는 X는 2로 들어가고 10 - 2는 8, 거기에 +=이 있음으로 y 원래 y의 값 5에 8을 더해서 최종값은 13이 된다.
-.문제3
컴파일러는 위에서 밑으로 내려온다. 위의 식에서 후위 증감으로 식이 모두 실행된 후에 x가 1이 증가하여 x는 3이 되었음으로 x = 3 + 2, 최종 결과값은 5가 나온다.
-.문제5
피 연산자가 int보다 작은 타입(byte, short, char)인 경우 int로 변환한 다음에 연산을 수행한다. c의 값이 'A'라는 문자값으로 'C'-c는 ‘C'-'A'가 되고 'C'와 'A'는 int로 암묵적 형변환되어 아스틱코드로 '67 - 65'가 되고 최종결과는 2가 된다.
-. 문제6
문제 5와 같은 이유로 53 - 48 = 5의 값이 출력됨
여기서 기본적으로 4가지 아스키 코드를 외우고있으면 활용하실때 편하다
Enter = 13, 숫자 0 = 48, 대문자 A = 65 , 소문자 a = 97
이 4가지는 꼭 알고있기
-.문제7
c+1은 C가 'A'니까 'A'+1이된다. 이항연산자의 성질(int보다 작은 타입은 int로 변환 후 연산)으로 'A'는 65, 결과값은 66이 나온다.
-.문제8
단항연산자인'++'은 이항연산자와 달리 int보다 작은 타입도 형변환을 하지 않는다.(이항연산자는 연산을 위해 ‘피연산자 스택(operand stack)’을 사용하는데 이 과정에서 형변환이 발생하는 것이다. 반면에 단항연산자인 증가연산자'++'은 ‘피연산자 스택’을 사용하지 않으므로 형변환도 발생하지 않는다.) 그래서 println은 변수 c를 숫자(int)로 출력하는 것이 아니라 문자로 출력한다. (println은 이 값을 타입에 따라 어떻게 출력할지를 결정한다. 만일 문자타입이면 저장된 값(문자코드)에 해당하는 문자를 출력하고 숫자라면 숫자로 출력한다.) 변수 c에 저장된 문자가 'A'(문제7에서 'A'의 문자코드 값이 1증가되어 66('B'의 문자코드)으로 변경되었다). 그러므로 결과는 66
-. 문제9
단항연산자'++'이 후위형인 경우에는 변수가 출력된 후에 저장된 값이 증가하므로 문자 'B'(문제8에서 B로 증가)가 출력된 후에 변수 c의 값이 1증가해서 문자 'C'가 저장된다.
▶문제2
아래의 코드는 사과를 담는데 필요한 바구니(버켓)의 수를 구하는 코드이다.
13개의 바구니가 필요할 것이다.
알맞은 코드를 넣으시오.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
public class main01 {
public static void main(String[] args) {
int numOfApples = 123; // 사과의 개수
int sizeOfBucket = 10; // 바구니의 크기(바구니에 담을 수 있는 사과의 개수)
int numOfBucket = 0, numOfBucket2=0, numOfBucket3=0, numOfBucket4 = 0;
//입력하세요
System.out.println("필요한 바구니의 수 :"+numOfBucket);
}
}
|
cs |
[답]
//예시1
numOfBucket3 = numOfApples % sizeOfBucket==0? numOfApples/sizeOfBucket : numOfApples/sizeOfBucket +1;
[풀이]
사과의 갯수에 바구니 수를 나누면 몇개의 바구니가 필요한지 알 수 있다. 단, 나누면 나머지가 떨어지는 것이 문제임. 그럼 나누기를 하고 몫이 딱 떨어지면 그대로 출력하고, 아니면 나머지를 위한 바구니 1개를 더 추가하면 된다. %를 이용하여 나머지연산자가 있는지 확인을 하고(/사용하면 오류) O면 A/X면 B를 출력하라는 것으로 삼항연산자로 간단하게 출력 한다.
▶문제3
아래는 변수 num의 값에 따라 ‘양수’, ‘음수’, ‘0’을 출력하는 코드이다.
삼항 연산자를 이용해서 (1)에 알맞은 코드를 넣으시오.
[Hint] 삼항 연산자를 두 번 사용하라.
1
2
3
4
5
6
7
8
|
public class main01 {
public static void main(String[] args) {
int num = -76;
System.out.println(---입력---);
}
}
|
cs |
[풀이]
▶문제4
아래는 변수 num의 값 중에서 백의 자리 이하를 버리는 코드이다.
만일 변수 num의 값이 ‘456’이라면 ‘400’이 되고, ‘111’이라면 ‘100’이 된다.
몫을 버리는 / 성질을 이용
▶문제5
아래는 변수 num의 값 중에서 일의 자리를 1로 바꾸는 코드이다.
만일 변수 num의값이 333이라면 331이 되고, 777이라면 771이 된다.
(1)에 알맞은 코드를 넣으시오.
1
2
3
4
5
6
|
public class main01 { public static void main(String[] args) {
int num = 333;
System.out.println (---입력---);
)
|
cs |
[답]
System.out.println (((num/10) * 10) + 1) ;
[풀이]
문제에서 이슈가 발생하는 곳은 마지막자리이다. 그럼 마지막자리만 분리할 방법이 있는지 생각하기. 마지막 자리 분리를 위해 10을 나누고 101을 더해야하니 *10을 하고 1을 더하기
▶문제6
아래는 변수 num의 값보다 크면서도 가장 가까운 10의 배수에서 변수 num의 값을 뺀 나머지를 구하는 코드이다.
예를 들어, 24의 크면서도 가장 가까운 10의 배수는 30이다. 19의 경우 20이고, 81의 경우 90이 된다.30에서 24를 뺀 나머지는 6이기 때문에 변수 num의 값이 24라면 6을 결과로 얻어야 한다.
[Hint] 나머지 연산자를 사용하라.
1
2
3
4
5
6
7
8
9
10
|
public static void main(String[] args) {
int num = 24;
System.out.println (---입력---);
}
|
cs |
[풀이]
-. 예시1
System.out.println((num/10+1)*10 - num);
해당 변수와 가장 가까운 10의자리에 초점을 두어 해결
해당변수의 10의자리를 먼저 구하고 +1을 하여 간단하게 해결
-. 예시2
System.out.println(10-num%10);
가장 가까운 정수에서 해당 변수를 뺄 때를 초점을 두어 해결
변수가 45이든 29이든 가장 가까운 정수에서 -를 하면 일의 자리수끼리 계산되어진다. %를 통해 1의자리를 구하고 그 나머지를 10에서 차감하는 방법으로 간단한 해결
▶문제7
아래는 화씨(Fahrenheit)를 섭씨(Celcius)로 변환하는 코드이다.
변환공식이 'C =5/9 ×(F - 32)'라고 할 때, (1)에 알맞은 코드를 넣으시오.
단, 변환 결과값은 소수점 셋째자리에서 반올림해야한다.
(Math.round()를 사용하지 않고 처리할 것)
1
2
3
4
5
6
7
8
9
|
class Exercise3_7 {
public static void main(String[] args) {
int fahrenheit = 100;
float celcius = ( /* (1) */ );
System.out.println("Fahrenheit:"+fahrenheit);
System.out.println("Celcius:"+celcius);
}
}
|
cs |
[정답]
float celcius = (int)((5/9f * (fahrenheit - 32)) * 100 + 0.5) / 100f;
[풀이]
1. C =5/9 ×(F - 32) 일 때, 5/9는 0임으로 정확한 값을 얻고싶다면 5/9f를 사용하여 실수로 계산해야한다.
2. Math.round()를 사용하지 않고 소수점 셋째자리에서 반올림을 하려면 다음과 같은 과정을 거쳐야 한다.
- 값에 100을 곱한다.
- 0.5를 더한다.
- int타입으로 변환한다.
- 100f로 나눈다.(100으로 나누면 소수점 아래의 값을 잃음)
▶문제8
아래 코드의 문제점을 수정해서 실행결과와 같은 결과를 얻도록 하시오.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
class Exercise3_8 {
public static void main(String[] args) {
byte a = 10;
byte b = 20;
byte c = a + b;
char ch = 'A';
ch = ch + 2;
float f = 3 / 2;
long l = 3000 * 3000 * 3000;
float f2 = 0.1f;
double d = 0.1;
boolean result = d == f2;
1)System.out.println("c=" + c);
2)System.out.println("ch=" + ch);
3)System.out.println("f=" + f);
4)System.out.println("l=" + l);
5)System.out.println("result=" + result);
}
}
|
cs |
[풀이]
이항연산은 두 피연산자의 타입을 일치시킨 후 연산을 수행한다.
그리고 int 보다 작은 타입(boolean, byte, char 및 short 타입)은 계산 전 int로 자동변환됨으로 피연산자 앞에 꼭 강제형변환 해주어야한다.
-. 문제1
변수 a와 b는 모두 byte타입으로 이항연산인 덧셈 연산을 하기 전에 int타입으로 자동 형변환된다. int와 int의 덧셈이니 연산결과는 int이다. int타입의 값(4byte)를 byte타입의 변수(1byte)에 담아야함으로 형변환을 해주어야한다.
byte c = a + b; -> byte c = (byte)(a+b);
-문제2
char 역시 int보다 작은 타입으로 강제형변환을 시켜주어야하며 char(A)에 +2를 하여 문자인 C를 출력한다
*문자출력: char ch = 'A';
ch = (char)(ch+2); //C출력
*숫자출력: int i = 'A';
i = i + 2; //67출력
=>출력하고싶은 결과값(문자,정수등)을 생각하고 변수 초기화 때 필요에 맞는 키워드 설정
-.문제3
int와 int의 연산결과는 int이기 때문에 3/2의 결과는 1이 된다. 연산결과를 실수로 얻고 싶으면, 적어도 두 피연산자 중 한 쪽이 실수타입(float와 double중의 하나)이어야 한다.
float f = 3/2f;
-.문제4
int*int*int의 결과는 int이므로 int타입의 최대값인 약 2*10의 9제곱을 넘는 결과는 오버플로우가 발생하여 예상한 것과는 다른 값을 얻는다. 그래서 피연산자 중 적어도 한 값은 long타입이어야 최종결과를 long타입의 값으로 얻기 때문에 long타입의 접미사 'L'을 붙여서 long타입의 리터럴로 만들어줘야 한다.
long l = 3000l * 3000 * 3000;
-.문제5
비교연산자도 이항연산자이므로 연산 시에 두 피연산자의 타입을 맞추기 위해 형변환이 발생한다. 그래서 double과 float의 연산은 double과 double의 연산으로 자동형변환 되는데, 실수는 정수와 달리 근사값으로 표현을 하기 때문에 float를 double로 형변환 했을 때 오차가 발생할 수 있다. 그래서 float값을 double로 형변환 하기 보다는 double값을 유효자리수가 적은 float로 형변환해서 비교하는 것이 정확한 결과를 얻는다.
boolean result = (float)d == f2;
▶문제9
다음은 문자형 변수 ch가 영문자(대문자 또는 소문자)이거나
숫자일 때만 변수 b의 값이 true가 되도록 하는 코드이다.
알맞은 코드를 넣으시오.
1
2
3
4
5
6
7
8
9
|
class Exercise3_9 {
public static void main(String[] args) {
char ch = 'z';
boolean b = (---입력---);
System.out.println(b);
}
}
|
cs |
[풀이]
-.예제1
boolean b = ch >= 0? true : false;
ch가 영문자이거나 숫자일경우, 아스키코드를 통해서 true값이 나온다. 실수일 경우에만 false로 나오게하라는 의미인데 음수일 경우 실수가 출력됨
-.예제2
( 'A' <= ch && ch <= 'Z' ) || ( 'a' <= ch && ch <= 'z' ) || ('0' <= ch && ch <= '9');
▶문제10
다음은 대문자를 소문자로 변경하는 코드인데,
문자 ch에 저장된 문자가 대문자인 경우에만 소문자로 변경한다.
문자코드는 소문자가 대문자보다 32만큼 더 크다.
예를 들어 'A‘의 코드는 65이고 ’a'의 코드는 97이다. (1)~(2)에 알맞은 코드를 넣으시오.
1
2
3
4
5
6
7
8
9
10
11
|
class Exercise3_10 {
public static void main(String[] args) {
char ch = 'A';
char lowerCase = ( /* (1) */ ) ? ( /* (2) */ ) : ch;
System.out.println("ch:"+ch);
System.out.println("ch to lowerCase:"+lowerCase);
}
}
|
cs |
[풀이]
('A' <= ch && ch <= 'Z'), (char)(ch+32)
대문자일 경우에만 소문자로 변경하라는 의미로 문자열 역시 숫자처럼 범위 지정이 가능함을 생각한다. 또한, 32를 더하지만 문자 char로 변환하여 문자열로 나타나게 하는 것을 잊으면 안됨
-. 출처:
[자바의 정석 연습문제] 3. 연산자
[3-1] 다음 연산의 결과를 적으시오. [연습문제]/ch3/Exercise3_1.java 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 class Exercise3_1 { public static void main(String[] args) { ..
yahma.tistory.com