포스트(post)

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)함수를 통해 문자열로 변경시켜 주었습니다.

사용자가 반드시 연산자와 숫자를 입력한다는 가정하에 작성되었으니, 일부를 입력하지 않을 경우에는 정상적으로 실행되지 않습니다.

© IsaacGo. All rights reserved.