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 + " " + 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>");
'웹개발 교육 > JavaScript' 카테고리의 다른 글
[12일] JavaScript (6) - 요일 구하기, Date 객체, 함수 (0) | 2022.08.10 |
---|---|
[11일] JavaScript (5) - 배열, 연습문제 (0) | 2022.08.09 |
[10일] JavaScript (4) - 이중 반복문, for 연습 (0) | 2022.08.08 |
[8일] JavaScript (2) - 형변환, Math, if문 (0) | 2022.08.04 |
[7일] JavaScript (1) - 자료형, 연산자 (0) | 2022.08.03 |