基于java设计一个可视化中智数计算器

Smarandache在1995年首次描述了中智学,并提出了一种重要的数学机制,称为中智集理论,用以处理模糊及其各种类型无法处理的不精确、不确定和不确定问题。NS是由真实程度(t)、不确定程度(i)和否定程度(f)三个自治映射得到的,取值范围为

例如对某商品的评价时,70%的人认为好,10%认为不好,而其余20%的人不做评价,那么我们可以用一个中智数来描述该商品。中智数的加法和乘法运算规则如下:

 

 

参考Windows操作系统提供的计算器设计一个中智数的计算器,要求具有如下功能:

1. 单击计算器上的数字(0、1、2、3、4、5、6、7、8、9)可以设置参与计算的运算数。

2. 单击计算器的运算符按钮(+、*)可以选择运算符号。

3. 单击计算器上S按钮可以计算出相应的得分函数值。

4. 单击计算器上的符号(=)按钮显示计算结果。

import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.text.BadLocationException;
public class Calculator extends JFrame implements ActionListener {//首先继承JFrame类和实现事件监听的接口
	
		private JTextField jtf;
	    private JButton jia,cheng,dian,dengyu,C,kongge1,kongge2;
	    private JButton more,less,douhao,hanshu;
		private JPanel[] jp;                      //建立各个按钮、面板及double型的参数
		private JButton[] jb;
	    private  double num1,num2,num3,num4,num5,num6;
		private String a;
		public  NN t1;
		public void Jisuanqi(String s) {
			setTitle(s);
			setBounds(350, 350, 300,300);//设置布局位置大小
			setVisible(true);//设置可见性
			setLayout(new GridLayout(6, 1, 0, 0));
			chushihua();
		}
		public void chushihua() {
			//初始化各个组件,并且添加动作监听事件的方法
			a="";
			jtf =new JTextField(12);
			jia =new JButton("+");
			jia.addActionListener(this);			
			cheng =new JButton("*");
			cheng.addActionListener(this);
			dian = new JButton(".");
			dian.addActionListener(this);
			dengyu = new JButton("=");
			dengyu.addActionListener(this);
			C =new JButton("C");
			C.addActionListener(this);
			kongge1=new JButton("DEL");
			kongge2=new JButton("Ans");
			more =new JButton(">");
			more.addActionListener(this);
			less =new JButton("<");
			less.addActionListener(this);
			hanshu =new JButton("S");
			hanshu.addActionListener(this);
			douhao =new JButton(",");
			douhao.addActionListener(this);
			jb=new JButton[10];
			for(int i=0;i<jb.length;i++){
				jb[i]=new JButton(String.valueOf(i));
				jb[i].addActionListener(this);
			}
			jp=new JPanel[6];
			for(int i=0;i<jp.length;i++){
				jp[i]=new JPanel();
			}
			jp[0].add(jtf);
			jp[0].add(C);
			add(jp[0]);
			
			
			jp[1].add(jb[7]);
			jp[1].add(jb[8]);//将各个组件分别放入6个面板中,再将各个面板放入大容器中
			jp[1].add(jb[9]);
			jp[1].add(jia);
			add(jp[1]);
			
			jp[2].add(jb[4]);
			jp[2].add(jb[5]);
			jp[2].add(jb[6]);
			jp[2].add(kongge1);
			add(jp[2]);
			
			
			jp[3].add(jb[1]);
			jp[3].add(jb[2]);
			jp[3].add(jb[3]);
			jp[3].add(cheng);
			add(jp[3]);
			
			jp[4].add(jb[0]);
			jp[4].add(dian);
			jp[4].add(dengyu);
			jp[4].add(kongge2);
			add(jp[4]);
			
			jp[5].add(hanshu);
			jp[5].add(more);
			jp[5].add(less);
			jp[5].add(douhao);
			add(jp[5]);
			
			setVisible(false);
			setVisible(true);
		}
		@Override
		public void actionPerformed(ActionEvent e) {//设置触发事件所发的行动
			// TODO Auto-generated method stub
			if(e.getSource()==C)
			{
				jtf.setText("");
			}
			if(e.getSource()==dengyu)//判断按钮的内容
			{
				String a3=jtf.getText();//获取文本框的内容,并转换成字符串
				num4=Double.valueOf(a3.replaceAll("<","" ).replaceAll(">", "" ).split(",")[0]);	//将文本框的内容先将<>去掉			
				num5=Double.valueOf(a3.replaceAll("<","" ).replaceAll(">", "" ).split(",")[1]);	//再按照逗号分割成字符串数组		
				num6=Double.valueOf(a3.replaceAll("<","" ).replaceAll(">", "" ).split(",")[2]);	//最后转化成double型进行赋值操作				
				NN t2=new NN(num4,num5,num6);//将刚才赋值的参数进行初始化NN类对象
				if(a.equals("+")){jtf.setText(t1.add(t2).toString());}//调用add方法进行运行,在调用tostring方法进行转换
				
				if(a.equals("*")){jtf.setText(t1.mult(t2).toString());}
				
			}		
			if("+*".contains(e.getActionCommand()))                                                    
			{
				String a2=jtf.getText();
				num1=Double.valueOf(a2.replaceAll("<","" ).replaceAll(">", "" ).split(",")[0]);			
				num2=Double.valueOf(a2.replaceAll("<","" ).replaceAll(">", "" ).split(",")[1]);
				num3=Double.valueOf(a2.replaceAll("<","" ).replaceAll(">", "" ).split(",")[2]);
				  t1=new NN(num1,num2,num3);
				a=e.getActionCommand();//当输入第一个数据后,若点击*或+的按钮则先清空文本框
			    jtf.setText("");
			}
			if("0.123456789><,".contains(e.getActionCommand()))
			{
				jtf.setText(jtf.getText()+e.getActionCommand());//若点击标签为0.123456789><,的按钮,则进行文本框追加操作
			}
			if(e.getSource()==hanshu) {
				String a1=jtf.getText();//获取文本框内容
				num1=Double.valueOf(a1.replaceAll("<","" ).replaceAll(">", "" ).split(",")[0]);//将文本框的内容先将<>去掉				
				num2=Double.valueOf(a1.replaceAll("<","" ).replaceAll(">", "" ).split(",")[1]);//再按照逗号分割成字符串数组
				num3=Double.valueOf(a1.replaceAll("<","" ).replaceAll(">", "" ).split(",")[2]);//最后转化成double型进行赋值操作
				NN t1=new NN(num1,num2,num3);
				jtf.setText(String.valueOf(t1.getS()));//调用getS方法进行运算,得到double型的结果,再将他进行转换成字符串,写入文本框
				
			}
		}

import java.math.BigDecimal;
import java.math.RoundingMode;

public class NN {//创建各个所需的参数
    private double T;//真实程度
    private double I;//不确定程度
    private double F;//否定程度
    private double S;//得分函数
	public double getT() {
		return T;
	}
	public void setT(double t) {//获取其参数对象的get和set方法
		T = t;
	}
	public double getI() {
		return I;
	}
	public void setI(double i) {
		I = i;
	}
	public double getF() {
		return F;
	}
	public void setF(double f) {
		F = f;
	}
	public double getS() {
		return S;
	}
	public void setS(double s) {
		S = s;
	}
	public NN(double t, double i, double f) {//创建含参构造器
		super();
		T = t;
		I = i;
		F = f;
		S =formatdou2((1+t-2*i-f)/2);//定义函数的运算模式
	}
	public NN(){//创建无参构造器
		super();
	}
	public NN add(NN n) {//定义中智数的加法运算
		double ret =formatdou2(this.T+n.getT()-this.T*n.getT());
		double rei =formatdou2(this.I*n.getT());
		double ref =formatdou2(this.F*n.getF());
		NN re =new NN(ret, rei, ref);
	    return re;
	}
	public NN mult(NN n) {//定义中智数的乘法运算
		double ret =formatdou2(this.T*n.getT());
		double rei =formatdou2(this.I+n.getI()-this.I*n.getI());
		double ref =formatdou2(this.F+n.getF()-this.F*n.getT());
	     NN re =new NN(ret, rei, ref);
	     return re;
	}
	public String toString() {//定义所获得结果后显示在文本框的格式
		return "<"+this.T+","+this.I+","+this.F+">";
	}
	private double formatdou2(double d) {//定义运算的精度及保留位数的形式
		
		String result = String .format("%.3f",d);
		return Double.valueOf(result);
	}
}
public class test {//创建测试类进行运行
	public static void main(String[] args) {
		// TODO Auto-generated method stub
   Calculator c =new Calculator();//创建中智数计算器对象
   c.Jisuanqi("中智数计算器");//调用方法
	}
}	

测试结果如下图

 

 

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值