java

4일차 2023-03-13 Java

choi Hoon 2023. 3. 13. 18:45

1.if문

 

1.1if~else문

if문 (조건식) {

     조건식이 참일 때 실행할 명령문;

} else {

   조건식이 거짓일 때 실행할 명령문;

}

또한, 실행할 명령문이 하나일 때는 {} 생략가능

else문은 홀로 사용불가 if~else가 하나의 문법이다

 

1-2) if ~else if문 

if(조건식 1) {

     조건식이 참일 때 실행할 명령문;

} else if(조건식 2){

     조건식 2가 참일 때 실행할 명령문; 

}

...

} else {

     모든 조건식이 거짓일 때 실행할 명령문;

}

위에서 아래로 내려오고 if문이 맞으면 실행하고 아니면 계속 내려오며 명령문을 실행한 후 if문을 나온다.

1-2) 문제 세 숫자 중 최댓값을 구하는 로직을 작성(if문 형식 3가지 중 아무거나 사용)

sol) 내가 한 것

int max=0;
		if(num1 > num2) {
			if(num1 > num3) {
				max=num1;
				System.out.println("최대값은"+max);
			}
		}else if (num2>num3){
			if(num2>num1) {
				max=num2;
				System.out.println("최대값은"+max);
			}	
		}else {
			max=num3;
			System.out.println("최대값은"+max);
		}

다른 방식:

int max=num1;
if(max < num2) max =num2;
if(max < num3) max =num3;
System.out.println("최대값"+max);

1-3) 삼항연산자

(조건 항)? 참이면 쓸 항:거짓이면 쓸 항 

System.out.println(num1 %2 ==0?"짝수":"홀수");//if~else를 기술 못하는 곳에도 기술 가능

ex)

System.out.println(num1 %2 ==0 ?num1 >=100 ?"짝수이면서 100이상":"짝수이면서 100미만" :"");

//문]한 문자를 입력받아 숫자인지 아닌지
		System.out.println("하나의 문자를 입력하세요");
		int ascii=System.in.read();
		System.out.println("[if~else문 버전]");
		boolean isNumber = ascii >= '0' && ascii <='9';
		if(isNumber) {
			System.out.println("숫자다");
		}else System.out.println("숫자가 아니다");
		
		System.out.println("[삼항 연산자 버전]");
		System.out.println(isNumber?"숫자다":"문자다");
		
		System.in.skip(2);//엔터스킵
		System.out.println("다시 한문자를 입력하세요");
		char word = (char)System.in.read();
		//문제]숫자인지 판단 후 2의 배수 판단하고 2의 배수면 "2의 배수"아니면"2의 배수가 아님출력
		//또한 숫자가 아니고 알파벳이라면  대소문자 판단후
		//대문자인 경우" 대문자 출력 소문자인 경우 소문자 출력
		//if ~else문 사용
		//가정]숫자나 알파벳만 입력한다고 가정하자.
		System.out.println("[if~else문 버전]");
		isNumber=word >='0' && word<='9';				
		if(isNumber) {
			if((word-'0') %2==0) System.out.println("2의 배수");
			else System.out.println("2의 배수아님");
		}
		else {
			if(word >='A'&& word <='Z') System.out.println("대문자");
			else System.out.println("소문자");
		}
		
		System.out.println("[삼항연산자 버전]");
		System.out.println(isNumber?
				(word-'0')%2==0?"2의 배수":"2의 배수가 아님":
				word >='A'&& word <='Z'?"대문자":"소문자");

2.switch문

switch(정수식){

   case  값:

   명령문1;

    ...

    break;

    case 값2:

    명령문2;

    ...

   break;

   default:// default는 마지막에 쓰는 것으로 마지막으로 쓰는 것 break는 여기는 생략가능하다. 하지만 위 case에서  

   명령문;//  끝에 break가 없으면 switch문을 벗어나지 않고 내려옴

}

if문은 조건식이 범위를 가지고 분기를 할 때 사용하고

switch문은 결과값이 1,2,3,4,5...등 (이산적) 딱 떨어지는 값을 표현할 때 사용한다.

switch문은

byte b=1;
		switch(b) {//변수가 와도 됨(단,타입은 byte/short/char/int형/String형/Enum만 가능)
		case 1: System.out.println("b에 저장된 값이 1");

이렇게 변수가 와도 된다.

/*

*여러 case를 동시에 처리할 때는

*case 값1:

*case 값2:

*case 값n: 실행문n: break;

*값1인 경우,값2인경우,갑n인 경우

* */

switch(inputNumber) {
	case 1:
	case 2:
	case 100:
	case 200: System.out.println("1이거나 2거나 100이거나 200중 하나"); break;
	case 300: System.out.println("300입니다.");
}

해석)

1:인경우하고 내려오고

2인경우 하고 내려오고

100인경우 하고 내려오고

200인경우 "1이거나 2거나 100이거나 200 중 하나"이 문장을 1, 2, 100, 200이 break문을 못 만났으니깐 4가지 경우가 다 200의 경우를 출력하게 된다.

ex)

/*문제 평균을 구해서 90점이상 "A"출력
						80점 이상'B'출력
						70점 이상'B'출력
						60점 이상'B'출력
						60점미만 "F"학점 출력
						단 ,switch문 사용
						*/
		System.out.println("국어점수 입력?");
		int kor = sc.nextInt();
		System.out.println("영어점수 입력?");
		int eng = sc.nextInt();
		System.out.println("수학점수 입력?");
		int math = sc.nextInt();
		
		int avg=(kor+eng+math)/30;
		System.out.println("평균점수:"+avg);
		switch(avg) { 
		case 10:
		case 9: System.out.println("A학점"); break;	
		case 8: System.out.println("B학점"); break;
		case 7: System.out.println("C학점"); break;
		case 6: System.out.println("D학점"); break;
		default: System.out.println("F학점");
		}

3.for문

 

3-1) for문 형식

for(초기식 ; 반복조건(조건식) ; 증감식){

         반복 조건이 참일 때 실행할 명령문들;

}

3-2) 무한 루프 for문

반복조건이 없거나 조건대신에 true를

지정하면 무조건 무한 루프

예]

for(;;){

}

for(;true;){

}

-for문은 반복 횟수가 정해진 경우 주로 사용한다.

반대로 반복 횟수를 모를 경우에는 while문을 사용한다.

3-3) for문

누적합을 for문을 통해 계산

//반복문을 이용해서 1부터 10까지 누적합:1+2+3+4+5+6+7+8+9+10

int sum=0;//누적합을 저장할 변수 선언

for(int i=1; i <=10; i++) {

sum+=i;

}

System.out.println("1부터 10까지 누적합:"+sum);

//방법 1]2씩 증가하도록 증감식 작성

sum=0;

for(int i=2; i <=10;i+=2) {

sum+=i;

}

System.out.println("1부터 10까지의 2의 배수 누적합:"+sum);

//방법 2] i%2==0인 경우

sum=0;

for(int i=2; i <=10;i++) {

if(i%2==0)//i가 2의 배수일 때만 누적

sum+=i;

}

System.out.println("1부터 10까지의 2의 배수 누적합:"+sum);

방법 1이 i가 증감식으로 계산하여 더 가벼운 식이다.

/*문 1~10까지 숫자 중 3의 배수이거나 5의 배수인 숫자의 합을 구하라

*

*

* */

 

/*문 1~10까지 숫자중 3의 배수이거나 5의 배수인 숫자의 합을 구하라
		 * 
		 * 
		 * */
		
		sum=0;
		for(i=1;i<=100; i++) {
			if(i%3==0 || i%5==0) {
				sum+=i;
			}
			if(i%15==0) {
				sum-=i;
			}
			
		}

다른 방법 1]

//방법1] || 하고 &&연산 사용
sum=0;
for(i=1; i<101; i++) {
	if((i%3==0 || i%5==0) && i%15 !=0) sum+=i;
}

다른 방법 2]

//방법2]^(XOR)연산 사용
sum=0;
for(i=1; i<101; i++) {
	if(i%3==0 ^ i%5==0) sum+=i;
}
System.out.println("1부터 100까지 3의 배수이거나 5의 배수의 누적합(공배수 제외):"+sum);

3-4) 이중 for문)

/*

* 이중(중첩) for문 :for문 안의 for문

* 이중 for문에서 바깥 for문은 행(row)을 의미

* 안쪽 for문은 열(column)을 나타낸다

*/

 

문제)

/*

* 0 0 0 1 (1,4)

* 0 0 1 0 (2.3)

* 0 1 0 0 (3,2)

* 1 0 0 0 (4,1)처럼 출력해 보자

*/

//방법 1]

for(int k=1;k<5;k++) {//행번호

 

for(int j=1;j<5;j++) {//열번호

       if(k+j==5) System.out.printf("%-2d",1);

       else System.out.printf("%-2d",0);

}

System.out.println();

}

System.out.println("-------------------------");

//방법 2]

for(int k=1; k<=4;k++) {

        for(int j=4; j>=1;j--) {

                if(k==j) System.out.printf("%-2d",1);

                else System.out.printf("%-2d",0);

}

System.out.println();

}

/*

*

* *

* * *

* * * *

* * * * *

를 출력하여라(이중 for문 사용)

*/

sol)

for(i=1; i<=5;i++) {

for(int j=1; j<=i;j++) {

     System.out.printf("%-2c",'*');

     }

     System.out.println();

}

/*
		  문]아래 형식대로 구구단을 출력
			2 * 1 = 2   3 * 1 = 3   4 * 1 = 4........9 * 1 = 9
			2 * 2 = 4   3 * 2 = 6   4 * 2 = 8........9 * 2 =18
			..
			..
			2 * 9 = 18  3 * 9 = 27  4 * 9 =36....... 9 * 9 = 81	
*/

for(i=2; i<=9; i++) {

for(int j=1; j<=9; j++) {

          System.out.printf("%d * %d = %d\t", j, i, j*i);

          }

          System.out.println();

}