4일차 2023-03-13 Java
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();
}