- Frederick Philips Brooks
Mythical Man-Month 저자
728x90
반응형
퀴즈 이펙트 5번 입니다.
완성된 화면 입니다.
html코드입니다.
<!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>퀴즈 이펙트05</title>
<link rel="stylesheet" href="css/reset.css">
<link rel="stylesheet" href="css/quiz.css">
</head>
<body>
<header id="header">
<h1><a href="../javascript14.html">Quiz</a><em>객관식 확인하기(여러문제) 유형</em></h1>
<ul>
<li><a href="quizEffect01.html">1</a></li>
<li><a href="quizEffect02.html">2</a></li>
<li><a href="quizEffect03.html">3</a></li>
<li><a href="quizEffect04.html">4</a></li>
<li class="active"><a href="quizEffect05.html">5</a></li>
</ul>
</header>
<!-- //header -->
<main id="main">
<div class="quiz_wrap">
<!-- <div class="quiz">
<div class="quiz_header">
<h2 class="quiz_title"></h2>
</div>
<div class="quiz_main">
<div class="quiz_quection">
</div>
<div class="quiz_view">
<div class='dog_wrap'>
<div class="ture">정답입니다.</div>
<div class="false">틀렸습니다!</div>
<div class='card-container'>
<div class="dog">
<div class="head">
<div class="ears"></div>
<div class="face"></div>
<div class="eyes">
<div class="teardrop"></div>
</div>
<div class="nose"></div>
<div class="mouth">
<div class="tongue"></div>
</div>
<div class="chin"></div>
</div>
<div class="body">
<div class="tail"></div>
<div class="legs"></div>
</div>
</div>
</div>
</div>
</div>
<div class="quiz_choice">
<label for="choice1">
<input type="radio" id="choice1" value="1" name="choice">
<span></span>
</label>
<label for="choice2">
<input type="radio" id="choice2" value="2" name="choice">
<span></span>
</label>
<label for="choice3">
<input type="radio" id="choice3" value="3" name="choice">
<span></span>
</label>
<label for="choice4">
<input type="radio" id="choice4" value="4" name="choice">
<span></span>
</label>
</div>
<div class="quiz_answer">
<button class="confirm">정답 확인 하기</button>
</div>
</div>
<div class="quiz_desc"></div>
</div> -->
</div>
</main>
<!-- //main -->
<footer id="footer">
<a href="mailto:ture403@gmail.com">ture403@gmail.com</a>
</footer>
</body>
- 다중으로 문제를 만들때 일일이 HTML에 입력해서 표출하는건 너무 노다가 작업입니다.
- 자바스크립트를 이용해서 반복을 해서 문제를 계속 표출하게 하는게 더 효율적일 것입니다.
JS코드입니다.
const quizInfo = [
{
infoType : "정보처리 기능사",
infoTime : "2011년도 5회",
infoNumber : "20110501",
infoQuection : "JK 플립플롭(Flip Flop)에서 보수가 출력되기 위한 J, K의 입력 상태는?",
infoChoice : {
1: "J=1, K=0",
2: "J=0, K=1",
3: "J=1, K=1",
4: "J=0, K=0"
},
infoAnswer :"3",
infoDesc : "JK 플리플롭은 만능 플리플롭이라고 불리울 만큼 기능이 많으며 모든 플리플롭의 기능을 대체할수 있습니다.특히 J=1, K=1 일때 T 플립플롭 즉 보수, 반전 기능으로 작동 합니다."
},{
infoType : "정보처리 기능사",
infoTime : "2011년도 5회",
infoNumber : "20110502",
infoQuection : "보기의 도형과 관련 있는 것은?",
infoChoice : {
1 : "OR게이트",
2 : "버퍼(buffer)",
3 : "NAND게이트 ",
4 : "인버터(Invert)"
},
infoAnswer :"4",
infoDesc : "인버터(Invert), NOT 게이트 입니다."
},{
infoType : "정보처리 기능사",
infoTime : "2011년도 5회",
infoNumber : "201105013",
infoQuection : "중앙처리장치(CPU)에 해당하는 부분을 하나의 대규모 집적회로의 칩에 내장시켜 기능을 수행하게 하는 것은?",
infoChoice : {
1 : "마이크로프로세서",
2 : "컴파일러",
3 : "소프트웨어",
4 : "레지스터"
},
infoAnswer :"1",
infoDesc : "마이크로프로세서란 하나의 칩안에 CPU의 각종 기능을 모두 내장한 형태를 말합니다."
},{
infoType : "정보처리 기능사",
infoTime : "2011년도 5회",
infoNumber : "201105014",
infoQuection : "명령의 오퍼랜드 부분에 실제 데이터가 기록되어 있어 메모리 참조를 하지 않고 데이터를 처리하는 방식으로 수행 시간이 빠르지만 오퍼랜드 길이가 한정되어 실제 데이터의 길이에 제약을 받는 주소지정 방식은?",
infoChoice : {
1 : "Direct Addressing",
2 : "Indirect Addressing",
3 : "Relative Addressing",
4 : "Immediate Addressing"
},
infoAnswer :"4",
infoDesc : "메모리를 참조 하지 않는다고 하였으므로 묵시적 또는 즉시주소 방식중 하나 입니다..이때 스택에 관한 언급이 없으므로 즉시주소방식(Immediate Addressing) 입니다."
},{
infoType : "정보처리 기능사",
infoTime : "2011년도 5회",
infoNumber : "20110505",
infoQuection : "명령어의 주소(Address)부를 연산 주소(Address)로 이용하는 주소지정방식은?",
infoChoice : {
1 : "상대 Addressing 방식",
2 : "절대 Addressing 방식",
3 : "간접 Addressing 방식",
4 : "직접 Addressing 방식"
},
infoAnswer :"4",
infoDesc : "레지스터에 저장된 값을 연산하는 것은 '연산 명령어' 입니다."
},{
infoType : "정보처리 기능사",
infoTime : "2011년도 5회",
infoNumber : "20110506",
infoQuection : "연산자의 기능과 거리가 먼 것은?",
infoChoice : {
1 : "주소지정 기능",
2 : "제어 기능",
3 : "함수연산 기능",
4 : "입/출력 기능"
},
infoAnswer :"1",
infoDesc : "명령어 = 명령어 코드부 + 명령어 주소부Instruction = Op_Code + Operand연산자의 기능과 거리가 먼것은이라고 하였으므로 주소와 관련된 이야기를 찾으시면 됩니다."
}
];
//선택자
const quizWrap = document.querySelector(".quiz_wrap");
let quizScore = 0;
//문제 출력
const updateQuiz = () => {
const exam = [];
quizInfo.forEach((qusection, number)=>{
exam.push(`
<div class="quiz">
<div class="quiz_header">
<h2 class="quiz_title">${qusection.infoType} ${qusection.infoTime}</h2>
</div>
<div class="quiz_main">
<div class="quiz_quection"><em>${number+1}</em>. ${qusection.infoQuection}
</div>
<div class="quiz_view">
<div class='dog_wrap'>
<div class="ture">정답입니다.</div>
<div class="false">틀렸습니다!</div>
<div class='card-container'>
<div class="dog">
<div class="head">
<div class="ears"></div>
<div class="face"></div>
<div class="eyes">
<div class="teardrop"></div>
</div>
<div class="nose"></div>
<div class="mouth">
<div class="tongue"></div>
</div>
<div class="chin"></div>
</div>
<div class="body">
<div class="tail"></div>
<div class="legs"></div>
</div>
</div>
</div>
</div>
</div>
<div class="quiz_choice">
<label for="choice1${number}">
<input type="radio" id="choice1${number}" value="1" name="choice${number}">
<span>${qusection.infoChoice[1]}</span>
</label>
<label for="choice2${number}">
<input type="radio" id="choice2${number}" value="2" name="choice${number}">
<span>${qusection.infoChoice[2]}</span>
</label>
<label for="choice3${number}">
<input type="radio" id="choice3${number}" value="3" name="choice${number}">
<span>${qusection.infoChoice[3]}</span>
</label>
<label for="choice4${number}">
<input type="radio" id="choice4${number}" value="4" name="choice${number}">
<span>${qusection.infoChoice[4]}</span>
</label>
</div>
</div>
<div class="quiz_desc">정답은 <em>${qusection.infoAnswer}</em>번 입니다.<br>${qusection.infoDesc}</div>
</div>
`);
});
exam.push(`
<div class="quiz_info">??점</div>
<div class="quiz_check">정답 확인</div>
`);
quizWrap.innerHTML = exam.join('');
//설명 숨기기
document.querySelectorAll(".quiz_desc").forEach(el=> el.style.display = "none");
};
updateQuiz();
// 정답 확인
const answerQuiz = () => {
const quizChoices = document.querySelectorAll(".quiz_choice");
//사용자가 체크한 정답 == 문제 정답
quizInfo.forEach((qusection, number)=>{
const userSelector = `input[name=choice${number}]:checked`;
const quizSelectorWrap = quizChoices[number];
const userAnswer = (quizSelectorWrap.querySelector(userSelector) || {}).value; //사용자가 체크한 정답 찾기
const dogWrap = quizWrap.querySelectorAll(".dog_wrap");
if(userAnswer == qusection.infoAnswer){
dogWrap[number].classList.add("like");
quizScore++;
} else{
dogWrap[number].classList.add("dislike");
}
});
//설명 보이기
document.querySelectorAll(".quiz_desc").forEach(el=> el.style.display = "block");
//점수 보이기
document.querySelector(".quiz_info").innerHTML = Math.ceil((quizScore / quizInfo.length) * 100) + "점";
}
// 정답 클릭
document.querySelector(".quiz_check").addEventListener("click", answerQuiz);
- 자바스크립트에 push를 이용해서 html코드를 적었습니다.
- 문제를 계속 만들꺼니 forEach를 통해 반복을 돌려서 문제를 만들었습니다. 백틱으로 감싸서 처리했습니다.
- 문제를 풀떄 설명을 보여주면 안되니 display = block 으로 했습니다.
- quizinfo에 정답체크를 할껀데 먼제 quizinfo 안에 있는 문제들을 돌면서 input 박스에 체크되어있는 값을 가져와서 quizinfo 안에있는 답과 맞는지 확인해서 변수하나 생성해서 quizScore 를 1씩 증가 시켜서 갯수를 확인합니다.
- 그리고 다 해설을 보여주기 위해서 diplay = none 을 display = block 변경을 했습니다.
- 점수를 표현하기 위해서 Math 메서드를 써서 quizScore에 있는 갯수를 참고해서 점수를 출력했습니다.
- .quiz_check를 눌르면 그때 만들어 두었던 answerQuiz를 출력했습니다.
완성된 코드를 확인해보세요.
https://github.com/ture403/web2023/blob/main/javascript/quiz/quizEffect05.html
완성된 전체 화면을 확인해보세요.
https://ture403.github.io/web2023/javascript/quiz/quizEffect05.html