본문 바로가기
Project/JavaScript

[JavaScript 프로젝트 : 공학용 계산기] 삼각함수 계산

by 꾸압 2022. 1. 18.

s. c, t, p 등 변수에 따라 삼각함수 계산이 가능하도록 추가하고자 하였다.

split을 통해 앞 문자열 / 뒷 문자열로 나누어 계산하고자 하였다.

삼각함수 연산자 앞에 숫자가 있을 경우 배열 afterTmp[0], 연산자 뒤의 숫자는 afterTmp[1] 에 저장한다.

문제는 연산자 앞에 숫자가 없을 경우 연산자 뒷 숫자가 afterTmp[0] 에 저장될 줄 알았으나

되려 afterTmp[0] 에 null 값이, afterTmp[1] 에 연산자 뒷편 숫자가 저장됨을 확인하였다.

이유는 모르겠다.

 

<초안 코드>

let letters = '3pow21';

console.log(letters);

// split을 하면 기준에 따라 2개의 배열로 나누는데,
// 기준점 앞 문자가 null 이라면 배열[0] 값은 null
// 배열[1] 에는 자료가 정상 저장 됨
let afterTmp = letters.split(/sin|cos|tan|pow/);

console.log('배열 [0] : ' + afterTmp[0]);
console.log('배열 [1] : ' + afterTmp[1]);


function triCal(arr, triNum) {

    let num = '0';

    switch (triNum) {
        case 's':
            num = Math.sin(afterTmp[1]);
            if(!isNaN(parseFloat(afterTmp[0]))) { return parseFloat(afterTmp[0]) + parseFloat(num); }
            else { return parseFloat(num); }
        case 'c':
            num = Math.cos(afterTmp[1]);
            if(!isNaN(parseFloat(afterTmp[0]))) { return parseFloat(afterTmp[0]) + parseFloat(num); }
            else { return parseFloat(num); }
        case 't':
            num = Math.tan(afterTmp[1]);
            if(!isNaN(parseFloat(afterTmp[0]))) { return parseFloat(afterTmp[0]) + parseFloat(num); }
            break;
        case 'p':
            if(!isNaN(parseFloat(afterTmp[0]))) {
                num = Math.pow(afterTmp[0], afterTmp[1]);
                return parseFloat(num);
            }
            else console.log('입력 error');
            break;
    }
}

console.log(triCal(afterTmp, 'p'));

 

 

<공학용 계산기에 적용시킨 코드>

// 입력 문자가 여러 숫자거나(22, 456 등), 삼각함수 연산자일 경우 임시 저장하기 위한 tmp
// 숫자 x sin 이런 식으로 쓰는 사람도 있지만, 공대에선 보통 33sin 이런 식으로 곱셈을 생략하기에 문자열 덩어리 tmp를 만듦
let tmp += form.charAt(i);

// 입력 문자열에 삼각함수 연산자가 있는지 확인 s|c|t|p
function checkTriNum(letters){
    if(letters.includes('s')) return true;
    else if(letters.includes('c')) return true;
    else if(letters.includes('t')) return true;
    else if(letters.includes('p')) return true;
}

// 삼각함수 안에 괄호가 있는건 여기서 고려하지 않고, 
// 삼각함수 연산자 다음에 숫자가 나온 뒤 다른 연산자 혹은 문자열의 끝을 만나면
// 바로 삼각함수가 계산되도록 하였다. (form) 은 원본 문자열
if(isNaN(form.charAt(i+1)) || (i+1 === form.length)) {

    // 삼각함수 검사
    if(checkTriNum(tmp)) {

        console.log('tmp 진입 확인 : ' + tmp);

        if(tmp.includes('s')) { tmp = triCal(tmp, 's'); }
        else if(tmp.includes('c')) { tmp = triCal(tmp, 'c'); }
        else if(tmp.includes('t')) { tmp = triCal(tmp, 't'); }
        else if(tmp.includes('p')) { tmp = triCal(tmp, 'p'); }
    }

    console.log('triCal 계산값 : ' + tmp);

    if(checkTriNum(form.charAt(i+1))) {

    }
    else {
        console.log('tmp 전달 최종 : ' + tmp);
        arr.push(tmp);
        tmp = "";
    }

}

>>> sin, cos 등의 문자열을 s,c,t,p 등으로 줄인건 계산시 굳이 sin, cos 등을 full-name으로 문자열에 추가할 필요없이

계산기 코드가 삼각함수 연산자 임을 제대로 인식하시만 하면 된다고 판단하여 간략화시켰다.

 

<삼각함수 계산용 function>

// 삼각함수 변환 로직
function triCal(letters, triNum) {

    console.log('afterTmp 전환 전 tmp 확인 : ' + letters);

    // 삼각함수에 따라 split
    let afterTmp = letters.split(/s|c|t|p/);

    let num = '0';

    console.log('afterTmp 변환 확인 : ' + afterTmp + '\n');

    switch (triNum) {
        case 's':
            num = Math.sin(afterTmp[1]);

            console.log(afterTmp[1]);
            console.log('sin 계산 : ' + Math.sin(afterTmp[1]));
            console.log('num 전환값 : ' + num);

            if(!isNaN(parseFloat(afterTmp[0]))) { 
                return parseFloat(afterTmp[0]) * parseFloat(num); 
            }
            else { 
                return parseFloat(num); 
            }
        case 'c':
            num = Math.cos(afterTmp[1]);
            if(!isNaN(parseFloat(afterTmp[0]))) { return parseFloat(afterTmp[0]) * parseFloat(num); }
            else { return parseFloat(num); }
        case 't':
            num = Math.tan(afterTmp[1]);
            console.log('arr[1] : ' + afterTmp[1]);
            console.log('num : ' + num + '\n');

            console.log(afterTmp[1]);
            console.log('tan 계산 : ' + Math.tan(afterTmp[1]));
            console.log('num 전환값 : ' + num);

            if(!isNaN(parseFloat(afterTmp[0]))) { return parseFloat(afterTmp[0]) * parseFloat(num); }
            break;
        case 'p':
            if(!isNaN(parseFloat(afterTmp[0]))) {
                num = Math.pow(parseFloat(afterTmp[0]), parseFloat(afterTmp[1]));
                console.log('pow 계산값 : ' + num);
                return parseFloat(num);
            }
            else return(console.log('입력 error'));
    }
}

 

>>> 현재 33sin(444) 식으로 삼각함수 연산자 내부에 괄호가 있을 때만 계산되도록 고민중(괄호가 문제)

 

댓글