21. 산술연산(사칙연산)
목표
숫자에 대해서 산술연산(사칙연산)을 수행하는 함수들((+)
, (-)
, (*)
, (/)
, (rem)
)을 알아봅시다
산술함수
우리가 일반적으로 사용하는 방식과 다르게
(1 + 2)
오토리습에서 사칙연산을 하려면 연산자가 가장 앞에 와야합니다.
(+ 1 2)
이는 오토리습에서는 연산자 개념이 없어서 산술연산조차 함수로 수행해야 하기 때문인데요.
덧셈과 뺄셈, 곱셈과 나눗셈(몫, 나머지)는 각각 (+)
, (-)
, (*)
, ((/)
, (rem)
) 함수로 수행됩니다
1
2
3
4
5
6
7
8
9
10
11
12
13
; 덧셈
(+ 5 7) ; 12
; 뺄셈
(- 3 10) ; -7
; 곱셈
(* 2 4) ; 8
; 나눗셈(몫)
(/ 9 4) ; 2
; 나눗셈(나머지)
(rem 9 4) ; 1
- 참고로
rem
은 나머지라는 뜻의 영어단어인 remnant의 줄임말입니다.
정수와 실수
만약 피연산자 모두가 정수일 경우에는 그 정수연산을 하여 정수를 반환하며, 피연산자들 중 1개 이상이 실수일 경우, 실수연산을 한 후 실수를 반환합니다.
실수연산이라함은 (/)
함수의 경우에 잘 나타나는데요. (/)
함수를 정수만을 대상으로 수행한 결과와 실수가 포함되어 있을 경우의 차이는 다음과 같습니다.
1
(/ 5 2) ; 2
이 경우는 5와 2 모두 정수이기 때문에, (/)
함수는 정수연산을 시행합니다. 따라서 5를 2로 나눈 몫은 2가 됩니다.
1
(/ 5 2.0) ; 2.5
반대로 이 경우에는 5는 정수이지만 2.0은 실수이므로, (/)
함수는 실수연산을 시행합니다. 따라서 5를 2로 나눈 값은 2.5가 됩니다.
만약 위의 2.0처럼 실제 값은 정수이지만 형식이 실수인 경우에 정수연산을 시행하고 싶다면,
(fix)
함수를 사용해서 실수를 정수로 변경할 수 있습니다.(fix)
함수는 실수의 소숫점을 버리고 정수로 변경합니다.
1 (/ 5 (fix 2.0)) ; 2
실습
사용자로부터 연산자와 두 수를 받아서, 두 수를 연산자로 연산한 결과를 보여줘 봅시다
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
(progn
(initget "+ - * /")
(setq kw (getkword "\n연산자 선택 - 덧셈(+), 뺄셈(-), 곱셈(*), 나눗셈(/) : "))
(setq n1 (getint "\n첫 번째 정수 입력 : "))
(setq n2 (getint "\n두 번째 정수 입력 : "))
(cond
((= kw "+")
(princ (strcat (itoa n1) kw (itoa n2) "=" (itoa (+ n1 n2))))
)
((= kw "-")
(princ (strcat (itoa n1) kw (itoa n2) "=" (itoa (- n1 n2))))
)
((= kw "*")
(princ (strcat (itoa n1) kw (itoa n2) "=" (itoa (* n1 n2))))
)
((= kw "/")
(princ (strcat (itoa n1) kw (itoa n2) "=" (itoa (/ n1 n2)) "(몫)"))
)
)
(princ)
)
(strcat)
함수는 문자열만 받아서 연결해주는 함수이므로, 사용자가 입력한 정수를(itoa)
함수를 통해 문자열로 변경시켜 주었습니다.
사용자가 반드시 연산자와 숫자를 입력한다는 가정하에 작성되었으니, 일부를 입력하지 않을 경우에는 정상적으로 실행되지 않습니다.