2016-04-10 20 views
0

Bjarne Stroustrup'un C++ kitabında bir kod örneğini taklit eden bir program yapmaya çalışıyorum. Bu, değerlendirilmesi gereken daha uzun ifadeleri ayrıştırabilen bir hesap makinesi yapmak için ilk yaklaşımdır. Henüz operatörün önceliği umurumda değil ve şu anki kodumla ilgili bir sorunu anlamaya çalışıyorum. İşte burada:Bu program neden 3 satırlık girdi gerektiriyor?

#include <iostream> 
using namespace std; 

int main() { 
    cout << "Expression: "; 
    int lval = 0; //left-hand value 
    int rval; // right-hand value 
    char op; 
    cin >> lval; //read leftmost operand 
    while (cin>>op) { //read operator and righ-hand operand repeatedly 
    cin >> rval; 
    switch (op) { 
    case '+': 
     lval += rval; //add: lval = lval+rval 
     break; 
    case '-': 
     lval -= rval; //subtract: lval = lval-rval 
     break; 
    case '*': 
     lval *= rval; //multiply: lval =lval*rval 
     break; 
    case '/': 
     lval /= rval; // divide: lval = lval/rval 
     break; 
    default: // not another operator: print result 
     cout << "Result: " << lval << '\n'; 
     return 0; 
    } 
    } 
return 0; 
} 

ben derlemek ve programı çalıştırdığınızda, hep örneğin girişin iki ekstra satırları eklemeniz gerekir:

$ ./calculator 
>Expression: 1+2+3 
> 
> 
[I can keep pressing enter as many times as I wish until I type in 2 more lines] 
>l 
>l 
>Results: 6 

neden program bu şekilde davranıyor? \n karakteri okunduğunda neden cin>>op yanlış döndürülüyor?

ben kitaptan while(cin>>op) bölümünü kopyalanan çünkü beni karıştırır.

+1

İki sorunları var 'boşluk onun tarafından atılır beri size döngü sona erdirmek amacıyla operatörden biri olmayan bir şeyi girmelisiniz böylece cin >> op', bir' \ n 'ayıklamak asla. İkinci problem, bir operatör bulamadığınız zaman bile, her zaman * bir sağ taraftaki işlenende okumanızdır. Bu yüzden iki satır yazmanız gerekiyor – melak47

cevap

2

Her yineleme için cin>>op ve cin>>rval okuyorsunuz ve bu okuma işlemleri kullanıcı bir değer girinceye kadar engellenir. >> operator yeni satır karakterini ('\ n') okuyamayacak, böylece başka bir değer girmediğinizde ve bu iki satırın her ikisini de girmediğinizde bu satırlar tıkanacaktır; sonuca ulaşmak için diğer iki değeri (ilk değer, varsayılan anahtar deyiminin yürütüldüğü şekilde operatör dışı değerlere başlar) girmenizi bekleyin.

Bunu da yeni bir satır okur çünkü operatörü almak için cin.get() kullanmak ve bunu önlemek için her operatör için anahtar ifadesi içindeki RVal okuyabilir.

cout << "Expression: "; 
    int lval = 0; //left-hand value 
    int rval; // right-hand value 
    char op; 
    cin >> lval; //read leftmost operand 
    while (cin.get(op)) { //read operator and righ-hand operand repeatedly 
    switch (op) { 
    case '+': 
     cin >> rval; 
     lval += rval; //add: lval = lval+rval 
     break; 
    case '-': 
     cin >> rval; 
     lval -= rval; //subtract: lval = lval-rval 
     break; 
    case '*': 
     cin >> rval; 
     lval *= rval; //multiply: lval =lval*rval 
     break; 
    case '/': 
     cin >> rval; 
     lval /= rval; // divide: lval = lval/rval 
     break; 
    default: // not another operator: print result 
     cout << "Result: " << lval << '\n'; 
     return 0; 
    } 
    } 
+0

Cevabınız ve bana "cin.get()" işlevini gösterdiğiniz için çok teşekkür ederim. – goncalotomas

4

while döngüsünün her yinelemesi için, iki girdiye (cin >> op ve cin >> rval) gereksiniminiz vardır; bu, default kasasına geçiş yapan sonuncuyu içerir. Bu yüzden iki ek satırı girmelisin.

İlgili konular