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) 식으로 삼각함수 연산자 내부에 괄호가 있을 때만 계산되도록 고민중(괄호가 문제)
'Project > JavaScript' 카테고리의 다른 글
[JavaScript 프로젝트 : 공학용 계산기] 공학용 계산기 upgraded (0) | 2022.01.26 |
---|---|
[JavaScript 프로젝트 : 공학용 계산기] 중복 연산자 제거 (0) | 2022.01.19 |
[JavaScript 프로젝트 : 공학용 계산기] 기본 공학용 계산기 (0) | 2022.01.19 |
[JavaScript 프로젝트 : 공학용 계산기] 문자열 시작, 끝 검색 (0) | 2022.01.18 |
댓글