웹개발 교육/JavaScript

[9일] JavaScript (3) - switch ~ case문, for문, break, continue, while, do ~ while

ewok 2022. 8. 5. 17:16

switch ~ case문

  • 경우의 수의 목록 중에서 동일한 값을 찾아서 수행한다.
  • break : switch문을 빠져나온다.
  • default : 목록 중에서 없는 경우 무조건 수행한다.
// 1. 값 : 실수형으로 경우 수는 사용 불가
// case 값은 반드시 순차적이지 않아도 된다
switch (10) {
    case 10 : document.write("SEOUL"); break;
    case 20 : document.write("JEJU"); break;
    case 30 : document.write("BUSAN"); break;
} //switch end

 

// 2. default : 목록에 값이 없으면 무조건 수행
switch (40) {
    case 10 : document.write("SEOUL"); break;
    case 20 : document.write("JEJU"); break;
    case 30 : document.write("BUSAN"); break;
    default : document.write("기타..."); break;
} //switch end

 

// 3. break 문이 없으면
switch (20) {
    case 10 : document.write("SEOUL"); break;
    case 20 : document.write("JEJU");
    case 30 : document.write("BUSAN"); break;
    default : document.write("기타..."); break;
} //switch end

 

 

연습문제

문제1

//문1) 평균점수에 따라서 A, B, C, D, F학점을 출력하시오(switch문 활용)
let kor = 100, eng = 95, mat = 90;
let aver = parseInt((kor+eng+mat)/3);
switch (aver) {
    case 100 : document.write("A"); break;
    case  99 : document.write("A"); break;
    case  98 : document.write("A"); break;
    case  97 : document.write("A"); break;
    case  96 : document.write("A"); break;
    case  95 : document.write("A"); break;
    case  94 : document.write("A"); break;
    case  93 : document.write("A"); break;
    case  92 : document.write("A"); break;
    case  91 : document.write("A"); break;
    case  90 : document.write("A"); break;
} //switch end

이 경우 문제 해결은 가능하지만 모든 점수마다 case를 설정해야 하기 때문에 비효율적이다.

문제의 성격마다 효율적인 방식으로 문제를 해결하는 것이 필요하다.

 

if문을 사용할 수도 있지만 switch문을 사용하여 조금 더 효율적으로 해결해보면 다음과 같이 할 수 있다.

switch (parseInt(aver/10)) {
    case 10 : 
    case  9 : document.write("A"); break;
    case  8 : document.write("B"); break;
    case  7 : document.write("C"); break;
    case  6 : document.write("D"); break;
    default : document.write("F"); break;
}

 

문제 2

//문2) 연산기호(op)에 따라 결과값을 출력하시오
let i = 3, j = 5;
let op = "+";  // + - * /
/*
    출력 결과
    3+5=8
    3-5=-2
    3*5=15
    3/5=0.6
*/
// 내 풀이
switch (op) {
    case "+" : document.write(i + "+" + j + "=" + (i+j)); break;
    case "-" : document.write(i + "-" + j + "=" + (i-j)); break;
    case "*" : document.write(i + "*" + j + "=" + (i*j)); break;
    case "/" : document.write(i + "/" + j + "=" + (i/j)); break;
}

// 다른 풀이
let result = 0;
switch (op) {
    case "+" : result=i+j; break;
    case "-" : result=i-j; break;
    case "*" : result=i*j; break;
    case "/" : result=i/j; break;
} //switch end
document.write(i + op + j + "=" + result);
document.write("<hr>")

 

 

문제 3

//문3) 주민번호를 이용해서 나이와 성별을 출력하시오
//예) 주민번호 "1912301234567"
//나이 : 올해 년도 - 태어난 년도
//성별 : 1 또는 3 남자, 2 또는 4 여자

let myYear =parseInt("19");   // 태어난 년도
let myCode = parseInt("1");   // 성별 코드

//태어난 년도 완성하기
switch (myCode) {
    case 1 :  
    case 2 :  myYear=myYear+1900; break;
    case 3 :  
    case 4 :  myYear=myYear+2000; break;
}
// 나이 구하기
myAge = 2022-myYear;
document.write("나이 : " + myAge + "<hr>")

// 성별 구하기
switch (myCode%2) {
    case 0 : document.write("성별 : 여자<hr>"); break;
    case 1 : document.write("성별 : 남자<hr>"); break;
}//switch end

// if문으로
if (myCode==2 || myCode==4) {
    document.write("성별 : 여자<hr>");
} else {
    document.write("성별 : 남자<hr>");
}//if end

if는 (조건식)에 true, false의 boolean 형태만 와야하며, switch는 (조건식)에 숫자나 문자형이 올 수 있다.

 

반복문

  • for 문, while 문, do ~ while 문
  • break 문
  • continue 문
  • 무한 LOOP : 끝이 없는 반복

for

반복문 형식

  • for(시작값; 종료값; 증감) { 반복하고자 하는 명령어들 }
  • for( in ) { }
  • for( : ) { }
  • for(;;) { } 무한 LOOP
// 증가에 따른 반복
for(let a=1; a<=3; a=a+1) { //a+=1 ++a a++
    document.write("HTML");
} // for end
/*
    a=1  1<=3  HTML  a=1+1
         2<=3  HTML  a=2+1
         3<=3  HTML  a=3+1
         4<=3  반복종료
*/

// 감소에 따른 반복
for(let b=3; b>=1; b=b-1) {
    document.write(b+"CSS");
} // for end
/*
    b=3  3>=1  3CSS  b=3-1
         2>=1  2CSS  b=2-1
         1>=1  1CSS  b=1-1
         0>=1  반복 종료
*/

문제

// 문4) 4단 출력하기
/*
    4 * 1 = 4
    4 * 2 = 8
    ...
    4 * 9 = 36
*/

let dan = 4;
for (let i=1; i<=9; i++) {
    document.write(dan + "*" + i + "=" + (dan*i));
    document.write("<hr>");
} //for end

 

break

반복문을 빠져나온다.

for(let a=1; a<10; a=a+1) {
    if(a==5) {
        break;
    }//if end
    document.write(a);
} // for end
/*
    a=1  1<10  {if(1==5)  1}  a=1+1
         2<10  {if(2==5)  2}  a=2+1
         3<10  {if(3==5)  3}  a=3+1
         4<10  {if(4==5)  4}  a=4+1
         5<10  {if(5==5)  {break} }
*/
document.write(a);

 

여기서 마지막 줄 a는 출력되지 않는다. for문을 돌면서 a는 5가 되었을텐데 왜 출력이 되지 않을까?

그 이유는 범위 밖이기 때문이다.

a는 for문 안에서 선언되었기 때문에 for문 밖에 있는 document.write(a);에서 a는 선언되지 않은 변수이다.

그래서 a가 출력되지 않는 것이다.

 

continue

반복문을 계속 실행한다. (다시 반복문으로 가라)

for(let a=1; a<10; a=a+1) {
    if(a==5) {
        continue;
    }//if end
    document.write(a);
} // for end

 

while

  • 형식) while(조건) { 조건이 true이면 수행 }
  • while() {} 무한LOOP
let a=1;
while(a<=3) {
    document.write(a);
    document.write("JAVA");
    a=a+1;
} // while end
/*
    while(1<=3) { 1JAVA a=1+1}
    while(2<=3) { 2JAVA a=2+1}
    while(3<=3) { 3JAVA a=3+1}
    while(4<=3) 종료
*/
document.write(a);

 

여기서 마지막 줄 a는 4로 출력된다. 그 이유는 a가 while 밖에서 선언되었기 때문이다.

 

do ~ while

형식) do {
           조건이 true이면 실행
         } while(조건);

let b=1;
do {
    document.write(b);
    document.write("Python");
    b=b+1;
} while(b<=3);
/*
    do { 1 Python  b=1+1 } while(2<=3)
    do { 2 Python  b=2+1 } while(3<=3)
    do { 3 Python  b=3+1 } while(4<=3)  종료
*/

 

let c=5;
do {
    document.write("jQuery");
    c=c+1;
} while(c<=3);
/*
    do { jQuery  c=5+1 } while(6<=3) 종료
*/

 

조건이 틀리더라도 무조건 1번은 수행된다.

 

제어문 연습문제

문제 1

// 내 풀이
let distance = 3100;
let pay = 900+100*(Math.ceil((distance-2000)/200));
if (distance<=2000) {
    document.write("900원");
} else {
    document.write(pay+"원");
//  document.write(900+100*(Math.ceil((distance-2000)/200))+"원");
}

// 풀이2
let distance1 = 2900;  //운행거리
let total=0;          //전체요금
let overfee=0;        //초과요금

if(distance1<=2000) {
    total=900;
} else {
    let exceed=distance1-2000 //초과거리
    // document.write("초과거리"+exceed);
    overfee=Math.ceil((exceed/200))*100;
    total=900+overfee;
} // if end

document.write("총운행거리 : " + distance1 + "<br>");
document.write("기본요금 : 900<br>");
document.write("추가요금 : " + overfee + "<br>");
document.write("전체요금 : " + total + "<br>");

 

문제 2

//문2) 1~3사이의 모든 수를 더하시오(누적의 합)
//  1+2+3=6
let hap=0;
for(let a=1; a<=3; a++) {
    hap=hap+a;  //hap+=a
} //for end
document.write("누적의 합 : " + hap);
document.write("<hr>")
/*
    a=1  1<=3  {hap=0+1} a=1+1
         2<=3  {hap=1+2} a=2+1
         3<=3  {hap=3+3} a=3+1
         4<=3  종료
*/

 

문제 3

//문3) 4팩토리얼값을 구하시오(누적의 곱)
//     4! = 4*3*2*1
let gop = 1;
for (let a=4; 0<a; a--) {
    gop = gop*a;
} //for end
document.write("누적의 곱 : " + gop);
document.write("<hr>");

 

문제 4

//문4) 두수사이의 합을 구하시오
//     2+3+4+5  (2와 5사이)
//     5+4+3+2  (5와 2사이)
let start=2;
let end=5;
let sum=0; //결과값
            
for (a=start; a<=end; a++) {
    sum=sum+a;
} //for end
document.write(start+"~"+end+"까지의 합 : "+sum);
document.write("<hr>");

 

start 값이 end 값보다 작다면 문제가 없다. 하지만 start 값이 end값보다 크다면 위 코드는 문제가 발생한다.

우리는 start 값이 end 값보다 크더라도 작동되게 해야 한다.

어떻게 해결할 수 있을까?

두 값을 서로 바꾸면 된다.

//변수값 서로 교환하기(swap)
if (start>end) {
    let tmp=start;
    start=end;
    end=tmp;
} // if end

이렇게 하면 start와 end에 어떠한 값이 오더라도 정상적으로 출력할 수 있다.

 

문제 5

//문5) 1~5사이 중에서 짝수의 갯수를 구하시오
let count = 0;
for(let a=1; a<=5; a=a+1) {
    if(a%2==0) {
       count=count+1; 
    }//if end
} //for end
document.write("짝수의 갯수 : " + count);
document.write("<hr>");
/*
    a=1  1<=5  {if(1%2==0)}             a=1+1
         2<=5  {if(2%2==0)  count=0+1}  a=2+1
         3<=5  {if(3%2==0)}             a=3+1
         4<=5  {if(4%2==0)  count=1+1}  a=4+1
         5<=5  {if(5%2==0)}             a=5+1
         6<=5
*/

 

문제 6

//문6) 서기1년 ~ 2022년 사이중에서 윤년의 갯수를 구하시오
//주의) 달력과 관련이 있는 정보는 특히 윤년 구하는 공식 등은 계산식에 사용하지 말고
//      자바스크립트(Data객체), 자바(Calendar클래스)를 사용해야 한다
let leap=0;
for (let year=1; year<=2022; year++) {
    if (year%4==0 && year%100!=0 || year%400==0) {   //윤년 구하는 공식
        leap=leap+1;
    }//if end
}// for end
document.write("윤년의 갯수 : " + leap);
document.write("<hr>");

 

문제 7

//문7) x값이 10으로부터 x를 여러 번 뺀 후
//     결과값이 음수가 되면 x를 몇번 뺐는가를 구하시오
/*
    10-3=7
     7-3=4
     4-3=1
     1-3=-2
*/
let x=3;
let su=10;
let cnt=0; //결과값
            
while(true) { //무한LOOP
    su=su-x;
    cnt=cnt+1
    if(su<0) {
        break;
    }//if end
}//while end
document.write("횟수 : " + cnt);
document.write("<hr>");

 

문제 8

//과제)3의 배수의 누적 합이 100이 넘어가려면 3부터 어디까지 더해야 하는지 구하시오
// 3+6+9+12+15+18+21+24 = 108
            
let totalsum=3;
let threetimes=2;
let sumnumber=1;
while(true) {
    totalsum=totalsum+(3*threetimes);  //누적의 합
    threetimes=threetimes+1;
    sumnumber=sumnumber+1;
    if(totalsum>100) {
        break;
    }//if end                
}//while end
document.write("3부터 " + 3*sumnumber + "까지");
document.write("<hr>");
document.write("3의 배수의 누적의 합 : "+totalsum);
document.write("<hr>");
// 다른 풀이
let num=0;
let add=0;   // 누적의 합
let str="";  // 출력 결과
while(true) {
    num=num+3;       //3의 배수
    add=add+num;
    // document.write(num + "&nbsp;&nbsp;" + add);
    // document.write("<hr>");
    str = str+num+"+";
    if(add>=100) {
        break;
    }//if end
}//while end
document.write(str);
document.write("<hr>");
document.write("3의 배수의 누적의 합 : "+add);
document.write("<hr>");