作者spider391 (小乖)
看板C_and_CPP
標題"計算機程式"源碼交換分享
時間Fri Jun 25 13:05:44 2010
不小心逛到這篇文章~
※ 引述《bioudee (It's my life!!)》之銘言:
: 需要寫個有關數學運算的程式,
: 一次從stdin讀入一行直到EOF,
: 按CR會從stdout印出答案
: .
: 數字包括正負數 (-1), 小數點(1.11), 分數(3/4).
: 運算符號包括 +, -, *, /, %,
: ^,
: 如果有括號則會優先處理.
: EX:
: 22+34+66-77 = 45
: (1)+(25*3)-2 = 74
: 13^5 = 371293
: 99 % 14 = 1
: 36 / 0 = ERROR
: 10^20 = ERROR
: 2^(.5) = 1.41421356
: 1--+3-(42+--5/2) = -40.5000000
: -(3^(2*(4-1))) = -729
: 請有經驗的大大幫幫忙
: 謝謝
推文提供了一些解法
推 ADF:google "math expression parser" 11/27 15:02
推 godfat:用 boost::spirit 滿好寫的,不過需要研究一下 11/27 15:46
→ ADF:樓上是boost魔人.. 11/27 16:07
→ sunneo:你用堆疊作作看吧... 11/27 18:05
推 gozha:用遞迴做二元樹,我是這樣做的.. 11/27 18:52
推 carlcarl:將運算式轉成後序 利用STACK 這樣會比較好處理
最近寫程式都是站在"巨人的肩膀"上,看到這題目手癢了一下
在星巴克點了杯"焦糖瑪奇朵",開始 implement
沒想到,咖啡喝完了~ code 還沒生出來
仔細想想,這題目也運用到了很多資訊科學的核心基礎觀念(很多都還給老師了 = =)
資料結構、演算法、Compiler、正規語言 等等。
光是要設計出符合計算機程式的需求就花了我不少時間了
eq. 1-2-3 的語意為 (1-2)-3
1+2*3 的語意為 1+(2*3)
還有很多議題可以討論:
是否要建立二元樹
用遞迴 or Stack or Table
是否用大數 or double
錯誤處理
平行計算
用 boost::spirit or Lex&Yacc 來寫
我自己目前寫了 double 版本的的計算機 (利用二元樹來實作)
接下來會實作大數版本 以及 boost::spirit 如何使用
不過就算自己寫的很爽 還是很多地方會沒考慮到
我想請有寫過計算機程式的或是跟我一樣手癢的版友,
跟我交換 soure code 分享一下彼此的 coding style
我再把計算機程式基本的寫法,或是有特殊有趣的心得 po 上來給大家分享
謝謝
======================================
ps.
有興趣的可以寄我站內信跟我要聯絡方式
源碼寄給我後,會以群組方式在寄給大家
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 61.216.172.170
→ king19880326:源碼, 你是大陸人?? 06/26 03:06
→ softwind:stack+big num. 其他就商品化在看摟 06/26 12:01
→ softwind:不一定要寄信 你可以看置底文 分享source code 06/26 12:03
→ dos792:為啥不直接看boost 源碼 06/26 17:56