一. 设计要求
参考Windows操作系统提供的计算器设计一个实用的计算器,要求除了具有普通的计算功能外,还具有保存计算过程的功能。
(1) 单击计算器上的数字按钮(0,1,2,3,4,5,6,7,8,9)可以设置参与计算的运算数。
(2) 单击计算器上的运算符按钮(+、-、*、/)可以选择运算的符号。
(3) 单击计算器上的函数按钮可以计算出相应的函数值。
(4) 单击计算器上的等号(=)按钮显示计算结果。
(5) 在一个文本框中显示当前的计算过程,在一个文本区中显示以往的计算过程。
(6) 单击“保存”按钮可以将文本区中显示的全部计算过程保存到文件:单击“复制”按钮可以将文本区中选中的文本复制到剪贴板;单击“清除”按钮可以清除文本区中的全部内容。
二. 改进要求
(1) 在保存计算过程到文件的同时也把当前时间保存到该文件中。
(2) 可以让用户选择计算器的精度,例如小数点最多保留两位等。
(3) 增加一个计算阶乘的功能,该功能用BigInteger类实现。
(4) 增加音效,用户单击按钮时程序能播放简短的声音,让用户通过声音知道自己单击了怎么样的按钮。
(5) 自定义新功能。
程序运行后的的图片:
//Computer类
//封装计算器的计算模型
import java.util.*;
public class Computer {
public int jd = 2;
public double result; //计算所得结果
public Stack<Character> dataItem; //参与运算的数据项
public Stack<Double> tempResult; //用堆栈存放临时结果
public Stack<Character> operator; //存放运算符号
public Computer(){
init();
}
public void init() {
dataItem = new Stack<Character>();
tempResult = new Stack<Double>();
dataItem.push('0');
operator = new Stack<Character>();
}
public void setDataItem(char c){
if(c!='.')
dataItem.push(c);
else {
if(!dataItem.contains('.'))
dataItem.push(c);
}
}
public void setOperator(char p){
if(dataItem.empty()){ //如果没有数据项
operator.clear();//防止用户不断更换或反复单击一个运算符
operator.push(p);//堆栈压入运算符,即保留用户最后确定的运算符
return;
}
if(operator.empty()) { //如果没有运算符
operator.push(p); //堆栈压入运算符
double m = computerDataItem(); //计算数据项
dataItem.removeAllElements(); //将数据项中的数字清空
tempResult.push(m); //把临时结果m压入tempResult
}
else { //如果有运算符
double mData = computerDataItem(); //计算数据项
dataItem.removeAllElements(); //将数据项中的数字清空
char yuansuan =operator.pop(); //弹出已有的运算符
double rTemp =tempResult.pop(); //弹出临时结果
if(yuansuan == '+'){
rTemp = rTemp+mData;
}
else if(yuansuan == '-') {
rTemp = rTemp-mData;
}
else if(yuansuan == '*') {
rTemp = rTemp*mData;
}
else if(yuansuan == '/') {
rTemp = rTemp/mData;
}
if(jd==0){
rTemp=Math.round(rTemp);
}else if(jd==1){
rTemp=Double.parseDouble(String.format("%.1f",rTemp));
}else if(jd==2){
rTemp=Double.parseDouble(String.format("%.2f",rTemp));
}
tempResult.push(rTemp); //把新临时结果rTemp压入tempResult
operator.push(p); //新运算符压入operator
}
}
public char getOperator() {
if(operator.empty()){
return '\0';
}
return operator.peek();
}
public void backspace() {
if(dataItem.size()>=1){
dataItem.pop();
}
}
public void initDataItemByMath(MathComputer computer){
computer.handle(this); //对compter中的数据项进行数学计算
}
public double getResult() { //得到计算结果
double endItem = 0;
if(dataItem.empty()){
endItem = tempResult.peek();
}
else {
endItem = computerDataItem();
}
if(operator.empty()) {
result = endItem;
return result;
}
char yuansuan =operator.peek(); //最后的运算符
if(yuansuan == '+'){
result = tempResult.peek()+endItem;
}
else if(yuansuan == '-') {
result = tempResult.peek()-endItem;
}
else if(yuansuan == '*') {
result = tempResult.peek()*endItem;
}
else if(yuansuan == '/') {
result = tempResult.peek()/endItem;
}
return result;
}
public double getTempResult() { //得到临时结果
double r = 0;
if(tempResult.empty()){
r = computerDataItem();
}
else {
r= tempResult.peek();
}
return r;
}
public double computerDataItem(){ //计算出数据项的double型结果
if(dataItem.empty()){
return tempResult.peek();
}
StringBuffer str = new StringBuffer();
double doubleData = 0;
for(int i=0;i<dataItem.size();i++) {
str.append(dataItem.get(i));//获取堆栈中的数字(但不弹栈)
}
try{
doubleData = Double.parseDouble(str.toString());
}
catch(NumberFormatException exp){
doubleData = 0;
}
return doubleData;
}
}
代码完整链接:
链接:https://pan.baidu.com/s/12oMtly1pq3EPobH5SqSnsg
提取码:0ory
网盘的这个代码是全的,创建一个项目自己起一个名,在src下把网盘中下载的ch2文件夹复制进去,目录结构见下图,在data文件夹下找到dl的java文件点击运行,先登录后跳转到计算器页面。登录后你可以拖动计算器调整到你觉得美观的大小,也可以自己设置。