코딩 공부/코드스테이츠 TIL

Code States 6일차

fullfish 2021. 10. 14. 23:01

오늘의 키포인트

계산기를 만들자

---------------------

시간내에 기본적인 계산기만 만들면 되며,
시간이 남는 다면 Advanced Challenges 그리고 더 시간이 남는다면 nightmare난이도를 풀면 되는데
Advanced까진 금방 풀었고 nightmare도 마지막 하나의 테스트 케이스만 빼고 풀었다
그 마지막 하나를 영영 통과 못하고 있다...

통과 못하고 있는 부분은 짧게 표현하자면
3+++2....5-1=4.5가 나오면 된다.
앞부분에 특이 케이스로
.이 여러개라도 1개와 마찬가지로 하기
+++이런식으로 나와도 +로 하기
3*3==== 하면 243이 나오기 이런 케이스를 하다보니
마지막 케이스와 충돌을 일으킨다
=를 처음 누를때와 그 이후로 나눠서 코딩을 했고 연산자 여러번 누를때도 연산자가 처음일때랑 그 이후로 나눴다.
마지막 케이스는 중간에 연산자가 많이 나오고 =는 한번이라 앞부분과 충돌이 되서 해결해 보려했는데 근본적으로 다르게 접근해야 할것같다

주말에 처음부터 해봐야겠다

----------------------

백그라운드 사진이 윈도우 크기에 따라 크기 달라지게 하기화면 크기에 따라 이미ㅇ지 크기 바뀌는거
body {

 

  width: 100%;

  height : 100vh;

  background-image: url('./data/bono.jpeg');

  background-repeat: no-repeat;

  background-size: cover;

  background-position: center;

}

----------------------------------저장용 코딩---------------------------

const calculator = document.querySelector('.calculator'); // calculator 엘리먼트와, 그 자식 엘리먼트의 정보를 모두 담고 있습니다.

const buttons = calculator.querySelector('.calculator__buttons'); // calculator__keys 엘리먼트와, 그 자식 엘리먼트의 정보를 모두 담고 있습니다.

const firstOperend = document.querySelector('.calculator__operend--left'); // calculator__operend--left 엘리먼트와, 그 자식 엘리먼트의 정보를 모두 담고 있습니다.

const operator = document.querySelector('.calculator__operator'); // calculator__operator 엘리먼트와, 그 자식 엘리먼트의 정보를 모두 담고 있습니다.

const secondOperend = document.querySelector('.calculator__operend--right'); // calculator__operend--right 엘리먼트와, 그 자식 엘리먼트의 정보를 모두 담고 있습니다.

const calculatedResult = document.querySelector('.calculator__result'); // calculator__result 엘리먼트와, 그 자식 엘리먼트의 정보를 모두 담고 있습니다.

let count = 0, decimalCount = 0, operCount = 0;

let i = 0 ;

let oper ='';

let midresult=0;

let n1=0, n2=0;

 

function calculate(n1, operator, n2) {

  let result = 0;

  // TODO : n1과 n2를 operator에 따라 계산하는 함수를 만드세요.

  // ex) 입력값이 n1 : '1', operator : '+', n2 : '2' 인 경우, 3이 리턴됩니다.

  switch(operator){

    case '+':

      result = n1 + n2;

        break;

    case '-':

      result = n1 - n2;

        break;

    case '/':

      result = n1 / n2;

        break;

     case '*':

       result = n1 * n2;

        break;

  }

  return String(result);

}

 

/* 기본모드

buttons.addEventListener('click', function (event) {

  // 버튼을 눌렀을 때 작동하는 함수입니다.

 

  const target = event.target; // 클릭된 HTML 엘리먼트의 정보가 저장되어 있습니다.

  const action = target.classList[0]; // 클릭된 HTML 엘리먼트에 클레스 정보를 가져옵니다.

  const buttonContent = target.textContent; // 클릭된 HTML 엘리먼트의 텍스트 정보를 가져옵니다.

  // ! 위 코드(Line 19 - 21)는 수정하지 마세요.

  if (target.matches('button')) {

    // TODO : 계산기가 작동할 수 있도록 아래 코드를 수정하세요. 작성되어 있는 조건문과 console.log를 활용하시면 쉽게 문제를 풀 수 있습니다.

    // 클릭된 HTML 엘리먼트가 button이면

    if (action === 'number' && count ===0) {

      // 그리고 버튼의 클레스가 number이면

      // 아래 코드가 작동됩니다.

      n1 += buttonContent;

      n1 = Number(n1);

      document.querySelector(".calculator__operend--left").textContent=n1;

      console.log('숫자 ' + buttonContent + ' 버튼');

      console.log(n1);

      console.log(firstOperend);

    }

 

    if (action === 'operator') {

      document.querySelector(".calculator__operator").textContent=buttonContent;

      oper = buttonContent;

      count +=1;

      console.log('연산자 ' + buttonContent + ' 버튼');

      console.log(oper);

      console.log(operator);

    }

 

    if (action === 'number' && count !== 0) {

      // 그리고 버튼의 클레스가 number이면

      // 아래 코드가 작동됩니다.

      n2 += buttonContent;

      n2 = Number(n2);

      document.querySelector(".calculator__operend--right").textContent=n2;

     

      console.log('숫자 ' + buttonContent + ' 버튼');

      console.log(n2);

    }




    if (action === 'decimal') {

       console.log('소수점 버튼');

   

      if(count === 0){

        n1 = n1 + '.';

        document.querySelector(".calculator__operend--left").textContent=n1;

        console.log(n1);

      }

      else{

        n2 = n2 + '.';

        document.querySelector(".calculator__operend--right").textContent=n2;

        console.log(n2);

      }

     

     

    }

     

 

    if (action === 'clear') {

      console.log('초기화 버튼 시작');

      n1 = 0;

      n2 = 0;

      oper = '';

      count = 0;

      res = 0;

      document.querySelector(".calculator__operend--left").textContent=0;

      document.querySelector(".calculator__operator").textContent='+';

      document.querySelector(".calculator__operend--right").textContent=0;

      console.log('초기화 중간');

      document.querySelector(".calculator__result").textContent=0;

      console.log('초기화 버튼끝');

    }

 

    if (action === 'calculate') {

      res = calculate(n1, oper, n2);

      res = Math.round(res*10)/10;

      document.querySelector(".calculator__result").textContent=res;

      console.log('계산 버튼');

      console.log(res);

    }

  }

 

});

*/

 

// ! Advanced Challenge test와 Nightmare test를 위해서는 아래 주석을 해제하세요.

 

const display = document.querySelector('.calculator__display--for-advanced'); // calculator__display 엘리먼트와, 그 자식 엘리먼트의 정보를 모두 담고 있습니다.

let firstNum, operatorForAdvanced, previousKey, previousNum;

 

buttons.addEventListener('click', function (event) {

  // 버튼을 눌렀을 때 작동하는 함수입니다.

 

  const target = event.target; // 클릭된 HTML 엘리먼트의 정보가 저장되어 있습니다.

  const action = target.classList[0]; // 클릭된 HTML 엘리먼트에 클레스 정보를 가져옵니다.

  const buttonContent = target.textContent; // 클릭된 HTML 엘리먼트의 텍스트 정보를 가져옵니다.

  // ! 위 코드는 수정하지 마세요.

 

  if (target.matches('button')) {

    if (action === 'number') {

      n1 += buttonContent;

      n1 = parseFloat(n1);    

      document.querySelector(".calculator__display--for-advanced").textContent=n1;

      console.log("숫자버튼 클릭");

    }

 

    if (action === 'operator') {

      if(oper ===''){

        midresult = n1;

        n1=0;

        decimalCount = 0;

        document.querySelector(".calculator__display--for-advanced").textContent=n1;

      }

      if(oper !== ''){

        if(operCount === 0){

          res = calculate(midresult, oper, n1);

          res = parseFloat(res);

         

          n1 = 0;

          console.log(`연산자 첫 계산 ${res}`);

        }

        else{

          res = calculate(midresult, oper, n1);

          res = parseFloat(res);

          i = res;

          n1 = 0;

          console.log(`연산자 그 후 계산 ${res}`);

        }

        midresult=res;

       

      }

      oper = buttonContent;

 

      console.log('연산자 클릭');

      console.log(oper);

      console.log(res);

    }

  }



    if (action === 'calculate' && oper !=='') {

      if(count === 0){

        if(n1 === 0){

          n1 = midresult;

        }

        res = calculate(midresult, oper, n1);

        res = parseFloat(res);

        count +=1;

      }

      else{

        res = calculate(res, oper, n1)

        res = parseFloat(res);

      }

      //res = Math.round(res*10)/10;

        document.querySelector(".calculator__display--for-advanced").textContent=res;

      console.log('계산 버튼');

      console.log(res);

    }

 

    if (action === 'clear') {

      console.log('초기화 버튼 시작');

      n1 = 0;

      midresult = 0;

      oper = '';

      res = 0;

      count = 0;

      decimalCount = 0;

      operCount = 0;

      document.querySelector(".calculator__display--for-advanced").textContent=0;

    }

 

    if (action === 'decimal' && decimalCount === 0) {

      console.log('소수점 버튼');

       n1 = n1 + '.';

       decimalCount +=1;

       document.querySelector(".calculator__display--for-advanced").textContent=n1;

       console.log(n1)

    }

 

});

 

'코딩 공부 > 코드스테이츠 TIL' 카테고리의 다른 글

Code States 8일차  (0) 2021.10.18
Code States 7일차  (0) 2021.10.15
Code State 5일차  (0) 2021.10.14
Code States 4일차  (0) 2021.10.12
Code States 3일차  (0) 2021.10.11