sungo
瘋狂口罩大盜
   
發文: 822
積分: 17
|
於 2004-05-25 13:37
     
以前有想過作個簡單計算器,但因為都在忙其他事...所以一直沒實作, 在這裡提出我的構想,希望大家也能談談自己的想法...
執行模式: 第一種:採跟Windows內建的小算盤同樣的執行模式,TextBox僅作 顯示用不能作輸入,全部由Button來輸入運算子、運算元以及函數 。優點:邏輯設計較簡單,例如運算三角函數sin 60 (角度),只要 在"Sin" Button的KeyPress事件裡,抓TextBox值60轉成弳度後放入 sin()方法作運算再將結果輸出到TextBox即可、加減乘除作法:例如 加法的運算,在"+" Button的KeyPress事件裡要作2件事,1.抓取 TextBox的值與堆疊頂端的值相加,2.將結果輸出至TextBox並放至堆疊 頂端。(必須在"+" Button 的KeyPress執行前,先將TextBox預設值0放 至堆疊頂端),例1+2+3+...n的運算過程如下: 操作鍵:..... 堆疊內容:.......TextBox顯示: 無...............0.....................0 1................0.....................1 +................0..1.................1 2................0..1.................2 +................0..1..3.............3 3................0..1..3.............3 +............... 0..1..3..6.........6 4................0..1..3..6.........4 +................0..1..3..10.......10 ......(以此類推)
缺點:無法由TextBox輸入,較缺乏彈性。在這裡偷偷告訴大家一個Windows小算 盤的小秘訣:雖然它的TextBox無法由鍵盤輸入,但熱鍵還是可以用的,也就是 說只要我們在Editor將運算式用Ctrl+C複製下來用Ctrl+V貼在小算盤的TextBox 上,它還是可以正確地計算出結果的。(貼上後按"="鍵答案就出來了)
第二種:也就是我想要實作的類型,TextBox除了作輸出用以外,還可兼作輸入 。運算的核心類別Arithmetic,包含下列基本功能:(可以一直擴充)
1.基本的四則運算:如(-1+9)*87/3.14。 看要用中序式轉後序式利用堆疊作或是用Token的方式作都可以 ,我應該會用Token,因為我比懶喜歡用之前已經作好的東西。
2.sin cos tan (角度的三角函數) 3.sinr cosr tanr (弳度<Radians>的三角函數) 4.asin acos atan (角度的反三角函數) 5.asinr acosr atanr (弳度的反三角函數) 6.rtod (弳度轉角度) 7.dtor (角度轉弳度) 8.sqrt (開根號) 以上用java.lang.Math就可輕鬆解決。
9.log (底數10的對數)
1 2 3
| public static double log(double number) {
return (Math.log(number) / Math.log(10));
}
|
10.ln (自然對數)
1 2 3
| public static double ln(double e) {
return (Math.log(e));
}
|
11.n (階乘) 大階層時數字會很大,所以用java.math.BigInteger來作。
12.d2b <decimal to binary> (十進制轉二進制) 13.b2d <binary to decimal> (二進制轉十進制) 14.d2o <decimal to octal> (十進制轉八進制) 15.o2d <octal to decimal> (八進制轉十進制) 16.d2h <decimal to hex> (十進制轉十六進制) 17.h2d <hex to decimal> (十六進制轉十進制) 以上可用java.lang.Integer、java.lang.String處理 或是要自己寫邏輯處理也可。
18.AND OR XOR NOT (位元運算功能) java裡的用法AND &、OR |、XOR ^、NOT ~
19.squa <square> (某數的平方) 用java.lang.Math.pow(double a, double b) -double b 參數用2
20.sinh cosh tanh (雙曲線函數) sinh x=0.5(ex - e-x) cosh x=0.5(ex + e-x) tanh x= sinh x / cosh x
21.logxy <logx Y> (底數為x的y對數)
1 2 3 4 5
| public static double log(double x, double y) {
double top = Math.log(y);
double bottom = Math.log(x);
return (top / bottom);
}
|
22.xpowy <X Pow Y> (X的Y方) 直接使用java.lang.Math.pow(double a, double b)
23.xsqrty <X Sqrt Y> (X開Y方)
1 2 3
| public static double xsqrty(double x, double y) {
return Math.pow(x, (double) 1 / (double) y);
}
|
在第二種執行模式中,Button的KeyPress事件僅需將對應的函數字串 插入至TextBox,重點在於怎麼處理TextBox裡的運算式,這也是最複雜 的部分。例如我們在TextBox輸入10*sin60+100,當focus在TextBox 時按下Enter鍵或是按下"=" Button後即要計算出108.660254037844的 答案並顯示於TextBox中。該case我的作法:先用Token設計一個邏輯, 抽出sin60作處理,再結合成10*8.660254037844+100,再送入先前設計 的四則運算處理method,即可算出答案。當然這只是sin結合其它運算子 作運算而已,如果有更多的函數結合在一起時,處理的狀況必會更加複 雜。
 
|