2011-03-27 38 views
0

對不起,我意識到我把這個問題的所有代碼都放進去了。我的所有代碼等於大部分針對其他學生的這個特殊問題的答案,這是愚蠢的。C++使用字符串識別兩位數

這裏我把該問題的基本要點是:我需要以規則的數學表達式來識別單個數字(例如5 + 6)以及兩位數(諸如56 + 78)

。數學表達式也可以顯示爲56 + 78(無空格)或56 +78等。

實際的問題是,無論輸入是什麼,我都在閱讀表達式5 6 + 7 8。

感謝和抱歉,我幾乎刪除了這個問題,但我的目標不是爲作業問題給出答案。

傑西Smothermon

+0

不完全與您的問題有關,但無論如何:開關和if語句會導致優化後大多數編譯器上的機器代碼相同。但是,如果級聯會遺留可能未初始化的返回值(您的編譯器應該已經警告過您),您應該修復該錯誤(或使用switch語句是正確的)。一般來說,我會在這種情況下使用switch語句,因爲我覺得它更簡潔,但是這是我猜想的味道。 – ChrisWue 2011-03-27 03:26:37

+0

@ChrisWue謝謝你的輸入....你是對的,我應該返回0或其他東西,如果沒有其他命中。是的,一般來說,我只是不知道switch語句是否更快,但我同意你的看法,switch語句看起來很酷哈哈 – 2011-03-27 04:03:24

回答

1

首先,它有助於這樣

​​

移動,if s轉換自身的功能,只是爲了清楚。

bool isOperator(char c){ 
    return c == '+' || c == '-' || c == '*' || c == '/' || c == '^'; 
} 

而且,不需要檢查它的任何操作,只需檢查輸入的是一個數字:

bool isNum(char c){ 
    return '0' <= c && c <= '9'; 
} 

另一件事,與長鏈上面,你有問題如果輸入字符是anyhing而不是'+',您還將輸入tempNumber += ...塊。你將不得不檢查與&&,或者上面的功能更好:

if (isNum(userInput[iterator])){ 
    tempNumber += userInput[iterator]; 
} 

這也將排除任何無效的輸入像bX和喜歡。


然後,你的問題有雙位數:
的問題是,你總是插入tempNumber後輸入一個空格。你只需要這樣做,如果數字序列完成。爲了解決這個問題,只需修改你的長if-else if鏈的末端:

// ... operator stuff 
} else { 
    postfixExpression << tempNumber; 
    // peek if the next character is also a digit, if not insert a space 
    // also, if the current character is the last in the sequence, there can be no next digit 
    if (iterator == userInput.lenght()-1 || !isNum(userInput[iterator+1])){ 
     postfixExpression << ' '; 
    } 
} 

這應該做的,從56 + 78 --> 56 78 +給予正確的代表性工作。請告訴我,如果有什麼問題。 :)

+0

@Xeo感謝您的幫助。我只是使用你的例子「isOperator」,因爲我確實需要確保變量可以被輸入(所以a + b仍然需要運行到b +)。話雖如此,我得到一個下標超出範圍的錯誤在這最後如果你給我的聲明......我會嘗試一些測試的長度,它總是讓我困惑。但我敢肯定,出界是因爲if語句檢查迭代器+ 1(這意味着它錯過了語句的第一部分)。謝謝 – 2011-03-27 04:13:14

+0

@Xeo好的,我應該在做最後的評論之前完成測試......抱歉哈哈。迭代器== userInput.length()需要迭代器== userInput.length() - 1.它幾乎可以工作,但現在如果我把5 + 6我得到5 6 +,但如果我把5 + 6我得到6 +。同樣56 + 78變成578 +,而56 + 78是56 78 +。我不知道發生了什麼,它必須是空間的測試,但它之前工作。謝謝 – 2011-03-27 04:16:19

+0

@Jesse:錯誤是你自己的錯誤,用''\ b''替換''''。 :)當它在'56 + 78'的'6'後面到達''''時,它將退格一個並從流中刪除'6'。你應該忽略這個''''。這應該解決它,如果我有問題的權利。 – Xeo 2011-03-27 04:29:14

2

問題確實由兩個部分組成:樂星輸入(轉向的字符序列爲「標記」的序列)和計算表達式。如果你分開完成這兩項任務,它應該容易得多。

首先,讀入輸入並將其轉換爲令牌序列,其中每個令牌是運算符(+,-等)或操作數(42等)。

然後,對這個標記序列執行infix-to-postfix轉換。 「令牌」類型沒有被任何幻想,也可以是簡單:

struct Token { 
    enum Type { Operand, Operator }; 
    enum OperatorType { Plus, Minus }; 

    Type type_; 
    OperatorType operatorType_; // only valid if type_ == Operator 
    int operand_;    // only valid if type_ == Operand 
}; 
+0

對不起,我不得不去研究這些東西都是哈哈。根據我的理解,結構就像公共課程;枚舉值的大括號中的一切正確?所以操作數是0,操作符是1.最後一個問題:這會將數字推在一起嗎?例如在「56 + 78」中,char 5和char 6將被作爲int「56」推送?我想我只是不明白最後三行。感謝您的快速回復 – 2011-03-27 02:54:36