2011-06-19 98 views
2

我想寫一個計算器,可以把文字作爲輸入。例如對於例如 「兩加五乘七」應該給出37作爲輸出。 我不會說謊,這是一件功課,所以在做這件事之前,我想如果我能指出一些對這些事情可能有用的東西,但我不知道。計算器,可以把文字作爲輸入

另外,方法ñ如何做到這一點也沒關係,我想。它必須用C++編寫。沒有其他語言會被接受。

謝謝。

[編輯] - 感謝您的回答。這是一門入門課程。所以保持儘可能簡單的東西,將不勝感激。我應該早些提到這一點。

[編輯2] - 達到了一個階段,我可以輸入數字,並獲得正確的輸出優先和所有。只是想看看如何將單詞轉換爲數字。感謝每個想要幫助的人。這就是爲什麼如此石頭。

+0

到目前爲止,您對此問題的嘗試有哪些?如果你不知道從哪裏開始,那麼從你知道的開始。你能把單詞變成數字嗎?你怎麼知道你的話是一個操作還是一個數字? – jonsca

+0

這是一個可怕的任務;有這麼多的英語語言做這個權利幾乎是不可能的。爲什麼要教學生早點做錯事呢? –

+0

@丹尼斯如果有一組有限的輸入並且程序可以排除任何不屬於特定範圍的東西,我不認爲它很糟糕。否則,我同意你的看法。 – jonsca

回答

1

只要可接受的輸入是足夠嚴格的,編寫一個recursive descent parser應該很容易。對於一個只接受數字和符號的簡單計算器來說,這個語法應該與語法差別不大。

使用std::istream類和提取操作符(>>),您可以輕鬆地將輸入分解爲單獨的單詞。

這裏是一個lecture,它顯示瞭如何爲數字和符號的常規計算器做到這一點。

與你的情況的主要區別是解析數字。取而代之的是符號「0-9」,你的輸入會像「零」,「一」,「九」,「數百名」,「千」等要解析的話這樣的流,你可以這樣做這樣的:

  1. 突破的話分成組,嵌套的「倍增器」一樣,「千」,「數百名」,「數十億美元」等;這些組可以嵌套。十(十,二十,三十),十幾歲,十一, ..)不要嵌套任何東西。你把像「103數以千計297」弄成這個樣子:

      +--------+---------+-----+ 
         /  |   |  \ 
         thousand hundred ninety seven 
        / \  | 
        hundred three two 
         | 
        one 
    
  2. 爲一組,遞歸地總結其所有的組件,然後通過它的「倍增器」乘以:

        103297 
          +--------+------+----+ 
         /  |  |  \ 
         (* 1000) + (* 100) + 90 + 7 
        / \  | 
        (* 100) + 3  2 
         | 
         1 
    
+0

謝謝。我已經達到你提到要使用的階段 - 將字符串標記化。如何將諸如三千七之類的東西轉換成-3007?你碰巧知道任何算法? –

+0

@Ian:看我的編輯是否有幫助。 –

+0

@Martiho,謝謝你的幫助。例如,當輸入是九十二時,我將如何處理?它應該轉換爲92. –

1

這是一些在學校我最喜歡的東西。

做到這一點,正確的方法是執行它作爲一個解析器 - 寫語法,記號化你的輸入,並解析了。然後你可以遞歸地評估它。

如果這些方法都聽起來很熟悉,雖然(即這是一個入門級),那麼你可以在一個更強大的方式一起本事 - 只是做它,你會怎麼做自然。將句子轉換爲數字和操作,然後執行操作。

1

注:我假設這是一個入門級的課程,而不是在編譯原理的課程。如果你被教導有關這方面的具體事情(例如算法,除了我提到的),你幾乎肯定會被期望應用這些概念

首先,你必須瞭解單詞。爲此目的,你可能只是一起破解它 - 一次讀一個單詞,並試圖理解這一點。逐步建立一個功能,可以讀取您需要能夠使用的一組數字。

如果輸入很簡單(只提供基本形式的表達式,不提供括號或任何內容),您可以簡單地在讀取數字和操作符之間交替進行操作,直到輸入完全讀取(但如果這應該是如果你最後閱讀的是一個操作符,則需要停止並顯示一個錯誤),因此你可以爲數字和操作符編寫單獨的方法。

要理解表達式需要如何計算,請使用shunting yard algorithm以適當的運算符優先級解析表達式。您可以將單詞的初始解析與此相結合,只需使用它將該標記提供給算法即可。

要真正計算結果,您需要評估解析的表達式。要做到這一點,您可以簡單地爲輸出使用堆棧:當您通常推送一個操作符時,您會彈出兩個值,將操作符應用於它們並推送結果。分流碼算法完成後,堆棧中會有一個值,其中包含最終結果。

+0

謝謝。現在它開始有意義了。我現在能夠做到這一點 - 「2 + 2 * 5」給出了12.現在如何解決轉換字數問題?任何算法都在那裏?可以給三千五百加三。我如何理解這一點? –

+0

是「3550」嗎?破折號「三五百」怎麼樣?你需要處理無效的輸入嗎?通常情況下,你應該,但是有時候好的錯誤處理比有效的輸入更難處理 - 因爲這是一個介紹類(介紹編譯器,也許???) – franji1