package z_exam;
public class Exam_02 {
/*
[3-1] 다음 중 형변환을 생략할 수 있는 것은? (모두 고르시오)
byte = b = 10;
char ch = 'A';
int in = 100;
long lo = 1000L;
(1) b = (byte) in;
int > byte 더 작은 형으로의 변환이므로 생략안됨
(2) ch = (char) b;
byte<char 더 큰형으로의 변환이지만 화살표가 이어져있지않기때문에 형변환생략안됨
(3) short s = (short) ch;
char=short 크기는 같지만 화살표가 이어지지않았기때문에 형변환 생략안됨
(4) float f = (float) lo;
long<flaot 더 큰타입으로의 변환이므로 생략할수있다.
(5) in = (int) ch;
char<int 더 큰타입으로의 변환인데다가 char는 int와 화살표가 이어져있으므로 형변환을 생략가능
[3-2] 다음 연산의 결과를 적으시오.
*/
public static void main(String[] args) {
/*
//int x = 2;
//int y = 5;
//char c = 'A'; //A의 문자코드는 65
System.out.println(1+x<<33);
//사칙연산다음에 시프트연산자이므로 좌>우 순서대로
//1+2=3
//3<<33 = 3*2^33 인데, 3은 int이므로 32bit(32칸) 즉 2^32만큼 가면 제자리.
//3*2^32*2^1이므로 2^32는 없애고 3*2^1만 남아서 6이된다
System.out.println(y>=5||x<0&&x>2);
//논리연산자 &&와 ||중에는 곱하기성격인 &&가 먼저이므로
//x<0 (false) && x>2 (false) = false가 되고
//y>=5(true) || false는 true가 된다
System.out.println(y+=10-x++);
//+=은 op= 즉 대입연산자이므로 맨 마지막에한다. -와 ++중 ++이 증감연산자로 더 먼저이므로
//x++은 일단 대입 후 증가이므로 2에서 증가시키지않고 대입먼저해서 2이다
//10-2=8이고, y= y +8 이므로 답은 8이되고, x는 증가해서 3이된다
System.out.println(x+=2);
//x = x+2 인데 위에서 x++되어 3이 되었으므로 3+2 = 5이다.
System.out.println(!('A'<=c&&c<='Z'));
//()가 가장 먼저이므로 ()안의 것을 먼저 계산하고, <=비교연산자와 &&논리연산자중엔 비교가 먼저이므로
//'A'<=c는 char와 char의 계산이므로 char를 int로 ('A'=65)바꾸고 계산하면 65=65 true이다
//c<='Z'는 char와 char의 계산이므로 int로 바꾸면 65<=90이므로 true이다
//true && true는 true이고, 마지막으로 !()을 해주면 false가 된다
System.out.println('C'-c);
//char인 'C'와 char c의 계산이므로 int로 바꿔서 계산하면
//67-65가 된다. 답은 2
System.out.println('5'-'0');
//char인 '5'와 char '0'의 계산은 int로 바꿔서
// 53-48 = 5가 된다 답은 5
System.out.println(c+1);
//char c 와 int 1의 계산은 char를 int로 바꿔서 ('A'=65) 66이 된다
System.out.println(++c);
//증감연산자는 1을 더하라는게 아니고 하나가 증가되는것이다
//단항연산자의 특징은 내 타입을 유지할수있다는 것이다.
//char c의 ++c는 'A' 에서 'B'가 된다
System.out.println(c++);
//증감연산자가 뒤에 오면 우선 대입 후 증가시킨다
//c는 위에서 'B'가 되었으므로 답은 'B'를 출력하고, 그 후 증가하여 'C'가 된다
System.out.println(c);
//위 문제의 연산이 끝난 후 c는 ++되었으므로 C가 출력된다
/*
[3-3] 아래는 변수 num의 값에 따라 "양수","음수","0"을 출력하는 코드이다. 삼항 연산자를 이용해서 (1)에 알맞는 코드를 넣으시오
int num = -30;
String result = num>0?"양수":num==0?"0":"음수";
System.out.println(result);
[3-4] 아래의 코드는 사과를 담는데 필요한 바구니 (버켓)의 수를 구하는 코드이다. 만일 사과의 수가 123개이고
하나의 바구니에는 10개의 사과를 담을 수 있다면, 13개의 바구니가 필요할 것이다. (1)에 알맞는 코드를 넣으시오.
int apples = 123;
int bucket = 10;
int numOfBucket = (int)((float)apples/bucket+0.9);
//apples와 bucket이 int라 나눠도 12.3이 되지않고 12가 되니까 float으로 형변환해서 계산하고 0.9까지 더한후 int로
System.out.println("필요한 바구니의 수 :"+numOfBucket);
[3-5] 아래의 코드는 변수 num의 값 중에서 백의 자리 이하를 버리는 코드이다. 만일 변수 num의 값이 '456'이라면 '400'이 되고,
'111'이라면 '100'이 된다. (1)에 알맞는 코드를 넣으시오
*/
//int num = 456;
//int result =(num/100*100);
//num1은 int타입이라 100으로 나누면 소수점뒷자리가 어짜피 남지않는다. 그대로 다시 100을 곱해주면
//백의자리 이하는 사라진다.
//System.out.println(result);
/*
[3-6] 아래 코드의 문제점을 수정해서 실행 결과와 같은 결과를 얻도록 하시오
*/
byte a = 10;
byte b = 20;
byte c = (byte)(a + b);
//a와 b 둘다 int보다 작은 byte이다. int보다 작으므로 int로 형변환되어, 계산하면 30이 되고
//이는 int값이므로 byte c에 들어갈수없다. 앞에 byte로 형변환해주어서 byte로 다시바꿔준다.
char ch = 'A';
ch = (char)(ch + 34);
//char인 ch와 int인 2를 계산하려면 더 큰 int형으로 바꿔야한다. 'A'는 65이고 2를 더하면 67
//67을 char로 캐스팅해도 결과값인 소문자c를 만들수없다. 소문자 c의 십진수값은 99이므로 2대신
//34를 더해서 99를 만들고, 이는 int이므로 char로 형변환해서 ch변수에 담으면 c가 출력된다
float f = 3/2f;
//실수의 기본형은 double이라 float는 뒤에 꼭 F를 적어줘야한다.
long l = 3000 * 3000 * 3000L;
//long도 마찬가지로 정수의 기본형이 int라 마지막에 L을 붙여줘야한다
float f2 = 0.1f;
double d = 0.1;
//double은 0.1을 정확히 가르킬수없다. double은 2의 n승으로 표현하는데, 0.5는 2^-1이라 가능하고
//0.1같이 2의 n승으로 표현할수없는것은 근사치만 가리킬뿐이다.
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);
/*
[3-7] 아래는 변수 num의 값보다 크면서도 가장 가까운 10의 배수에서 변수 num의 값을 뺀 나머지를 구하는 코드이다.
예를들어, 24의 크면서도 가장 가까운 10의 배수는 30이다. 19의 경우 20이고, 81의 경우 90이 된다.
30에서 24를 뺀 나머지는 6이기 때문에 변수 num의 값이 24라면 6을 결과로 얻어야 한다.
(1)에 알맞은 코드를 쓰시오
*/
int num = 24;
int result1 = ((num+9)/10*10-num);
//num에 9를 더하면, 올림할때처럼, 10의 배수가 아닌이상 가장 가까운 10의 배수의 첫번째자리를 얻을수있다.
//거기에 일의자리를 없애기 위해 10으로 나눠주고, int타입이기때문에 소숫점아래는 자연히 사라지고, 다시 10을 곱해주면
//num과 가장 가까운 10의 배수를 구할수있고, 여기서 num을 빼주면 된다.
System.out.println("result : "+result1);
/*
[3-8] 아래는 화씨(Fahreheit)를 섭씨(Celcius)로 변환하는 코드이다. 변환공식이 'C=5/9 X (F-32)'라고할때,
(1)과 (2)에 알맞은 코드를 넣으시오.
단, 변활결과값은 소수점 셋째자리에서 반올림해야한다.
*/
int fahreheit= 100; //화씨
float formula = (5/9f*(fahreheit-32)); //변환공식활용
//fahreherit는 int지만 더 큰 float로는 cast연산자를 생략해줘도 된다.
float celcius = (int)(formula*100+0.5)/100F; //formula 소수점 셋째자리에서 반올림
//셋째자리에서 반올림해서 두번째자리까지 표시할꺼기때문에 100을 곱해주고 0.5더해줘서 올림한 뒤에! int로
//형변환해서 소수밑의자리 다 버리고 다시 100으로 나눠준다(이때 소수점결과나와야하므로 F표시)
System.out.println("Fahrenheit:"+fahreheit);
System.out.println("Celcius:"+celcius);
}
}