API Basic Arithmetic ko - LIHACHTETAN/ClassicUO-BadNewbie-BasicIDE GitHub Wiki
+, -, *, /, MOD
ClassicUO โข Basic
์ฐ์ ์์ ๊ฐ์ ๊ณ์ฐํฉ๋๋ค. +๋ ๋ํ๊ธฐ, -๋ ๋นผ๊ธฐ ๋๋ ๋ถํธ ๋ฐ์ , *๋ ๊ณฑํ๊ธฐ, /๋ ๋๋๊ธฐ, MOD๋ ์ ์ ๋๋จธ์ง์ ๋๋ค. ๊ฒฐ๊ณผ๋ฅผ ๋ณ์์ ๋์ ํ๊ฑฐ๋ RETURN์ผ๋ก ๋ฐํํ์ฌ ์ฌ์ฉํฉ๋๋ค.
์ ํํ ๊ตฌ๋ฌธ
left + right
left - right
-right
left * right
left / right
left MOD right
(expression)
๋งค๊ฐ๋ณ์
leftโ ์ผ์ชฝ ์ซ์ ํผ์ฐ์ฐ์: ๋ฆฌํฐ๋ด, ์ ์ธ๋ ๋ณ์, ๊ดํธ์ ๋๋ ํจ์ ๊ฒฐ๊ณผ์ ๋๋ค. ๋จํญ ๋ง์ด๋์ค์๋ ์ผ์ชฝ ํผ์ฐ์ฐ์๊ฐ ์์ต๋๋ค.rightโ ์ค๋ฅธ์ชฝ ์ซ์ ํผ์ฐ์ฐ์์ ๋๋ค. /์์๋ ์ ์์ ๋๋ค. MOD๋ Integer๋ก ๋ณํํ ๋ค์๋ 0์ด ์๋์ด์ผ ํฉ๋๋ค. ์๋ฅผ ๋ค์ด 0.5๋ 0์ผ๋ก ์๋ ค ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค.operator / precedenceโ ์ฐ์ ์์๋ ๋จํญ ๋ง์ด๋์ค, ๊ฐ์ ์ฐ์ ์์์ * / MOD๋ฅผ ์ผ์ชฝ๋ถํฐ, ์ดํญ + -๋ฅผ ์ผ์ชฝ๋ถํฐ ๊ณ์ฐํ๋ ์์์ ๋๋ค. ๊ดํธ๋ก ์์๋ฅผ ๋ฐ๊ฟ ์ ์์ต๋๋ค. ๋จํญ ํ๋ฌ์ค, ๊ฑฐ๋ญ์ ๊ณฑ ^, ์ญ์ฌ๋์ ์ ์ ๋๋์ ์ ์ง์ํ์ง ์์ต๋๋ค.
๋ฐํ๊ฐ
์ ์์ +, -, *, ๋จํญ ๋ง์ด๋์ค๋ Integer์ ๋๋ค. ์ฐธ์ฌํ๋ ์ซ์ ํผ์ฐ์ฐ์๊ฐ Decimal์ด๋ฉด Decimal์ ๋ฐํํฉ๋๋ค. /๋ ํญ์ Decimal์ด๋ฉฐ 5/2=2.5์ ๋๋ค. MOD๋ Integer๋ฅผ ๋ฐํํฉ๋๋ค. ๊ณ์ฐ๋ ์ซ์์ด๋ฉฐ ์ฑ๊ณต ์ฌ๋ถ๋ ์์ดํ ์๋ผ๋ ์๋ฏธ๋ ์คํฌ๋ฆฝํธ๊ฐ ๋ถ์ฌํฉ๋๋ค.
๋์
- MOD๋ ๋ ํผ์ฐ์ฐ์๋ฅผ ๋ถํธ ์๋ 32๋นํธ ์ ์๋ก ๋ฐ๊พธ๊ณ ํํ ๊ฐ๋ฅํ ์์ ๋ถ๋ถ์ 0 ๋ฐฉํฅ์ผ๋ก ์๋ฆ ๋๋ค. ๋๋จธ์ง ๋ถํธ๋ ํผ์ ์์ ๊ฐ์ต๋๋ค. -17 MOD 5=-2, -2147483648 MOD -1=0์ ๋๋ค. mOd์ฒ๋ผ ๋์๋ฌธ์๋ฅผ ์์ด๋ ๊ฐ์ต๋๋ค.
- MOD์ ์ ์๊ฐ 0์ด๋ฉด TRY/CATCH๋ก ์ฒ๋ฆฌํ ์ ์๋ ์ค๋ฅ๊ฐ ๋ฉ๋๋ค. /๋ ๋ถ๋์์์ ๋๋์ ์ผ๋ก, 0์ด ์๋ ๋ถ์๋ฅผ 0์ผ๋ก ๋๋๋ฉด ๋ถํธ ์๋ Infinity, 0/0์ NaN์ ๋๋ค. ์ ํํ ๊ฐ์ด ํ์ํ๋ฉด ์ ์๋ฅผ ๋ฏธ๋ฆฌ ํ์ธํ์ธ์.
- ์ ์ +, -, *, ๋ถํธ ๋ฐ์ ์ ์ค๋ฒํ๋ก ์ ํ์ 32๋นํธ๋ฅผ ์ ์งํ๋ฉฐ ๋ ํฐ ์ ์ํ์ผ๋ก ์๋ ํ์ฅํ์ง ์์ต๋๋ค. ๊ทผ์ฟ๊ฐ์ ํ์ฉํ๋ ํฐ ๊ณ์ฐ์ ๋จผ์ ํผ์ฐ์ฐ์๋ฅผ Decimal๋ก ๋ฐ๊ฟ ์ ์์ต๋๋ค. ๋ถ๋์์์ ์๋ ์ด์ง ๋ฐ์ฌ๋ฆผ ์ค์ฐจ๊ฐ ์์ต๋๋ค.
- ์ผ๋ฐ ์ซ์ ์ฐ์ฐ์๋ ํ ์คํธ๋ฅผ ์๋์ผ๋ก ํด์ํ์ง ์์ต๋๋ค. String+String์ ๋ฌธ์์ด์ ์ฐ๊ฒฐํ๊ณ String+Integer๋ ์คํจํฉ๋๋ค. ์ซ์ ํ ์คํธ๋ CDbl ๋ฑ์ผ๋ก ๋ช ์์ ์ผ๋ก ๋ณํํ์ธ์. ์ค์ MOD๋ ๋ณ๋ BasicMod ํจ์๋ณด๋ค ์ ์ ํ ์คํธ๋ฅผ ์๊ฒฉํ๊ฒ ํด์ํฉ๋๋ค.
- ํ๊ฐ๊ธฐ์์ ์์ ์์๋๋ก ํผ์ฐ์ฐ์๋ฅผ ๊ณ์ฐํ๊ณ ์ฐ์ฐ์ ํ ํฐ์ ์ ํํ์ฌ InjectionValue๋ฅผ ๋ง๋ญ๋๋ค. ๊ดํธ ์์ ์์ ๋จผ์ ๋๋ฉ๋๋ค. ํผ์ฐ์ฐ์ ์์ฒด๊ฐ ํด๋น API๋ฅผ ํธ์ถํ์ง ์๋ ํ ์ด๋, ๋๊ธฐ, ๋คํธ์ํฌ ์์ฒญ์ ๋ฐ์ํ์ง ์์ต๋๋ค.
์์
1. ์ฐ์ ์์์ ๊ดํธ
# plain=2+3*4๋ ๊ณฑ์
์ ๋จผ์ ๊ณ์ฐํ์ฌ 14๊ฐ ๋ฉ๋๋ค. grouped=(2+3)*4๋ 20์
๋๋ค. Main์ plain*100+grouped=1420์ ๋ฐํํ์ฌ ๋ ๊ณ์ฐ์ ํ์ธํฉ๋๋ค.
Option Explicit On
SUB Main()
VAR plain = 2 + 3 * 4
VAR grouped = (2 + 3) * 4
RETURN plain * 100 + grouped
END SUB
๋งค๊ฐ๋ณ์ ๋ฐ ์คํ ์ค๋ช :
plain=2+3*4๋ ๊ณฑ์ ์ ๋จผ์ ๊ณ์ฐํ์ฌ 14๊ฐ ๋ฉ๋๋ค. grouped=(2+3)4๋ 20์ ๋๋ค. Main์ plain100+grouped=1420์ ๋ฐํํ์ฌ ๋ ๊ณ์ฐ์ ํ์ธํฉ๋๋ค.
2. ์์ฑ๋ ๋ฌถ์๊ณผ ๋จ์ ์์ดํ
# DescribeBatches๋ total=27, size=5๋ฅผ ๋ฐ์ต๋๋ค. size ๊ฒ์ฌ๋ 0 ์ดํ์ ๋ฌถ์ ํฌ๊ธฐ๋ฅผ ๊ฑฐ๋ถํฉ๋๋ค. Fix(total/size)๋ 5.4๋ฅผ ์์ฑ๋ 5๋ฌถ์์ผ๋ก ๋ฐ๊พธ๊ณ , total mOd size๋ ๋จ์ 2๊ฐ๋ฅผ ๊ตฌํฉ๋๋ค. CStr๋ก ๋ฐํ ๋ฌธ์์ด "5:2"๋ฅผ ๋ง๋ญ๋๋ค. ๋ณด์กฐ ํจ์ ์ ์ฒด๊ฐ ํฌํจ๋ฉ๋๋ค.
Option Explicit On
FUNCTION DescribeBatches(total, size)
IF size <= 0 THEN
RETURN "invalid"
END IF
VAR whole = Fix(total / size)
VAR remaining = total mOd size
RETURN CStr(whole) + ":" + CStr(remaining)
END FUNCTION
SUB Main()
RETURN DescribeBatches(27, 5)
END SUB
๋งค๊ฐ๋ณ์ ๋ฐ ์คํ ์ค๋ช :
DescribeBatches๋ total=27, size=5๋ฅผ ๋ฐ์ต๋๋ค. size ๊ฒ์ฌ๋ 0 ์ดํ์ ๋ฌถ์ ํฌ๊ธฐ๋ฅผ ๊ฑฐ๋ถํฉ๋๋ค. Fix(total/size)๋ 5.4๋ฅผ ์์ฑ๋ 5๋ฌถ์์ผ๋ก ๋ฐ๊พธ๊ณ , total mOd size๋ ๋จ์ 2๊ฐ๋ฅผ ๊ตฌํฉ๋๋ค. CStr๋ก ๋ฐํ ๋ฌธ์์ด "5:2"๋ฅผ ๋ง๋ญ๋๋ค. ๋ณด์กฐ ํจ์ ์ ์ฒด๊ฐ ํฌํจ๋ฉ๋๋ค.
3. ์๋ชป๋ ์ ์ ์ฒ๋ฆฌ
# 10 MOD 0์ unusedResult์ ๋์
ํ๊ธฐ ์ ์ ์ค๋ฅ๋ฅผ ๋
๋๋ค. CATCH๋ problem์ ์ค๋ฅ๋ฅผ ์ ์ฅํ๊ณ caught=TRUE๋ก ์ค์ ํฉ๋๋ค. Main์ ๋ฐํ๊ฐ 1์ ์ด ์์ ์ ์ค๋ฅ ์ฒ๋ฆฌ ํ์์ด๋ฉฐ ์คํจํ MOD์ ๊ฒฐ๊ณผ๊ฐ ์๋๋๋ค.
Option Explicit On
SUB Main()
VAR caught = FALSE
TRY
VAR unusedResult = 10 MOD 0
CATCH problem
caught = TRUE
END TRY
RETURN caught
END SUB
๋งค๊ฐ๋ณ์ ๋ฐ ์คํ ์ค๋ช :
10 MOD 0์ unusedResult์ ๋์ ํ๊ธฐ ์ ์ ์ค๋ฅ๋ฅผ ๋ ๋๋ค. CATCH๋ problem์ ์ค๋ฅ๋ฅผ ์ ์ฅํ๊ณ caught=TRUE๋ก ์ค์ ํฉ๋๋ค. Main์ ๋ฐํ๊ฐ 1์ ์ด ์์ ์ ์ค๋ฅ ์ฒ๋ฆฌ ํ์์ด๋ฉฐ ์คํจํ MOD์ ๊ฒฐ๊ณผ๊ฐ ์๋๋๋ค.