Получение ошибки сегментации в моем калькуляторе после исправления

58
8

Я пытаюсь написать калькулятор post-fix/reverse polish, только перед каждым номером перед каждым оператором будет "#", "!" И ".". чтобы обозначить конец выражения. Одно пространство между каждым числом/символом/и т.д. Мне не нужна проверка ошибок.

Я понимаю, что здесь вы можете использовать stringstream, но я все же думаю, что он сможет работать без него.

Вход, введенный в консоль, будет выглядеть примерно так:

# 33 # 3 ! / # 2 ! *.

который затем выводит 22. В настоящее время я получаю ошибку сегментации с приведенным ниже кодом.

Спасибо, что посмотрели.

#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;
}

спросил(а) 2014-05-17T23:59:00+04:00 6 лет, 5 месяцев назад
1
Решение
70

Проблемы, которые я нашел:

Линия

    else if (c == '#'){  

должно быть

    else if (ch == '#'){  

Линия

    else if (c == '.'){  

должно быть

    else if (ch == '.'){  

Линия

        inputComplete == true;

должно быть

        inputComplete = true;

Обновить

Я понимаю, что вам не нужен код проверки ошибок. Но минимальная проверка ошибок полезна. С этой целью, я думаю, вы должны проверить, когда достигнут EOF.

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

вместо

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

имеет смысл для меня.

ответил(а) 2014-05-18T00:20:00+04:00 6 лет, 5 месяцев назад
58

В конце

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

но это должно быть

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

ответил(а) 2014-05-18T00:11:00+04:00 6 лет, 5 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема