2014-02-20 159 views
0

我試圖創建一個解算不同長度(例如2 + 3/4或7 * 8/2 + 12-14)的算術表達式的計算器,並且我想知道是否可以在不使用的字符串。不使用字符串的可變長度算術計算器?

我發現無數的教程解釋瞭如何使一個簡單的計算器只有兩個數字和一個運算符,我還發現了使用sscanf和字符串來獲取輸入的示例。

但是,我的問題是:有沒有一種方法(甚至有可能)獲得可變長度輸入而不使用字符串?

起初,我以爲我可以簡單地添加更多的說明符:

int num1 , num2, num3; 
char op1, op2; 

printf("Please enter your equation to evaluate: "); 
scanf("%d%c%d%c%d", &num1, &op1, &num2, &op2, &num3); 

但顯然,這並不對方程比3號或小於3號工作更長的時間。 我也在考慮使用某種遞歸函數,但我不確定如果我需要事先詢問整個等式,我該怎麼做?

+0

您可以嘗試使用自己的解析器並使用http://en.wikipedia.org/wiki/Reverse_Polish_notation – Alexis

+0

一次只能讀取一個字符。 – jxh

+0

但是,如果不使用字符串,那麼可以將每個標記存儲爲'char',但是,您需要一個下降解析器。最好將表達式轉換爲拋光表示法,然後使用堆棧結構構建表達式樹。 – nullpotent

回答

0

如果您打算從用戶輸入或命令行參數中讀取ASCII,那麼您在字符串世界中是非常不可避免的。你可以做的是儘可能早地將它們轉換成別的東西。

您可以放棄ASCII並定義二進制文件格式。

例如,您可能會說每兩個字節對都是一個標記。第一個字節是一個元素類型(有符號整數,無符號整數,float,運算符),第二個字節是值。

僞代碼:

while(!done) { 
    int type = read(f); 
    int value = read(f); 
    switch(type) { 
     case TYPE_INTEGER: 
      push_to_stack(value); 
      break; 
     case TYPE_FLOAT: 
      push_to_stack_as_float(value); 
      break; 
     case TYPE_OPERATOR: 
      execute_operator(value); 
      break; 
    } 
} 

相當爲什麼你會強迫自己沿着這條路,我不知道。你可能會發現自己想編寫一個程序來將ASCII輸入轉換成你的二進制文件格式;這將使用字符串。那麼爲什麼你首先逃避了絃樂?

0

你可以創建一個struct的列表,每個struct必須包含一個值或一個子列表,一個運算符(char?)和一個對下一個(和或之前)char的引用。

然後,您只需要求用戶輸入一個數字(或「(」/「)」)和一個操作符號。每個數字+運算符都是列表中的一個新元素,每一個(是一個子列表,每一個)都是返回上級列表(您甚至可以不創建子列表,但可以動態地詳細說明並返回結果,例如一個遞歸函數)

結構和代碼可以詳細闡述以支持多個參數。