럿고의 개발 노트

[자바의 정석 3rd Edition] Chapter03. 연산자 연습문제 풀이 본문

Java Note/자바의 정석 3rd Edition

[자바의 정석 3rd Edition] Chapter03. 연산자 연습문제 풀이

KimSeYun 2020. 2. 2. 14:48

Chapter03. 연습문제

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

public class Practice01 {
    public static void main(String[] args) {
        int x = 2;
        int y = 5;
        char c = 'A';

        System.out.println(1 + x << 33); // 1 + x는 3으로 쉬프트 연산으로 33번 움직이지만, int형은 32이상이 되면 32를 나눈 나머지 만큼만 연산이 된다. 즉, x + 1 >> 1과 동일하다. 따라서 결과는 6이 된다.
        System.out.println(y >= 5 || x < 0 && x > 2); // y > = 5가 true이며, OR연산자이기 때문에 뒤에 조건식은 무시된다. 따라서 결과는 true
        System.out.println(y += 10 - x++); // 식을 풀어보면 y = y + (10 - x++)이 된다. x는 후위연산자이기 떄문에 일단 (10 - x++)이 연산이 된 후에 x에 +1이 된다. 즉, y = y + 8이며, 결과는 13이 된다.
        System.out.println(x += 2); // 위의 출력문에서 x는 후위연산이 되어 x = 3이 되었으며, x += 2는 5가 정답이다.
        System.out.println(!('A' <= c && c <= 'Z')); // 안에 논리식은 대문자인지를 확인하는 조건식으로 c의 값이 대문자 이기 떄문에 true가 나오지만, 논리 부정 연산자가 있기 때문에 결과는 false가 나온다.
        System.out.println('C' - c); // 'C'는 아스키코드로 67이며, c('A')는 아스키코드로 65로 67 - 65결과로 2가 정답이다.
        System.out.println('5' - '0'); // 아스키코드는 0-9까지 a-z까지 A-Z까지 연속적으로 있기 때문에 0과 5의 차이가 정답으로 5가 정답이다.
        System.out.println(c + 1); // 위의 설명으로 연속적이기 때문에 66('B')가 정답, 정수형 리터럴은 더하는것이기때문에 형변환이 일어난다. 따라서 정수가 나온다.
        System.out.println(++c); // 선행연산자로 +1 연산이 가장 먼저 일어나기 때문에, 'B'(66)이 정답이다.
        System.out.println(c++); // 후위연산자로 +1 연산이 가장 나중에 일어나며, 따라서 'B'(66)가 나온 후에 c의 값에 +1이 연산될것이다.
        System.out.println(c); // 위에 후위연산자로 +1을 연산되어 'C'(67)가 정답이다.
    }
}

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

public class Practice02 {
    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);
    }
}

3-3. 아래는 변수 num의 값에 따라 '양수', '음수', '0'을 출력하는 코드이다. 삼항 연산자를 이용해서 (1)에 알맞은 코드를 넣으시오.

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

3-4. 아래는 변수 num의 값 중에서 백의 자리 이하를 버리는 코드이다. 만일 변수 num의 값이 '456'이라면 '400'이 되고, '111'이라면 '100'이 된다. 알맞은 코드를 넣으시오.

public class Practice04 {
    public static void main(String[] args) {
        int num = 456;
        System.out.println((num / 100) * 100);
    }
}

3-5. 아래는 변수 num의 값 중에서 일의 자리를 1로 바꾸는 코드이다. 만일 변수 num의 값이 333이라면 331이 되고, 777이라면 771이 된다.

public class Practice05 {
    public static void main(String[] args) {
        int num = 333;
        System.out.println(((num / 10) * 10) + 1);
    }
}

3-6. 아래는 변수 num의 값보다 크면서도 가장 가까운 10의 배수에서 변수 num의 값을 뺀 나머지를 구하는 코드이다. 예를 들어, 24의 크면서도 가장 가까운 10의 배수는 30이다. 19의 경우 20이고, 81의 경우 90이 된다. 30에서 24를 뺀 나머지는 6이기 때문에 변수 num의 값이 24라면 6을 결과로 얻어야 한다.

public class Practice06 {
    public static void main(String[] args) {
        int num = 24;
        System.out.println(10 - (num % 10));
    }
}

3-7. 아래는 화씨(Fahrenheit)를 섭씨(Celcius)로 변환하는 코드이다. 변환공식이 'C = 5 / 9 x (F - 32)'라고 할 때, 알맞은 코드를 적으시오. 단, 변환 결과값은 소수점 셋째자리에서 반올림해야한다.(Math.round()를 사용하지 않고 처리할 것)

public class Practice07 {
    public static void main(String[] args) {
        int fahrenheit = 100;
        float celcius = (int)((5/9f * (fahrenheit - 32)) * 100 + 0.5) / 100f;

        System.out.println("Fahrenheit : " + fahrenheit);
        System.out.println("Celcius : " + celcius);
    }
}
  • Math.round()를 사용하지 않고 소수점 셋째자리에서 반올림을 하려면 다음과 같은 과정을 거쳐야 함.
    1. 값에 100을 곱한다.
    2. 0.5를 더한다.
    3. int타입으로 변환한다.
    4. 100f로 나눈다.(100으로 나누면 소수점 아래의 값을 잃음)

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

문제

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;
        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);
    }
}

c=30
ch=C
f=1.5
l=27000000000
result=true

수정본

public class Practice08 {
    public static void main(String[] args) {
        byte a = 10;
        byte b = 20;
        byte c = (byte)(a + b);

        char ch = 'A';
        ch = (char)(ch + 2);

        float f = 3/2f;
        long l = 3000 * 3000 * 3000L;

        float f2 = 0.1f;
        double d = 0.1;

        boolean result = (float)d == f2;

        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가 되도록 하는 코드이다. 알맞은 코드를 넣으세요.

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

        System.out.println(b);
    }
}

3-10. 다음은 대문자를 소문자로 변경하는 코드인데, 문자 ch에 저장된 문자가 대문자인 경우에만 소문자로 변경한다. 문자코드는 소문자가 대문자보다 32만큼 더 크다. 예를 들어 'A'의 코드는 65이고, 'a'의 코드는 97이다. 알맞은 코드를 넣으세요.

public class Practice10 {
    public static void main(String[] args) {
        char ch = 'A';
        char lowerCase = (ch >= 'A' && ch <= 'Z') ? (char)(ch + 32) : ch;

        System.out.println("ch : " + ch);
        System.out.println("ch to lowerCase : " + lowerCase);
    }
}

출처

Comments