더시드위키
연습장(r521판)
편집 시각·1
[주의!] 문서의 이전 버전(에 수정)을 보고 있습니다. 최신 버전으로 이동
분류
as : "a" value to string; bs : "b" value to string;
al : "a" string length (integer); bl : "b" string length (integer)
ad : "a" decimal point (integer); bd : "b" decimal point (integer);
au :
ab : "a" below value (string→integer); bb : "b" below value (string→integer);
ap : "a" # of places of decimal (for addition or subtraction);
ac : a constant of "a" for division (integer);
bp : "b" # of places of decimal (for addition or subtraction);
bc : a constant of "b" for division (integer);
0.303과 0.0303은 다른 수이므로 자리수가 다름을 표시할 용도
ru : "result" upper value (integer→string); rb : "result" below value (integer→string);
rp : "result" # of places of decimal (integer);
rs : "result" suprerior value (integer→string); ri : "result" inferior value (integer→string);
i : index;
tu : temporary value 1 (integer); tv : temporary value 2 (integer);
tw : temporary value 3 (integer); tx : temporary value 4 (integer→string);
ty : temporary value 5 (integer); tz : temporary value 6 (integer);
pd : padding with zeros. (string)
ps : pass (logical); ts :
ea : error code about "a" (integer); eb : error code about "b" (integer);
wa : warning code about "a" (integer); wb : warning code about "b" (integer);
ma : message about "a" (string); mb : message about "b" (string);
tm : temporary string, or transaction message (string); tn : temporary string 2 (string);
ns : negative sign for multiplication and division (string);
값을 미리 정의하여 초기화합니다. 중간에
소수점이 존재하지 않을 경우 au 문자열 길이값을 ad로 정의합니다. au의 마지막 문자열 index는 ad-1이 됩니다.
the seed에서 지원되는 long(integer)가 unsigned였으면 1844경까지 가서 충분히 19자리로 놀 수 있었는데, signed long이므로 922경까지 가능한 공간에서 18자리로 잘라내기를 합니다. (소수점 위 최대 18자리, 소수점 아래 최대 18자리)
(반점(,)을 자동적으로 생략하고 들어가는 것은 나중에 생각하겠습니다.)
a와 b 모두 입력되었을 때, br와 ts 변수를 이용하여 순차적으로 검사를 진행합니다. 도중 문제가 있으면 (br를 true로 반환하고) 오류 코드를 내도록 만듭니다. a를 먼저 보며, 소수점 윗부분을 먼저 본 다음 소수점 아랫부분을 봅니다.
변수 tm와 tn을 가져와 유효성 검사를 실행합니다.
먼저 소수점을 2개 이상 입력했음이 탐지된다면 오류코드 5번(이중 소수점 표기)을 반환합니다.
소수점을 입력하면 indexOf와 lastIndexOf는 서로 다른 값을 가리키게 됩니다. 소수점을 입력하지 않았을 경우 indexOf와 lastIndexOf는 -1로 서로 같은 값을 가리키게 됩니다.
문제가 없으면 au를 tm으로 복제하고 검사를 계속 합니다.
앞자리가 마이너스(-)일 경우 이를 잘라냅니다. 이 때 소수점 윗자릿수가 넘치면 오류코드 1번(오버플로)를 반환합니다.
의도적으로 00을 적어놓았을 수 있으므로 tm 앞에 숫자 1을 더 붙인 다음, 이를 값으로 바꾼 다음 다시 텍스트 값으로 바꾼 문자열을 tn으로 정의합니다. 중간에 숫자가 아닌 문구가 들어갔다면 숫자가 아닌 문구가 들어간 부분부터 값이 잘려 나오게 됩니다.
숫자가 아닌 문구를 섞어넣었음이 탐지될 경우 오류코드 6번(소수점 윗자리 오류)을 반환합니다. (반점(,)도 걸릴 수 있습니다.)
소수점 아래 부분을 검사합니다. 앞에서 소수점 개수를 검사했으므로 소수점 아래 부분에 점(.)이 더 이상 나올 수 없습니다.
소수점 아래 입력한 자릿수가 19자리를 넘어가면 오류 대신 경고코드 1번(소수점 아래 자릿수 너무 많음)을 반환하고 소수점 아래 자릿수를 최대 18자리로 잘라냅니다. (이하 이상한 문구를 섞어도 이를 계산에 넣지 않게 됩니다.)
앞에서 소수점 아래 자릿수를 18자 이하로 줄였습니다. 문자열에서 자릿수에 해당하는 index가 비어있다면 해당 문자열의 주소값은 null이 나옵니다. (예:"테스트"[3]==null) 숫자는 문자열 각 자릿수 문자열의 유니코드 값이 null이 아닌 이상 48 이상 57 이하이며, 이를 이용하여 소수점 아래 18자리에 대해 유효성 검사를 합니다.
소수점 아래 자리에 입력한 부분이 문제가 있으면 오류코드 7번(소수점 아랫자리 오류)를 반환합니다.
이와 같은 방법으로 b도 bu를 tm으로 복제하는 과정을 포함하여 유효성 검사를 실행합니다. 오류코드는 동일합니다.
a와 b를 각각 진단해야 하므로 br를 false로 초기화합니다.
유효성 검사가 종료되었으면 ts와 br, ps를 false로 초기화합니다 유효성 검사에 쓰인 tm과 tn 값을 빈 문자열 값으로 초기화합니다.
입력한 소수점 아래에 입력한 값을 정리합니다. 이에 따라 ap, bp값도 다시 조정됩니다.
○○○○○○○○○□□□□○○□□○ 과 같이 9칸, 4칸, 2칸, 2칸, 1칸씩 그 정도를 보정하게 됩니다.
그 다음
이 상태의 au를 ma로 저장하고 ab가 빈 문자열이 아니라면 ab도 ma에 저장합니다. 같은 방법으로 bu, bb을 mb에 저장합니다.
덧셈과 뺄셈 계산과정을 적어봅니다.
a과 b의 소수점 윗부분은 정수이므로 쉽게 계산할 수 있습니다.
a와 b 모두가 정수이면 ap==0, bp==0이 되며, 이런 경우에는 소수점 아래 자릿수를 검산할 필요가 없습니다. a와 b 중 소수점 아래 자릿수가 있는 수가 있을 때에만 소수점 윗자리의 계산값이 얼마가 나오느냐를 보면서 소수점 아래의 자릿수를 정리하는 과정이 의미가 있습니다.
a와 b 모두 정수인 경우 ap, bp는 모두 0이 되므로 ru만을 그대로 문자열로 바꾸면 되며 소수점 아래(rb)는 표기해야 할 필요가 없으므로 rb="", (소수점 아래 자릿수)rp=0을 반환합니다.
rb==0인 경우 rb="", rp=0을 반환합니다.
이제 rb=""이 아닌 경우 소수점 아래 숫자 정리를 합니다.
rp를 rb의 문자열 길이로 다시 정의합니다.
a와 b 모두 0이 아닌 경우에서 곱셈을 연산하는 과정입니다.
a와 b 모두 0이 아닌 경우에서 나눗셈을 연산하는 과정입니다.
연산이 끝났으면 표기된 숫자를 정리합니다.
먼저 ru를 (곱셈연산에서 정수값으로 나올 수 있고, 나눗셈에서 몫이 1보다 작은 값이 나오는 경우같이 값을 부여하지 않았다면 초기화할 때 정의했던 정수 0인 채로 있으므로) 문자열로 바꿉니다.
18자리씩 끊어 표기하므로 소수점 위 19~36번째 자리에 해당하는 rs값이 (가령 곱셈에서, 곱한 값을 더한 결과가) 0일 경우 rs를 빈 문자열로 바꿉니다. 이 때 ru를 정수로 바꿔 ru 왼쪽에 있는 0들을 지운 다음, ru를 문자열로 바꿉니다.
계산과정에서 ru의 윗자리인 rs값이 0보다 클 경우, 1~18번째 자리인 ru에 빈 자리를 채우도록 ru의 왼쪽을 0으로 채웁니다.
i보다 소수점 아래부분을 더 써내려가야 하는 상황이 아닌(나눗셈에서 ts가 false인) 경우에서, 소수점 아래 19~36번째 자리에 해당하는 ri값이 0일 경우 ri를 빈 문자열로 바꿉니다.
이 때 ri와 rb가 모두 0일 경우 rb도 빈 문자열로 바꾸고 rp=0으로 둡니다.
ri가 빈 문자열이 아닐 (+ri가 0보다 클) 때 true를 주는 논리값으로 ps를 정의합니다.
!ts인 상황에서 ps가 true이면 rp를 ri의 길이로, 그렇지 않고 rb만 0이 아닌경우 rp를 rb의 길이로 정의합니다.
!ts이면서 ri가 빈 문자열이 아닐 경우 ri의 오른쪽부터 붙은 "0"들을 모두 지웁니다.
!ts이면서 이면서 ri가 빈 문자열일 경우, rb의 오른쪽에 붙은 "0"들을 모두 지웁니다,
ts인 경우 rb, ri의 오른쪽 부분을 정리하지 않고 rp를 39로 정의합니다.
rb 정리를 이것으로 종료합니다.
error
1 : 오버플로
2 : 언더플로 (사용하지 않음)
3 : 0으로 나눌 수 없음
4 : 0으로 연산할 수 없음 (사용하지 않음)
5 : 이중 소수점 표기
6 : 소수점 윗부분 오류
7 : 소수점 아랫부분 오류
warning
1 : 소수점 아래 입력한 자릿수가 너무 많음
2 : 소수점 아래 표시하는 자릿수를 제한함 (나눗셈)
3 : 소수점 아래 표시되는 자릿수가 너무 많음 (사용하지 않음)
sa : searching a (logical); sb : searching b (logical); sf : searching f (logical);
ps : pass (logical);
ad : "a" decimal point of string variable 'ma' (integer);
bd : "b" decimal point of string variable 'mb' (integer);
md : displaying mode number (string→integer); ms : message for correction (string)
tm : temporary string, or transaction message (string); tn : temporary string 2 (string);
tx : temporary value 1 (integer); ty : temporary value 2 (integer); tz : temporary value 3 (integer);
comment : comment (string);
ru는 계산결과에서 소수점 위 자리이므로, dot(.)이 나오지 않습니다.
1 + 1 = 2