본문 바로가기
🤼‍♂️ 5. Project/5-2 연습문제 풀이

[Do it! 자바스크립트+제이쿼리 입문] 4장 객체

by 달님🌙 2021. 9. 12.
반응형

 

 

총정리 실습! 

 

1. 브라우저 객체 모델을 사용해 운영체제 정보와 스크린 정보 얻기 

  - navigator 객체와 screen 객체를 이용하여 버튼을 누를 때마다 방문자의 운영체제 정보와 스크린 사이즈 정보 출력

<!DOCTYPE html>
<html lang="ko">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>navigator</title>
</head>
<body>
    <script>
        var info = navigator.userAgent.toLowerCase(); 
        var oslmg = null;

        if(info.indexOf('windows') >= 0) {
            oslmg = "windows.png";
        } else if(info.indexOf('macintosh') >= 0) {
            oslmg = "macintosh.png";
        } else if(info.indexOf('iphone') >= 0) {
            oslmg = "iphone.png";
        } else if(info.indexOf('android') >= 0) {
            oslmg = "android.png";
        }

        //myFnc(num);
        //myFnc2(num);

        document.write('<img src="images/' + oslmg + '">', "<br>");
        
        var scr = screen;
        var sc_w = scr.width;
        var sc_h = scr.height;

        document.write("모니터 해상도 너비 : " + sc_w + "px", "<br>");
        document.write("모니터 해상도 높이 : " + sc_h + "px", "<br>");
    </script>
</body>
</html>

 

* 크롬 개발자 도구의 디바이스 도구를 사용하여 환경을 테스트해볼 수 있다. 

* 모델 변경 후 새로고침을 해야 이미지 파일이 바뀜 

 

 

 

 

도전 Mission!

 

1. 휴대폰 번호 뒷자리 별처리 및 이미지 속성 문자열 대체하기 - substring()과 replace() 메서드 사용

<!DOCTYPE html>
<html lang="ko">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>문자열 객체</title>
</head>
<body>
    <script>
        var phoneNum = "010-2345-1234";
        var result_1 = phoneNum.substring(0, phoneNum.length - 4);
        document.write(result_1, "**** <br>");

        var imgSrc = "images/bnt_out.jpg";
        var result_2 = imgSrc.replace("out", "over");
        document.write(result_2, "<br>");
    </script>
</body>
</html>

 

2. 점심 메뉴 고르기 - Math.floor()과 Math.random() 메서드 사용

<!DOCTYPE html>
<html lang="ko">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>배열 객체와 수학 객체</title>
</head>
<body>
    <script>
        var menu = ["짜장면", "돈가스", "된장국", "김치찌개", "회덮밥"];
        var menuNum = Math.floor(Math.random() * 5); 
        // 0이상 5미만의 실수를 소수점 버림 -> 0 ~ 4 사이의 자연수
        var result = menu[menuNum];
        document.write(menuNum+1 + "번 메뉴인 \"" + result + "\"이(가) 당첨되었습니다.");
    </script>
</body>
</html>

 

homework

 

<!doctype html>
<html lang="ko">
<head>
	<meta charset="utf-8">
	<meta name="viewport" content="width=device-width, initial-scale=1.0">
	<title>memeber 객체</title>
	<style>
		body {font-size:1.2em; line-height: 2em;}
	</style>
</head>
<body>
	<script>
		// 객체 리터럴 표기법 : 중괄호{}를 이용하여 프로퍼티를 한번에 지정하는 방법
		var member1 = {
			"name" : "홍길동",
			"id" : 123,
			"age" : 25,
			"address" : "서울"
		};

		document.write("<h2>" + member1.name + "</h2>");
		document.write("<ul><li>id : " + member1.id + "</li>");
		document.write("<li>나이 : " + member1.age + "</li>");
		document.write("<li>주소 : " + member1.address + "</li></ul>");	
	</script>
</body>
</html>

 

 

<!doctype html>
<html lang="ko">
<head>
	<meta charset="utf-8">
	<meta name="viewport" content="width=device-width, initial-scale=1.0">
	<title>Circle 객체</title>
	<style>
		body { text-align: center; font-size:1.2em; line-height: 2em;}
	</style>
</head>
<body>
	<script>
		var r = prompt("원의 반지름은? (cm)");
		var circle1 = new Circle(r);
		document.write("반지름이 " + r + "cm일 때<br>");
		document.write("원의 둘레 : 약 " + circle1.circumference() + "cm<br>");
		document.write("원의 넓이 : 약 " + circle1.area() + "cm<sup>2</sup>");
		function Circle(radius) {
			this.radius = radius, // this.radius에 r을 담음 
			this.circumference = function() { // circumference()로 써야함(함수라서!)
				return Math.floor(2 * this.radius * Math.PI);
			}
			// 위처럼 수식이 들어있는 문장을 function() 을 안쓰고 아래처럼 쓰면 글자 그대로 출력됨
			// this.circumference = Math.floor(2 * this.radius * Math.PI);
			this.area = function() {
				return Math.floor(Math.pow(this.radius,2) * Math.PI);
			} 
		}
	</script>
</body>
</html>

 

 

<!DOCTYPE html>
<html lang="ko">
<head>
	<meta charset="UTF-8">
	<meta name="viewport" content="width=device-width, initial-scale=1.0">
	<meta http-equiv="X-UA-Compatible" content="ie=edge">
	<title>배열의 합 테이블에 추가</title>
	<style>
		table, td {border:1px solid #ccc; border-collapse: collapse; margin-bottom:20px;}
		td { padding:5px;}
	</style>
</head>
<body>
	<script>
		var numbers = [2, 4, 6, 8, 10];
		showArray(numbers); // 메소드 실행

		function showArray(arr) {
			var str = "<table><tr>";
			var sum = 0; // 모든 요소의 합을 담을 변수 선언
			for (var i=0; i<arr.length; i++) {
				str += "<td>" + arr[i] + "</td>";
				sum += arr[i]; // 변수 sum에 모든 요소의 합 담기
			}
			arr.push(sum); // sum을 배열의 마지막에 추가
			str += "<td>" + sum + "</td>"; // sum을 테이블에 추가

			str += "</tr></table>";
			document.write(str);
		}
	</script>
</body>
</html>

 

 

4. 배열의 총 합을 구해 화면에 출력해 주세요.

<!DOCTYPE HTML>
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>배열의 총합</title>
</head>
<body>
    <script type="text/javascript">
        /*
            미션 02: 배열의 총 합을 구해 화면에 출력해 주세요.
         */
        var data = [10, 20, 30, 40, 50];
        var sum = 0;
        for(var i = 0; i < data.length; i++) {
            sum += data[i];
        }
        alert("배열 합은 " + sum + "입니다.");
    </script>
</body>
</html>

 

5. 입력 값의 합 구하기

조건 1. end가 입력될 때까지 숫자를 계속해서 입력받기

조건 2. prompt()를 이용해 값을 입력받을 때 입력받는 횟수가 출력되어야한다.

조건 3. 입력 값이 end면 alert()을 이용해 “입력이 종료되었습니다.” 메시지를 띄운 후 프로그램 종료

조건 4. end가 아닌 경우 햔재까지 입력받은 값의 합을 document.write()를 이용해 화면에 출력

(end가 입력된 후 프로그램이 종료되고 한 번에 보여지게됨)

<!DOCTYPE HTML>
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>입력값의 합구하기</title>
</head>
<body>
    <script type="text/javascript">
        /*
         미션 02: 입력 값 합 구하기
         end가 입력될 때까지 숫자를 계속해서 입력받아 다음과 같이 출력되게 만들어 주세요.

         요구사항:
         - window.prompt()를 이용해 값을 입력받을 때 입력받는 횟수가 출력되어야 합니다.
         - 입력 값이 end면 alert()을 이용해 “입력이 종료되었습니다.” 메시지를 띄운 후 프로그램을 종료해 주세요.
         - end가 아닌 경우 입력받은 값의 합을 document.write()를 이용해 화면에 출력해 주세요.
         */
        var index = 1;
        var sum = 0;
        while(true) {
            
            var data = prompt(index + "번째 숫자를 입력하세요");
            if(data == "end") {
                alert("입력이 종료되었습니다.");
                break;
            }
            sum += parseInt(data);
            document.write("현재 합 =  " + sum + "<br>");
            index++;
        }
    </script>
</body>
</html>

 

 

6. 이미지를 가로*세로로 배열하기

조건 1. 이미지 시작위치는 left:100, top:100 입니다.

조건 2. 하나의 이미지 영역은 200*200입니다.

조건 3. 이미지는 3열로 배열해 주세요.

<!DOCTYPE HTML>
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title></title>

    <style>
        div.image-container {
            position: relative;
        }

        div.image-container img {
            position: absolute;
            left: 0;
            top: 0;
            width: 120px;
        }
        #btnStart {
            padding:5px;
            margin-bottom:5px;
        }
    </style>

</head>

<body>
    <div>
        <button id="btnStart">
            배열시작
        </button>
    </div>
    <div class="image-container">
        <img src="banners/1.png" >
        <img src="banners/2.png" >
        <img src="banners/3.png" >
        <img src="banners/4.png" >
        <img src="banners/5.png" >
        <img src="banners/6.png" >
        <img src="banners/7.png" >
        <img src="banners/8.png" >
    </div>
    
    <!--

    미션 04: 이미지를 가로*세로로 배열하기
    버튼을 클릭하면 이미지를 요구사항에 맞게 배열해 주세요.

    요구사항:
        1. 이미지 시작위치는 left:100, top:100 입니다.
        2. 하나의 이미지 영역은 200*200입니다.
        3. 이미지는 3열로 배열해 주세요.

    힌트 :
    대상.style.left = x + 'px';
    대상.style.top = y + 'px';
    img 하나씩 꺼내기 : 변수 = img[i];

    -->
    <script>
        var btn = document.getElementById('btnStart');

        btn.addEventListener('click', function() {
            // 이미지 찾기.
            // 이미지 태그 배열 생성
            var img = document.getElementsByTagName('img');

            // 이미지 개수 구하기.
            // 이미지 태그 배열의 길이
            var length = img.length;

            // 여기에 풀이를 입력해주세요.
            // 이미지 배열하기.
            for (var i = 0; i < length; i++) {
                // n번째 이미지 구하기
                // 이미지 태그 하나 씩 꺼내기
                var nImg = img[i];
                // 위치 값 구하기
                var x = 100 + ((i % 3) * 200); //100 + 0*200,1*200,2*200,0*200,1*200,2*200,0*200,1*200,2*200
                var y = 100 + (parseInt(i / 3) * 200);//100 + 0*200,0*200,0*200,1*200,1*200,1*200,2*200,2*200,2*200

                // 위치 설정
                nImg.style.left = x + 'px';
                nImg.style.top = y + 'px';
            }
        });

    </script>
</body>
</html>

 

 

7. 로또 당첨 확인

<!DOCTYPE html>
<html lang="ko">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>로또 당첨 확인</title>
</head>
<body>
    <script>

        // 1. 이번주 당첨 번호 '생성'
        var lotto = [];
        for(var i = 0; i < 7; i++) {
            //로또 번호생성하여 lotto배열에 입력, 1~45까지의 랜덤 숫자 6개 + 보너스 번호 1
            lotto[i] = Math.floor(Math.random() * 45 + 1);
            //중복 처리
            for(var j = 0; j < i; j++) {
                if(lotto[i] == lotto[j]) {
                    lotto.pop(); 
                    i--;
                    // i = 3 인 경우 아직 배열에는 인덱스 3까지만 추가된 상황이라 pop해주면 i번째가 나감
                }
            }
        } console.log(lotto);


        // 2. 이번주 당첨 번호 '출력'
        var lottoNo = "";
        for(var k = 0; k < lotto.length; k++) {
            if(k == 6) {
                lottoNo += "보너스번호 : " + lotto[k];
            } else {
                lottoNo += lotto[k] + ", ";
            }
        } document.write("이번주 로또 당첨 번호는 : " + lottoNo, '<br>');


        // 3. 사용자 구매 번호 '생성'
        var userNo = [];
        for(var userCnt = 0; userCnt < 6; userCnt++) {
            //사용자 번호 입력 받아서 userNo 배열에 입력
            var data = prompt("1~45까지의 숫자를 입력하세요.");
            userNo.push(data);
            //입력 값이 1보다 작거나 45보다 크거나 '', null입력 시 배열에서 삭제하고 다시 입력
            if(data < 1 || data > 45 || data == '' || data == null) {
                userNo.pop(); // 방금 담은거 다시 빼기
                userCnt--; // 이 작업 안해주면 빵꾸 생김
            } else {
                //사용자 입력 값 중복 처리
                for(var j = 0; j < userCnt; j++) {
                    if(userNo[userCnt] == userNo[j]) {
                        userNo.pop();
                        userCnt--;
                    }
                }
            }
        } console.log(userNo);

        // 4. 사용자 구매 번호 '출력'
        document.write("구입한 로또 번호 : " + userNo, '<br>');

        // 5. 당첨 여부 확인 코드 작성
        var correctCnt = 0;
        var bonusFlag = false;

        for(var m = 0; m < lotto.length; m++) {
            for(var n = 0; n < userNo.length; n++) {
                //lotto번호와 사용자 입력값 비교
                //보너스번호가 일치하면 bonusFlag -> true로 변경
                if(lotto[m] == userNo[n]) {
                    if(m == 6) {
                        bonusFlag = true; 
                    } else {
                        correctCnt++;
                    }
                }
            }
        }

        // 6. 당첨 여부 확인 메시지 출력
        if(correctCnt == 6) {
            document.write("1등 당첨!", '<br>');
        } else if(correctCnt == 5) {
            if(bonusFlag) {
                document.write("2등 당첨!", '<br>');
            } else {
                document.write("3등 당첨!", '<br>');
            }
        } else if(correctCnt == 4) {
            document.write("3등 당첨!", '<br>');
        } else if(correctCnt == 3) {
            document.write("4등 당첨!", '<br>');
        } else {
            document.write("꽝!", '<br>');
        }
    </script>
</body>
</html>

 

 

 

반응형

댓글