荣耀计算器

                                          ## 荣耀自制计算器

登录界面

package wangrongchang;
import java.awt.Image;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import java.awt.Font;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPasswordField;
import javax.swing.JTextField;
import javax.swing.ImageIcon;
import javax.swing.JOptionPane;
public class Login //extends JFrame
{
	private static  JButton bt1;//注册按钮
	private static  JButton bt2;//登陆按钮
	private static  JButton bt3;//退出按钮
	private static  JLabel jl1;//登陆的版面
	private static  JFrame jf1;//登录的框架
	private static  JTextField jt1;//id
	private static  JPasswordField jt2;//密码
	private static  JLabel jl_id;//id标签
	private static  JLabel jl_password;//密码标签
    private static String t1,t2;
    private static int pd=0;
	public Login() 
	{
		Font font=new Font("楷体",Font.PLAIN,20);
		jf1=new JFrame("欢迎登录计算器小程序");
		jf1.setSize(500,500);
		//给登录界面添加背景图片
		ImageIcon bgim = new ImageIcon(Login.class.getResource("tt.jpg")) ;//背景图案
		bgim.setImage(bgim.getImage().
		getScaledInstance(bgim.getIconWidth(),
				bgim.getIconHeight(),Image.SCALE_DEFAULT));
	    jl1=new JLabel();
	    jl1.setIcon(bgim);
	    //账号栏
	    jl_id=new JLabel("账号:");
	    jl_id.setBounds(40,60,60,30);
	    jl_id.setFont(font);
        //密码栏
	    jl_password=new JLabel("密码:");
	    jl_password.setBounds(40,120,60,30);
	    jl_password.setFont(font);
	    //注册按钮
	    bt1=new JButton("注册");
	    bt1.setBounds(40, 250, 100,50);
	    bt1.setFont(font);
	    //登录按钮
	    bt2=new JButton("登录");
	    bt2.setBounds(170, 250, 100,50);
	    bt2.setFont(font);
	    //退出按钮
	    bt3=new JButton("退出");
	    bt3.setBounds(300, 250, 100,50);
	    bt3.setFont(font);
	    //加入文本框
	    jt1=new JTextField();
	    jt1.setBounds(150,50,250,50);
	    jt1.setFont(font);
	    jt2=new JPasswordField();
	    jt2.setBounds(150,120,250,50);
	    jt2.setFont(font);
	    jl1.add(jt1);
	    jl1.add(jt2);
	    jl1.add(jl_id);
	    jl1.add(jl_password);
	    jl1.add(bt1);
	    jl1.add(bt2);
	    jl1.add(bt3);
	    jf1.add(jl1);
	    jf1.setVisible(true);
	    jf1.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	    jf1.setLocation(400,200);
	    //注册
	    bt1.addActionListener(new ActionListener() {
	    	@SuppressWarnings("deprecation")
	    	public void actionPerformed(ActionEvent e){
	    		pd=1;
	    		t1=jt1.getText();
	    		t2=jt2.getText();
	    		String filename="users.txt";
	    		try {
	    	FileWriter writer=new FileWriter(filename);
	    	BufferedWriter bw=new BufferedWriter(writer);
	    	bw.write("id:"+t1+"&&"+"Password:"+t2);
	    	bw.newLine();
	    	bw.close();
	    	writer.close();
	   }catch(IOException ex) {ex.printStackTrace();}
	   jt1.setText("");
	   jt2.setText("");
	   JOptionPane.showMessageDialog(null,"注册成功!你的账号是:"+t1+"密码是:"+t2);
	   }
	    });
	  //登录事件
	  bt2.addActionListener(new ActionListener() {
		  @SuppressWarnings("deprecation")
		  public void actionPerformed(ActionEvent e) {
			  if(pd==1||pd==0) 
			  {
				  File filename=new File("users.txt");
				  try {
					  FileReader inone=new FileReader(filename);
					  BufferedReader intwo=new BufferedReader(inone);
					  String s=null;
					  int b=1;
					  while((s=intwo.readLine())!=null) {
						  StringBuilder stringBuilder=new StringBuilder();
						  stringBuilder.append("id:");
						  stringBuilder.append(jt1.getText());
						  stringBuilder.append("&&");
						  stringBuilder.append("Password:");
						  stringBuilder.append(jt2.getText());
					     String ak=stringBuilder.toString();
					  if(s.equals(ak)) {
						  JOptionPane.showMessageDialog(null,"登录成功!");
						  jt1.setText("");
						  jt2.setText("");
						  //new Calculator().init();
						  new User();
						  jf1.dispose();
						  b=0;
						  break;
					  }
					  }
					  intwo.close();
					  inone.close();
					  if(b==1) {JOptionPane.showMessageDialog(null,"登陆失败!检查账号密码是否正确或请注册后登录",null,JOptionPane.ERROR_MESSAGE, null);
					 jt1.setText("");
					 jt2.setText("");
					  }
					  if(b==0) {//dispose();
					  return ;}
				  }catch(IOException ex) {ex.printStackTrace();}
			  }
		  }
	  });
	bt3.addActionListener(new ActionListener() {
		//@SuppressWarnings("deprecation")
    	public void actionPerformed(ActionEvent e){System.exit(0);}
	});}
	public static void main(String[] args) {
      new Login();
	}	
}

计算机界面

package wangrongchang;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.border.BevelBorder;
import javax.swing.JTextField;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Font;
import java.awt.GridLayout;
import java.awt.SystemColor;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.text.NumberFormat;
import java.util.regex.Pattern;
public class User 
{
	//定义组件
	String key[]={"MC","MR","MS","M+","M-","sin","cos","tan","log","π","1", "2", "3", "+", "x²", "4", "5", "6", "-", "√", "7", "8", "9", "*", "1/x", "0", "(",
            ")", "÷", "n!", ".","%", "←", "c", "="};
	private JMenuBar jmb=new JMenuBar();
    private	JMenu []jm=new JMenu[3];
	JMenuItem[] jmi=new JMenuItem[6];
	JTextField[] jtf=new JTextField[3];//创建方框;
	JButton[] jb=new JButton[key.length];
	private JPanel jps=new JPanel();
	private JPanel jpb=new JPanel();
	private JFrame jf=new JFrame();
	//操作变量
	private String result=" ";
     private	String store="";//缓存字符串
	private String jtf2str;//给第三个文本框存放操作数
	boolean newDigital=true;//是否输入新的数的状态
	double d;//一元运算变量;
	double d1;//二元运算的前操作的数
	double d2;//二元运算的后操作数
	public User() 
	{
		//创建组件
		jm[0]=new JMenu("查看(V)");
	    jm[1]=new JMenu("编辑(E)");
	    jm[2]=new JMenu("帮助(H)");
	   
	    jmi[0]=new JMenuItem("二进制转换");
	    jmi[1]=new JMenuItem("八进制转换");
	    jmi[2]=new JMenuItem("十六进制转换");
	    jmi[3]=new JMenuItem("复制(C)");
	    jmi[4]=new JMenuItem("粘贴(P)");
	    jmi[5]=new JMenuItem("关于计算器(A)");
	    
	    for(int i=0;i<6;i++) 
	    jmi[i].addActionListener(new ButtonListener()); 
	    for(int i=0;i<key.length;i++) {
	    	jb[i]=new JButton(key[i]);
	    	jb[i].setContentAreaFilled(false);
	    	jb[i].setFocusable(false);
	    	jb[i].addActionListener(new ButtonListener());//给每个按钮添加监听处理  
	        jpb.add(jb[i]);
	    }
	    initGUI();//设置布局
	     jf.setTitle("欢迎使用计算器");
	    jf.setIconImage(new ImageIcon("t4.jpg").getImage());//设置背景
	    jf.setSize(500,500);//设置大小
	    jf.setLocation(200,200);//设置初始位置
	    jf.setVisible(true);//显示
	    jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//设置默认到关闭操作
	}
	//设置布局
	public void initGUI() 
	{
		jf.setJMenuBar(jmb);
		jmb.add(jm[0]);
		jmb.add(jm[1]);
		jmb.add(jm[2]);
		jm[0].add(jmi[0]);
		jm[0].add(jmi[1]);
		jm[0].add(jmi[2]);
		jm[1].add(jmi[3]);
		jm[1].add(jmi[4]);
		jm[2].add(jmi[5]);
		//显示记忆索引值的文本框
		jtf[0]=new JTextField();
		jtf[0].setEditable(false);
		jtf[0].setHorizontalAlignment(JTextField.RIGHT);
		//显示M
		jtf[1]=new JTextField();
		jtf[1].setEditable(false);
		jtf[1].setHorizontalAlignment(JTextField.RIGHT);
		//显示输出结果
		jtf[2]=new JTextField("0");
		jtf[2].setEditable(false);
		jtf[2].setHorizontalAlignment(JTextField.RIGHT);
		jtf[2].setFont(new Font("arial",Font.BOLD,22));
		jtf[2].setForeground(Color.BLUE);
		jps.setLayout(new BorderLayout());
		jpb.setLayout(new GridLayout(7,5,4,4));
		jpb.setBorder(
	     new BevelBorder(BevelBorder.RAISED,new Color(180,180,180),null,SystemColor.scrollbar,null));
	//按键
	   	jps.add(jtf[0],BorderLayout.NORTH);
	   	jps.add(jtf[1],BorderLayout.CENTER);
	   	jps.add(jtf[2],BorderLayout.AFTER_LAST_LINE);
	   	jf.add(jpb,BorderLayout.CENTER);
	   	jf.add(jps,BorderLayout.NORTH);
	   	
	}
    /**
     * 事件处理
     *
     * @author
     *
     */
    public class ButtonListener implements ActionListener {
        @Override
        public void actionPerformed(ActionEvent e) {
        	String s1=e.getActionCommand();
            String content = String.valueOf(s1);
            boolean flag1 = jtf[0].getText().contains("=");
            // 输入处理的结果赋值给result
            result= parseInputStr(result,content);
            
            jtf[0].setText(result);
            // 控制计算结果后继续输入
              //store=result;
    		jtf2str=jtf[2].getText();//获取文本框中的字符串
    		if(e.getSource()==jmi[0]) {//二进制转换
    			int n=Integer.parseInt(jtf2str);
     		   jtf[2].setText(Integer.toBinaryString(n));
    		}
    		if(e.getSource()==jmi[1]){//八进制转换
    			int n=Integer.parseInt(jtf2str);
    			jtf[2].setText(Integer.toOctalString(n));
    		}
    		if(e.getSource()==jmi[2]) {//十六进制转换
    			int n=Integer.parseInt(jtf2str);
    			jtf[2].setText(Integer.toHexString(n));
    		}
    		if(e.getSource()==jmi[3]) {//复制
    			store=jtf2str;
    		}
    		if(e.getSource()==jmi[4]) {//粘贴
    			 jtf2str=store;
    			if(jtf2str=="")
    			jtf[2].setText("0");
    			else
    			jtf[2].setText(jtf2str);
    		}
    		if(e.getSource()==jmi[5])//关于计算器 
    		{
    			JOptionPane.showMessageDialog(null,"!!-_-!!王荣昌制作!!-_-!!");
    		}
    		if(s1.equals("MC"))
    			jtf[1].setText("");
    		if(s1.equals("MR")) 
    			jtf[2].setText(store);
    		if(s1.equals("MS")) {
    			jtf[1].setText("M");
    			result=jtf2str;
    		}
    		if(s1.equals("M+")) {
    			d1=Double.parseDouble(store);
    			d2=Double.parseDouble(jtf2str);
    			result=String.valueOf(d1+d2);
    		}
    		if(s1.equals("M-")) {
    			d1=Double.parseDouble(store);
    			d2=Double.parseDouble(jtf2str);
    			result=String.valueOf(d1-d2);
    		}	
            if (flag1 && content.matches("^\\d")) {
            	result= content;
                jtf[0].setText(result);
                jtf[2].setText("0");
            }
            if (content.equals("←"))
                backSpace();// 后退

            if (content.equals("c"))
                clear();// 清屏

            if (result.endsWith("=")) {
                String str = jtf[0].getText();
                // 如果(大于)数,报错“缺少)”
                if (countsOfSubstringInString(result, "(") > countsOfSubstringInString(result, ")")) {
                    jtf[2].setText("')' is missing!");
                    result= result.substring(0,result.length() - 1);

                }
                else if (result.contains("!")) {
                    int index = indexOfNumberStart(result.substring(0,result.indexOf('!')));
                    String s = result.substring(index,result.indexOf('!'));
                    if (parse(s) > 100)
                        jtf[2].setText("the argument for factorial is too large!");
                    else
                        calculate();
                }
                // 如果出现根号下负数,报错“负数没有平方根”
                else if (str.indexOf("sqt") != -1) {
                    int index = indexOfOpecifiedMirrorBracket(str, '(',
                            str.indexOf("sqt") + 3);
                    String s = str.substring(str.indexOf("sqt") + 4, index);
                    if (parse(s) < 0.0) {
                        jtf[2].setText("negative number do not have a square root!");
                    } else
                        calculate();
                }
                //如果出现log下的负数,报错"真数要大于0"
                else if(str.indexOf("log")!=-1) {
                	int index = indexOfOpecifiedMirrorBracket(str, '(',
                            str.indexOf("log") + 3);
                    String s = str.substring(str.indexOf("log") + 4, index);
                    if (parse(s) <=0.0) {
                        jtf[2].setText("The true number should be greater than 0!");
                    } else
                        calculate();
                }
                // 如果出现/0.0报错“0不能作为被除数”
                else if (jtf[0].getText().indexOf("/") != -1) {
                    String s = "";
                    int indexofdiv = indexOfNumberEnd(str, str.indexOf("/"));
                    s = str.substring(str.indexOf("/") + 1, indexofdiv);
                    if (parse(s) == Double.parseDouble("0")) {// 如果s=0
                        jtf[2].setText("0 can not be the dividend!");
                        result=result.substring(0,result.length() - 1);
                    } else
                        calculate();
                } else
                    calculate();
            }
        }
    }
    public static void main(String[] args) {
    	new User();
    }
//结果格式化
    public void calculate() {
    	result= String.valueOf(parse(result.substring(0,result.length() - 1)));
        jtf[2].setText(formatResult(result));
    }
    // 处理显示结果
    public String formatResult(String result) {
        String finalResult = "";
        Double d = Double.valueOf(result);
        NumberFormat nf = NumberFormat.getInstance();
        nf.setGroupingUsed(false);
        if (Math.abs(d) >= 1 || Math.abs(d) == 0)
            finalResult = nf.format(d);
        else
            finalResult = d.toString();
        return finalResult;
    }
    /**
     * 后退处理
     */
    public void backSpace() {
        if (result.length() == 1 ||result.equals("")) {
        	result= " ";
            jtf[0].setText(result);
        } else {
        	result=result.substring(0, result.length() - 1);
            if (result.endsWith(" "))
            	result= result.substring(0,result.length() - 1);
            jtf[0].setText(result);
        }
        jtf[2].setText(" ");
    }
    /**
     * 清屏处理
     *
     * @param content
     */
    public void clear() {
        jtf[2].setText(" ");
        jtf[0].setText(" ");
        result=" ";
        jtf[2].setText("0");
    }
    /**
     * 输入处理
     *
     * @param result
     * @param content
     * @return
     */
    public static String parseInputStr(String result, String content) {

        // 刚开始输入只能输入数字、π、-或者(
        if (result.equals(" ") || result.equals("")) {
            if (content.matches("\\d+|π|\\-|\\(*")) {
                result = "".concat(content);
            }
        }

        // 左括号数大于右括号数才能输入右括号
        else if (content.equals(")")) {
            boolean b = result.matches(".*\\d$|.*\\)$");// result以数字结尾或者右括号结尾
            if (countsOfSubstringInString(result, "(") > countsOfSubstringInString(result, ")") && b)
                result = result.concat(content);
            else
                result = result.concat("");
        }
        // 以数字结尾
        else if (Pattern.matches(".*\\d$|.*π$", result)) {
            // 不可输入00
            if (lastNumberOfStr(result).matches("^0+")
                    && /* !content.equals(".") &&!content.equals("=") && */ !content.matches("\\+|\\-|\\*|÷|\\.|="))
                result = result + "";
                // 数字后面跟x²,1/x,√
            else if (content.matches("x²|1/x|sin|cos|tan|log|√|n!")) {
                result = parseDigitEndWithFuncthion(result, content);
            }
            // x.y后不能接小数点,如2.1后不能输入点,不能出现2.1.2
            else if (Pattern.matches(".*\\.\\d+$", result)) {// 结果以.数字结尾
                result = result.concat(content.matches("\\d*|\\+|\\-|\\*|\\%|÷|\\)|=") ? content : "");
            }
            // 数字或小数点
            else if (content.matches("\\d|\\."))
                result = result.concat(content);
            else
                result = result.concat(content.matches("\\+|\\-|\\*|\\%|÷|\\)|=") ? " " + content : "");
        }
        // 以小数点结尾
        else if (Pattern.matches(".*\\.$", result) && Pattern.matches("^\\d", content)) {
            result = result.concat(content);
        }
        // 以左括号结尾
        else if ((result).matches(".*\\($")) {
            result = result.concat(content.matches("\\d*|π|\\-|\\(") ? content : "");
        }
        // 以右括号结尾
        else if (Pattern.matches(".*\\)$", result)) {
            if (content.matches("\\+|\\-|\\*|\\%|÷|=")) {
                result = result + " " + content;
            }
            if (content.matches("\\)")) {
                result = result + content;
            }
            if (content.matches("x²|√|1/x|sin|cos|tan|log")) {
                result = parseBrackets(result, content);
            }
        }
        // 以加减乘除结尾
        else if (result.matches(".*\\+$|.*\\-$|.*\\*$|.*÷$|.*/$|.*\\%$")) {
            result = result.replaceAll("÷", "/");
            if (result.matches(".*\\-$")) {// 以减号结尾
                if (result.length() == 1)
                    result = result + (content.matches("\\(|\\d|π") ? content : "");// 负号
                else if (result.length() > 1) {// 减号或左括号负号
                    boolean b = result.charAt(result.length() - 2) == '(';
                    if (b)
                        result = result + (content.matches("\\(|\\d|π") ? content : "");// 左括号负号
                    else
                        result = result + (content.matches("\\(|\\d|π") ? " " + content : "");// 减号
                }
            } else
                result = result + (content.matches("\\(|\\d|π") ? " " + content : "");
        }
        // 以!结尾
        else if (Pattern.matches(".*!$", result)) {
            result = result + (content.matches("\\+|\\-|\\%|\\*|/|=|\\)") ? content : "");
        }
        return result;
    }
    /**
     * 计算处理
     *
     * @param content
     * @return
     */
    public static double parse(String content) {
        // 处理π
        if (content.contains("π"))
            content =content.replace("π",""+Math.PI);
        if (content.contains("1/x"))
            content = content.replace("1/x", "rec");
        // 处理乘以负数*-
        if (content.contains("*-") || content.matches(".*(\\*\\s\\-).*")) {
            content = content.replaceAll("\\*\\s\\-", "*-");
            content = multiplicationAndDivisionOfNegative(content, "*");
        }
        // 处理除以负数/-
        if (content.contains("/-") || content.matches(".*(/\\s\\-).*")) {
            content = content.replaceAll("/\\s\\-", "/-");
            content = multiplicationAndDivisionOfNegative(content, "/");
        }
        // --转成+
        if (content.contains("--") || content.matches(".*(\\-\\s\\-).*")) {
            content = content.replaceAll("\\-\\s\\-", "+");
            content = content.replaceAll("\\-\\-", "+");
        }

        // 处理平方
        int index = content.indexOf("sqr");
        if (index != -1) {
            int endindex = indexOfOpecifiedMirrorBracket(content, '(', index + 3);
            String d = "(" + content.substring(index + 3, endindex + 1) + "*"
                    + content.substring(index + 3, endindex + 1) + ")";
            return parse(content.substring(0, index) + d + content.substring(endindex + 1));
        }
        //处理sin
        index=content.indexOf("sin");
        if (index != -1) {
            int endindex = indexOfOpecifiedMirrorBracket(content, '(', index + 3);
            double d=Math.sin(parse(content.substring(index+3,endindex+1)));
            return parse(content.substring(0, index) + d + content.substring(endindex + 1));
        }
        //处理cos
        index=content.indexOf("cos");
        if (index != -1) {
            int endindex = indexOfOpecifiedMirrorBracket(content, '(', index + 3);
            double d=Math.cos(parse(content.substring(index+3,endindex+1)));
            return parse(content.substring(0, index) + d + content.substring(endindex + 1));
        }
        //处理tan
        index=content.indexOf("tan");
        if (index != -1) {
            int endindex = indexOfOpecifiedMirrorBracket(content, '(', index + 3);
            double d=Math.tan(parse(content.substring(index+3,endindex+1)));
            return parse(content.substring(0, index) + d + content.substring(endindex + 1));
        }
        //处理log
        index=content.indexOf("log");
        if (index != -1) {
            int endindex = indexOfOpecifiedMirrorBracket(content, '(', index + 3);
            double d=Math.log(parse(content.substring(index+3,endindex+1)));
            return parse(content.substring(0, index) + d + content.substring(endindex + 1));
        }
        // 处理开方
        index = content.indexOf("sqt");
        if (index != -1) {
            int endindex = indexOfOpecifiedMirrorBracket(content, '(', index + 3);
            double d = Math.sqrt(parse(content.substring(index + 3, endindex + 1)));
            return parse(content.substring(0, index) + d + content.substring(endindex + 1));
        }
        // 处理求倒
        index = content.indexOf("rec");
        if (index != -1) {
            int endindex = indexOfOpecifiedMirrorBracket(content, '(', index + 3);
            double d = parse("1/" + content.substring(index + 3, endindex + 1));
            return parse(content.substring(0, index) + d + content.substring(endindex + 1));
        }
        // 处理括号
        int startindex = content.indexOf("(");
        boolean b = countsOfSubstringInString(content, "(") == countsOfSubstringInString(content, ")");
        if (startindex != -1 && b) {
            int endindex = indexOfFirstMirrorBracket(content, '(');
            double d = parse(content.substring(startindex + 1, endindex));
            return parse(content.substring(0, startindex) + d + content.substring(endindex + 1));
        }
        // 处理阶乘,由于阶乘很容易越界,故不考虑括号阶乘了
        index = content.indexOf("!");
        if (index != -1) {
            double d = factorial(parse(content.substring(indexOfLeftOperator(content, index) + 1, index)));
            return parse(
                    content.substring(0, indexOfLeftOperator(content, index) + 1) + d + content.substring(index + 1));
        }
        // 处理加法
        index = content.indexOf("+");
        if (index != -1) {
            return parse(content.substring(0, index)) + parse(content.substring(index + 1));
        }
        // 处理减法
        index = content.lastIndexOf("-");
        if (index != -1) {
            return parse(content.substring(0, index)) - parse(content.substring(index + 1));
        }
        //处理求模
        index=content.indexOf("%");
        if(index!=-1)
        return parse(content.substring(0,index)) % parse(content.substring(index+1));
        // 处理乘法
        index = content.indexOf("*");
        if (index != -1) {
            return parse(content.substring(0, index)) * parse(content.substring(index + 1));
        }
        // 处理除法
        index = content.lastIndexOf("/");
        if (index != -1) {
            return parse(content.substring(0, index)) / parse(content.substring(index + 1));
        }
        // 处理空格
        if (content.equals("") || content.equals(" "))
            content = "0";
        // 最后结果
        return Double.parseDouble(content);
    }
    /**
     * 阶乘实现
     */
    public static double factorial(double d) {
        return (d == 0.0 ? 1 : d * factorial(d - 1));
    }

    /**
     * 字符串中某子字符串的数量
     */
    public static int countsOfSubstringInString(String string, String substring) {
        int sum = 0;
        String subStrHead = "";
        String subStrTrail = "";
        while (string.contains(substring)) {
            sum++;
            subStrHead = string.substring(0, string.indexOf(substring));
            subStrTrail = string.substring(subStrHead.length() + substring.length());
            string = subStrHead + subStrTrail;
        }
        return sum;
    }

    /**
     * 找最左边的左括号的镜像括号的位置,或者最右边的右括号的镜像括号的位置
     */
    public static int indexOfFirstMirrorBracket(String s, char c) {
        int indexresult = -1;
        int sum = 0;
        if (countsOfSubstringInString(s, "(") == countsOfSubstringInString(s, ")")) {
            if (c == '(') {
                int index = s.indexOf(c) - 1;
                do {
                    index++;
                    if (s.charAt(index) == '(')
                        sum++;
                    if (s.charAt(index) == ')')
                        sum--;
                } while (sum != 0 && index < s.length());
                indexresult = index - 1;
            }
            if (c == ')') {
                int index = s.lastIndexOf(c);
                do {
                    if (s.charAt(index) == ')') {
                        sum++;
                    }
                    if (s.charAt(index) == '(')
                        sum--;
                    index--;
                } while (sum != 0 && index >= 0);
                indexresult = index;
            }
        }
        return indexresult + 1;
    }
    /**
     * 指定位置的括号的镜像括号
     */
    public static int indexOfOpecifiedMirrorBracket(String s, char c, int index) {
        int indexresult = -1;
        int sum = 0;
        int startIndex = -1;
        int endIndex = -1;
        StringBuffer sb = new StringBuffer(s);
        if (countsOfSubstringInString(s, "(") == countsOfSubstringInString(s, ")")) {
            if (index == 0 || index == s.length() - 1)
                return indexOfFirstMirrorBracket(s, c);
            else if (c == '(') {
                sum = countsOfSubstringInString(s.substring(0, index), String.valueOf(c));
                while (sum != 0) {
                    startIndex = sb.indexOf("(");
                    endIndex = indexOfFirstMirrorBracket(sb.toString(), c);
                    sb = sb.replace(startIndex, startIndex + 1, "a").replace(endIndex, endIndex + 1, "a");
                    sum--;
                }
                indexresult = indexOfFirstMirrorBracket(sb.toString(), c);
            } else if (c == ')') {
                sum = countsOfSubstringInString(s.substring(index + 1), String.valueOf(c));
                while (sum != 0) {
                    startIndex = sb.indexOf(")");
                    endIndex = indexOfFirstMirrorBracket(sb.toString(), c);
                    sb = sb.replace(startIndex, startIndex + 1, "a").replace(endIndex, endIndex + 1, "a");
                    sum--;
                }
                indexresult = indexOfFirstMirrorBracket(sb.toString(), c);
            }
        }
        return indexresult;
    }

    /**
     * 某个位置前面最近一个算术运算符的位置
     *
     * @param s
     * @param specifiedIndex
     * @return
     */
    public static int indexOfLeftOperator(String s, int specifiedIndex) {
        int temp = -1;
        if (specifiedIndex >= 1 && s.substring(0, specifiedIndex).matches(".*(\\-|\\+|\\%|\\*|/).*")) {
            do {
                specifiedIndex--;
            } while (!String.valueOf(s.charAt(specifiedIndex)).matches("\\+|\\-|\\%|\\*|/"));
            temp = specifiedIndex;
        }
        return temp;
    }

    /**
     * 某个位置后面最近一个算术运算符的位置
     */
    public static int indexOfRightOperator(String s, int specifiedIndex) {
        int temp = -1;
        boolean b = specifiedIndex >= 0 && specifiedIndex <= s.length() - 1
                && s.substring(specifiedIndex + 1).matches(".*(\\+|\\-|\\%|\\*|/).*");
        if (b) {
            while (!String.valueOf(s.charAt(specifiedIndex + 1)).matches("\\+|\\-|\\%|\\*|/")) {
                specifiedIndex++;
            }
            temp = specifiedIndex + 1;
        }
        return temp;
    }

    /**
     * 处理算式中的*-和/-
     */
    public static String multiplicationAndDivisionOfNegative(String content, String operator) {
        int indexofoperator = content.indexOf(operator);
        int startindex = indexOfLeftOperator(content, indexofoperator);// indexofoperator左边最近的运算符+-*/的位置
        if (startindex == -1) {
            content = "-" + content.substring(0, content.indexOf(operator) + 1)
                    + content.substring(content.indexOf(operator) + 2);
        }
        if (startindex != -1) {
            if (content.substring(indexofoperator, indexofoperator + 2).equals(operator + "-")) {
                String tempstr = "-" + content.substring(startindex + 1, indexofoperator + 1);
                content = content.substring(0, startindex + 1) + tempstr + content.substring(indexofoperator + 2);
            }
        }
        return content;
    }

    /**
     * 找数字结尾的字符串结束位置开始往前的一个完整数字的位置
     *
     * @param result
     * @return
     */
    public static int indexOfNumberStart(String result) {
        int resultIndex = -1;
        int indexOfOperator = indexOfLeftOperator(result, result.length() - 1);// 该位置前面第一个运算符位置
        if (indexOfOperator == -1) {//前面没有运算符
            indexOfOperator = result.lastIndexOf('(');
            if (indexOfOperator == -1)
                resultIndex = 0;
            else
                resultIndex = indexOfOperator + 1;
        } else {
            if(result.charAt(indexOfOperator) == '-' && result.charAt(indexOfOperator + 1) != ' ')
                resultIndex = indexOfOperator;
            else{
                while (result.charAt(indexOfOperator + 1) == '(' || result.charAt(indexOfOperator + 1) == ' ')
                    indexOfOperator++;
                resultIndex = indexOfOperator + 1;
            }
        }
        return resultIndex;
    }

    /**
     * 找运算符位置往后完整数字的位置
     *
     * @param result
     * @param index
     * @return
     */
    public static int indexOfNumberEnd(String result, int index) {
        int resultIndex = -1;
        int indexOfOperator = indexOfRightOperator(result, index + 1);
        String subStrStart = result.substring(0, index + 1);
        String subStrEnd = result.substring(index + 1);
        if (indexOfOperator == -1) {// 没有运算符
            if (result.substring(index + 1).contains("(")) {
                int startIndex = subStrStart.length() + subStrEnd.indexOf('(');
                int endIndex = indexOfOpecifiedMirrorBracket(result, '(', startIndex);
                resultIndex = endIndex + 1;
            } else if (indexOfOperator == -1) {
                while (index < result.length() && String.valueOf(result.charAt(index + 1)).matches("\\s|\\d|\\."))
                    index++;
                resultIndex = index + 1;
            }
        } else {
            if (result.substring(index + 1, indexOfOperator).contains("(")) {
                int startIndex = subStrStart.length() + subStrEnd.indexOf('(');
                int endIndex = indexOfOpecifiedMirrorBracket(result, '(', startIndex);
                resultIndex = endIndex + 1;
            } else
                resultIndex = indexOfOperator;
        }
        return resultIndex;
    }

    /**
     * 以数字结尾的字符串的最后一个完整的数字字符串
     *
     * @param result
     * @return
     */
    public static String lastNumberOfStr(String result) {
        int indexTemp = indexOfLeftOperator(result, result.length() - 1);
        boolean b = String.valueOf(result.charAt(result.length() - 1)).matches("\\d");
        if (indexTemp <= result.length() - 1 && b) {
            while (!String.valueOf(result.charAt(indexTemp + 1)).matches("\\d"))
                indexTemp++;
            return result.substring(indexTemp + 1);
        } else
            return "";
    }

    /**
     * 右括号后面跟平方、求倒、开方
     *
     * @param result
     * @param content
     * @return
     */
    public static String parseBrackets(String result, String content) {
        String temp = "";
        int startIndex = indexOfFirstMirrorBracket(result, ')');
        int indexOfOperator = indexOfLeftOperator(result, startIndex);
        String substrhead = "";
        String substrtrail = "";
        if (indexOfOperator == -1)
            substrtrail = result;
        else {
            substrhead = result.substring(0, indexOfOperator + 2);
            substrtrail = result.substring(indexOfOperator + 2);
        }
        if (content.equals("√")) {
            if (substrtrail.startsWith("(") && substrtrail.endsWith(")")
                    && indexOfFirstMirrorBracket(substrtrail, '(') == substrtrail.length() - 1)
                temp = substrhead + "sqt" + substrtrail;
            else
                temp = substrhead + "sqt(" + substrtrail + ")";
        }
        if (content.equals("x²")) {
            if (substrtrail.startsWith("(") && substrtrail.endsWith(")")
                    && indexOfFirstMirrorBracket(substrtrail, '(') == substrtrail.length() - 1)
                temp = substrhead + "sqr" + substrtrail;
            else
                temp = substrhead + "sqr(" + substrtrail + ")";
        }
        if (content.equals("1/x")) {
            if (substrtrail.startsWith("(") && substrtrail.endsWith(")")
                    && indexOfFirstMirrorBracket(substrtrail, '(') == substrtrail.length() - 1)
                temp = substrhead + "rec" + substrtrail;
            else
                temp = substrhead + "rec(" + substrtrail + ")";
        }
        if (content.equals("sin")) {
            if (substrtrail.startsWith("(") && substrtrail.endsWith(")")
                    && indexOfFirstMirrorBracket(substrtrail, '(') == substrtrail.length() - 1)
                temp = substrhead + "sin" + substrtrail;
            else
                temp = substrhead + "sin(" + substrtrail + ")";
        }
        if (content.equals("cos")) {
            if (substrtrail.startsWith("(") && substrtrail.endsWith(")")
                    && indexOfFirstMirrorBracket(substrtrail, '(') == substrtrail.length() - 1)
                temp = substrhead + "cos" + substrtrail;
            else
                temp = substrhead + "cos(" + substrtrail + ")";
        }
        if (content.equals("tan")) {
            if (substrtrail.startsWith("(") && substrtrail.endsWith(")")
                    && indexOfFirstMirrorBracket(substrtrail, '(') == substrtrail.length() - 1)
                temp = substrhead + "tan" + substrtrail;
            else
                temp = substrhead + "tan(" + substrtrail + ")";
        }
        if (content.equals("log")) {
            if (substrtrail.startsWith("(") && substrtrail.endsWith(")")
                    && indexOfFirstMirrorBracket(substrtrail, '(') == substrtrail.length() - 1)
                temp = substrhead + "log" + substrtrail;
            else
                temp = substrhead + "log(" + substrtrail + ")";
        }
        if (temp.startsWith("(") && temp.endsWith(")") && indexOfFirstMirrorBracket(temp, '(') == temp.length() - 1)
            temp = temp.substring(1, temp.length() - 1);

        return temp;
    }

    /**
     * 数字结尾后面跟平方、求倒、开方
     *
     * @param result
     * @param content
     * @return
     */
    public static String parseDigitEndWithFuncthion(String result, String content) {
        String temp = "";
        String contentTemp = "";
        if (content.equals("1/x"))
            contentTemp = "rec";
        if (content.equals("n!"))
            contentTemp = "!";
        if (content.equals("x²"))
            contentTemp = "sqr";
        if (content.equals("√"))
            contentTemp = "sqt";
        if(content.equals("sin"))
        	contentTemp= "sin";
        if(content.equals("cos"))
        	contentTemp= "cos";
        if(content.equals("tan"))
        	contentTemp= "tan";
        if(content.equals("log"))
        	contentTemp= "log";
        int startIndex = indexOfNumberStart(result);// 数字的开头
        String substrhead = result.substring(0, startIndex);
        String substrtrail = result.substring(startIndex);
        if (result.startsWith("-") && startIndex == 1) {
            if (contentTemp == "!")
                temp = "-" + result.substring(startIndex) + "!";
            else
                temp = contentTemp + "(" + result + ")";
        } else {
            if (contentTemp == "!") {
                if (substrtrail.endsWith("π") || substrtrail.matches(".*\\.\\d*[1-9]+$"))
                    temp = result;
                else
                    temp = substrhead + substrtrail + contentTemp;
            } else
                temp = substrhead + contentTemp + "(" + substrtrail + ")";
        }
        return temp;
    }
}    	

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。
### 回答1: IPv6计算器是一种在线工具,用于对IPv6地址进行计算和操作。IPv6是互联网协议的一种,由于IPv4地址已经耗尽,IPv6被广泛应用于现代互联网。 首先,IPv6计算器可以进行IPv6地址的转换。它可以将IPv6地址转换为十进制数、二进制数和十六进制数,使得用户可以更方便地理解和操作IPv6地址。 其次,IPv6计算器还支持子网划分。用户可以输入一个IPv6地址和子网前缀长度,计算出该子网的网络地址、广播地址和可用主机地址范围。这对于网络管理员来说是非常有用的,可以帮助他们更好地规划和管理网络。 此外,IPv6计算器还提供了CIDR(无类型域间选路)计算功能。用户可以输入一组IPv6地址和相应的子网前缀,计算出最简CIDR块和各个子网的地址范围。 最后,IPv6计算器还可以进行IPv6地址的校验和判断。用户可以输入一个IPv6地址,判断其格式是否正确,以及该地址是否属于保留地址或特殊地址。 综上所述,IPv6计算器是一款非常实用的在线工具,可以帮助用户更好地理解和操作IPv6地址,以及进行相关的网络规划和管理工作。 ### 回答2: IPv6计算器是一种在线工具,用于计算IPv6地址的相关信息和操作。 IPv6是下一代因特网协议,它提供了更多的IP地址空间,以满足日益增长的互联网连接需求。IPv6地址采用128位表示,相比于IPv4的32位地址更为复杂。因此,使用IPv6计算器可以节省人工计算的时间和劳动。 IPv6计算器可以执行多种功能。首先,它可以将IPv6地址转换为二进制、十进制或十六进制表示,使人们更好地理解和解释IPv6地址的结构。其次,它可以分解IPv6地址的各个部分,如地址前缀、子网ID和接口ID,帮助用户更好地理解和配置网络。第三,它还可以执行子网划分,根据给定的子网前缀长度计算可用的子网数量和每个子网的地址范围。此外,IPv6计算器还可以进行地址合并、地址压缩和地址类型检测等操作。 使用IPv6计算器可以提高网络工程师和网络管理员的工作效率,特别是在解决IPv6网络部署和配置方面。它可以帮助用户更好地理解和操作IPv6地址,并减少人为错误的可能性。IPv6计算器通常以在线形式提供,用户只需在网页上输入所需的IPv6地址或操作,即可获得计算结果。 总的来说,IPv6计算器是一种方便实用的在线工具,能够帮助用户更好地处理和操作IPv6地址,提高网络配置和管理的效率。它有助于促进IPv6的广泛应用与推广,并推动互联网的发展。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值