1. 程式人生 > 其它 >java儲存計算過程的計算器_java實現簡單計算器

java儲存計算過程的計算器_java實現簡單計算器

技術標籤:java儲存計算過程的計算器

java實現簡單計算器

斷斷續續的幾天時間裡,嘗試著用java實現了一個簡單的計算器。其實基本功能前不久就實現了,但是存在一些Bug,這幾天修復了一下,又加了一個程式設計師計算器(進位制轉化)。
這是最初的介面:

75f143dd59407036aa8f7494f3c17dbe.png

這是最新介面:
b80f1d7a71bdbbd1b8ae6d2c2eaf68bb.png

增加了一個程式設計師介面(實則就是進位制轉化)
b92938816d2ada6a484074a8cca98f31.png

簡單看一下專案結構:
e86a3750e24df5aa3c2ea730cdbbbea5.png

5個java檔案在一個lianxi包中。Caculator.java是主類來建立兩個介面一個Programmer.java和一個std.java。ProgrammerC.java中包含程式設計師介面計算的一些操作函式。stdC.java是標準介面計算的一些函式。分別看一下原始碼:
//Caculator.java
packagelianxi;
importjava.awt.*;
importjavax.swing.*;

publicclassCaculatorextendsJFrame{
JTabbedPanedbTabPane;//選項卡面板
JPanelinputPanel;//標準面板;
JPanelviewPanel;//程式設計師面板;
stdstdPanel;
ProgrammerProgrammerPanel;

publicCaculator(){
super("計算器");
setGUIComponent();
}

publicvoidsetGUIComponent(){
Containerc=getContentPane();
dbTabPane=newJTabbedPane();
//定義標準面板
inputPanel=newJPanel();
inputPanel.setLayout(null);
stdPanel=newstd();
inputPanel.add(stdPanel);
dbTabPane.add(inputPanel,"標準");

//定義程式設計師面板
viewPanel=newJPanel();
viewPanel.setLayout(null);
ProgrammerPanel=newProgrammer();
viewPanel.add(ProgrammerPanel);
dbTabPane.add(viewPanel,"程式設計師");

c.add(dbTabPane);
}

publicstaticvoidmain(String[]args){
Caculatorsm=newCaculator();
stdCstdc=newstdC();
Programmerprogrammer=newProgrammer();
sm.setSize(600,230);
sm.setVisible(true);
sm.setResizable(false);//視窗大小不可改變
sm.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
}
//ProgrammerC.java
packagelianxi;
//進位制轉化
//二進位制——>十進位制、十進位制——>二進位制
//八進位制——>十進位制、十進位制——>八進位制
//十六進位制——>十進位制、十進位制——>十六進位制

importjava.awt.event.ActionEvent;
importjava.awt.event.ActionListener;
importjava.util.Iterator;
importjava.util.Vector;

publicclassProgrammerC{
Stringstr1="";
publicinttransform1(int[]er_shi,intk){//k為要轉化的進位制數
intans=0;
for(inti=er_shi.length-1;i>=0;i--){
for(intj=0;j1-i;j++)
er_shi[i]*=k;
ans+=er_shi[i];
}returnans;
}publicStringtransform2(Strings,intk){//k為要轉化的進位制數intans=Integer.parseInt(s);intchushu;
Strings1="";
Vectorb=newVector();
chushu=ans;while(chushu!=0){if(k!=16){
b.add(chushu%k);
chushu=chushu/k;
}else{if(chushu%k==10||chushu%k==11||chushu%k==12||chushu%k==13||chushu%k==14||chushu%k==15){switch(chushu%k){case10:b.add("A");break;case11:b.add("B");break;case12:b.add("C");break;case13:b.add("D");break;case14:b.add("E");break;case15:b.add("F");break;
}
}elseb.add(chushu%k);
chushu=chushu/k;
}
}for(inti=0;is1+=b.get(i);
}returnnewStringBuffer(s1).reverse().toString();//將字串反向輸出
}
}
//stdC.java
packagelianxi;
/*這裡注意計算根號時,只能單個計算例如(根號9)不能計算帶根號的表示式
*因為根號沒加入到棧裡面,而是另外的函式
**/
importjava.lang.Math;
importjava.math.BigDecimal;
importjava.awt.event.ActionEvent;
importjava.awt.event.ActionListener;
importjava.util.Stack;

importjavax.swing.JButton;

publicclassstdC{

publicstdC(){

}
publicstaticintsq(intn){//求根函式1
if(n==1){
return1;
}
inttmp=0;
for(inti=1;i<=n/2+1;i++){
if(i*i==n){
tmp=i;
break;
}
if(i*i>n){
tmp=i-1;
break;
}
}
returntmp;
}
publicstaticdouble[]sc(intm){//求根函式2m==3保留三位小數
double[]arr=newdouble[m];
intnum=0;
while(num!=m){
doublef=1;
for(inti=0;i<=num;i++){
f=f*10;
}
arr[num]=1/f;//arr[0]=0.1f==10、arr[1]=0.01f==100、arr[2]=0.001f==1000
num++;
}
returnarr;
}
publicstaticdoublesb(intn,doublej,double[]arr){//求根函式3
doubletmp=j;//2
for(intp=0;pif(p>0){
j=tmp;//計算過後的值(整數位+小數位的和,賦值給j,下面繼續運算)
}
for(inti=1;i<=9;i++){//小數位只有九位{0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9}
tmp=i*arr[p]+j;//i*arr[p],相當於每次加0.1,0.2...
if(tmp*tmp==n){
returntmp;
}
if(tmp*tmp>n){
//避免丟失精度
BigDecimalc1=newBigDecimal(Double.toString(tmp));
BigDecimalc2=newBigDecimal(Double.toString(arr[p]));
tmp=c1.subtract(c2).doubleValue();
break;
}
}
}
returntmp;
}
publicstaticStringcompute(Stringinput)//即1237的樣例{
Stringstr[];
Stringinputnew="";
doubledou;
for(inti=0;iif(input.charAt(i)!='c'){
inputnew+=input.charAt(i);
}
}
str=inputnew.split("");//以空格分隔

if(str[1].compareTo("√")==0){//這裡為什麼是1
Stringstr1="";
inttmp=0;
for(intj=2;jstr1+=str[j];
}
doubleans1=Double.parseDouble(str1);//這裡轉化一下
if(ans1==0)
return"false";
if(ans1==1)
returnString.valueOf(ans1);
dou=sb((int)ans1,sq((int)ans1),sc(3));
Stringresult1=String.valueOf(dou);
returnresult1;
}
//1+2+3
Stacks=newStack();doublem=Double.parseDouble(str[0]);//第一個為數字,奇數為運算子,偶數為運算元
s.push(m);for(inti=1;iif(i%2==1){if(str[i].compareTo("+")==0){doublehelp=Double.parseDouble(str[i+1]);
s.push(help);
}if(str[i].compareTo("-")==0){doublehelp=Double.parseDouble(str[i+1]);
s.push(-help);
}if(str[i].compareTo("*")==0){//1*2doublehelp=Double.parseDouble(str[i+1]);doubleans=s.peek();//取出棧頂元素
s.pop();//消棧
ans*=help;
s.push(ans);
}if(str[i].compareTo("/")==0){doublehelp=Double.parseDouble(str[i+1]);doubleans=s.peek();
s.pop();
ans/=help;
s.push(ans);
}if(str[i].compareTo("%")==0){doublehelp=Double.parseDouble(str[i+1]);doubleans=s.peek();
s.pop();
ans%=help;
s.push(ans);
}
}
}doubleans=0d;while(!s.isEmpty()){
ans+=s.peek();
s.pop();
}
Stringresult=String.valueOf(ans);returnresult;
}
}

這裡文字有限只顯示了主類和兩個計算類ProgrammerC.java、stdC.java,全部的程式碼在這裡:https://blog.csdn.net/gaoyuelon/article/details/99886683

在實現的過程中遇到很多問題:
1.文字域如何新增滾動條
2.寫檔案時如何在之前的基礎上追加內容(即不覆蓋之前的內容)
3.如何建立選項卡面板(即標準介面和程式設計師介面)
4.各種資料型別之間的轉換
5.用堆疊實現加減乘除
6.根號的計算方法
7.進位制之間的轉化
8.可變長陣列的使用以及vector
9.視窗屬性
10.利用System.out.println()做除錯
之後把這些問題的解決方法再寫一下,第十點不算問題吧,只是覺得這樣除錯比較方便。

Linux命令

16.clear 清屏

4f5553c55c60dcac13e04870bc1867f1.gif

a0cc81d869e2a3dfb77ac1adcf96c8bb.png