最近在寫乙個計算器的專案,其中最麻煩的就是數學表達試的解析,用c語言解決問題,每一步基本都要自己實現,非常鍛鍊邏輯能力。用了將近兩個晚上的時間,終於完成了大部分表示式的解析,寫這篇文章來記錄下遇到的問題。
涉及到二維指標。
主要思想和這篇部落格中的一樣:
首先進行括號代換,就是將括號中的表示式單獨計算出來,計算出來的字串代替原來括號的位置。
然後進行乘除暈眩,將解析式中的乘除單獨計算出來,計算出來的字串代替原來乘除的位置。
最後進行加減法的運算,從左到右進行計算,得到結果。
**中運用到了指標陣列,陣列中存放的都是指標,每個指標指向表示式中的子串。**可以直接執行這種方法可以運用於命令列引數的解析。
#include
#include
#include
/****************************str*****************************/
char
*str_init()
void
str_free
(char
*p)void
(char
**src,
const
char
*str)
/****************************str*****************************/
/****************************calculate*****************************/
void
deal_split
(char
*a,int len,
char
*list)
}}//加減
intdeal_add_sub
(char
*str)
;deal_split
(str,
strlen
(str)
, list)
;int result =
atoi
(list[0]
);int i =0;
for(i =
1; i <
10&& list[i]
!=null
; i +=2
)if(*list[i]
=='-')}
return result;
}//乘除
char
*deal_mul_div
(char
*str)
;deal_split
(str,
strlen
(str)
, list)
;char
*dst =
str_init()
;//輸出字串
char
*temp = list[0]
;char itoa_temp[10]
=;int i =0;
for(i =
1; i <
30&& list[i]
!=null
; i +=2
)elseif(
*list[i]
=='-'
)elseif(
*list[i]
=='*'
)elseif(
*list[i]
=='/')}
(&dst, temp)
;return dst;
}void
printf_list
(char
*list)
}//括號
char
*deal_bracket
(char
*str)
;deal_split
(str,
strlen
(str)
, list)
;char
*dst =
str_init()
;//輸出字串
char
*dst_temp =
str_init()
;char
*temp = list[0]
;char itoa_temp[10]
=;int i =0;
for(i =
1; i <
30&& list[i]
!=null
; i++
)elseif(
*list[i]
=='-'
)elseif(
*list[i]
=='*'
)elseif(
*list[i]
=='/'
)elseif(
*list[i]
=='('
)char
*p1 =
deal_mul_div
(dst_temp)
;int value =
deal_add_sub
(p1)
;itoa
(value, itoa_temp,10)
; temp = itoa_temp;}}
(&dst, temp)
;str_free
(dst_temp)
;return dst;
}/****************************calculate*****************************/
intmain()
C 數學表示式計算
c 計算 數學表示式 標量的值 搞個字典 string double 更具 操作符號 分割字串 更具 優先順序把資料 push stack 再每次 分別 pop 2個資料,和 乙個操作符,一直到全部結束 效果下圖如圖 部分核心 如下 空 stack 返回 true 空 stack 返回 true p...
數學表示式的計算 使用正規表示式
這種方式的基本思想就是迴圈使用正規表示式找出字串中不帶括號的那一部分,再分析出各個數字和運算子以及函式,並執行運算,然後將結果替換原表示式中相應部分,直到最後不能再進行任何替換。如 3 5 sin 7 9 3 5 sin 7 9 8 sin 7 9 8 sin16 8 sin16 8 0.2879 ...
數學表示式
只做 1或者2操作,使得給定乙個目標數,乙個初始數,使得初始數到目標數的步驟最短。23 52 1 2 1 113 11 1 1 1 222 1 先判斷目標數字和原始數字的大小,然後在判斷目標數是否為奇數,若是,則 1變成偶數在遞迴,在判斷原始數 2是否大於目標數,若不大於,則做乘2的操作。若小於則不...