basicJAVA/100. 연습문제

Exam 02

unemo 2020. 10. 12. 19:24
반응형
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);
			}
}
반응형

'basicJAVA > 100. 연습문제' 카테고리의 다른 글

Exam 04  (0) 2020.10.20
Exam_03 추가과제  (0) 2020.10.16
Exam_03  (0) 2020.10.16
Exam 01  (0) 2020.10.12