2014-02-09 52 views
5

我有一個簡單的C程序如何從鍵盤輸入數學表達式?

int main() 
{ 

    int n, maxn = 21; 
    float SN, x; 

    printf("input x:"); 
    scanf("%f", &x); 

    printf("input maxn:"); 
    scanf("%d", &maxn); 

    for(n=0;n<=maxn;n++){ 
     SN = SN + pow(x,n); 
     n = n + 1; 
    } 

    printf("%f", SN); 
    getch(); 
    return 0; 
} 

我需要使它多功能,使用戶可以輸入任何表達與來自鍵盤的任何用戶輸入,以取代POW(X,N)。我如何在程序中添加表達式?

+1

有一種工具,它完全符合你的願望。它被稱爲* bc *,並且它是免費軟件http://ftp.gnu.org/gnu/bc/檢查URL並查看源代碼是如何解析數學表達式的。如果你使用Windows,你可能必須使用cygwin來獲得它的預編譯版本。 – Alex

+0

有理論上有可能通過使用動態鏈接庫來完成與'eval'類似的事情。您可以從用戶字符串生成一個簡單的代碼,將其編譯爲動態庫並加載到您的程序中。它聞起來像黑客攻擊,你將需要一個兼容的編譯器在代碼執行的機器上。這個問題被擱置,否則我會發布演示代碼... – Marian

回答

10

C和C++不提供此功能,因爲在編譯時(語法分析表達式時)和運行時(評估它們時)之間存在明顯差異。

爲表達式實現解析器和編譯器/評估器是一個很好的練習,但它不是微不足道的,並且可能需要比此刻更多的經驗(考慮到您提出的問題)。

這個問題最容易理解的方法是在我看來recursive descent parser但只是四個操作,數字和變量,我猜這將需要一百行左右的代碼。

yacc and bison是設計用於根據語法定義自動生成解析/評估代碼的工具。我個人更喜歡手寫解析器,因爲你得到了更好的控制(特別是在錯誤處理或句法和語義級別相互作用時,但這就是我,我也是NIH syndrome的一個壞例子)。

像Python或Javascript這樣的高級語言會爲您提供已實現爲eval的此功能。

+0

有沒有現成的圖書館可以幫助我? – Euphe

+0

@Euphe:這個問題的歷史工具是yacc/bison,請參閱已編輯的答案以獲得描述的一些鏈接。 – 6502

+0

你有沒有檢查你可以做什麼與提高精神... http://stackoverflow.com/a/21419351/1000282 –