2016-08-28 5 views
2

데이터 구조 클래스에 4 개의 기본 연산과 괄호가있는 산술 표현식을 해결하는 계산기를 프로그래밍해야하는 과제가 있습니다. 입력은 표준 버퍼를 통해 이루어지며 결과는 출력과 동일합니다.양수와 음수를 구별하여 수식에서 숫자를 올바르게 구문 분석하는 방법은 무엇입니까?

처음에는 교사가 알고리즘을 제공했는데 (표현식을 접미어에서 후위로 변환하는 방법과 그것을 평가하는 방법) 유일한 목표는 우리 자신의 스택을 구현하고 사용하는 것이 었습니다. ,하지만 계산기 자체가 잘 작동하지 않으며, 파서 때문에 생각합니다.

This is the algorithm 및 숫자, 연산자 및 괄호를 구문 분석하는 데 사용되는 코드를 사용하여 나중에 평가하기 쉬운 방식으로 식을 저장하는 배열로 가져 왔습니다.

// saida is an array of pairs of integers, the first value of the pair is the value of the info (the number itself or the ASCII value of the operator) 
// The second value is an indicator of whether it is a number or a operator 
for (i = 0; i < exp_size; i++) { 
    c = expression[i]; 

    // If the current char is a digit, store it into a helper string and keep going until a non-digit is found 
    // Then atoi() is used to transform this string into an int and then store it. 
    if (c >= '0' && c <= '9') { 
     j = 1, k = i+1; 
     tempInt[0] = c; 
     while(expression[k] >= '0' && expression[k] <= '9') { 
      tempInt[j++] = expression[k]; 
      k++; 
     } 
     tempInt[j] = '\0'; 
     saida[saidaIndex][0] = atoi(tempInt); 
     saida[saidaIndex++][1] = 0; 
     i = k-1; 
    } 

    // If the character is an operator, the algorithm is followed. 
    else if (c == '+' || c == '-' || c == '*' || c == '/') { 
     while(pilha->size > 0 && isOpBigger(stack_top(pilha), c)) { 
      saida[saidaIndex][0] = stack_pop(pilha); 
      saida[saidaIndex++][1] = 1; 
     } 
     stack_push(c, pilha); 
    } 
    else if (c == '(') stack_push(c, pilha); 
    else if (c == ')') { 
     j = stack_pop(pilha); 
     while(j != '(') { 
      saida[saidaIndex][0] = j; 
      saida[saidaIndex++][1] = 1; 
      j = stack_pop(pilha); 
     } 
    } 
} 

'마이너스 기호가 빼기 연산자 또는 음수 (I 마이너스 연산자가 음수와 합 것을 알고를 표시하는 경우 문제는이 코드에 나는 말할 수있다, 그러나 didn를

  • 마이너스 기호가있을 때마다, 대신 더하기 기호 (+)를 저장하고 * -1 다음 번호 자체를하자 : t, 나는 성공 아무도, 다음 생각하지)이 문제를 해결 도와주었습니다. 다음 숫자가 이미 음수 인 경우 나 마이너스 기호가 1 + 2 - (3 * 4)와 같은 괄호가있는 표현식보다 앞에있는 경우 작동하지 않습니다.
  • 빼기 기호 다음에 공백이 있으면 연산자이고, 그렇지 않으면 음수입니다. 입력에 규칙이 없으므로 작동하지 않습니다.

나는 통역사의 경험이 전혀 없으므로 진행 방법을 모르겠습니다. 이 코드는 음수가 아닌 유효한 표현으로 완벽하게 작동하지만() + 3 -()과 같은 이상한 코드에서는 작동하지 않지만 또 다른 문제입니다.

도움 주셔서 감사합니다.

+0

'for (i = 0; i

+0

나는이 방법으로 문자열을 반복하는 것에 대해 생각해 본적이 없다. 시도 해보려 고, 고마워! –

+0

문자열을 파싱 할 때 많은 유연성이 추가됩니다. 당신은 모든 문자열의 마지막에 * 널 바이트 *가 있다는 것을 알고 있으므로 필요에 따라'while (* p)'및 문자열 읽기/읽기를 사용하여 문자열을 감추면 모든 것을 할 수 있습니다. 예를 들면' (p + x)'를 미리 읽습니다. * start *와 * end * 포인터를위한 문자열 (예 :'char * sp, * ep;') 내에서 * 하위 표현식 *을 여러 포인터로 사용할 수도 있습니다.이 포인터는'if (* p == ' (') sp = p;''if (* p =') ') ep = p;'까지 계속하고''sp''와''ep'' 사이에있는 것을 처리합니다. –

답변

1

"단항 마이너스"라는 문제이며, 귀하의 경우 (변수가 없음) 대체 할 수 있습니다. 이

지금 대신 다른 운영자

  • 입력의 첫 번째 문자 앞에 왼쪽 괄호
  • 선행

    • 경우

      오퍼레이터 -

      은 단항이며 예를 들어 m과 같은 다른 문자를 저장하고 다른 연산자 (또는 t)보다 높은 우선 순위를 지정하면 -을 저장합니다. 당신이 가진 경우에는 지수 연산자와 같습니다).

      다른 팁 : 공백을 사용하지 말고 산술 표현식은 공백없이 작동해야합니다. 그렇지 않으면 올바르지 않습니다.

  • +0

    감사합니다. 나는 그것을 시도 할 것입니다. 더하기 기호로 구현해야합니까? –

    +0

    아니요, 일반적으로 필요하지 않습니다. – deamentiaemundi

    +0

    @MikaelMello, 단항 마이너스 연산자를 사용하면 단항 플러스 연산자도 사용할 수 있습니다. 그것은 불필요하지만,'++ 3 '에서와 같이 입력에'+ 3' (표현식의 시작 부분에)이나 중복 될 수 있습니다. '+++ - +++ - + - + - ++ 3 + - + - + - + 5'와 같은 입력을 가질 수 있는지 확인하십시오. 단항 연산자는'5 * - 3' 또는'-5 * + 3' ('5 * (-3)'및 (-5)로 해석되는 표현식을 허용하기 위해, * (+3)') 또는 적어도 더하기 연산자'+'와'-' (두 번째'-5 * + 3'은 부정확 할 것입니다) –