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("中智数计算器");//调用方法
}
}
测试结果如下图