2016-03-22 14 views
1

Bir postfix hesap makinesini kodlamaya çalışıyorum, ancak ilk olarak olmak üzere iki sayıya girmeye devam ediyorum: Hesap makinesi bir boşlukla karşılaştığında, yalnızca bir kez saniyeden çıkılıyor: bir operatörle karşılaşmadığında/non digit (ie), kodladığım hata mesajını göstermez. Postfix Notation Calculator

int main() 
{ 

stack <int> calcStack; 
string exp; 
char ans; 
cout << "\nDo you want to use the calculator?" << endl; 
cin >> ans; 
while (ans == 'y') 
{ 
    cout << "\nEnter your exp" << endl; 
    cin >> exp; 
    for (int i = 0; i < exp.size(); i++) 
    { 
     if (isspace(exp[i])) 
     { 

     } 
     else if (isdigit(exp[i])) 
     { 
      int num = exp[i] - '0'; 
      calcStack.push(num); 
     } 
     else 
      doOp(exp[i], calcStack); 
    } 

    while (!calcStack.empty()) 
    { 
     calcStack.pop(); 
    } 

    cout << "\nDo you want to use the calculator again?" << endl; 
    cin >> ans; 
} 

system("pause"); 
return 0; 
} 

Bu

ana döngüde function--

void doOp(const char & e, stack <int>& myS) 
{ 

if (myS.size() == 2) 
{ 
    int num1, num2, answ; 
    num2 = myS.top(); 
    myS.pop(); 
    num1 = myS.top(); 
    myS.pop(); 
    if (e == '+') 
     answ = num1 + num2; 
    else if (e == '-') 
     answ = num1 - num2; 
    else if (e == '*') 
     answ = num1 * num2; 
    else if (e == '/') 
     answ = num1/num2; 
    else if (e == '%') 
     answ = num1 % num2; 
    else 
     cout << "\nError- Invalid operator" << endl; 

    cout << "\nCalculating..." << endl << answ << endl; 
    myS.push(answ); 
} 
else 
    cout << "\nInvalid stack size- too few, or too many" << endl; 
} 
+0

Her seferinde bir sorun hangi soruna neden oldu? –

+0

Unutmayın ki '' '' '' '' '' 'std: string'' nesnesine veri okuduğunuzda, bir alan iki değer arasında bir ayrım olarak görülür. Bkz. Http://stackoverflow.com/questions/5838711/c-cin-input-with-spaces – BrainStone

+0

bu, alan sorununa neden olur - 37 * 9 - böylece 3 * 7 çalışır, ancak -9 olmaz. Ayrıca, geçersiz ifadeyi söylemek yerine 37 * n + ifadesini kullanmaya çalışırsam, geçersiz boyut olduğunu belirtir. –

cevap

0

, sen dize çıkarıcı dizelerle okuyorsanız:

cin >> exp; 

dize çıkarıcı uzay duyarlıdır. Böylece girişte bir boşluk char ile karşılaşılır girmez, dize okuması durur ve witespace exp'e dahil değildir.

Eğer boşluklar dahil tam bir çizgi elde etmek istiyorsanız, size tercih yapmanız gerekir:

Düzenleme
getline (cin, exp); 

: Eğer getline() ile yaşamaya sorunu sormak karakter çıkarma realted edilir

kullanıcı hesap makinesini kullanmak istiyorsa. y girilmesi yeterli değildir. Yani ygirerseniz girin. Sadece y, ans içine konacak, böylece getline() boş bir satır okumaya başlayacaktır.

Bunu çözmek için başlangıçtaki girişi güncellemek:

cin >> ans;     // as before 
    cin.ignore (INT_MAX, '\n'); // add this to skip everything until newline included 
İşte

o (yanlış operatör durumunda hata mesajı da dahil) çalıştığını gösteren bir online demo

hata ayıklayıcı kullanılan ve her ifadeyi infaz
+0

Bu yaklaşımı denediğimde, derleyici, kullanıcının ifadeyi girmesine izin vererek tamamen atlar ve while döngüsüne gider. –

+0

Lütfen ayrıştırmakta olduğunuz ifadeyi verebilir misiniz? Getline (cin, exp) kullanarak – Christophe

+0

. Bir ifade yazamam. Çıktı diyor ki: lütfen bir ifade girin: o zaman kullanıcı hesap makinesini kullanmak isteyip istemediğini sorar –