2014-05-17 1 views
1

포스트 픽스/리버스 폴스 계산기를 쓰려고하는데, 각 숫자 앞에는 '#'이 붙습니다. 각 연산자 앞에 '!'가 붙습니다. , '.' 표현의 끝을 의미합니다. 각 숫자/문자/사이의 공백 하나. 나는 오류 검사에 신경 쓰지 않는다.포스트 픽스 계산기에서 세그멘테이션 폴트 받기

여기서 stringstream을 사용할 수 있다는 것을 알고 있지만, 여전히 여기에 stringstream을 사용할 수 있어야한다고 생각합니다.

입력

후 출력 22. 나는 현재 아래의 코드 세그먼트 오류를 ​​얻고 것

# 33 # 3 !/# 2 ! *. 

, 같이 보일 것이다, 콘솔에 들어갔다.

감사합니다. 끝에

#include <iostream> 
#include <cstdlib> 
#include <math.h> 

using namespace std; 

class Stack{ 
    public: 
    Stack(){ 
     this->size = 0; 
    } 

    Stack & push(double c){ 
     if (size == MAX_SIZE) die("Push Overflow"); 
     data[size] = c; 
     size++; 
     return *this; 
    } 

    double pop(){ 
     return data[--size];  
    } 

    double top() const{ 
     return data[size-1]; 
    } 

    unsigned getSize() const{return size;} 

    bool die(const string & msg){ 
     cerr << "Fatal Error: " << msg << endl; 
     exit(EXIT_FAILURE); 
    } 

    void show(){ 
     for (int i = 0; i < size; i++){ 
      cout << data[i] << endl; 
    }} 

    private: 

    static const unsigned MAX_SIZE = 50; 
    double data[MAX_SIZE]; 
    unsigned size; 
}; 


int main(){ 
    Stack s1; 
    bool inputComplete = false; 
    double num1 =0; 
    double num2 = 0; 
    double answer = 0; 
    char c, ch; 

    while(!inputComplete){  
     cin >> ch; 
     if (ch == '!'){ 
      cin >> c; 

      num1 = s1.pop(); 
      num2 = s1.pop(); 

      switch(c){  

       case '+': 
       answer = num2 + num1; 
       break;  

       case '-': 
       answer = num2 - num1; 
       break;  

       case '/': 
       answer = num2/num1; 
       break;  

       case '^': 
       answer = pow(num2, num1); 
       break;  

       case '*': 
       answer = num2 * num1; 
       break; 
      } 
      s1.push(answer); 
     }  
     else if (c == '#'){ 
      double number; 
      cin >> number; 
      s1.push(number); 
     } 
     else if (c == '.'){ 
      inputComplete == true; 
     } 
    } 

    s1.show();  
    return 0; 
} 
+1

우선, 함수'pop'에서'if (size == 0) die ("Pop Underflow");를 추가 할 것입니다. –

+0

폴란드 사람 만 폴란드어 계산기를 작성할 수 있습니다. –

+1

루프를 끝내려면'c' 변수에 유효한 내용이 언제 있습니까? 문제를 파악하는 것이 도움이 될 것입니다. 그것이 쓰여지는 방식으로,'ch'가'!'이면'c'가 설정됩니다. 'else' 부분이'ch' 변수를 검사 할 것인가? –

답변

2

문제 내가 발견해야한다 :

라인

else if (c == '#'){ 
,515,

 inputComplete == true; 

이어야

else if (c == '.'){ 

else if (ch == '.'){ 

라인이어야

else if (ch == '#'){ 

라인이어야

 inputComplete = true; 

업데이트 난 당신이 오류 코드를 확인하지 않을 것을 깨닫게

. 그러나 최소한의 오류 검사가 유용합니다. 이를 위해 EOF에 도달했는지 확인해야한다고 생각합니다. 대신

cin >> ch; 
    if (ch == '!'){ 

ch = cin.get(); 
    if (ch == EOF) 
    { 
     inputComplete = true; 
    } 
    else if (ch == '!'){ 

나에게 의미가 있습니다.

+1

감사합니다 !! 이러한 변화로 인해 문제가 해결되었습니다.나는 조건문에서 'ch'를 놓쳤다는 것을 믿을 수 없다. – user2411290

+0

@ user2411290 안녕하십니까. 다행히 도울 수있어. –

1

else if (c == '.'){ 
    inputComplete == true; 
} 

이 있지만

else if (c == '.'){ 
    inputComplete = true; 
} 
+0

도움 주셔서 감사합니다, 알랭! – user2411290

관련 문제