Java实现图形化计算器(支持括号、开平方)
Java实现图形化计算器(支持括号、开平方)
Java实习作业,实现一个图形化计算器,正好赶上周末作业不多就写了一个计算器。功能不是特别全,但是能满足一些最基本的需求(比如小学三年级及以下的数学题,,,也不一定能算对,,,)(手动滑稽)。代码注释写的比较详尽,不多说赘述。目前时间及能力有限,代码中可(ken)能(ding)还有bug,欢迎测试&扩展。
程序运行界面如下:
上菜~
//@Calculater.java
import java.awt.Font;
import java.awt.Button;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.border.EmptyBorder;/*** 2019.10.27更新:* 修复bug:* 1.添加了除零的判断并给出提示* 2.避免了科学记数法产生的‘E’使程序崩溃* 3.添加了表达式符号运与算数不匹配(如3-)* 的判断(通过栈空和栈剩余的判断)。* *//*** @版本:V2.0* @作者:猪猪侠的Laser_Cannon* @时间: 2019.10.27* @博客:https://blog.csdn.net/qq_43312718* * @描述:* 简易计算器的实现代码,能够计算开方,百分数,倒数* 及简单的带有小括号的中缀表达式。* * @说明:* 代码全部为自己所写,由于时间能力不足,代码仍有很* 多问题和未实现的功能,今后会逐渐更新和完善。若发* 现bug或计算错误的表达式,欢迎私我,一定认真对待。* * @已实现的功能:* 1.简单的表达式计算,包括 + - * /运算符,正负号,* 开平方,求倒数,百分数及括号功能,以及退格,清空。* 2.输入表达式时自动更新上下两文本框(仿Windows自* 带计算器界面),并将最后的运算结果显示在下方文本* 框,将表达式显示在上方文本框。* 3.简单的表达式检查功能,能够检查括号不匹配、除以零、* 等部分表达式错误。* 4.运算符输入限制和辅助:连续输入运算符时,不会连续* 向表达式中添加运算符,而是进行运算符更新(将最近* 一次输入的运算符更新)。* 5.小数点限制:在一个运算数中若输入小数点则小数点按* 键暂时失效,以保证每个运算数只有一个小数点;另外,* 当按下小数点时,若下方文本框中没有内容或者仅有运* 算符,则自动在小数点前添加数字0。* 6.数字及小数点输入限制和辅助:输入右括号之后数字键* 及小数点键暂时失效,输入运算符之后重新激活。* 7.其他输入限制和辅助:无法在表达式为空时输入百分号。* 允许输入前导零,计算时自动去除,允许输入多层括号,* 将按照优先级进行计算。* 8.支持开平方函数(sqrt)的多层嵌套,当开平方的运算* 数小于零时将显示表达式错误(Bad str)。* 9.根据表达式长度动态改变上下文本框字体大小,以保证* 上下文本框内容能在文本框中完整显示。* 10.计算结果格式化,自动确定是否输出小数位,并将整数* 部分按照四位分级法显示,即每三位数字用一个逗号隔* 开。* * * * @待实现的功能:* 1.更多按键* 2.界面的美化* 3.表达式检查功能* 4.表达式纠错功能* 5.键盘的监听功能* 6.支持多层开平方嵌套(递归实现)* 6.动态改变改变组件大小(跟随窗口)* 7.一次计算完成后点击运算符号会将上次运算结果保留* 并加入这次的运算表达式中* 8.菜单栏的更多功能:进制转换计算器、运算历史记录* 9.更多及更强大的输入限制及辅助功能* 10.高精度及大数类的使用,以实现更强的计算器功能* 11.百分号前可以添加括号括起来的表达式* 12.正负号按键功能的优化:当前仅是每次按下正负号* 就会添加“(-”,后续将更改为判断正负,若为负* 则去掉负号,否则添加负号* 13.支持自行设置小数点后显示的位数* *//*** @类说明:* 计算器的界面生成,以及事件监听响应功能。* * @类结构:* public class Calculater extends JFrame {* public static void main(String[] args){}* public Calculater(){} //构造函数,生成主界面* class btnActionListener implements ActionListener{} //按键监听事件响应内部类* class btnKeyListener implements KeyListener{} //键盘监听(未实现)* }*/public class Calculater extends JFrame {private static final long serialVersionUID = 1L;/** @flag* 用于标记是否完成了一次运算,每次计算完成之后* 即每次点击'='之后其值更新为真,之后再次点击* 任何按键将清空文本框,并将其值更新为false。* ** @point* 若正在输入运算数(即非运算符),则point生效,* 用于标记当前运算数是否已经输入小数点,以保证* 每个运算数只能有一个小数点。*/private boolean flag = false;private boolean point = false;private JPanel contentPane; //主窗格private JTextField txtUnder; //上层文本框,用于显示输入的表达式private JTextField txtUpper; //下层文本框,用于显示当前的输入private String strUpper = ""; //上层文本private String strUnder = ""; //下层文本public static void main(String[] args) {Calculater frame = new Calculater();frame.setVisible(true);//frame.setResizable(false); //不可更改窗口大小}public Calculater() {setTitle("简易计算器-猪猪侠的Laser_Cannon");setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);setBounds(100, 100, 416, 620);contentPane = new JPanel();contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));setContentPane(contentPane);contentPane.setLayout(null);/*** 生成文本窗格,窗格分两层。输入计算表达式时表达* 式显示在下层。开始时均为空。输入计算表达式时,* 上下层文本框实时更新。点击等于号之后下层文本框* 显示运算结果,上层显示表达式。再次点击任何按键* 重置计算器并显示该键。*/JPanel paneText = new JPanel(); //添加文本窗格paneText.setBounds(0, 0, 400, 170);contentPane.add(paneText);paneText.setLayout(null);txtUpper = new JTextField(strUpper); //添加上方文本框txtUpper.setHorizontalAlignment(JTextField.RIGHT); //设置文本右对齐txtUpper.setFont(new Font("Consolas", Font.PLAIN, 30));txtUpper.setEditable(false);txtUpper.setBounds(0, 0, 400, 65);paneText.add(txtUpper);txtUnder = new JTextField(strUnder); //添加下方文本框txtUnder.setHorizontalAlignment(JTextField.RIGHT); //设置文本右对齐txtUnder.setFont(new Font("Consolas", Font.PLAIN, 50));txtUnder.setEditable(false);txtUnder.setBounds(0, 65, 400, 105);paneText.add(txtUnder);/*** 生成按键窗格,采用字符串数组以循环形式生成按键。*/JPanel PaneButton = new JPanel(); //添加按键窗格PaneButton.setBounds(0, 170, 400, 412);contentPane.add(PaneButton);PaneButton.setLayout(new GridLayout(6, 4, 0, 0));String[] btn = {"(",")","CE","Del","%","sqrt","1/X","*", //设置按键文字"7","8","9","/","4","5","6","+","1","2","3","-","±","0",".","="};for(int i=0;i<btn.length;i++) { //添加按键Button button = new Button(btn[i]);button.setFont(new Font("Consolas", Font.PLAIN, 25));button.addActionListener(new btnActionListener()); //添加监听器//button.addKeyListener(new btnKeyListener());PaneButton.add(button);}}/*** 内部类,实现按键的监听功能,并实时更新上下* 两个文本窗格的显示内容。*/class btnActionListener implements ActionListener{public void actionPerformed(ActionEvent e) {String cmd = e.getActionCommand();/*** 检查更新flag,若flag为真,清空上下文本框。* @flag* 用于标记是否完成了一次运算,每次计算完成之后* 即每次点击'='之后其值更新为真,之后再次点击* 任何按键将清空文本框,并将其值更新为false。*/if(flag) {strUnder = "";strUpper = "";flag = false;}/** * 检查更新point,(point为真,小数点按键失效)* 若point为真且当前响应按键为运算符,则将point* 置为假,此时小数点生效。* @point* 若正在输入运算数(即非运算符),则point生效,* 用于标记当前运算数是否已经输入小数点,以保证* 每个运算数只能有一个小数点。*/char a = cmd.charAt(0);if(point && cmd.length()==1 && (a<'0'||a>'9') && a!='.') {point = false;}//清空键,将上下文本框清空,等待下次输入。if(cmd.equals("CE")) {strUpper = "";strUnder = "";}//删除键,将下方文本框中的最后一个字符(若存在)//删掉,但无法删除上方文本框的字符。else if (cmd.equals("Del")) {if(strUnder.length()>0) {strUnder = strUnder.substring(0,strUnder.length()-1);}}//基本运算符,将下方文本框的内容移至上方文本框,//若下方文本框首字符为左括号,则延迟上移操作至//下次输入右括号时(此处待优化,功能将改为当左右//括号数量匹配时再进行上移操作)else if(cmd.equals("+")||cmd.equals("-")||cmd.equals("*")||cmd.equals("/")) {char s = ' ';if(!strUnder.isEmpty()) { //获取下方文本框最后字符s = strUnder.charAt(strUnder.length()-1);}if(strUpper.isEmpty()&&strUnder.isEmpty()) {} //上下均空时运算符按键失效else if(!strUnder.isEmpty()&&(s=='+'||s=='-'||s=='*'||s=='/')) { //当已经输入一个运算符时,再次输入视为运算符更新strUnder = strUnder.substring(0,strUnder.length()-1)+cmd;}else if(!strUnder.isEmpty()&&strUnder.charAt(0)!='(') {strUpper += strUnder;strUnder = cmd;}else {strUnder += cmd;}}//左括号按键else if(cmd.equals("(")) {strUpper += strUnder;strUnder = cmd;}//右括号按键,将下方文本框内容上移else if(cmd.equals(")")) {strUpper = strUpper + strUnder + ")";strUnder = "";}//百分号按键,当下层问空时百分号键失效else if (cmd.equals("%")) {if(strUpper.isEmpty()&&strUnder.isEmpty()) {}else {strUpper += strUnder;strUnder = cmd;}}//开平方按键else if (cmd.equals("sqrt")) {strUpper += strUnder;strUnder = "sqrt(";}//求倒数按键//避免了下层文本框有运算符时点击“1/X”键会出现“1/(+”的问题。else if (cmd.equals("1/X")) {if(!strUnder.isEmpty()) {char t = strUnder.charAt(0);if(t=='+'||t=='-'||t=='*'||t=='/') {strUpper += t;strUnder = strUnder.substring(1,strUnder.length());}}strUnder = "1/(" + strUnder;}//正负号按键,在下方文本框中的文本前加上“(-”(此处待优化)else if (cmd.equals("±")) {strUnder = strUnder + "(-";}//小数点按键。若point为真,按键失效。否则,下方文本框添加//小数点并point的值赋为真,开始生效。另外,若按下小数点时//表达式为空或前一位非数字,则自动在小数点前添加数字0。//下层为空上层非空时小数点按键失效。(避免右括号之后输入数字)else if(cmd.equals(".")) {if(point) {return;}else if(strUnder.isEmpty()&&!strUpper.isEmpty()) {} else if(strUnder.isEmpty()) {strUnder += "0.";point = true;}else {char t = strUnder.charAt(strUnder.length()-1);if(t<'0'||t>'9') {strUpper += strUnder;strUnder = "0.";}else strUnder += ".";point = true;}}//等于号按键,按下即触发计算表达式,并将flag赋为真,下次点//击任何按键将清空上下文本框(此处待优化)。else if (cmd.equals("=")) {if(strUnder.isEmpty()&&strUpper.isEmpty()) {return;}flag = true;strUpper += strUnder;strUnder = Calculate.calc(strUpper);}//数字按键,若之前下方文本框有基本运算符则将其上移。//下层为空上层非空时数字键失效else {if(strUnder.isEmpty()&&!strUpper.isEmpty()) {} else if(strUnder.isEmpty()) {strUnder += cmd;}else {char t = strUnder.charAt(strUnder.length()-1);if((t=='+'||t=='-'||t=='*'||t=='/') && (strUnder.charAt(0)!='(')) {strUpper += strUnder;strUnder = cmd;}else {strUnder += cmd;}}}txtUpper.setText(strUpper); //更新上方文本框的文本if(strUpper.length()>23) {txtUpper.setFont(new Font("Consolas", Font.PLAIN, 690/strUpper.length()));}else {txtUpper.setFont(new Font("Consolas", Font.PLAIN, 30));}txtUnder.setText(strUnder); //更新下方文本框的文本if(strUnder.length()>15) {txtUnder.setFont(new Font("Consolas", Font.PLAIN, 700/strUnder.length()));}else {txtUnder.setFont(new Font("Consolas", Font.PLAIN, 50));}}}// class btnKeyListener implements KeyListener{ //键盘监听功能
// @Override
// public void keyTyped(KeyEvent e) {// }
// @Override
// public void keyPressed(KeyEvent e) {// }
// @Override
// public void keyReleased(KeyEvent e) {// }
// }}
//@Calculate.java
import java.util.Stack;
import java.util.StringTokenizer;/*** @类说明:* 表达式计算静态方法类,包括表达式计算、表达式纠错、* 表达式预处理三个静态方法。若表达式有误返回包含错误* 说明的字符串,否则返回计算结果的字符串形式。* * @类结构:* public class Calculate {* public static String calc(String str) {} //表达式计算(调用各个方法)* private static boolean checkString(String str) {} //表达式检查(检查括号匹配)* private static String Preprocess(String str) {} //表达式预处理(计算sqrt及%)* private static String getcalc(String str) {} //初等表达式计算(中缀转后缀)* }*/
public class Calculate {/*** 表达式计算方法,首先调用纠错方法及预处理方法进行初步处理,* 再通过栈进行中缀表达式转后缀表达式,最后返回计算结果的字符* 串,是否返回小数位具取决于小数部分是否为0。*/public static String calc(String str) {if (checkString(str) == false) { //检查括号匹配return "Bad str";}str = Preprocess(str);if(str.equals("Bad sqrt")||str.equals("Devide 0")) { //检查开平方数是否为正return str;}str = getcalc(str); //进行计算(此时仅包含基本运算符和小括号)if(str.equals("Bad str")||str.equals("Devide 0")) {return str;}java.text.DecimalFormat format = new java.text.DecimalFormat("#,###.######");//数值格式化return format.format(Double.parseDouble(str));}/*** 表达式纠错方法,目前功能仅限于检查左右小括号的匹配, * 后续准备加入更多的纠错功能,如运算符与运算数的匹配。*/private static boolean checkString(String str) {// 检查括号括号匹配Stack<Character> sta = new Stack<Character>();for (int i = 0; i < str.length(); i++) {if (str.charAt(i) == '(') {sta.push(str.charAt(i));} else if (str.charAt(i) == ')') {if (sta.empty() || sta.peek() != '(') {return false;} else {sta.pop();}}}if (sta.size() > 0)return false;return true;}/*** 表达式预处理方法,计算表达式中的一元运算符的* 部分(sqrt及%)。并将负号做处理以便计算。*/private static String Preprocess(String str) {for (int i = 0; i < str.length()-1; i++) {if (str.charAt(i) == '(' && str.charAt(i + 1) == '-') { //将“(-”转化为“(0-”str = str.substring(0, i + 1) + "0" + str.substring(i + 1, str.length());}}for (int i = str.length()-1; i>=0; i--) {//从后向前遍历,以支持sqrt的多层嵌套if (str.charAt(i) == 's') { //计算开平方int cnt = 1;for (int j = i + 5; j < str.length(); j++) {if(str.charAt(j)=='(') {cnt++;}else if(str.charAt(j)==')') {cnt--;}if (cnt==0) {//左右括号达到匹配,即可获得根号下的完整表达式String s = getcalc(str.substring(i + 5, j));if(s.equals("Devide 0")) {return s;}double sqrt = Double.parseDouble(s);if(sqrt<0) {return "Bad sqrt";}str = str.substring(0, i)+ String.valueOf(Math.sqrt(sqrt))+ str.substring(j + 1, str.length());break;}}}}for (int i = 0; i<str.length(); i++) {//从后向前遍历,以支持sqrt的多层嵌套if (str.charAt(i) == '%') { //计算百分比for (int j = i - 1; j >= 0; j--) {if (j == 0) {if (i < str.length() - 1) {str = String.valueOf(Double.parseDouble(str.substring(0, i)) / 100)+ str.substring(i + 1, str.length());} else {str = String.valueOf(Double.parseDouble(str.substring(0, i)) / 100);}break;}char t = str.charAt(j);if ((t > '9' || t < '0') && t != '.') {if (i < str.length() - 1) {str = str.substring(0, j + 1)+ String.valueOf(Double.parseDouble(str.substring(j + 1, i)) / 100)+ str.substring(i + 1, str.length());} else {str = str.substring(0, j + 1)+ String.valueOf(Double.parseDouble(str.substring(j + 1, i)) / 100);}break;}}}}return str;}private static String getcalc(String str) {if (str.isEmpty()) {return str;}/*** 将中缀表达式转换为后缀表达式,并在运算数与运算符之间* 添加分隔符‘$’,最后进行后缀表达式的计算。中缀表达式* 储存在str中,后缀表达式储存在s中。*/Stack<Character> sta = new Stack<Character>();String s = "$";int i = 0;if (str.charAt(0) == '(') {sta.push('(');i++;}boolean flag = false;for (; i < str.length(); i++) {if (str.charAt(i) == '+' && (i == 0 || (str.charAt(i - 1) < '0' && str.charAt(i - 1) != ')')))i++;if (str.charAt(i) == '-') {flag = true;i++;}while (i < (int) str.length() && ((str.charAt(i) >= '0' && str.charAt(i) <= '9') || str.charAt(i) == '.' || str.charAt(i)=='E')) {if (flag) {s += "-$";flag = false;}s += str.charAt(i);i++;}s += "$";if (i < (int) str.length()) {if (sta.empty() || str.charAt(i) == '(')sta.push(str.charAt(i));else if (str.charAt(i) == '+' || str.charAt(i) == '-') {while (sta.size() > 0 && sta.peek() != '(') {s += sta.pop() + "$";}sta.push(str.charAt(i));} else if (str.charAt(i) == '*' || str.charAt(i) == '/') {while (sta.size() > 0 && (sta.peek() == '*' || sta.peek() == '/')) {s += sta.pop() + "$";}sta.push(str.charAt(i));} else {while (sta.size() > 0 && sta.peek() != '(') {s += sta.pop() + "$";}sta.pop();}}}while (sta.size() > 0) {s += sta.pop() + "$";}/*** 进行后缀表达式的计算*/Stack<Double> stack = new Stack<Double>();StringTokenizer token = new StringTokenizer(s, "$", false);while (token.hasMoreTokens()) {String t = token.nextToken();if((t.equals("+")||t.equals("-")||t.equals("*")||t.equals("/"))&&stack.size()<2) {return "Bad str";}if (t.equals("+")) {stack.push(stack.pop() + stack.pop());} else if (t.equals("-")) {double a = stack.pop();stack.push(stack.pop() - a);} else if (t.equals("*")) {stack.push(stack.pop() * stack.pop());} else if (t.equals("/")) {double a = stack.pop();if(Math.abs(a-0)<1E-6) {return "Devide 0";}stack.push(stack.pop() / a);} else {stack.push(Double.parseDouble(t));}}double c = stack.pop();if(sta.size()>0) {return "Bad Str";}return String.valueOf(c);}}/*** 来自stackoverflow的eval实现,支持以下符号运算* sqrt cos sin tan ^ + - / * . ( )* 使用应首先检查表达式是否正确,否则可能导致程序崩溃。* 在此备份待学习。*/
//public static double eval(final String str) {// return new Object() {// int pos = -1, ch;
//
// void nextChar() {// ch = (++pos < str.length()) ? str.charAt(pos) : -1;
// }
//
// boolean eat(int charToEat) {// while (ch == ' ') nextChar();
// if (ch == charToEat) {// nextChar();
// return true;
// }
// return false;
// }
//
// double parse() {// nextChar();
// double x = parseExpression();
// if (pos < str.length()) throw new RuntimeException("Unexpected: " + (char)ch);
// return x;
// }
//
// // Grammar:
// // expression = term | expression `+` term | expression `-` term
// // term = factor | term `*` factor | term `/` factor
// // factor = `+` factor | `-` factor | `(` expression `)`
// // | number | functionName factor | factor `^` factor
//
// double parseExpression() {// double x = parseTerm();
// for (;;) {// if (eat('+')) x += parseTerm(); // addition
// else if (eat('-')) x -= parseTerm(); // subtraction
// else return x;
// }
// }
//
// double parseTerm() {// double x = parseFactor();
// for (;;) {// if (eat('*')) x *= parseFactor(); // multiplication
// else if (eat('/')) x /= parseFactor(); // division
// else return x;
// }
// }
//
// double parseFactor() {// if (eat('+')) return parseFactor(); // unary plus
// if (eat('-')) return -parseFactor(); // unary minus
//
// double x;
// int startPos = this.pos;
// if (eat('(')) { // parentheses
// x = parseExpression();
// eat(')');
// } else if ((ch >= '0' && ch <= '9') || ch == '.') { // numbers
// while ((ch >= '0' && ch <= '9') || ch == '.') nextChar();
// x = Double.parseDouble(str.substring(startPos, this.pos));
// } else if (ch >= 'a' && ch <= 'z') { // functions
// while (ch >= 'a' && ch <= 'z') nextChar();
// String func = str.substring(startPos, this.pos);
// x = parseFactor();
// if (func.equals("sqrt")) x = Math.sqrt(x);
// else if (func.equals("sin")) x = Math.sin(Math.toRadians(x));
// else if (func.equals("cos")) x = Math.cos(Math.toRadians(x));
// else if (func.equals("tan")) x = Math.tan(Math.toRadians(x));
// else throw new RuntimeException("Unknown function: " + func);
// } else {// throw new RuntimeException("Unexpected: " + (char)ch);
// }
//
// if (eat('^')) x = Math.pow(x, parseFactor()); // exponentiation
//
// return x;
// }
// }.parse();
//}
Java实现图形化计算器(支持括号、开平方)相关推荐
- 【程序】[Qt\C++] 图形化计算器——用QT5实现带括号优先级的GUI编程计算器
一. 实验任务(实验题目.目的) 搞个图形化的代括号的计算器 二. 任务分析 假设已经有了计算器,实现按下等号的计算算法 学习qt 设置各按钮槽函数 将算法缝合进qt内 设计实现负数.小数 优化代码计 ...
- JAVA Swing 图形化界面编程
JAVA Swing 图形化界面编程 目录 1.组件 1.1 基本组件 1.2. 组件边框 1.3. JToolBar 工具条 1.4 JColorChooser 颜色选择器 1.5 JFileCho ...
- JAVA学习——图形化窗口图标设置
JAVA学习--图形化窗口图标设置 一.问题: 明明按着老师的代码来学习,但是我死活都改变不了图形化窗口左上角的小图标,为什么呢? 先上代码: Image im=(new ImageIcon(path ...
- JAVA之旅(三十一)——JAVA的图形化界面,GUI布局,Frame,GUI事件监听机制,Action事件,鼠标事件
JAVA之旅(三十一)--JAVA的图形化界面,GUI布局,Frame,GUI事件监听机制,Action事件,鼠标事件 有段时间没有更新JAVA了,我们今天来说一下JAVA中的图形化界面,也就是GUI ...
- java之图形化界面(GUI)
一.概述 用户与计算机进行交换的方式有两种: GLI:Command lin User Interface(命令行用户接口),也就是常见的dos窗口,它需要记住一些常用的命令,操作不直观方便. GUI ...
- java 高级 图形化界面_java高级图形化界面
java.awt.event.WindowAdapter 是一个接口 学生的答案: C 标准答案: C 该题分数:4.0 学生得分: 4.0 分 9. 在基于 Swing 的图形用户界面设计中,面板属 ...
- 基于Java的图形化中国象棋游戏+PPT文档
下载地址 介绍 (具有网络通信功能) 使用Java语言实现的经典中国象棋程序, 带有演讲PPT文档 功能 登录功能 登录与游戏界面之间添加闪屏界面(类似启动页图片) 游戏准备 投降认输 悔棋 聊天沟通 ...
- java基础-图形化界面(一)
JPanel 是 JComponent 的直接子类(可以用JPanel替换 JComponent) Graphics2D是Graphics的子类 Graphics2D类 getX(),getY(),g ...
- c语言遇到非法字符,98行的四则计算器.(支持括号)加入了非法字符的检测
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 #include #include #include double s2n(char **tem)//字符串转为数字 { double tem_s=ato ...
最新文章
- Python的数据库操作(Sqlalchemy)
- 做好准备迎接崭新的BCH了吗?
- JAVA 创建线程池
- web前后台数据交互
- comparator比较器用法_Python学习:好像很少人知道 Python iter() 的另外一个用法?...
- 重命名数据库表空间和数据文件
- 洛谷P2480 [SDOI2010]古代猪文(卢卡斯定理+中国剩余定理)
- 【总结】实现点击累加效果的几种方式对比
- 深入理解 OUI(Oracle Universal Installer)
- VMware Workstation Pro 虚拟机做RAID
- 动画交互原型设计:Principle for Mac
- [读书笔记]密码文件总结
- 部署war包到tomcat根目录
- 调试工具之UDP/TCP网络调试助手NetAssist
- ETL工具kettle之Java脚本+Elasticsearch bulk insert
- 深港澳金融科技师(SHMFTTP)一级考试
- 压力变送器matlab,总结压差变送器三种不同故障以及处理方法[理论结合实际]
- 搭建企业级ELK日志分析系统
- 微信公众平台开发(六) 翻译功能开发
- 推挽电路原理“上P下N”及“上N下P”的区别
热门文章
- python backspace 转义_如何将backspace\x08应用于字符串?
- S5PV210系列之刷机【部署 烧写】
- 计算机在学校的使用英语作文,学生使用电脑大学英语作文
- 「知识连载」 如何用钉钉宜搭制定企业疫情防控数字化管理方案
- 医疗器械维修前景如何
- 关于IGS安装后只有ABB等少数几个驱动解决方法
- Elasticsearch实战 | 如何从数千万手机号中识别出情侣号?
- 计算机硬件电信号和二进制之间是什么关系,ch2_计算机硬件基础.ppt
- 变种 背包问题_01背包及其变种(物品无限背包、恰好装满背包)
- SVM算法(Support Vector Machine)