java制作计算器的时候同时输入两个运算符出错 10C

按照慕课网一步一步做的,但是做完之后存在一个问题,就是如果已经输入了一个运算符号,继续输入一个运算符号,后输入的那一个并不会将原来的那个符号覆盖,所以就会运算出错。请问有什么方法解决?(我尝试通过if判断是否已经输入了运算符,如果已经输入,就把原来的截去之后再写入新的运算符,但是没有效果)

package com.example.calculator;

import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;

public class MainActivity extends Activity implements OnClickListener{
    private Button bt0,bt1,bt2,bt3,bt4,bt5,bt6,bt7,bt8,bt9,btplus,btdiv,btdel,btclear,btmultiply,btminus,btpot,btequal;
    private EditText input;
    private boolean clear_flag;//清空标识
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        bt0=(Button) findViewById(R.id.btn_zero);
        bt1=(Button) findViewById(R.id.btn_one);
        bt2=(Button) findViewById(R.id.btn_two);
        bt3=(Button) findViewById(R.id.btn_three);
        bt4=(Button) findViewById(R.id.btn_four);
        bt5=(Button) findViewById(R.id.btn_five);
        bt6=(Button) findViewById(R.id.btn_six);
        bt7=(Button) findViewById(R.id.btn_seven);
        bt8=(Button) findViewById(R.id.btn_eight);
        bt9=(Button) findViewById(R.id.btn_nine);
        btplus=(Button) findViewById(R.id.btn_plus);
        btdiv=(Button) findViewById(R.id.btn_devide);
        btdel=(Button) findViewById(R.id.btn_del);
        btequal=(Button) findViewById(R.id.btn_equal);
        btclear=(Button) findViewById(R.id.btn_clear);
        btmultiply=(Button) findViewById(R.id.btn_multiply);
        btminus=(Button) findViewById(R.id.btn_minus);
        btpot=(Button) findViewById(R.id.btn_pot);
        input=(EditText) findViewById(R.id.et_input);

        bt0.setOnClickListener(this);
        bt1.setOnClickListener(this);
        bt2.setOnClickListener(this);
        bt3.setOnClickListener(this);
        bt4.setOnClickListener(this);
        bt5.setOnClickListener(this);
        bt6.setOnClickListener(this);
        bt7.setOnClickListener(this);
        bt8.setOnClickListener(this);
        bt9.setOnClickListener(this);
        btplus.setOnClickListener(this);
        btdiv.setOnClickListener(this);
        btdel.setOnClickListener(this);
        btequal.setOnClickListener(this);
        btclear.setOnClickListener(this);
        btmultiply.setOnClickListener(this);
        btminus.setOnClickListener(this);
        btpot.setOnClickListener(this);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();
        if (id == R.id.action_settings) {
            return true;
        }
        return super.onOptionsItemSelected(item);
    }

    @Override
    public void onClick(View v) {
        String str=input.getText().toString();
        switch(v.getId())
        {
        case R.id.btn_one:
        case R.id.btn_two:
        case R.id.btn_three:
        case R.id.btn_four:
        case R.id.btn_five:
        case R.id.btn_six:
        case R.id.btn_seven:
        case R.id.btn_eight:
        case R.id.btn_nine:
        case R.id.btn_pot:
        case R.id.btn_zero:
            if(clear_flag){
                clear_flag=false;
                str="";
                input.setText("");
            }
            input.setText(str+((Button)v).getText());
            break;
        case R.id.btn_devide:
        case R.id.btn_plus:
        case R.id.btn_minus:
        case R.id.btn_multiply:
            if(clear_flag){
                clear_flag=false;
                str="";
                input.setText("");
            }
            input.setText(str+" "+((Button)v).getText()+" ");
            break;
        case R.id.btn_del:
            if(clear_flag){
                clear_flag=false;
                str="";
                input.setText("");
            }else if(str!=null&&!str.equals("")){
                input.setText(str.substring(0,str.length()-1));
            }
            break;
        case R.id.btn_clear:
            clear_flag=false;
            str="";
            input.setText("");
            break;
        case R.id.btn_equal:
            getResult();
            break;
        default:
        }
    }
    //运算结果
    private void getResult(){
        String exp=input.getText().toString();
        if(exp==null||exp.equals("")){
            return;
        }
        if(!exp.contains(" ")){
            return;
        }
        if(clear_flag){
            clear_flag=false;
            return;
        }
        clear_flag=true;
        double result=0;
        String s1=exp.substring(0,exp.indexOf(" "));//运算符前面的字符串
        String op=exp.substring(exp.indexOf(" ")+1,exp.indexOf(" ")+2);//截取到的运算符
        String s2=exp.substring(exp.indexOf(" ")+3);//运算符后面的字符串
        if(!s1.equals("")&&!s2.equals("")){
            double d1=Double.parseDouble(s1);
            double d2=Double.parseDouble(s2);
            if(op.equals("+")){
                result=d1+d2;
            }else if(op.equals("-")){
                result=d1-d2;
            }else if(op.equals("×")){
                result=d1*d2;
            }else if(op.equals("÷")){
                if(d2==0){
                    result=0;
                }else{
                    result=d1/d2;
                }
            }
            if(!s1.contains(".")&&!s2.contains(".")&&!op.equals("÷")){
                int r=(int) result;
                input.setText(r+"");
            }else{
                input.setText(result+"");
            }
        }else if(!s1.equals("")&&s2.equals("")){
            input.setText(exp);
        }else if(s1.equals("")&&!s2.equals("")){
            double d2=Double.parseDouble(s2);
            if(op.equals("+")){
                result=0+d2;
            }else if(op.equals("-")){
                result=0-d2;
            }else if(op.equals("×")){
                result=0;
            }else if(op.equals("÷")){
                    result=0;
            }
            if(!s2.contains(".")){
                int r=(int) result;
                input.setText(r+"");
            }else{
                input.setText(result+"");
            }
        }else{
            input.setText("");
        }
    }
}

2个回答

运算符为一个字节,在java默认的string编码中,你可以用char存储,那么不管你按多少次,总是会覆盖前面的,并不会判断。

看了下你的思路,比如你上面的输入的值 是 String s = " 5 + ";String reg = "+ ";
if(s.endsWith(reg)) s = s.replace(reg,"");这样一定能替换掉

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
html如何限制输入计算器常见的运算符
![图片说明](https://img-ask.csdn.net/upload/201610/14/1476416754_185883.png) 计算器程序的输入进行判断和限制,比如已经输入“3+“ 之后,不能继续输入运算符。。。常见的一些输入限制
java中=是赋值的意思,==是等于的意思,这两个运算符的区别和联系什么呢
java中=是赋值的意思,==是等于的意思,这两个运算符的区别和联系什么呢,是不是可以这样子理解,x=x+1是正确的写法,x==x+1是不成立的,因为x=!x+1,求分析解答指出理解不到位的地方,谢谢
Java语言比较3个数的大小怎么用三木运算符而不是if语言来实现呢
Java语言比较3个数的大小怎么用三木运算符而不是if语言来实现呢
如何定义一个运算符的变量
int s1, s2,s3; Console.WriteLine("我是一个简单的计算器,可以实现两个整数的加减乘除取余"); Console.WriteLine("请输入第一个操作数:"); s1 = int.Parse(Console.ReadLine()); Console.WriteLine("请输入第二个操作数:"); s2 = int.Parse(Console.ReadLine()); Console.WriteLine("请输入运算符:"); s3 = Console.ReadLine();
Java语言用二元运算符如果不要返回一个数字,怎么写语句
Java语言用二元运算符如果不要返回一个数字,怎么写语句,谢谢
运算符~的作用是什么?
书上讲运算符~的作用是取反码,但是我用编译器打印出~1的结果是-2. 按理说正数的反码应该就是它本身,即1的反码就是1. 请问各位大佬,我哪里理解出了错?
java语言,怎么用三元运算符进行绝对值的计算?怎么将一个数转换为绝对值?
java语言,怎么用三元运算符进行绝对值的计算?怎么将一个数转换为绝对值?
运算符名称数据源超出了80个字符的长度限制?
Flink 运算符名称数据源超出了80个字符的长度限制,已被截断?有人遇到过吗?
重载操作运算符的问题
模板类有数据成员 T data[len]; 重载了一个类的运算符,代码如下: ``` inline operator const T* () const { return &data[0];} ``` 这个语句跟一般的重载运算不一样。operator const T* ( )这一部分是什么意思呢? &data[0]中的&符号是表示取地址还是表示引用?
~和^运算符的计算方法
请问 {unsigned char a,b; a=7|3; b=~ 4&3; printf("%d %d\n", a, b); } 中~和^是如何计算的,请详细
Java计算器多个数一起运算问题
网上找的代码都是只能一次实现两个数之间的四则运算(也就是跟window自带计算器一样),那怎么实现多个数之间的运算呢? 如输入1+3*2= 输出:7 也就是用户可以输入一大串数字,自动满足运算法则出结果(满足运算法则)。 简单说明做法即可。感谢。
用JAVA语言,输入一串字符串,从里面分解出运算数和运算符,并计算出结果。
输入一串字符串,从里面分解出运算数和运算符,并计算出结果。如输入“234+123”,分解出234、+、123,运算结果为357。
请问重载流插入运算符<<怎么不能识别定义的类?
大佬们帮忙看看。重载了<<和自增运算符,用来输出自己定义的Point类,前缀++正常输出,后缀++报错: **没有与这些操作数匹配的"<<"运算符,操作类型为ostream<<Point**。但是p++的返回值就是Point啊? 代码如下: ``` //通过重载实现点类的自增自减和输出 #include <iostream> using namespace std; class Point { int _x, _y; public: Point(int x, int y) :_x(x), _y(y) {} Point& operator ++();//前置++不需要参数 Point operator ++(int);//后置++需要参数来作为标志 Point& operator --(); Point operator --(int); friend ostream& operator << (ostream& o, Point& p); }; Point& Point:: operator ++ () { _x++; _y++; return *this; } /* ++i在c++的定义最后返回的是对象的引用*/ Point Point::operator ++ (int) { Point temp = *this; ++* this; return temp; } /* i++在c++的定义中返回的是对象的值 后缀操作符接受一个额外的int型作为形参,并不使用该形参仅做区分*/ Point& Point::operator --() { _x--; _y--; return *this; } Point Point::operator --(int) { Point temp = *this; ++* this;//复用了前缀++的重载 return temp; } ostream& operator << (ostream& o, Point& p) { o << "(" << p._x << "," << p._y << ")" << endl; return o; } int main() { Point p(1, 2); cout << p << endl; //cout << p++ << endl;//重载的后缀++和--都不能被<<识别 cout << ++p << endl; //cout << p-- << endl;// cout << --p << endl; return 0; } ```
java简易计算器实现,添加能够切换简易计算器和科学计算器的按键。
![图片说明](https://img-ask.csdn.net/upload/201810/27/1540655964_202901.png) 现已有完整计算器框架和实现,但是需求有一条是: 能 通过菜单可以切换简易计算器和科学计算器。 如今就这个功能未实现,简易计算器就是只包含+、-、*、/的状态,而科学计算器则包括开方、平方、幂运算、1/n等操作。各运算已实现,但就是不知道怎么切换界面。求大神添加一个能够让其变化界面的按钮函数来实现。 附上代码: ``` import java.awt.BorderLayout; import java.awt.Color; 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; /** * 一个计算器,与Windows附件自带计算器的标准版功能、界面相仿。 但还不支持键盘操作。 */ public class Calculator extends JFrame implements ActionListener { /** 计算器上的键的显示名字 */ private final String[] KEYS = { "7", "8", "9", "÷", "sqrt", "4", "5", "6", "x", "%", "1", "2", "3", "-", "1/x", "0", "+/-", ".", "+", "=" }; /** 计算器上的功能键的显示名字 */ private final String[] COMMAND = { "Backspace", "CE", "C" }; /** 计算器左边的M的显示名字 */ private final String[] M = { " ", "MC", "MR", "MS", "M+" }; /** 计算器上键的按钮 */ private JButton keys[] = new JButton[KEYS.length]; /** 计算器上的功能键的按钮 */ private JButton commands[] = new JButton[COMMAND.length]; /** 计算器左边的M的按钮 */ private JButton m[] = new JButton[M.length]; /** 计算结果文本框 */ private JTextField resultText = new JTextField("0"); // 标志用户按的是否是整个表达式的第一个数字,或者是运算符后的第一个数字 private boolean firstDigit = true; // 计算的中间结果。 private double resultNum = 0.0; // 当前运算的运算符 private String operator = "="; // 操作是否合法 private boolean operateValidFlag = true; /** * 构造函数 */ public Calculator() { super(); // 初始化计算器 init(); // 设置计算器的背景颜色 this.setBackground(Color.BLACK); this.setTitle("计算器"); // 在屏幕(500, 300)坐标处显示计算器 this.setLocation(500, 300); // 不许修改计算器的大小 this.setResizable(false); // 使计算器中各组件大小合适 this.pack(); } /** * 初始化计算器 */ private void init() { // 文本框中的内容采用右对齐方式 resultText.setHorizontalAlignment(JTextField.RIGHT); // 不允许修改结果文本框 resultText.setEditable(false); // 设置文本框背景颜色为白色 resultText.setBackground(Color.WHITE); // 初始化计算器上键的按钮,将键放在一个画板内 JPanel calckeysPanel = new JPanel(); // 用网格布局器,4行,5列的网格,网格之间的水平方向间隔为3个象素,垂直方向间隔为3个象素 calckeysPanel.setLayout(new GridLayout(4, 5, 3, 3)); for (int i = 0; i < KEYS.length; i++) { keys[i] = new JButton(KEYS[i]); calckeysPanel.add(keys[i]); keys[i].setForeground(Color.blue); } // 运算符键用红色标示,其他键用蓝色表示 keys[3].setForeground(Color.red); keys[8].setForeground(Color.red); keys[13].setForeground(Color.red); keys[18].setForeground(Color.red); keys[19].setForeground(Color.red); // 初始化功能键,都用红色标示。将功能键放在一个画板内 JPanel commandsPanel = new JPanel(); // 用网格布局器,1行,3列的网格,网格之间的水平方向间隔为3个象素,垂直方向间隔为3个象素 commandsPanel.setLayout(new GridLayout(1, 3, 3, 3)); for (int i = 0; i < COMMAND.length; i++) { commands[i] = new JButton(COMMAND[i]); commandsPanel.add(commands[i]); commands[i].setForeground(Color.red); } // 初始化M键,用红色标示,将M键放在一个画板内 JPanel calmsPanel = new JPanel(); // 用网格布局管理器,5行,1列的网格,网格之间的水平方向间隔为3个象素,垂直方向间隔为3个象素 calmsPanel.setLayout(new GridLayout(5, 1, 3, 3)); for (int i = 0; i < M.length; i++) { m[i] = new JButton(M[i]); calmsPanel.add(m[i]); m[i].setForeground(Color.red); } // 下面进行计算器的整体布局,将calckeys和command画板放在计算器的中部, // 将文本框放在北部,将calms画板放在计算器的西部。 // 新建一个大的画板,将上面建立的command和calckeys画板放在该画板内 JPanel panel1 = new JPanel(); // 画板采用边界布局管理器,画板里组件之间的水平和垂直方向上间隔都为3象素 panel1.setLayout(new BorderLayout(3, 3)); panel1.add("North", commandsPanel); panel1.add("Center", calckeysPanel); // 建立一个画板放文本框 JPanel top = new JPanel(); top.setLayout(new BorderLayout()); top.add("Center", resultText); // 整体布局 getContentPane().setLayout(new BorderLayout(3, 5)); getContentPane().add("North", top); getContentPane().add("Center", panel1); getContentPane().add("West", calmsPanel); // 为各按钮添加事件侦听器 // 都使用同一个事件侦听器,即本对象。本类的声明中有implements ActionListener for (int i = 0; i < KEYS.length; i++) { keys[i].addActionListener(this); } for (int i = 0; i < COMMAND.length; i++) { commands[i].addActionListener(this); } for (int i = 0; i < M.length; i++) { m[i].addActionListener(this); } } /** * 处理事件 */ public void actionPerformed(ActionEvent e) { // 获取事件源的标签 String label = e.getActionCommand(); if (label.equals(COMMAND[0])) { // 用户按了"Backspace"键 handleBackspace(); } else if (label.equals(COMMAND[1])) { // 用户按了"CE"键 resultText.setText("0"); } else if (label.equals(COMMAND[2])) { // 用户按了"C"键 handleC(); } else if ("0123456789.".indexOf(label) >= 0) { // 用户按了数字键或者小数点键 handleNumber(label); // handlezero(zero); } else { // 用户按了运算符键 handleOperator(label); } } /** * 处理Backspace键被按下的事件 */ private void handleBackspace() { String text = resultText.getText(); int i = text.length(); if (i > 0) { // 退格,将文本最后一个字符去掉 text = text.substring(0, i - 1); if (text.length() == 0) { // 如果文本没有了内容,则初始化计算器的各种值 resultText.setText("0"); firstDigit = true; operator = "="; } else { // 显示新的文本 resultText.setText(text); } } } private void handleNumber(String key) { if (firstDigit) { // 输入的第一个数字 resultText.setText(key); } else if ((key.equals(".")) && (resultText.getText().indexOf(".") < 0)) { // 输入的是小数点,并且之前没有小数点,则将小数点附在结果文本框的后面 resultText.setText(resultText.getText() + "."); } else if (!key.equals(".")) { // 如果输入的不是小数点,则将数字附在结果文本框的后面 resultText.setText(resultText.getText() + key); } // 以后输入的肯定不是第一个数字了 firstDigit = false; } private void handleC() { // 初始化计算器的各种值 resultText.setText("0"); firstDigit = true; operator = "="; } private void handleOperator(String key) { if (operator.equals("÷")) { // 除法运算 // 如果当前结果文本框中的值等于0 if (getNumberFromText() == 0.0) { // 操作不合法 operateValidFlag = false; resultText.setText("除数不能为零"); } else { resultNum /= getNumberFromText(); } } else if (operator.equals("1/x")) { // 倒数运算 if (resultNum == 0.0) { // 操作不合法 operateValidFlag = false; resultText.setText("零没有倒数"); } else { resultNum = 1 / resultNum; } } else if (operator.equals("+")) { // 加法运算 resultNum += getNumberFromText(); } else if (operator.equals("-")) { // 减法运算 resultNum -= getNumberFromText(); } else if (operator.equals("x")) { // 乘法运算 resultNum *= getNumberFromText(); } else if (operator.equals("sqrt")) { // 平方根运算 resultNum = Math.sqrt(resultNum); } else if (operator.equals("%")) { // 百分号运算,除以100 resultNum = resultNum / 100; } else if (operator.equals("+/-")) { // 正数负数运算 resultNum = resultNum * (-1); } else if (operator.equals("=")) { // 赋值运算 resultNum = getNumberFromText(); } if (operateValidFlag) { // 双精度浮点数的运算 long t1; double t2; t1 = (long) resultNum; t2 = resultNum - t1; if (t2 == 0) { resultText.setText(String.valueOf(t1)); } else { resultText.setText(String.valueOf(resultNum)); } } // 运算符等于用户按的按钮 operator = key; firstDigit = true; operateValidFlag = true; } /** * 从结果文本框中获取数字 * * @return */ private double getNumberFromText() { double result = 0; try { result = Double.valueOf(resultText.getText()).doubleValue(); } catch (NumberFormatException e) { } return result; } public static void main(String args[]) { Calculator calculator1 = new Calculator(); calculator1.setVisible(true); calculator1.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } } ```
小白求知java操作符的问题~~~~
如下代码: int i = 1; boolean b = !(i++ == 3) ^ (i++ ==2) && (i++==3); System.out.println(b); System.out.println(i); 运行结果bfalse i3 有很多解析是这样: int i = 1; boolean b = !(i++ == 3) ^ (i++ ==2) && (i++==3) !(i++ == 3) 1不等于3 取反 true i=2 i++ ==2 2等于2 true i=3 !(i++ == 3) ^ (i++ ==2) 结果为 false 因为是短路与 第二个不用看 所以结果为 b=false i=3 我想知道为什么一开始不运算第三个小括号里的?也就是解析里面短路与后面的不用看了?
VB中的:=运算符和=运算符有什么不同?什么时候才会用到:=运算符呢?
VB中的:=运算符和=运算符有什么不同?什么时候才会用到:=运算符呢?
python的除法计算,为什么和计算器计算的不一样?
需要把一段java代码重写为python的,运行结果总是不对,调试后发现是python在计算过程中和java有些不一样。 比如计算下面这个数字: ``` 1811552740395741107/62 ``` java和win10系统计算器计算的结果都是 【29218592587028082】 但是,python计算的结果是-------------【29218592587028084】 为什么会相差2? ![图片说明](https://img-ask.csdn.net/upload/202001/04/1578111406_861278.jpg) 很难受,是什么原因导致的这种情况,python在这其中是有一些坑是我不知道的吗? # #更新 ``` 在stackOverflow上找到了解决办法,用运算符'//'代替'/'。 1811552740395741107 // 62 '//'表示整数除法,结果是整数?程序结果是正确了,但是不知道为什么,之前的结果相差2,也不是进位退位导致的吧。 不知道python的'/'底层是怎么实现的,大数运算过程中二进制位产生了累积误差? 还发现一个问题,绝对值函数math.fabs(),下列代码: t = -1811552740395741107 if -t == math.fabs(t): print(-t) print('%f' % math.fabs(t)) 两条print是可以执行的,但是输出结果是: 1811552740395741107 1811552740395741184.000000 也就是说在内存中的二进制数是相等的,但是打印出两个数却不一样? 如果拿fabs()得到的结果去计算,程序和预期的结果又不一样,很烦,今天踩了很多坑! ``` **有谁知道其中的原因么,为什么Python的行为和其他语言不一样?这应该不是BUG吧**
link中??运算符是二元运算符还是三元运算符?为什么它和?:不同?
link中??运算符是二元运算符还是三元运算符?为什么它和?:不同?
求大佬指教c++重载运算符中的问题
大佬们,我刚写了个自加的重载运算符,为什么我写的前面自加的是对的,但是后面自加的就错了 #include<iostream> using namespace std; class num { friend ostream& operator<<(ostream& cout, num& p); public: num(); num& operator++() { a++; return *this; } num operator++(int) { num sign=*this; a++; return sign; } private: int a; }; num::num() { a = 10; } ostream& operator<<(ostream& cout, num& p) { cout << p.a; return cout; } void fun() { num q; cout << ++q << endl; cout << q++ << endl; } int main() { fun(); return 0; }
终于明白阿里百度这样的大公司,为什么面试经常拿ThreadLocal考验求职者了
点击上面↑「爱开发」关注我们每晚10点,捕获技术思考和创业资源洞察什么是ThreadLocalThreadLocal是一个本地线程副本变量工具类,各个线程都拥有一份线程私有的数
程序员必须掌握的核心算法有哪些?
由于我之前一直强调数据结构以及算法学习的重要性,所以就有一些读者经常问我,数据结构与算法应该要学习到哪个程度呢?,说实话,这个问题我不知道要怎么回答你,主要取决于你想学习到哪些程度,不过针对这个问题,我稍微总结一下我学过的算法知识点,以及我觉得值得学习的算法。这些算法与数据结构的学习大多数是零散的,并没有一本把他们全部覆盖的书籍。下面是我觉得值得学习的一些算法以及数据结构,当然,我也会整理一些看过
Linux(服务器编程):15---两种高效的事件处理模式(reactor模式、proactor模式)
前言 同步I/O模型通常用于实现Reactor模式 异步I/O模型则用于实现Proactor模式 最后我们会使用同步I/O方式模拟出Proactor模式 一、Reactor模式 Reactor模式特点 它要求主线程(I/O处理单元)只负责监听文件描述符上是否有事件发生,有的话就立即将时间通知工作线程(逻辑单元)。除此之外,主线程不做任何其他实质性的工作 读写数据,接受新的连接,以及处...
阿里面试官问我:如何设计秒杀系统?我的回答让他比起大拇指
你知道的越多,你不知道的越多 点赞再看,养成习惯 GitHub上已经开源 https://github.com/JavaFamily 有一线大厂面试点脑图和个人联系方式,欢迎Star和指教 前言 Redis在互联网技术存储方面使用如此广泛,几乎所有的后端技术面试官都要在Redis的使用和原理方面对小伙伴们进行360°的刁难。 作为一个在互联网公司面一次拿一次Offer的面霸,打败了...
五年程序员记流水账式的自白。
不知觉已中码龄已突破五年,一路走来从起初铁憨憨到现在的十九线程序员,一路成长,虽然不能成为高工,但是也能挡下一面,从15年很火的android开始入坑,走过java、.Net、QT,目前仍处于android和.net交替开发中。 毕业到现在一共就职过两家公司,目前是第二家,公司算是半个创业公司,所以基本上都会身兼多职。比如不光要写代码,还要写软著、软著评测、线上线下客户对接需求收集...
C语言魔塔游戏
很早就很想写这个,今天终于写完了。 游戏截图: 编译环境: VS2017 游戏需要一些图片,如果有想要的或者对游戏有什么看法的可以加我的QQ 2985486630 讨论,如果暂时没有回应,可以在博客下方留言,到时候我会看到。 下面我来介绍一下游戏的主要功能和实现方式 首先是玩家的定义,使用结构体,这个名字是可以自己改变的 struct gamerole { char n
一文详尽系列之模型评估指标
点击上方“Datawhale”,选择“星标”公众号第一时间获取价值内容在机器学习领域通常会根据实际的业务场景拟定相应的不同的业务指标,针对不同机器学习问题如回归、分类、排...
究竟你适不适合买Mac?
我清晰的记得,刚买的macbook pro回到家,开机后第一件事情,就是上了淘宝网,花了500元钱,找了一个上门维修电脑的师傅,上门给我装了一个windows系统。。。。。。 表砍我。。。 当时买mac的初衷,只是想要个固态硬盘的笔记本,用来运行一些复杂的扑克软件。而看了当时所有的SSD笔记本后,最终决定,还是买个好(xiong)看(da)的。 已经有好几个朋友问我mba怎么样了,所以今天尽量客观
程序员一般通过什么途径接私活?
二哥,你好,我想知道一般程序猿都如何接私活,我也想接,能告诉我一些方法吗? 上面是一个读者“烦不烦”问我的一个问题。其实不止是“烦不烦”,还有很多读者问过我类似这样的问题。 我接的私活不算多,挣到的钱也没有多少,加起来不到 20W。说实话,这个数目说出来我是有点心虚的,毕竟太少了,大家轻喷。但我想,恰好配得上“一般程序员”这个称号啊。毕竟苍蝇再小也是肉,我也算是有经验的人了。 唾弃接私活、做外...
压测学习总结(1)——高并发性能指标:QPS、TPS、RT、吞吐量详解
一、QPS,每秒查询 QPS:Queries Per Second意思是“每秒查询率”,是一台服务器每秒能够相应的查询次数,是对一个特定的查询服务器在规定时间内所处理流量多少的衡量标准。互联网中,作为域名系统服务器的机器的性能经常用每秒查询率来衡量。 二、TPS,每秒事务 TPS:是TransactionsPerSecond的缩写,也就是事务数/秒。它是软件测试结果的测量单位。一个事务是指一...
Python爬虫爬取淘宝,京东商品信息
小编是一个理科生,不善长说一些废话。简单介绍下原理然后直接上代码。 使用的工具(Python+pycharm2019.3+selenium+xpath+chromedriver)其中要使用pycharm也可以私聊我selenium是一个框架可以通过pip下载 pip install selenium -i https://pypi.tuna.tsinghua.edu.cn/simple/ 
阿里程序员写了一个新手都写不出的低级bug,被骂惨了。
这种新手都不会范的错,居然被一个工作好几年的小伙子写出来,差点被当场开除了。
Java工作4年来应聘要16K最后没要,细节如下。。。
前奏: 今天2B哥和大家分享一位前几天面试的一位应聘者,工作4年26岁,统招本科。 以下就是他的简历和面试情况。 基本情况: 专业技能: 1、&nbsp;熟悉Sping了解SpringMVC、SpringBoot、Mybatis等框架、了解SpringCloud微服务 2、&nbsp;熟悉常用项目管理工具:SVN、GIT、MAVEN、Jenkins 3、&nbsp;熟悉Nginx、tomca
2020年,冯唐49岁:我给20、30岁IT职场年轻人的建议
点击“技术领导力”关注∆  每天早上8:30推送 作者| Mr.K   编辑| Emma 来源| 技术领导力(ID:jishulingdaoli) 前天的推文《冯唐:职场人35岁以后,方法论比经验重要》,收到了不少读者的反馈,觉得挺受启发。其实,冯唐写了不少关于职场方面的文章,都挺不错的。可惜大家只记住了“春风十里不如你”、“如何避免成为油腻腻的中年人”等不那么正经的文章。 本文整理了冯
程序员该看的几部电影
##1、骇客帝国(1999) 概念:在线/离线,递归,循环,矩阵等 剧情简介: 不久的将来,网络黑客尼奥对这个看似正常的现实世界产生了怀疑。 他结识了黑客崔妮蒂,并见到了黑客组织的首领墨菲斯。 墨菲斯告诉他,现实世界其实是由一个名叫“母体”的计算机人工智能系统控制,人们就像他们饲养的动物,没有自由和思想,而尼奥就是能够拯救人类的救世主。 可是,救赎之路从来都不会一帆风顺,到底哪里才是真实的世界?
Python绘图,圣诞树,花,爱心 | Turtle篇
每周每日,分享Python实战代码,入门资料,进阶资料,基础语法,爬虫,数据分析,web网站,机器学习,深度学习等等。 公众号回复【进群】沟通交流吧,QQ扫码进群学习吧 微信群 QQ群 1.画圣诞树 import turtle screen = turtle.Screen() screen.setup(800,600) circle = turtle.Turtle()...
作为一个程序员,CPU的这些硬核知识你必须会!
CPU对每个程序员来说,是个既熟悉又陌生的东西? 如果你只知道CPU是中央处理器的话,那可能对你并没有什么用,那么作为程序员的我们,必须要搞懂的就是CPU这家伙是如何运行的,尤其要搞懂它里面的寄存器是怎么一回事,因为这将让你从底层明白程序的运行机制。 随我一起,来好好认识下CPU这货吧 把CPU掰开来看 对于CPU来说,我们首先就要搞明白它是怎么回事,也就是它的内部构造,当然,CPU那么牛的一个东
还记得那个提速8倍的IDEA插件吗?VS Code版本也发布啦!!
去年,阿里云发布了本地 IDE 插件 Cloud Toolkit,仅 IntelliJ IDEA 一个平台,就有 15 万以上的开发者进行了下载,体验了一键部署带来的开发便利。时隔一年的今天,阿里云正式发布了 Visual Studio Code 版本,全面覆盖前端开发者,帮助前端实现一键打包部署,让开发提速 8 倍。 VSCode 版本的插件,目前能做到什么? 安装插件之后,开发者可以立即体验...
破14亿,Python分析我国存在哪些人口危机!
2020年1月17日,国家统计局发布了2019年国民经济报告,报告中指出我国人口突破14亿。 猪哥的朋友圈被14亿人口刷屏,但是很多人并没有看到我国复杂的人口问题:老龄化、男女比例失衡、生育率下降、人口红利下降等。 今天我们就来分析一下我们国家的人口数据吧! 一、背景 1.人口突破14亿 2020年1月17日,国家统计局发布了 2019年国民经济报告 ,报告中指出:年末中国大陆总人口(包括31个
2019年除夕夜的有感而发
天气:小雨(加小雪) 温度:3摄氏度 空气:严重污染(399) 风向:北风 风力:微风 现在是除夕夜晚上十点钟,再有两个小时就要新的一年了; 首先要说的是我没患病,至少现在是没有患病;但是心情确像患了病一样沉重; 现在这个时刻应该大部分家庭都在看春晚吧,或许一家人团团圆圆的坐在一起,或许因为某些特殊原因而不能团圆;但不管是身在何处,身处什么境地,我都想对每一个人说一句:新年快乐! 不知道csdn这...
听说想当黑客的都玩过这个Monyer游戏(1~14攻略)
第零关 进入传送门开始第0关(游戏链接) 请点击链接进入第1关: 连接在左边→ ←连接在右边 看不到啊。。。。(只能看到一堆大佬做完的留名,也能看到菜鸡的我,在后面~~) 直接fn+f12吧 &lt;span&gt;连接在左边→&lt;/span&gt; &lt;a href="first.php"&gt;&lt;/a&gt; &lt;span&gt;←连接在右边&lt;/span&gt; o...
在家远程办公效率低?那你一定要收好这个「在家办公」神器!
相信大家都已经收到国务院延长春节假期的消息,接下来,在家远程办公可能将会持续一段时间。 但是问题来了。远程办公不是人在电脑前就当坐班了,相反,对于沟通效率,文件协作,以及信息安全都有着极高的要求。有着非常多的挑战,比如: 1在异地互相不见面的会议上,如何提高沟通效率? 2文件之间的来往反馈如何做到及时性?如何保证信息安全? 3如何规划安排每天工作,以及如何进行成果验收? ......
作为一个程序员,内存和磁盘的这些事情,你不得不知道啊!!!
截止目前,我已经分享了如下几篇文章: 一个程序在计算机中是如何运行的?超级干货!!! 作为一个程序员,CPU的这些硬核知识你必须会! 作为一个程序员,内存的这些硬核知识你必须懂! 这些知识可以说是我们之前都不太重视的基础知识,可能大家在上大学的时候都学习过了,但是嘞,当时由于老师讲解的没那么有趣,又加上这些知识本身就比较枯燥,所以嘞,大家当初几乎等于没学。 再说啦,学习这些,也看不出来有什么用啊!
2020年的1月,我辞掉了我的第一份工作
其实,这篇文章,我应该早点写的,毕竟现在已经2月份了。不过一些其它原因,或者是我的惰性、还有一些迷茫的念头,让自己迟迟没有试着写一点东西,记录下,或者说是总结下自己前3年的工作上的经历、学习的过程。 我自己知道的,在写自己的博客方面,我的文笔很一般,非技术类的文章不想去写;另外我又是一个还比较热衷于技术的人,而平常复杂一点的东西,如果想写文章写的清楚点,是需要足够...
别低估自己的直觉,也别高估自己的智商
所有群全部吵翻天,朋友圈全部沦陷,公众号疯狂转发。这两周没怎么发原创,只发新闻,可能有人注意到了。我不是懒,是文章写了却没发,因为大家的关注力始终在这次的疫情上面,发了也没人看。当然,我...
这个世界上人真的分三六九等,你信吗?
偶然间,在知乎上看到一个问题 一时间,勾起了我深深的回忆。 以前在厂里打过两次工,做过家教,干过辅导班,做过中介。零下几度的晚上,贴过广告,满脸、满手地长冻疮。 再回首那段岁月,虽然苦,但让我学会了坚持和忍耐。让我明白了,在这个世界上,无论环境多么的恶劣,只要心存希望,星星之火,亦可燎原。 下文是原回答,希望能对你能有所启发。 如果我说,这个世界上人真的分三六九等,...
节后首个工作日,企业们集体开晨会让钉钉挂了
By 超神经场景描述:昨天 2 月 3 日,是大部分城市号召远程工作的第一天,全国有接近 2 亿人在家开始远程办公,钉钉上也有超过 1000 万家企业活跃起来。关键词:十一出行 人脸...
Java基础知识点梳理
Java基础知识点梳理 摘要: 虽然已经在实际工作中经常与java打交道,但是一直没系统地对java这门语言进行梳理和总结,掌握的知识也比较零散。恰好利用这段时间重新认识下java,并对一些常见的语法和知识点做个总结与回顾,一方面为了加深印象,方便后面查阅,一方面为了学好java打下基础。 Java简介 java语言于1995年正式推出,最开始被命名为Oak语言,由James Gosling(詹姆
2020年全新Java学习路线图,含配套视频,学完即为中级Java程序员!!
新的一年来临,突如其来的疫情打破了平静的生活! 在家的你是否很无聊,如果无聊就来学习吧! 世上只有一种投资只赚不赔,那就是学习!!! 传智播客于2020年升级了Java学习线路图,硬核升级,免费放送! 学完你就是中级程序员,能更快一步找到工作! 一、Java基础 JavaSE基础是Java中级程序员的起点,是帮助你从小白到懂得编程的必经之路。 在Java基础板块中有6个子模块的学
B 站上有哪些很好的学习资源?
哇说起B站,在小九眼里就是宝藏般的存在,放年假宅在家时一天刷6、7个小时不在话下,更别提今年的跨年晚会,我简直是跪着看完的!! 最早大家聚在在B站是为了追番,再后来我在上面刷欧美新歌和漂亮小姐姐的舞蹈视频,最近两年我和周围的朋友们已经把B站当作学习教室了,而且学习成本还免费,真是个励志的好平台ヽ(.◕ฺˇд ˇ◕ฺ;)ノ 下面我们就来盘点一下B站上优质的学习资源: 综合类 Oeasy: 综合
相关热词 c# 压缩图片好麻烦 c#计算数组中的平均值 c#获取路由参数 c#日期精确到分钟 c#自定义异常必须继承 c#查表并返回值 c# 动态 表达式树 c# 监控方法耗时 c# listbox c#chart显示滚动条
立即提问