본문 바로가기

Javascript/Javascript(2024 version)

Javascript(8) - 정보처리기사 필기 결과 출력

728x90
반응형

1) Javascript 예제

   1-1) 정보처리기사 필기 결과 출력

 

 

 

 

 

1) Javascript 예제

1-1) 정보처리기사 필기 결과 출력

scit45_subject.html

<!DOCTYPE html>
<html lang="kor">
  <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>Web Front-End</title>
    <!-- 1)	CSS와 JavaScript는 파일로 지정하여 적용 -->
    <!-- CSS 파일 가져오기 -->
    <link rel="stylesheet" href="./subject_style.css" />

    <!-- JS 파일 가져오기 -->
    <script src="./subject_script.js" type="text/javascript"></script>
  </head>
  <body>
    <!-- 8)	기준 이미지와 같이 HTML 태그 생성 -->
    <div id="frame">
      <!-- ---------------------header--------------------- -->
      <header>
        <!-- 2)	제목에 해당하는 태그 생성 -->
        <!-- 제목 태그 생성 -->
        <h1>[정보처리 기사 필기 결과]</h1>

        <h2># 가채점 예상 점수를 입력하세요</h2>
      </header>

      <!-- --------------------- main --------------------- -->
      <main>
        <div id="scoreContents">
          <h4 class="blueFont">맞춘 개수</h4>

          <!-- 목록태그 생성 : 순서가 있는 목록을 만들어주는 "ol 태그" 생성(목록 요소인 "li 태그" 추가) -->

          <!-- 3)	점수를 입력 받기 위한 입력 태그 생성 -->
          <!-- 점수 입력태그 생성 : input 태그 생성 -->

          <!-- 4)	점수를 입력 받기 위한 입력 태그에 0이 보여지도록 속성값 부여 : 각 input 태그별로 placeholder 속성 추가 -->

          <!-- 5)	예상 점수를 출력 하기 위한 텍스트 태그 생성 -->
          <!-- 예상점수 출력용 텍스트태그 생성 : span 태그(class="blueFont expectedScore") 생성 -->
          <ol>
            <li>
              <label for="inputBox1" class="listItem">소프트웨어 설계:</label>
              <span class="scorePart">
                20문제 중
                <input
                  type="text"
                  id="inputBox1"
                  placeholder="0"
                  size="6"
                  class="scoreBox"
                />
                개
              </span>
              <span class="blueFont expectedScore"></span>
            </li>
            <li>
              <label for="inputBox2" class="listItem">소프트웨어 개발:</label>
              <span class="scorePart">
                20문제 중
                <input
                  type="text"
                  id="inputBox2"
                  placeholder="0"
                  size="6"
                  class="scoreBox"
                />
                개
              </span>
              <span class="blueFont expectedScore"></span>
            </li>
            <li>
              <label for="inputBox3" class="listItem">데이터베이스 구축:</label>
              <span class="scorePart">
                20문제 중
                <input
                  type="text"
                  id="inputBox3"
                  placeholder="0"
                  size="6"
                  class="scoreBox"
                />
                개
              </span>
              <span class="blueFont expectedScore"></span>
            </li>
            <li>
              <label for="inputBox4" class="listItem"
                >프로그래밍 언어활용:</label
              >
              <span class="scorePart">
                20문제 중
                <input
                  type="text"
                  id="inputBox4"
                  placeholder="0"
                  size="6"
                  class="scoreBox"
                />
                개
              </span>
              <span class="blueFont expectedScore"></span>
            </li>
            <li>
              <label for="inputBox5" class="listItem"
                >정보시스템 구축관리:</label
              >
              <span class="scorePart">
                20문제 중
                <input
                  type="text"
                  id="inputBox5"
                  placeholder="0"
                  size="6"
                  class="scoreBox"
                />
                개
              </span>
              <span class="blueFont expectedScore"></span>
            </li>
          </ol>
        </div>

        <!-- 6)	최종 결과를 출력하기 위한 버튼 태그 생성 -->
        <!-- 최종결과 출력용 버튼 생성 -->
        <div id="btnArea">
          <input type="button" value="최종 결과 확인" id="checkBtn" />
        </div>
      </main>

      <!-- ---------------------footer--------------------- -->
      <footer id="finalResultArea" style="display: none">
        <h2># 최종결과</h2>
        <h4 class="blueFont">
          합격: 100점을 만점으로 하여 과목당 40점 이상, 전과목 평균 60점 이상.
        </h4>

        <!-- 목록태그 생성 -->
        <ul>
          <li id="subjectAvg"></li>
          <li id="failedNum"></li>
        </ul>

        <!-- 7)	최종 결과를 출력하는 영역 태그 및 하위 태그 생성 -->
        <!-- 최종결과 출력용 영역 태그 및 하위 태그 생성 -->
        <div id="finalResult">
          <span id="finalResultPhrase"></span>
        </div>
      </footer>
    </div>
  </body>
</html>

 

 

subject_style.css

/* css 작성 */

/* 1)	전체 화면 : 폭은 800px, 높이는 620px, 화면 중앙 정렬 */
body > #frame {
  width: 800px;
  height: 620px;
  margin: 0 auto;
  border: 1px dotted black;
  box-sizing: border-box;
  padding: 0 5px;
}

/* 2)	상단의 제목 : 가운데 정렬 */
header > h1 {
  text-align: center;
  background-color: #00008b;
  color: white;
}

/* 3)	"맞춘 개수를 출력하는 영역"에 임의의 배경색 변경 */
main {
  background-color: #f0ffff;
}

main > #scoreContents {
  padding-left: 30px;
}

main > #scoreContents > h4 {
  padding-top: 28px;
}

main > #scoreContents > ol > li > .listItem {
  display: inline-block;
  width: 175px;
}

main > #scoreContents > ol > li > .scorePart > .scoreBox {
  text-align: right;
}

main > #btnArea {
  width: 800px;
  text-align: center;
  padding-bottom: 10px;
}

main > #btnArea > #checkBtn {
  background-color: #00ffff;
  font-weight: bold;
  border-radius: 8px;
}

footer > #finalResult {
  text-align: center;
}

/* 4) 불합격 문구의 배경색(=gainsboro) & 글자색(=red)을 기준 이미지와 같이 변경 */
footer > #finalResult > #finalResultPhrase {
  display: inline-block;
  background-color: gainsboro;
  color: red;
  font-weight: bold;
  font-size: 15px;
  width: 100px;
  height: 25px;
}

/* 5) 맞춘 개수, 예상점수, 합격 조건 문구의 font 색상 "blue"로 적용 */
.blueFont {
  color: blue;
}

 

 

subject_script.js

// javascript 작성

// 5)	DOM의 element들을 JavaScript로 불러와 활용 및 조작
window.onload = function () {
  // 점수 입력박스 5개(keyup 이벤트 적용)
  let scoreBox = document.querySelectorAll(".scoreBox");
  // 최종 결과 확인 버튼(click 이벤트 적용)
  let resultCheckBtn = document.querySelector("#checkBtn");

  for (let i = 0; i < scoreBox.length; i++) {
    scoreBox[i].addEventListener("keyup", function () {
      // 예상점수 문구 영역 5개
      let expectedScore = document.querySelectorAll(".blueFont.expectedScore");

      // 각 점수 입력박스 별로 입력값을 지우고 난 뒤
      // 재입력하는 경우에 다시 예상점수 문구를 보여주기 위해 추가한 코드입니다.
      expectedScore[i].style.display = "inline-block";

      /*
          2)	점수를 입력하는 입력박스에 문자를 입력하면 ‘숫자를 입력하세요’ 문구를 출력하고,
              20을 넘어갈 경우 ‘각 과목당 맞춘 문제수(0~20)를 입력하세요’ 문구를 출력하고,
              해당 입력박스의 값을 null로 초기화 시키고 예상점수 문구를 안보이도록 설정.
      */
      if (isNaN(scoreBox[i].value)) {
        alert("숫자를 입력하세요");
        scoreBox[i].focus();
        scoreBox[i].value = null;
        expectedScore[i].style.display = "none";
        return;
      }
      if (parseInt(scoreBox[i].value) > 20 || parseInt(scoreBox[i].value) < 0) {
        alert("각 과목당 맞춘 문제수(0~20)를 입력하세요");
        scoreBox[i].focus();
        scoreBox[i].value = null;
        expectedScore[i].style.display = "none";
        return;
      }
      // 각 점수 입력박스 별로 입력했던 값을 지우면
      // 해당 예상점수 문구가 안보이게 처리한 코드입니다.
      if (scoreBox[i].value.trim().length == 0) {
        expectedScore[i].style.display = "none";
        return;
      }
      // 각 점수 입력박스 별로 양의 정수가 아닌
      // 소수점이 들어간 숫자(ex. 1.1 등)를 입력한 경우
      // 아래와 같이 경고창을 띄우고
      // 해당 입력박스의 값을 null로 초기화 시키고
      // 해당 예상점수 문구가 안보이게 처리한 코드입니다.
      if (scoreBox[i].value.indexOf(".") != -1) {
        alert("양의 정수(0~20)를 입력하세요");
        scoreBox[i].focus();
        scoreBox[i].value = null;
        expectedScore[i].style.display = "none";
        return;
      }

      /*
          1)	점수를 입력하는 입력박스에 숫자를 입력할 경우에만
              이미지와 같이 예상점수를 1문제당 5점으로 계산하여 출력
      */
      expectedScore[i].innerHTML = `[예상점수] ${
        parseInt(scoreBox[i].value) * 5
      }점`;
    });
  }

  /*
      3)	최종 결과 확인 버튼을 누를 경우에만 최종 결과가 보이도록
          클릭 이벤트를 설정하고 해당 최종 결과 영역에 display 속성값(block) 부여
  */
  resultCheckBtn.addEventListener("click", function () {
    let finalResultArea = document.querySelector("#finalResultArea");
    let subjectAvg = document.querySelector("#subjectAvg");
    let failedNum = document.querySelector("#failedNum");
    let finalResultPhrase = document.querySelector("#finalResultPhrase");

    // 점수가 미입력된 과목이 한 개라도 있는 경우
    // 최종 결과 확인 버튼을 누르면 경고창을 띄우고
    // 최종 결과를 보여주지 않도록 처리하였습니다.
    for (let j = 0; j < scoreBox.length; j++) {
      if (scoreBox[j].value == "") {
        alert(
          "점수가 미입력된 과목이 있습니다.\n확인 후 반드시 점수를 입력해주세요."
        );
        scoreBox[j].focus();
        // 최종 결과를 확인한 후 점수 수정이 필요하여
        // 수정하는 과정에서 실수로 점수를 미입력한 경우
        // 최종 결과를 보여주지 않도록 처리하였습니다.
        finalResultArea.style.display = "none";
        return;
      }
    }

    // 4)	최종 결과 영역에 평균, 과락된 과목 수의 값을 계산하여 출력
    // 과목 점수의 총합
    let totalScore = 0;
    // 과락된 과목의 개수
    let subjectNum = 0;

    for (let k = 0; k < scoreBox.length; k++) {
      totalScore += parseInt(scoreBox[k].value) * 5;

      if (parseInt(scoreBox[k].value) * 5 < 40) {
        subjectNum++;
      }
    }

    // 과목 점수의 평균
    let subjectAverage = totalScore / scoreBox.length;

    if (subjectAverage >= 60 && subjectNum == 0) {
      subjectAvg.innerHTML = `평균: ${subjectAverage}`;
      failedNum.innerHTML = `과락된 과목 수: ${subjectNum}과목`;
      finalResultPhrase.innerHTML = "합격";

      finalResultArea.style.display = "block";
    } else {
      subjectAvg.innerHTML = `평균: ${subjectAverage}`;
      failedNum.innerHTML = `과락된 과목 수: ${subjectNum}과목`;
      finalResultPhrase.innerHTML = "불합격";

      finalResultArea.style.display = "block";
    }
  });
};