2013-04-09 43 views
1

我正在讀取用戶輸入的字符串並在循環內使用該字符串進行基本計算的程序中工作。 我的一般問題是使用循環內部的字符串,儘管後來它將不得不做更多的事情,但從現在開始,我只需要測試Bolzano定理(特別是爲了找到可能的根的區間) 。 我已經開始研究一個函數,該函數通過字符讀取輸入字符,並用開關控件計算中綴表達式。 不過,我想知道是什麼,如果有一種方法可以做這樣的事情:C/C++:將讀取的字符串傳遞給程序中的循環C

{ 
    /*Already stored the doubles: a, b, precision.*/ 
    printf("Enter the expression you want to calculate"); 
    scanf("%s", expression); 
    /*User input: (3*i)+(i*i)-3*/ 
    while(i <= b){ 
     fa = (3*i)+(i*i)-3; /*How to insert the string here*/ 
     fb = (3*(i+precision))+((i+precision)*(i+precision))-3; 
     if(fa*fb < 0) 
      printf("There is at least one root in the interval: [ %g, %g ].", a, a+precision); 
     /*And goes on...*/ 
} 

假設用戶沒有輸入在循環使用無效的表達式(如I^7 )或者我已經實現了控制來轉換這些表達式(類似於讀取一個字符串,並將其更改爲後綴或前綴符號進行必要的轉換),有沒有辦法將一個存儲的字符串在一個賦值循環中使用?

+0

在C或C++?也許你想'atoi'? – 2013-04-09 03:55:52

+0

'atoi'有一些非常糟糕的語義 - 'strtol'總是一個更好的選擇。 – 2013-04-09 04:02:01

+1

您需要一個表達式解析器。 – user93353 2013-04-09 04:10:15

回答

0

我想你問的是:給一個字符串和一些數學表達式,我該如何評估這個表達式?

我不知道您是否可以對錶達式的語法做出某些假設;如果這樣可以幫助你簡化你的代碼。如果沒有,你基本上就必須「記號化」的字符串第一個,上面的字符串,將令牌的這樣一個順序:

LBRACKET, NUM, BINOP, VAR, RBRACKET, BINOP, LBRACKET, VAR, BINOP, VAR, RBRACKET, BINOP, NUM 

你也不得不建立自己一點解析器,可以確保你的表達是基於某些句法規則形成的;解析器會使用這個令牌序列。解析器的輸出是一個表示該表達式的數據結構(通常是一棵樹)。給定那棵樹,你可以通過自下而上計算子表達式來評估表達式。

fa =      - 
         /\ 
         + 3 
         /\ 
         * * 
        /\/\ 
        3 i i i 

這只是一個添加新節點到樹中以添加精度操作數的問題。

有一些東西在線如何做到這一點。只需搜索「如何構建表達式評估器」,例如this頁面會提供一些更多的細節。

+0

謝謝,這正是我需要的。顯然它不會像我想象的那麼容易,但感謝你提供的答案和鏈接。 – 2013-04-09 06:28:21

+0

你是對的,這不是一個5分鐘的黑客攻擊,但有一些幫助你可以自動化這些事情。有些工具可以幫助您從描述中生成掃描器(標記器)和解析器,請參閱'lex'或'flex'或'yacc'或'bison';甚至可以搜索「在線掃描器生成器」或「在線解析器生成器」。話雖如此,如果您可以確保您的表達式字符串具有某種形式/語法,那麼您可以直接進入它並將其拉出來。 – Jens 2013-04-09 08:39:41

相關問題