Fx-5800p 공식 저장 - fx-5800p gongsig jeojang

전기공학

[카시오 공학용 계산기 fx-5800p] 내부 기능 사용법

Fx-5800p 공식 저장 - fx-5800p gongsig jeojang

2016. 4. 16. 11:48

공대생의 필수품 공학용 계산기를 십분 발휘하기 위해서

사용설명서 중 제가 필요한 부분을 추렸습니다(저는 참고로 전기공학도)

아래는 제 카시오 공학용 계산기 fx-5800p 모습입니다. 

HI처럼 원하는 알파벳을 입력하기 위해서 

ALPHA 키를 누르시고 키보드를 보고 원하는 알파벳 아래에 있는 키를 누르세여 

복소수 표시

전압과 전류의 위상차를 표시하기위해 자주 쓰입니다.


사용자지정함수 만들기


자주 쓰이는 공식 같은거를 저장하고 풀 수 있습니다

연립방정식 풀기
 

라플라스 역변환을 하다보면 부분분수를 하다가 자주 필요합니당

만약 더 필요한 기능이 있을 시 구글에서 fx-5800p 매뉴얼을 치면

pdf파일을 다운 받으실수 있으세요~

시험기간 모두들 열공 하세요~

FX-5800P를 써 본 사람이면 알겠지만

이 계산기에는 저장할 수 있는 공간이

문자 변수 A,B,C,D,E,F,G,H,I,J,K,L,N,M,O,P,Q,R,S,T,U,V,W,X,Y,Z랑

동적 할당 배열인 Z Array, 그리고 SD 통계가 있는데 솔직히 여기 저장해서 쓰느니 Z Array에 저장해서 쓰기 때문에 제쳐두고

실질적으로 사용하게 되는 공간은 Z Array랑 문자 변수임

근데 TI-89같은 갓산기는 함수를 정식 지원해서 매개변수를 지원해주는데

이 계산기는 가격도 TI 1/3 수준인데 지원해주겠나? ㅎㅎ

하지만 튜링완전하면 안되는게 마! 어딧나!

직접 만들어서 쓰면 되는거지!

이런 함수 지원 이슈부터 시작해서 프로그래밍 전반에 필요한 기법을 소개해보겠음

본인이 군대에서 공책에 그려가며 고안했던 방법들이라 이게 정답이다라고는 못하겠는데

이런 열악한 환경에서 프로그래밍하는데 가이드라인이 될 수 있다고 생각하고 적어봄

1. Z Array 구성과 예약 문자 변수 3개

본인은 Z Array를

FREE, USER, SWAP 3개의 영역+Z[E]로 나눴음

배치 순서는 FREE, USER, SWAP, Z[E]순으로 구성되어 있다.

1-1. FREE

무규약 공간임, 정말 아무렇게나 사용해도 되는 공간이고 배열 10칸 정도 할당함

1-2. USER

정확히는 데이터가 저장되는 공간, 프로그램이 지속적으로 접근해야하는 데이터 등을 여기에 담아 사용, 대부분의 배열 공간을 이곳에 할당

1-3. SWAP

여러 변수들의 값을 스왑해주는 공간, 26(알파벳 개수)+10개 정도 할당함, 이것에 대해서는 후술.

1-4. Z[E]

SWAP 영역의 시작 인덱스를 저장하는 위치로 사용함

그리고 P, R, E는 예약 문자 변수로 생각하고 일반적인 용도로 사용하지 않음 이것도 후술.

2. P, R의 사용

P는 Parameter(매개변수), R은 Return(반환) 변수로 생각하고

루틴만 구성할 수 있는 PROG에 함수 꼴 처리가 가능하게 프로그래밍 했음

예를들어

function (x){

return x+100;

}

이 함수를 계산기에 구현하고 싶으면

P+100→R:

이런 식으로 짜는거임

그런데 프로그래밍 하다보면 보통 저런 함수만 필요한게 아니라

다중 매개변수를 지원하는 함수가 필요함

function (x,y){

return x+y+100;

}

정수 두개정도 일때는 P에 복소수를 받아서

ReP(실수부 추출), ImP(허수부 추출)을 이용해서

ReP(P)+ImP(P)+100→R:

이렇게 처리할 수 있음

function (x,y,z,t){

return x+y+z+t+100;

}

정수 4개를 지원해야 한다고?

그럼 P와 R을 모두 매개변수를 받는데 사용하면 됨

ReP(P)+ImP(P)+ReP(R)+ImP(R)+100→R:

* 이런 기법들이 사용됨에 따라 프로그램이 쌓이니까 뭐가 뭔지 구분이 안되서 나름의 프로그램 네이밍 방법도 생각해냈는데

유형 식별자.함수 특성.함수 이름으로 지었음

예를들어 반올림 함수를 구현했다고 치면

"F.DI.ROUND"

F=Function

D=Dual Parameter

I=Independent (P의 독립을 지원해준다는 의미 즉 "P의 무결성" 지원) *후술

ROUND=반올림 함수명

이런식으로 이름을 만드는거임, 함수 특성은 대문자 한개로 표현하고 순서는 알파벳 순으로 적음

A 특성, B 특성, Z 특성 함수는

F.ABZ.NAME 으로 표현하는 식

그렇다면 n개의 매개변수를 받으려면 어떻게 해야할까? 이야기를 하기 전에

잠깐 반환(Return)에 대해서 얘기하겠음

반환도 여러개를 반환해야하는 경우가 분명히 생김

이쯤오면 "2개까지는 그냥 P와 R을 사용해서 반환하면 되지않음?"이란 생각이 뇌를 스칠텐데

물론 가능하지만 이 방법은 문제가 조금 있는게 "P의 무결성"이 깨진다는 단점이 있음

이게 무슨 소리냐면

벡터1 X+Yi(복소수로 표현)를 받아서

(벡터1-벡터1 단위 벡터)*(벡터1의 길이)를 구하는 프로그램을 만든다고 해보자

[RUN]

100+100i→P:

PROG "LOGIC"

[NORMALIZE]

P÷Abs(P)→R:

Abs(P)→P:

// 굳이 길이랑 같이 반환할 필요는 없지만, 그렇게 한다 치자

[LOGIC]

PROG "NORMALIZE":

// LOGIC이 실행되기 전에 받은 Parameter가 Return값으로 채워져서 오염됨

Abs(P)×(P-R)→R:

// 예상과는 다른 결과를 얻게됨.

이렇게 P가 오염되서 이리저리 함수가 호출되서 값들을 가공하는 복잡한 과정을 만들어갈때 제약이 생김...

그래서 Dual Return은 신중하게 사용하는 것이 좋음.

그런데 이렇게 "P의 무결성"은 깨트리지 않는 것이 깔끔한 코딩을 하는데 도움이 되는데

이런 열악한 환경에서 무결성을 저해할 일이 과연 저것밖에 없을까?

안타깝게도 하나가 더 있음, 바로 중첩으로 함수를 사용할 때 이런 일이 또 발생함

[PLUS1] = function(x){return x+1;}

P→R:

1→P:

PROG "F.DI.PLUS":

[F.DI.PLUS]

P+R→R:

[RUN]

100→P:

PROG "PLUS1":

PROG "PLUS1":

// R=102를 기대함, 하지만 아님

그렇다면 어떻게 해결해야 할까?

답은 간단함 함수 안에서 P를 어떻게 변경했던간에 함수가 종료되기 전에 처음받은 P값을 그대로 P에 담아놓고 함수가 끝나면 되는거임

이런 경우를 위해 SWAP 영역을 구상한건데 비단 Dual Return의 케이스 말고도

어떤 함수 안에서 매개변수를 요하는 다른 함수를 호출할 때 필연적으로 "P의 무결성"이 깨질수 밖에 없었기 때문임

그럼 SWAP 영역을 사용해서 어떻게 이 문제를 빗껴가느냐?

* Z[E]는 SWAP 영역이 시작하는 인덱스임

P→Z[Z[E]+0]:

Z[E]+1→Z[E]:

<함수 로직>

Z[E]-1→Z[E]:

Z[Z[E]+0]→P:

이런 식으로 함수를 구성하면 아무리 <함수 로직> 부분에서 "P의 무결성"을 깨트리는 일을 행한다고 한들

스왑 영역에 백업된 P의 값이 정상적으로 돌아오고 함수가 종료되면서 "P의 무결성"이 꺠지지 않음

또 <함수 로직> 안에서 저런 형식을 갖춘 함수를 또 호출하더래도 문제가 생기지 않음.

Q. 그럼 함수가 <함수 로직> 뒤의 부분을 실행시키지 못하고 종료되면? 그게 쌓여서 스왑 영역 범위에서 벗어난 인덱스가 Z[E]에 저장되면? 어떻케헤요!

A. 계산기 자체의 한계인데 그럴 일을 최대한 줄여야하고, 본인같은 경우는 사용자 실행 중지의 에러 누적을 복원하기 위해 Z[E]를 원래의 시작 인덱스로 다시 맞춰주는 캘리브레이션 프로그램을 하나 만들어놨음

자 그러면 위의 예제를 스왑을 통해 문제없게 바꿔보겠음

[PLUS1] = function(x){return x+1;}

P→Z[Z[E]+0]:

Z[E]+1→Z[E]:

P→R:

1→P:

PROG "F.DI.PLUS":

[F.DI.PLUS]

P+R→R:

[RUN]

100→P:

PROG "PLUS1":

PROG "PLUS1":

// R=102임

이런 식으로 해결이 가능하다.

그럼 다시 아까의 문제로 돌아와서 n개의 매개변수를 받는 방법은 어떻게 하면 될까?

두가지 방법이 있음 FREE 영역을 사용하는 방법과 SWAP 영역을 사용하는 방법인데 장단이 있음

* FREE 영역을 사용하는 방법

그냥 Z[1], Z[2], Z[3], Z[4]등(FREE 영역)에 원하는 매개변수값을 저장하고

함수에서 Z[1], Z[2], Z[3], Z[4]에 접근하면 됨.

이 방법은 전역변수를 사용하는 것과 비슷한 방법이여서 편리하고 직관적인 면(하드 코딩같은)이 있는 대신 문제가 하나 있음

바로 "P 무결성" 문제에서 벗어나지 못한다는건데 중첩 함수 실행 케이스에서

Z[1], Z[2], Z[3], Z[4]를 매개변수로 받는 함수 내부에서 Z[1], Z[2], Z[3]을 매개변수 영역으로 사용하는 다른 함수를 호출하고 나면

Z[1], Z[2], Z[3]이 오염되므로 오염된 상태의 밑의 로직은 처음의 Z[1], Z[2], Z[3]에 접근할 수 없게됨, 물론 스왑과 병행해서 사용하면 되지만

사용이 필요한 파라미터의 개수 만큼 SWAP과 FREE 영역이 둘 다 요구되고 백업과 회수를 해야한다는 점에서 낭비가 있음.

* SWAP 영역을 사용하는 방법

바로 코드를 박겠음, function(a,b,c,d,e){return a+b+c+d+e;}를 구현하는 거임

[RUN]

1→Z[Z[E]+0]:

2→Z[Z[E]+1]:

3→Z[Z[E]+2]:

4→Z[Z[E]+3]:

5→Z[Z[E]+4]:

Z[E]+5→Z[E]:

PROG "ADD.FIVE":

Z[E]-5→Z[E]:

[ADD.FIVE]

// P를 쓰지 않기 때문에 굳이 "P의 무결성"을 지킬 필요 없지만, 이렇게 할 경우 P를 자유롭게 사용 가능함.

Z[Z[E]-5+0]+Z[Z[E]-5+1]+Z[Z[E]-5+2]+Z[Z[E]-5+3]+Z[Z[E]-5+4]→R:

이렇게 "P의 무결성"을 SWAP으로 유지하는 방법의 응용으로 N개의 매개변수를 받을 수 있음

N개의 Return을 받는 방법에서도 마찬가지로 FREE 영역과 SWAP 영역을 쓸 수 있는데

* FREE 영역의 N개 Return

FREE 영역만을 사용하여 N개의 Return을 구성하는데 하필 그 함수 안에서도 N-Return 함수를 호출한다면 Return 하는데 사용하는

인덱스를 서로 달리 하면 충돌 문제를 최대한 피할 수 있다.

* SWAP 영역의 N개 Return

역시 바로 코드 박는다. P를 받아서 P+1, P+2, P+3, P+4, P+5를 생성해서 반환하는 코드임.

[RUN]

Z[E]-1→Z[E]:

Z[Z[E]+0]→P:

Z[E]+5→Z[E]:

// Return 받을 공간 할당, malloc 쓰는 느낌이 약간 든다.

1→P:

PROG "GEN.FIVE":

// Z[Z[E]-5+0~4]의 반환값을 사용하여 로직 구성

Z[E]-5→Z[E]:

// 사용할 일이 끝나면 메모리 반환

Z[E]-1→Z[E]:

Z[Z[E]+0]→P:

P+1→Z[Z[E]-5+0]:

P+2→Z[Z[E]-5+1]:

P+3→Z[Z[E]-5+2]:

P+4→Z[Z[E]-5+3]:

P+5→Z[Z[E]-5+4]:

위와 같은 방식으로 FX-5800P에서 함수를 사용할 수 있다...

나는 최대한 문자 변수를 아끼겠다고 E에는 인덱스값 저장 구역(FREE, USER, SWAP 영역의 시작 인덱스가 저장된)의 시작 인덱스를 저장하고

Z[E]를 SWAP 시작 인덱스로 사용했는데(Z[E+1], Z[E+2] 등을 각 영역 시작 인덱스로 쓰려했었던 것 같음)

여러분은 아끼지 말고 문자 변수 하나를 더 쓰거나 그냥 Z[E]대신 E를 사용해서

코드를 조금 더 간추릴 수도 있겠다.

그리고 프로그램을 짜다 보면 N개의 매개변수와 N개의 반환은 극단적인 사용을 하는 경우 외에는 좀처럼 없고

보통 본인은 SWAP 영역을 코드에 설탕을 치기 위해서 사용했는데...

예를들어 계산 프로그램을 만드는 도중 sin과 cos값을 저장해두고 쓸일이 생기는 경우

[Run]

Sin(P)→Z[Z[E]+0]:

Cos(P)→Z[Z[E]+1]:

// 복잡한 계산을 하는 순간 Z[Z[E]+?]의 사칙연산으로 구성된 코드를 볼수 있다

// 매우 즐겁다... 즐거워서 정신분열남 ㄹㅇ;;

이렇게 하는 것 보다...

[Run]

Sin(P)→S:

Cos(P)→C:

// 마참내!!... 눈이 편하다!

Z[Z[E]+1]→S:

Z[Z[E]+2]→C:

백업과 회수 부분을 작성하는 것은 귀찮고 성능에 조금 영향을 미치겠지만

가뜩이나 가독성 안좋은 계산기 디스플레이에서 코드 부분이 그나마 가독성을 얻게 되서 볼만하게 된다.

이렇게 안했으면 나 이걸로 코딩 못했음; 여러분은 폰 노이만이 아닙니다

반드시 이렇게 하도록 하세요 씨발

폰 노이만이며 ㄴ그렇케하던가 해도됨니다

아무튼 이리하여 이 빌어먹을 계산기에서 코딩을 하기위한 기반을 세울수 있고 이후는 자기 맘대로 원하는거 만들면 됨

보너스)

"=>" 를 이런 식으로 주석으로 활용할 수도 있음


좀 두서없이 썼긴한데 양해바라고, 질문 환영함