2번째 글에서 설명한대로


숫자 아닌 문자들(사칙연산)

에 대하여 각각의 연산 방법을 지정해주면

사칙연산 계산기는 아주 쉽게 만들어내고 적용가능하다..


하지만

사칙연산만 하는 계산기는 아무 쓰잘떼기 없기에

좀더 확장성을 가질수 있는 계산기를 만드려고 고민하였다.



가. 함수기능?

만일 계산기 내에서 함수를 정의해서 쓸수 있다면

가뜩이나 괄호 지옥인 infix 계산기를 쉽게 다룰수 있을것이다.

함수기능을 만들때 생각해야 할점을 적어보았다.


1. 함수라는 틀을 만들고 계속 꺼내쓸수 있도록 하기 (함수테이블)

2. 반복연산을 가능하게 하기  (재귀호출 가능하게 하기)

3. 재귀호출이 가능해지려면 탈출조건이 필요 (if문의 필요성)

4. 함수를 정의하는 키워드  ("def" 키워드)



나. if문의 문제점

()? :  <- 이것은 c에서 3항 연산자이다.

if문 같은 경우

if(조건) 참일때, 거짓일때

이러한 3개의 요소가 필요하게 되는데

이는 이진트리로 적용할때 문제가 된다.

조건식을 넣을곳이 마땅치가 않다.


잘 생각해보면 조건식도 결국은 이 계산기 수식처럼 작성할수 있다.

비교연산자를 집어넣으면 된다.

EVAL (input ROOT)
        if (숫자?)
             then return 숫자
        else
             if('+' ?)
                  then return EVAL(left) + EVAL(right)
             if('*' ?)
                  then return EVAL(left) * EVAL(right)
             ....
             if ( > ?) 
                  then if(EVAL(left) > EVAL(right)) 
                              then return 1
                         else
                              then return 0
             ...



이 문제는 if를 쓰려면  if( 조건식)

이렇게 if바로 옆에 괄호를 붙이도록 입력을 받고

그 괄호안에 있는 조건을을 다시 EVAL 함수로 평가를

해서 만일 참(1) 이면 왼쪽가지를 선택하도록 하고

거짓(0) 이면 오른쪽 가지를 선택하도록 하였다.


저장할수 있는 문자열은 한계가 있으므로

조건식도 따로 트리로 만들고

그 트리를 struct tree 내에 *ifs 필드를 추가하고 조건식을 가리키게 함으로서 해결하였다.


struct Tree
    char name[10];
    Tree *left
    Tree *right
    Tree *ifs   //조건식도 결국은 트리이다.


그래서 if 문을 만나면 EVAL 함수는 다음과 같이 동작한다.

EVAL (input ROOT)
        if (숫자?)
             then return 숫자
        else
             if('+' ?)
                  then return EVAL(left) + EVAL(right)
             if('*' ?)
                  then return EVAL(left) * EVAL(right)
             //그외 나머지 사칙연산
             ...
             if ( > ?) 
                  then if(EVAL(left) > EVAL(right)) 
                              then return 1
                         else
                              then return 0
             //그외 나머지 비교연산
             ....

             if("if" ?) //"if" 라는 문자열을 읽으면?
                  then if(EVAL(ROOT -> ifs) == 0)  
                               then return EVAL(right) //false
                         else 
                               then return EVAL(left)  //true
            ...

간단하다 이는 트리를 만들때 조건식을 따로 구분하여야 하는데 나중에 설명

비교 연산은

'>', '<', '==' 세가지를 만들었는데  

나중에 함수기능을 쓸수 있게되면 충분히 '>=' 같은것도 만들어낼수 있으므로 >= , <= 이런 형태는 생략 

Posted by 멍충한아싸

댓글을 달아 주세요