当前位置: 首页 > news >正文

简易计算器-课后程序(JAVA基础案例教程-黑马程序员编著-第十一章-课后作业)

【案例11-2】 简易计算器

【案例介绍】

1.案例描述

本案例要求利用Java Swing 图形组件开发一个可以进行简单的四则运算的图形化计算器。

2.运行结果

运行结果

 

【案例分析】

要制作一个计算器,首先要知道它由哪些部分组成,如下图所示:

一个简单的图形化界面计算器,需要由界面组件、组件的时间监听器和具体的事件处理逻辑组成。

实现一个简易图形化界面计算器可分以下几个步骤:

1.UI组件创建和初始化:包括窗体的创建,显示计算结果文本框、清除按钮、数字按钮、运算符等按钮的初始化。

2.在窗体中添加UI组件:包括放置数字键及运算符面板、放置清除框面板。

3.布局结束之后,就是计算器的难点:编写事件处理程序。

4.按键的响应实现。

5.计算逻辑的实现。

6.注册监听器

【案例实现】

Calculator.java

  1. package chapter1102;
  2. import java.awt.*;
  3. import java.awt.event.*;
  4. import javax.swing.*;
  5. import java.util.Vector;
  6. import java.math.BigDecimal;
  7. public class Calculator {
  8.           // 操作数1,为了程序的安全,初值一定设置,这里我们设置为0
  9.           String str1 = "0";
  10.          // 操作数2
  11.      String str2 = "0";
  12.      // 运算符
  13.     String signal = "+";  
  14.      // 运算结果
  15.     String result = "";
  16.      // 以下k1k5为状态开关
  17.      // 开关1用于选择输入方向,将要写入str1str2
  18.      // 1 时写入 str1,为 2 时写入 str2
  19.     int k1 = 1;
  20.     // 开关 2 用于记录符号键的次数
  21.      // 如果 k2>1 说明进行的是 2+3-9+8 这样的多符号运算
  22.     int k2 = 1;
  23.      // 开关3用于标识 str1 是否可以被清 0
  24.      // 等于 1 时可以,不等于1时不能被清0
  25.     int k3 = 1;
  26.      // 开关4用于标识 str2 是否可以被清 0
  27.      // 等于 1 时可以,不等于1时不能被清0
  28.     int k4 = 1;
  29.      // 开关5用于控制小数点可否被录入
  30.      // 等于1时可以,不为1时,输入的小数点被丢掉
  31.     int k5 = 1;
  32.      // store的作用类似于寄存器,用于记录是否连续按下符号键
  33.     JButton store;
  34.      //vt 存储之前输入的运算符。
  35.     @SuppressWarnings("rawtypes")
  36.     Vector vt = new Vector(20, 10);
  37.      // 创建一个 JFrame 对象并初始化。JFrame 可以理解为程序的主窗体。  
  38.      JFrame frame = new JFrame("Calculator");
  39.  //创建一个JTextField对象并初始化。JTextField用于显示操作和计算结果的文本框。
  40.      // 参数 20 表明可以显示 20 列的文本内容
  41.     JTextField result_TextField = new JTextField(result, 20);
  42.      // 清除按钮
  43.     JButton clear_Button = new JButton("Clear");
  44.      // 数字键09
  45.     JButton button0 = new JButton("0");
  46.     JButton button1 = new JButton("1");
  47.     JButton button2 = new JButton("2");
  48.     JButton button3 = new JButton("3");
  49.     JButton button4 = new JButton("4");
  50.     JButton button5 = new JButton("5");
  51.     JButton button6 = new JButton("6");
  52.     JButton button7 = new JButton("7");
  53.     JButton button8 = new JButton("8");
  54.     JButton button9 = new JButton("9");
  55.      // 计算命令按钮,加减乘除以及小数点等
  56.     JButton button_Dian = new JButton(".");
  57.     JButton button_jia = new JButton("+");
  58.     JButton button_jian = new JButton("-");
  59.     JButton button_cheng = new JButton("*");
  60.     JButton button_chu = new JButton("/");
  61.     JButton button_dy = new JButton("=");
  62.     public Calculator() {
  63.         button0.setMnemonic(KeyEvent.VK_0);
  64.     result_TextField.setHorizontalAlignment(JTextField.RIGHT);
  65.         // 创建一个 Jpanel 对象并初始化
  66.          JPanel pan = new JPanel();
  67.          // 设置该容器的布局为四行四列,边距为5像素
  68.         pan.setLayout(new GridLayout(4, 4, 5, 5));
  69.          // 将用于计算的按钮添加到容器内
  70.         pan.add(button7);
  71.         pan.add(button8);
  72.         pan.add(button9);
  73.         pan.add(button_chu);
  74.         pan.add(button4);
  75.         pan.add(button5);
  76.         pan.add(button6);
  77.         pan.add(button_cheng);
  78.         pan.add(button1);
  79.         pan.add(button2);
  80.         pan.add(button3);
  81.         pan.add(button_jian);
  82.         pan.add(button0);
  83.         pan.add(button_Dian);
  84.         pan.add(button_dy);
  85.         pan.add(button_jia);
  86.          // 设置 pan 对象的边距
  87.         pan.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
  88.          // 按照同样的方式设置第二个JPanel
  89.         JPanel pan2 = new JPanel();
  90.         pan2.setLayout(new BorderLayout());
  91.         pan2.add(result_TextField, BorderLayout.WEST);
  92.         pan2.add(clear_Button, BorderLayout.EAST);
  93.           // 设置主窗口出现在屏幕上的位置
  94.         frame.setLocation(300, 200);
  95.          // 设置窗体可以调大小
  96.         frame.setResizable(true);
  97.          //窗体中可以放置 JPanel,这里我们将面板pan和面板pan2让如窗体
  98.         frame.getContentPane().setLayout(new BorderLayout());
  99.         frame.getContentPane().add(pan2, BorderLayout.NORTH);
  100.         frame.getContentPane().add(pan, BorderLayout.CENTER);
  101.         frame.pack();
  102.         frame.setVisible(true);
  103.          //Listener类中编写的是数字键的响应逻辑。
  104.         class Listener implements ActionListener {
  105.            @SuppressWarnings("unchecked")
  106.            public void actionPerformed(ActionEvent e) {
  107.                String ss = ((JButton) e.getSource()).getText();
  108.                store = (JButton) e.getSource();
  109.                vt.add(store);
  110.                if (k1 == 1) {
  111.                    if (k3 == 1) {
  112.                        str1 = "";
  113.                        k5 = 1;
  114.                    }
  115.                    str1 = str1 + ss;
  116.                    k3 = k3 + 1;
  117.                    result_TextField.setText(str1);
  118.                } else if (k1 == 2) {
  119.                    if (k4 == 1) {
  120.                        str2 = "";
  121.                        k5 = 1;
  122.                }
  123.                    str2 = str2 + ss;
  124.                    k4 = k4 + 1;
  125.                    result_TextField.setText(str2);
  126.                }                              
  127.            }
  128.         }
  129.           //Listener_signal类中编写了运算符号键的响应逻辑
  130.         class Listener_signal implements ActionListener {
  131.            @SuppressWarnings("unchecked")
  132.            public void actionPerformed(ActionEvent e) {
  133.                String ss2 = ((JButton) e.getSource()).getText();
  134.                store = (JButton) e.getSource();
  135.                vt.add(store);
  136.                if (k2 == 1) {
  137.                    k1 = 2;
  138.                    k5 = 1;
  139.                    signal = ss2;
  140.                    k2 = k2 + 1;
  141.                } else {
  142.                    int a = vt.size();
  143.                    JButton c = (JButton) vt.get(a - 2);
  144.                    if (!(c.getText().equals("+"))
  145.                            && !(c.getText().equals("-"))
  146.                            && !(c.getText().equals("*"))
  147.                            && !(c.getText().equals("/")))
  148.                    {
  149.                        cal();
  150.                        str1 = result;
  151.                        k1 = 2;
  152.                        k5 = 1;
  153.                        k4 = 1;
  154.                        signal = ss2;
  155.                    }
  156.                    k2 = k2 + 1;
  157.                }
  158.            }
  159.         }
  160.      //Listener_clear类中编写了清除键的响应逻辑
  161.     class Listener_clear implements ActionListener {
  162.            @SuppressWarnings("unchecked")
  163.            public void actionPerformed(ActionEvent e) {
  164.                store = (JButton) e.getSource();
  165.                vt.add(store);
  166.                k5 = 1;
  167.                k2 = 1;
  168.                k1 = 1;
  169.                k3 = 1;
  170.                k4 = 1;
  171.                str1 = "0";
  172.                str2 = "0";
  173.                signal = "";
  174.                result = "";
  175.                result_TextField.setText(result);
  176.                vt.clear();
  177.            }
  178.         }
  179.      //Listener_dy类中编写的是等于号键的响应逻辑
  180.     class Listener_dy implements ActionListener {
  181.            @SuppressWarnings("unchecked")
  182.            public void actionPerformed(ActionEvent e) {
  183.                store = (JButton) e.getSource();
  184.                vt.add(store);
  185.                cal();
  186.                k1 = 1;
  187.                k2 = 1;
  188.                k3 = 1;
  189.                k4 = 1;
  190.                str1 = result;
  191.            }
  192.         }
  193. //Listener_xiaos类中编写的是小数点键的相应逻辑
  194. class Listener_xiaos implements ActionListener {
  195.            @SuppressWarnings("unchecked")
  196.            public void actionPerformed(ActionEvent e) {
  197.                store = (JButton) e.getSource();
  198.                vt.add(store);
  199.                if (k5 == 1) {
  200.                    String ss2 = ((JButton) e.getSource()).getText();
  201.                    if (k1 == 1) {
  202.                        if (k3 == 1) {
  203.                            str1 = "";
  204.                            k5 = 1;
  205.                        }
  206.                        str1 = str1 + ss2;
  207.                        k3 = k3 + 1;
  208.                        result_TextField.setText(str1);
  209.                    } else if (k1 == 2) {
  210.                        if (k4 == 1) {
  211.                            str2 = "";
  212.                            k5 = 1;
  213.                        }
  214.                        str2 = str2 + ss2;
  215.                        k4 = k4 + 1;
  216.                        result_TextField.setText(str2);
  217.                    }
  218.                }
  219.                k5 = k5 + 1;
  220.            }
  221.         }
  222.           // 监听等于键
  223.         Listener_dy jt_dy = new Listener_dy();
  224.          // 监听数字键
  225.         Listener jt = new Listener();
  226.          // 监听符号键
  227.         Listener_signal jt_signal = new Listener_signal();
  228.          // 监听清除键
  229.         Listener_clear jt_c = new Listener_clear();
  230.          // 监听小数点键
  231.         Listener_xiaos jt_xs = new Listener_xiaos();
  232.         button7.addActionListener(jt);
  233.         button8.addActionListener(jt);
  234.         button9.addActionListener(jt);
  235.         button_chu.addActionListener(jt_signal);
  236.         button4.addActionListener(jt);
  237.         button5.addActionListener(jt);
  238.         button6.addActionListener(jt);
  239.         button_cheng.addActionListener(jt_signal);
  240.         button1.addActionListener(jt);
  241.         button2.addActionListener(jt);
  242.         button3.addActionListener(jt);
  243.         button_jian.addActionListener(jt_signal);
  244.         button0.addActionListener(jt);
  245.         button_Dian.addActionListener(jt_xs);
  246.         button_dy.addActionListener(jt_dy);
  247.         button_jia.addActionListener(jt_signal);
  248.         clear_Button.addActionListener(jt_c);
  249.           // 窗体关闭事件的响应程序
  250.         frame.addWindowListener(new WindowAdapter() {
  251.            public void windowClosing(WindowEvent e) {
  252.                System.exit(0);
  253.            }
  254.         });
  255.     }
  256.      // calc()方法中编写了计算逻辑的实现。
  257.     public void cal() {
  258.         double a2;
  259.         double b2;
  260.         String c = signal;
  261.         double result2 = 0;
  262.         if (c.equals("")) {
  263.            result_TextField.setText("Please input operator");
  264.         } else {
  265.            if (str1.equals("."))
  266.                str1 = "0.0";
  267.            if (str2.equals("."))
  268.                str2 = "0.0";
  269.            a2 = Double.valueOf(str1).doubleValue();
  270.            b2 = Double.valueOf(str2).doubleValue();
  271.            if (c.equals("+")) {
  272.                result2 = a2 + b2;
  273.            }
  274.            if (c.equals("-")) {
  275.                result2 = a2 - b2;
  276.            }
  277.            if (c.equals("*")) {
  278.                BigDecimal m1 = new BigDecimal(Double.toString(a2));
  279.                    BigDecimal m2 = new
  280.                                     BigDecimal(Double.toString(b2));
  281.                    result2 = m1.multiply(m2).doubleValue();
  282.            }
  283.            if (c.equals("/")) {
  284.                if (b2 == 0) {
  285.                    result2 = 0;
  286.                } else {
  287.                    result2 = a2 / b2;
  288.                }
  289.            }
  290.            result = ((new Double(result2)).toString());
  291.            result_TextField.setText(result);
  292.         }
  293.     }
  294.     @SuppressWarnings("unused")
  295.     public static void main(String[] args) {
  296.     try {  
  297.  //通过 UIManager 来设置窗体的 UI 风格
  298.  UIManager.setLookAndFeel("javax.swing.plaf.metal.MetalLookAndFeel");
  299.         } catch (Exception e) {
  300.            e.printStackTrace();
  301.         }
  302.         Calculator cal = new Calculator();
  303.     }
  304. }

上述代码中,第7-32行代码,定义了一些成员变量,方便响应的逻辑实现。第34-35行代码,创建了一个Vector对象,存储之前输入的运算符。第37行代码,创建了一个 JFrame 对象并初始化。JFrame 可以理解为程序的主窗体。第40行代码,创建了一个JTextField对象并初始化。JTextField用于显示操作和计算结果的文本框。参数 20 表明可以显示 20 列的文本内容。第42行代码,创建了一个清除按钮对象。第44-53行,创建数字键0-9按钮对象。第55-60行,创建计算命令按钮,加减乘除以及小数点等按钮对象。第65-101行代码,是对计算器进行布局。Listener类中编写的是数字键的响应逻辑。Listener_xiaos类中编写的是小数点键的相应逻辑。Listener_signal类中编写了运算符号键的响应逻辑。Listener_dy类中编写的是等于号键的响应逻辑。Listener_clear类中编写了清除键的响应逻辑。calc()方法中编写了计算逻辑的实现。第222-247行代码,创建监听对象,斌对各个按键进行监听。第249-253行代码,为窗体关闭事件的响应程序。第297行代码,通过 UIManager 来设置窗体的 UI 风格。

相关文章:

简易计算器-课后程序(JAVA基础案例教程-黑马程序员编著-第十一章-课后作业)

【案例11-2】 简易计算器 【案例介绍】 1.案例描述 本案例要求利用Java Swing 图形组件开发一个可以进行简单的四则运算的图形化计算器。 2.运行结果 运行结果 【案例分析】 要制作一个计算器,首先要知道它由哪些部分组成,如下图所示: 一…...

chatGPT使用:询问简历和面试相关话题(持续更新中)

chatGPT使用:询问简历和面试相关话题 写一份Java简历,价值2万元包装上面的Java简历面试自我介绍面试简述稿包装简历的方法技巧如何进行良好的自我介绍如何写一份优秀的面试简述稿如何写一份优秀的简历如何写一份优秀的面试讲述稿如何提高面试录取率如何拿到offer写一份Java简…...

Java的 Stream流

Stream流&#xff1f;结合Lambda表达式&#xff0c;用于简化集合和数组操作的API。Stream流的一个小例子&#xff1a;创建一个集合&#xff0c;存储多个姓名&#xff0c;把集合中所有以"张"开头的长度为3的元素存储到一个新的集合并输出。List<String> namesne…...

FL Studio 21 中文正式版发布支持多种超个性化主题

万众期待的 FL Studio 21 版本正式发布上线&#xff0c;目前在紧锣密鼓的安排上线中&#xff0c;届时所有购买正版 FL Studio 的用户&#xff0c;都可以免费升级到21版&#xff01; 按照惯例&#xff0c;本次新版也会增加全新插件&#xff0c;来帮助大家更好地创作。今天先给大…...

【微信小程序】-- 全局配置 -- window - 导航栏(十五)

&#x1f48c; 所属专栏&#xff1a;【微信小程序开发教程】 &#x1f600; 作  者&#xff1a;我是夜阑的狗&#x1f436; &#x1f680; 个人简介&#xff1a;一个正在努力学技术的CV工程师&#xff0c;专注基础和实战分享 &#xff0c;欢迎咨询&#xff01; &…...

Spring中最常用的11个扩展点

前言我们一说到spring&#xff0c;可能第一个想到的是 IOC&#xff08;控制反转&#xff09; 和 AOP&#xff08;面向切面编程&#xff09;。没错&#xff0c;它们是spring的基石&#xff0c;得益于它们的优秀设计&#xff0c;使得spring能够从众多优秀框架中脱颖而出。除此之外…...

网络协议丨HTTPS是什么?

我们都知道HTTP协议&#xff0c;那什么是HTTPS&#xff1f; 我们都知道&#xff0c;HTTP有两个缺点——“明文”和“不安全”仅凭 HTTP 自身是无力解决的&#xff0c;需要引入新的 HTTPS 协议。 由于 HTTP 天生“明文”的特点&#xff0c;整个传输过程完全透明&#xff0c;任…...

Anaconda常用命令总结,anaconda、conda、miniconda的关系

Anaconda、conda、miniconda的关系 Anaconda Anaconda 是一个用于数据科学&#xff0c;机器学习和深度学习的开源软件包管理系统&#xff0c;其中包括了许多流行的 Python 包和工具Anaconda主要用于科学计算和数据分析。 conda Conda 是 Anaconda 中的包管理器&#xff0c;…...

【蓝桥杯入门到入土】最基础的数组你真的掌握了吗?

文章目录一&#xff1a;数组理论基础二&#xff1a;数组知识点总结三&#xff1a;数组这种数据结构的优点和缺点是什么&#xff1f;四&#xff1a;实战解题1. 移除元素暴力解法双指针法2.有序数组的平方暴力解法双指针法最后说一句一&#xff1a;数组理论基础 首先要知道数组在…...

Java Set系列集合(Collections集合工具类、可变参数)

目录Set系列集系概述HashSet集合元素无序的底层原理&#xff1a;哈希表HashSet集合元素去重复的底层原理LinkedHashSet有序实现原理TreeSetCollection集合总结可变参数Collections集合工具类Set系列集系概述 Set系列集合特点 无序&#xff1a;存取顺序不一致不重复&#xff1…...

chromium构建原生AS项目-记录1

构建的chromium版本&#xff1a;待补充重要说明&#xff1a;so文件加载的过程文件&#xff1a;base_java.jar包文件路径&#xff1a;org.chromium.base.library_loader.LibraryLoader方法&#xff1a;loadAlreadyLocked&#xff08;Context context&#xff09;line166 :Native…...

Mybatis-Plus 开发提速器:mybatis-plus-generator-ui

Mybatis-Plus 开发提速器&#xff1a;mybatis-plus-generator-ui 1.简介 github地址 &#xff1a; https://github.com/davidfantasy/mybatis-plus-generator-ui 提供交互式的Web UI用于生成兼容mybatis-plus框架的相关功能代码&#xff0c;包括Entity,Mapper,Mapper.xml,Se…...

李迟2023年02月工作生活总结

本文为 2023 年 2 月工作生活总结。 研发编码 Linux Go 某工程使用到一些数据的统计&#xff0c;为方便&#xff0c;使用 map 存储数量&#xff0c;由于其是无序的&#xff0c;输出的列表顺序不固定&#xff0c;将其和历史版本对比不方便&#xff0c;所以需要将 key 排序再输…...

【Python百日进阶-Web开发-Vue3】Day542 - Vue3 商城后台 02:Windi CSS 与 Vue Router4

文章目录 一、WindiCSS 初始1.1 WindiCSS 是什么?1.2 为什么选择 Windi CSS?1.3. 基础用法1.4 集成二、简单按钮2.1 设置背景色2.2 设置字体颜色和上下左右padding2.3 设置圆角2.4 鼠标悬浮,颜色加深2.5 鼠标划入动画2.6 设置阴影2.7 @apply 抽离class代码到 style 块中三、…...

Jupyter Lab | “丢下R,一起来快乐地糟蹋服务器!”

写作前面 工具永远只是为了帮助自己提升工作效率 —— 沃兹基硕得 所以说&#xff0c;为什么要使用jupyterlab呢&#xff1f;当然是因为基于服务器来处理数据就可以使劲造了&#xff0c;而且深切地感觉到&#xff0c;“R这玩意儿是人用的吗”。 jupyter-lab | mamba安装以及…...

分页与分段

前面我们分析了虚拟地址和物理地址 我们这里进行一个简单的分析 这个是程序运行时的地址映射 那么这些碎片&#xff0c;我们现在的操作系统究竟如何处理呢&#xff1f; 我们再引入一个实际问题 我们如何把右边的进程p塞入左边的内存空间里面 有一种方法将p5kill掉&#xff…...

【UE4 】制作螺旋桨飞机

一、素材资源链接&#xff1a;https://pan.baidu.com/s/1xPVYYw05WQ6FABq_ZxFifg提取码&#xff1a;ivv8二、课程视频链接https://www.bilibili.com/video/BV1Bb411h7qw/?spm_id_from333.337.search-card.all.click&vd_source36a3e35639c44bb339f59760641390a8三、最终效果…...

五.家庭:亲情背后有理性

5.1经济学帝国主义【单选题】以下属于经济学研究范围的是&#xff08; &#xff09;。A、约束最优化B、稀缺资源配置C、价格竞争与非价格竞争D、以上都对我的答案&#xff1a;D【多选题】为何有学科分类?A、分工B、专业化C、累积创新D、科技进步我的答案&#xff1a;ABCD【判断…...

【Leedcode】栈和队列必备的面试题(第三期)

【Leedcode】栈和队列必备的面试题&#xff08;第三期&#xff09; 文章目录【Leedcode】栈和队列必备的面试题&#xff08;第三期&#xff09;一、题目&#xff08;用两个栈实现队列&#xff09;二、思路图解1.定义两个栈2.初始化两个数组栈3. 将数据放入pushST数组栈中4.删除…...

《图机器学习》-GNN Augmentation and Training

GNN Augmentation and Training一、Graph Augmentation for GNNs1、Feature Augmentation2、Structure augmentation3、Node Neighborhood Sampling一、Graph Augmentation for GNNs 之前的假设&#xff1a; Raw input graph computational graph&#xff0c;即原始图等于计算…...

【Node.js算法题】数组去重、数组删除元素、数组排序、字符串排序、字符串反向、字符串改大写 、数组改大写、字符替换

文章目录前言数组去重数组删除元素数组排序字符串排序字符串反向字符串改大写数组改大写字符替换字符替换运行结果&#xff1a; ![在这里插入图片描述](https://img-blog.csdnimg.cn/8ac1c15e6f0944cdb8ca50bcb844182a.png)总结前言 本期文章是js的一些算法题&#xff0c;包括…...

Win10系统开始菜单无法点击解决方法分享

Win10系统开始菜单无法点击解决方法分享。有用户电脑一开机之后&#xff0c;就出现了开始菜单无法正常点击的情况。我们很多设置项都是通过开始菜单来进行开启的。那么这个功能无法点击了怎么办呢&#xff1f;接下来我们一起来看看以下的解决方法分享吧。 方法一&#xff1a; 1…...

libmodbus从linux访问window上的服务超时问题

window&#xff1a;使用EasyModbusTCP Server Simulator 作为服务。linux:程序&#xff1a;#include <stdio.h> #include <modbus/modbus.h>int main() {modbus_t *ctx;uint16_t holding_registers[1];// Create a new Modbus TCP contextctx modbus_new_tcp(&quo…...

挑战图像处理100问(26)——双线性插值

双线性插值是一种常用的图像插值方法&#xff0c;用于将低分辨率的图像放大到高分辨率。它基于一个假设&#xff1a;在两个相邻像素之间的值是线性的。 双线性插值考察444邻域的像素点&#xff0c;并根据距离设置权值。虽然计算量增大使得处理时间变长&#xff0c;但是可以有效…...

NXP iMX8系列处理器Pin Multiplexing定义说明

By Toradex秦海1). 简介为了提高处理器的设计灵活性和可用性&#xff0c;NXP的所有i.MX系列处理器都配备了基于 IOMUX Controller (IOMUXC)和IOMUX来使能Pin Mux功能&#xff0c;使得一个特定的IO管脚可以选择不同的可能多达8种的功能定义模块(ALT0, ALT1, ALT2, ALT3...)&…...

用Python的Supervisor進行進程監控以及自動啓動

python 限制同一时间只执行一个 作服務器端開發的同窗應該都對進程監控不會陌生&#xff0c;最近剛好要更換 uwsgi 爲 gunicorn&#xff0c;而gunicorn又剛好有這麼一章講進程監控&#xff0c;因此多研究了下。python 結合以前在騰訊工做的經驗&#xff0c;也會講講騰訊的服務…...

Centos和Window系统下Frp内网穿透

frp 是一个高性能的内网穿透的反向代理软件&#xff0c;支持 TCP、UDP、HTTP、HTTPS 等常见协议(TCP最常用)&#xff0c;可以将处于局域网或者家用电脑主机、办公电脑主机通过中转服务器的方式暴露在公网里&#xff0c;使用户可以通过访问公网的IP&#xff08;域名&#xff09;…...

春招冲刺(四):flex布局面试题总结

flex布局面试题总结 Q1&#xff1a;什么是弹性盒布局&#xff1f; 特点&#xff1a;让元素对不同屏幕尺寸和不同显示设备做好适应。在响应式网站表现较好。 一、容器属性 Q2&#xff1a;display:flex和display:inline-flex的作用 使容器变成弹性布局&#xff0c;为其子元素…...

我的 System Verilog 学习记录(7)

引言 本文简单介绍 SystemVerilog 语言的 testbench 组件间通信和数据交互。 前文链接&#xff1a; 我的 System Verilog 学习记录&#xff08;1&#xff09; 我的 System Verilog 学习记录&#xff08;2&#xff09; 我的 System Verilog 学习记录&#xff08;3&#xff…...

canvas复习笔记(绘制直线、矩形、圆形、圆弧)

canvas 画一条直线 <body><canvasid"c"width"300"height"200"style"border: 1px solid #ccc;"></canvas> </body><script>// 2、获取 canvas 对象const cnv document.getElementById("c");…...

LeetCode 653. 两数之和 IV - 输入二叉搜索树

653. 两数之和 IV - 输入二叉搜索树 难度&#xff1a;easy\color{Green}{easy}easy 题目描述 给定一个二叉搜索树 rootrootroot 和一个目标结果 kkk&#xff0c;如果二叉搜索树中存在两个元素且它们的和等于给定的目标结果&#xff0c;则返回 truetruetrue。 示例 1&#xf…...

【Datawhale图机器学习】图神经网络

图神经网络 GNN是一种连接模型&#xff0c;通过网络中节点之间的信息传递的方式来获取图中的依存关系&#xff0c;GNN通过从节点任意深度的邻居来更新该节点状态&#xff0c;这个状态能够表示状态信息。第一次在论文 The graph neural network model 中提出 与传统NN的区别&a…...

【项目精选】 javaEE采购管理系统(论文+视频+源码)

点击下载源码 本系统是一个独立的系统&#xff0c;用来解决企业采购信息的管理问题。采用JSP技术构建了一个 有效而且实用的企业采购信息管理平台&#xff0c;目的是为高效地完成对企业采购信息的管理。经过 对课题的深入分析&#xff0c;采购系统需实现以下功能模块&#xff1…...

【Servlet篇2】创建一个web项目

在上一篇文章当中&#xff0c;已经提到了什么是Maven&#xff0c;以及如何使用maven从中央仓库下载jar包。【Tomcat与Servlet篇1】认识Tomcat与Maven_革凡成圣211的博客-CSDN博客Tomcat&#xff0c;mavenhttps://blog.csdn.net/weixin_56738054/article/details/129228140?spm…...

Allegro如何手动让静态铜皮避让过孔操作指导

Allegro如何手动让静态铜皮避让过孔操作指导 在用Allegro做PCB设计的时候,如果铺的是静态铜皮,铜皮铺在过孔上会造成短路,需要手动避让下,如下图 下面介绍如何手动避让,具体操作如下 点击Shape点击Manual Void/Cavity...

Java使用SpringBoot的Filter来扩展管道请求

Java Spring Boot 是一个流行的 Java Web 开发框架&#xff0c;它提供了一些基本的 Web 管道功能。在 Spring Boot 中&#xff0c;Web 管道是通过一组过滤器、拦截器、控制器和视图解析器等组件组成的。 如果你需要扩展 Spring Boot Web 管道&#xff0c;可以考虑以下几种方式…...

「JVM 高效并发」锁优化

为了线程间更高效的共享数据及解决竞争问题&#xff0c;提高程序执行效率&#xff0c;JDK 6 做了大量锁优化&#xff0c;如适应性自旋&#xff08;Adaptive Spinning&#xff09;、锁消除&#xff08;Lock Elimination&#xff09;、锁膨胀&#xff08;Lock Coarsening&#xf…...

当园区物流遇上云计算,会发生什么事情?

顺丰供应链与亚马逊云科技的强强联手&#xff0c;可以给物流供应链企业带来怎样的启示&#xff1f;物流行业的数智化趋势在国内物流行业说起顺丰&#xff0c;相信是无人不知无人不晓。作为数字化供应链服务解决方案提供商&#xff0c;顺丰供应链可以提供端到端供应链的规划、管…...

作为测试开发岗的面试官,我都是怎么选人的?

最近一段时间面试了不少人&#xff0c;主要是一些测试开发岗&#xff0c;中高级的初级的也都有&#xff1b;也有一些偏业务测试岗的候选人。总结出了一些方法论&#xff0c;或者说更多的是个人作为面试官所遵守的一套面试准则。 1.什么是面试&#xff1f; 面试不仅仅是你问我…...

android事件分发机制源码分析

没什么用的前言责任链设计模式流程图源码分析 没什么用的前言 事件分发机制是面试中一道必问的题目&#xff0c;而我的应对方式则是&#xff0c;在网络上找一些博客看看&#xff0c;然后做一些笔记&#xff0c;最后在面试时将我自己记住的内容说出来。这种方式本身没有太大的…...

今天,小灰37岁了!

人们常常说&#xff0c;35岁是互联网人的中年危机。现在&#xff0c;小灰已经跨过了中年危机&#xff0c;倒不是因为小灰财务自由了&#xff0c;而是因为今天是小灰37岁的生日。年轻时候&#xff0c;小灰总觉得30岁是一个很遥远的年龄&#xff0c;而现在&#xff0c;小灰距离40…...

基于.NET 7 + iView 的前后端分离的通用后台管理系统开源框架

更多开源项目请查看&#xff1a;一个专注推荐.Net开源项目的榜单 今天给大家推荐一套前后端分离通用后台管理系统开源框架。 项目简介 这是基于.Net 7 Vue.js开发的、前后端分离框架&#xff0c;前端UI框架采用iView&#xff0c;该项目只有基础功能模块&#xff0c;不包含具…...

新一代通信协议—— RSocket

一、简介 RSocket 是一种二进制字节流传输协议&#xff0c;位于 OSI 模型中的5~6层&#xff0c;底层可以依赖 TCP、WebSocket、Aeron 协议。最初由 Netflix 开发&#xff0c;支持 Reactive Streams。其开发背后的动机是用开销更少的协议取代超文本传输协议(HTTP)&#xff0c;H…...

【编程实践】这个代码命名规范是真优雅呀!代码如诗!!(多读优秀的开源代码,多实践,你也可以一样优秀!)

目录 管理类命名 传播类命名 回调类命名 监控类命名 内存管理类命名 过滤检测类命名 结构类命名 常见设计模式命名 解析类命名 网络类命名 CRUD命名 其他 End 管理类命名 写代码&#xff0c;少不了对统一资源的管理&#xff0c;清晰的启动过程可以有效的组织代码…...

Linux->进程终止和等待

目录 1. 进程终止场景 1.1 进程退出码 1.2 进程常见退出方式 2. 进程等待 2.1 进程等待的必要性 2.2 进程等待的方式 wait()方式 waitpid()方式 options参数 status参数 1. 进程终止场景 代码运行完毕&#xff0c;结果正确 代码运行完毕&#xff0c;结果不正确 代码异…...

超店有数分享:tiktok数据分析工具推荐,助你成功出海!

现阶段的跨境电商人都纷纷入局tiktok&#xff0c;这是风口也是发展趋势。Tiktok的下载量已经超过了35亿&#xff0c;每月都有10亿用户活跃&#xff0c;在154国家/地区使用。Tiktok用户每天在平均花1小时左右进行浏览&#xff0c;打开率也很高。如今&#xff0c;tiktok也越来越成…...

2022 第十四届蓝桥杯模拟赛第三期(题解与标程)

第十四届蓝桥杯模拟赛第三期1. 最小的十六进制问题描述答案提交参考答案2. Excel的列问题描述答案提交参考答案3. 相等日期问题描述答案提交参考答案4. 多少种取法问题描述答案提交参考答案5. 最大连通分块问题描述答案提交参考答案6. 哪一天问题描述输入格式输出格式样例输入样…...

「TCG 规范解读」PC 平台相关规范(1)

可信计算组织&#xff08;Ttrusted Computing Group,TCG&#xff09;是一个非盈利的工业标准组织&#xff0c;它的宗旨是加强在相异计算机平台上的计算环境的安全性。TCG于2003年春成立&#xff0c;并采纳了由可信计算平台联盟&#xff08;the Trusted Computing Platform Alli…...

HNU工训中心:直流电路测量分析实验报告

工训中心的牛马实验 实验目的 1.熟悉直流电路的测量和分析方法。 2.熟悉直流电源、电压表、电流表的使用法及其特性。 实验仪器和器材 1.实验仪器 直流稳压电源型号:IT6302 台式多用表型号:UT805A 2.实验&#xff08;箱&#xff09;器材 电路实验箱 元器件&#xff1a;电阻…...

tensorflow2.4--1.框架介绍

前言 虽然1.x版本tensorflow有很多项目都基于此构建&#xff0c;然而随着2.x版本的推出&#xff0c;很多架构已经发生了改变&#xff0c;代码发生了改变&#xff0c;同时很多模组已经废弃不用或者更新,tensorflow1.x已经不能再兼容最新的项目,与时俱进是必要的&#xff0c;因此…...