Java面向对象(进阶)-- 拼电商客户管理系统(康师傅)

文章目录

  • 一、目标
  • 二、需求说明
    • (1)主菜单
    • (2)添加客户
    • (3)修改客户
    • (4)删除客户
    • (5)客户列表
  • 三、软件设计结构
  • 四、类的设计
    • (1)Customer类的设计
    • (2)CustomerList类的设计
    • (3)CustomerView类的设计
    • (4)CMUtility工具类
  • 五、结果展示

一、目标

项目学习巩固目标:

  • 模拟实现一个基于文本界面的《拼电商客户管理系统》

  • 进一步掌握编程技巧和调试技巧,熟悉面向对象编程

  • 主要涉及以下知识点:

    • 类结构的使用:属性、方法及构造器

    • 对象的创建与使用

    • 类的封装性

    • 声明和使用数组

    • 数组的插入、删除和替换

    • 关键字的使用:this

二、需求说明

模拟实现基于文本界面的《拼电商客户管理系统》。

该软件能够实现对客户对象的插入、修改和删除(用数组实现),并能够打印客户明细表。

(1)主菜单

项目采用分级菜单方式。主菜单如下:
-----------------拼电商客户管理系统-----------------
1 添 加 客 户
2 修 改 客 户
3 删 除 客 户
4 客 户 列 表
5 退 出
请选择(1-5):_

•每个客户的信息被保存在Customer对象中。

•以一个Customer类型的数组来记录当前所有的客户。

•每次“添加客户”(菜单1)后,客户(Customer)对象被添加到数组中。

•每次“修改客户”(菜单2)后,修改后的客户(Customer)对象替换数组中原对象。

•每次“删除客户”(菜单3)后,客户(Customer)对象被从数组中清除。

•执行“客户列表 ”(菜单4)时,将列出数组中所有客户的信息。

(2)添加客户

添加客户”的界面及操作过程如下所示:
……
请选择(1-5):1
---------------------添加客户---------------------
姓名:佟刚
性别:男
年龄:35
电话:010-56253825
邮箱:tongtong@atguigu.com
---------------------添加完成---------------------

(3)修改客户

修改客户”的界面及操作过程如下所示:
……
请选择(1-5):2
---------------------修改客户---------------------
请选择待修改客户编号(-1退出):1
姓名(佟刚):<直接回车表示不修改>
性别(男):
年龄(35):
电话(010-56253825):
邮箱(tongtong@atguigu.com):tongg@atguigu.com
---------------------修改完成---------------------

(4)删除客户

删除客户”的界面及操作过程如下所示:
……
请选择(1-5):3
---------------------删除客户---------------------
请选择待删除客户编号(-1退出):1
确认是否删除(Y/N):y
---------------------删除完成---------------------

(5)客户列表

客户列表”的界面及操作过程如下所示:
……
请选择(1-5):4
---------------------------客户列表---------------------------
编号 姓名 性别 年龄 电话 邮箱
1 佟刚 男 45 010-56253825 tong@abc.com
2 封捷 女 36 010-56253825 fengjie@ibm.com
3 雷丰阳 男 32 010-56253825 leify@163.com
-------------------------客户列表完成-------------------------

三、软件设计结构

该软件由以下三个模块组成:
image.png

Ø CustomerView(视图)为主模块,负责菜单的显示和处理用户操作

Ø CustomerList为Customer对象的管理模块,内部用数组管理一组Customer对象,并提供相应的添加、修改、删除和遍历方法,供CustomerView调用(操作数组的行为都放在CustomerList里面)

Ø Customer为实体对象,用来封装客户信息(数组是Customer类类型的,也可以设计为JavaBean)


enterMainMenu()方法的活动图
image.png


四、类的设计

(1)Customer类的设计

Customer为实体类,用来封装客户信息

  • 该类封装客户的以下信息:
    • String name :客户姓名
    • char gender :性别
    • int age :年龄
    • String phone:电话号码
    • String email :电子邮箱
  • 提供各属性的get/set方法
  • 提供所需的构造器(可自行确定)

🤺代码
【Customer.java】

package yuyi03;/*** ClassName: Customer* Package: yuyi03* Description:*  客户类* @Author 雨翼轻尘* @Create 2023/10/28 0028 18:30*/
public class Customer {//属性private String name;    //客户姓名private char gender;    //性别private int age;    //年龄private String phone;   //电话号码private String email;   //电子邮箱//方法public void setName(String name){this.name=name;}public char getGender() {return gender;}public void setGender(char gender) {this.gender = gender;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public String getPhone() {return phone;}public void setPhone(String phone) {this.phone = phone;}public String getEmail() {return email;}public void setEmail(String email) {this.email = email;}public String getName(){return name;}public String getDetails(){return name + "\t" +gender +"\t" +age+ "\t" +phone +"\t"+email;}//构造器public Customer() {}public Customer(String name, char gender, int age, String phone, String email) {this.name = name;this.gender = gender;this.age = age;this.phone = phone;this.email = email;}
}

(2)CustomerList类的设计

CustomerList为Customer对象的管理模块,内部使用数组管理一组Customer对象

  • 本类封装以下信息:
    • Customer[] customers:用来保存客户对象的数组
    • int total = 0 :记录已保存客户对象的数量
  • 该类至少提供以下构造器和方法:
    • public CustomerList(int totalCustomer)
    • public booleanaddCustomer(Customer customer)
    • public booleanreplaceCustomer(int index, Customer cust)
    • public booleandeleteCustomer(int index)
    • public Customer[] getAllCustomers()
    • public Customer getCustomer(int index)
    • public int getTotal()

⚡各方法的作用与参数:

public CustomerList(inttotalCustomer)

  • 用途:构造器,用来初始化customers数组
  • 参数:totalCustomer:指定customers数组的最大空间

public booleanaddCustomer(Customer customer)

  • 用途:将参数customer添加组中最后一个客户对象记录之后
  • 参数:customer指定要添加的客户对象
  • 返回:添加成功返回true;false表示数组已满,无法添加

public booleanreplaceCustomer(int index, Customer cust)

  • 用途:用参数customer替换数组中由index指定的对象

  • 参数:customer指定替换的新客户对象

         index指定所替换对象在数组中的位置,从0开始
    
  • 返回:替换成功返回true;false表示索引无效,无法替换

/*** 用途:从数组中删除参数index指定索引位置的客户对象记录* @param index  参数: index指定所删除对象在数组中的索引位置,从0开始* @return  返回:删除成功返回true;false表示索引无效,无法删除*/
public boolean deleteCustomer(int index){//后边元素往前挪if(index>=0 && index<total){for (int i = index; i <total-1 ; i++) { //比如现在有3个元素,角标是0-2,index为1(第二个元素),角标为2的元素(第三个)往前移动,现在只有两个元素,角标不能超过1customers[i]=customers[i+1];    //i的最大值是tatal-2,则customers[i+1]最大值为customers[total-1]}//将有效数据最后一个位置置空customers[total-1]=null;    total--;    //总人数减一return true;}else{return false;}
}

还可以这样:

/*** 用途:从数组中删除参数index指定索引位置的客户对象记录* @param index  参数: index指定所删除对象在数组中的索引位置,从0开始* @return  返回:删除成功返回true;false表示索引无效,无法删除*/public boolean deleteCustomer(int index){if(index<0 || index>=total){return false;}for (int i = index; i < total-1; i++) {customers[i]=customers[i+1];}//将有效数据最后一个位置置空//customers[total-1]=null;//total--;//或customers[--total]=null;return true;}

public booleandeleteCustomer(int index)

  • 用途:从数组中删除参数index指定索引位置的客户对象记录
  • 参数: index指定所删除对象在数组中的索引位置,从0开始
  • 返回:删除成功返回true;false表示索引无效,无法删除

public Customer[] getAllCustomers()

  • 用途:返回数组中记录的所有客户对象
  • 返回: Customer[] 数组中包含了当前所有客户对象,该数组长度与对象个数相同。

public Customer getCustomer(int index)

  • 用途:返回参数index指定索引位置的客户对象记录
  • 参数: index指定所要获取的客户在数组中的索引位置,从0开始
  • 返回:封装了客户信息的Customer对象

image.png


🤺代码
【CustomerList.java】

package yuyi03;/*** ClassName: CustomerList* Package: yuyi03* Description:*  CustomerList为Customer对象的管理模块,内部使用数组管理一组Customer对象* @Author 雨翼轻尘* @Create 2023/10/28 0028 18:47*/
public class CustomerList {//属性private Customer[] customers;   //用来保存客户对象的数组private int total;  //记录已保存客户对象的数量//构造器/*** 用途:构造器,用来初始化customers数组* @param totalCustomer  指定customers数组的最大空间*/public CustomerList(int totalCustomer){customers=new Customer[totalCustomer];}//方法/*** 用途:将参数customer添加组中最后一个客户对象记录之后* @param customer  参数:customer指定要添加的客户对象* @return  返回:添加成功返回true;false表示数组已满,无法添加*/public boolean addCustomer(Customer customer){if(total<customers.length){ //若此时客户对象的数量(total)小于数组长度,说明数组没有满,可以添加客户进去customers[total]=customer;total++;    //加完一个客户进数组,客户对象数量加一return true;}else{return false;}}/*** 用途:用参数cust替换数组中由index指定的对象* @param index  index指定所替换对象在数组中的位置,从0开始* @param cust  参数:cust 指定替换的新客户对象* @return  返回:替换成功返回true;false表示索引无效,无法替换*/public boolean replaceCustomer(int index, Customer cust){if(index>=0 && index<total){customers[index]=cust;return true;}else{return false;}}/*** 用途:从数组中删除参数index指定索引位置的客户对象记录* @param index  参数: index指定所删除对象在数组中的索引位置,从0开始* @return  返回:删除成功返回true;false表示索引无效,无法删除*/public boolean deleteCustomer(int index){if(index<0 || index>=total){return false;}for (int i = index; i < total-1; i++) {customers[i]=customers[i+1];}//将有效数据最后一个位置置空//customers[total-1]=null;//total--;//或customers[--total]=null;return true;}/*** 用途:返回数组中记录的所有客户对象* @return 返回: Customer[] 数组中包含了当前所有客户对象,该数组长度与对象个数相同。*/public Customer[] getAllCustomers(){//错误的://return customers;  会将空的元素也一起返回,现在只需要有客户的对象元素//正确的:Customer[] cus=new Customer[total]; //要是一个也没有存,total是0,循环进不去,直接返回,相当于造了一个长度为0的数组for (int i = 0; i < total; i++) {   //total也可以改为cus.lengthcus[i]=customers[i];    //没有将对象复制过来,只是将地址复制过来了,对象还是原来的那个}return cus;}/*** 用途:返回参数index指定索引位置的客户对象记录* @param index  参数: index指定所要获取的客户在数组中的索引位置,从0开始* @return 返回:封装了客户信息的Customer对象*/public Customer getCustomer(int index){if(index>0 || index<total){ //index有效范围return customers[index];}else{return null;}}/***获取客户列表中客户的数量* @return  客户数量total*/public int getTotal(){return total;}}

(3)CustomerView类的设计

CustomerView为主模块,负责菜单的显示和处理用户操作

  • 本类封装以下信息:
    • CustomerList customerList = new CustomerList(10);
    • 创建最大包含10个客户对象的CustomerList对象,供以下各成员方法使用。
  • 该类至少提供以下方法:
    • public void enterMainMenu()
    • private void addNewCustomer()
    • private void modifyCustomer()
    • private void deleteCustomer()
    • private void listAllCustomers()
    • public static void main(String[] args)

⚡各方法的作用与参数:

public void enterMainMenu()

  • 用途:显示主菜单,响应用户输入,根据用户操作分别调用其他相应的成员方法(如addNewCustomer),以完成客户信息处理。

private void addNewCustomer()

private void modifyCustomer()

private void deleteCustomer()

private void listAllCustomers()

  • 用途:这四个方法分别完成“添加客户”、“修改客户”、“删除客户”和“客户列表”等各菜单功能。
  • 这四个方法仅供enterMainMenu()方法调用。

public static void main(String[] args)

  • 用途:创建CustomerView实例,并调用 enterMainMenu()方法以执行程序。

🤺代码

【CustomerView.java】

package yuyi03;/*** ClassName: CustomerView* Package: yuyi03* Description:*  CustomerView为主模块,负责菜单的显示和处理用户操作* @Author 雨翼轻尘* @Create 2023/10/29 0029 10:16*/
public class CustomerView {//造CustoomerList的对象,作为当前类的属性出现CustomerList customerList = new CustomerList(10);   //数组长度为10,最多添加10个客户//方法/*** 进入主界面的方法*/public void enterMainMenu(){boolean isFlag=true;while(isFlag){//显示界面System.out.println("\n-------------------拼电商客户管理系统-----------------\n");System.out.println("                   1 添 加 客 户");System.out.println("                   2 修 改 客 户");System.out.println("                   3 删 除 客 户");System.out.println("                   4 客 户 列 表");System.out.println("                   5 退       出\n");System.out.print("                   请选择(1-5):");char key = CMUtility.readMenuSelection();   //让用户从1-5做选择,不是这个范围就出不来switch(key){case '1'://添加客户addNewCustomer();break;case '2'://修改客户modifyCustomer();break;case '3'://删除客户deleteCustomer();break;case'4'://客户列表listAllCustomers();break;case '5':System.out.print("确认是否退出(Y/N):");char isExit=CMUtility.readConfirmSelection();if(isExit=='Y'){    //Y要大写,因为在CMUtility.readConfirmSelection()方法里面给它转成大写的了//获取用户选择为5的时候退出isFlag=false;}//若是N就不用管它了,继续循环即可break;}}}//添加客户private void addNewCustomer(){System.out.println("---------------------添加客户---------------------");System.out.print("姓名:");String name = CMUtility.readString(4);System.out.print("性别:");char gender = CMUtility.readChar();System.out.print("年龄:");int age = CMUtility.readInt();System.out.print("电话:");String phone = CMUtility.readString(15);System.out.print("邮箱:");String email = CMUtility.readString(15);Customer cust = new Customer(name, gender, age, phone, email);boolean flag = customerList.addCustomer(cust);if (flag) {System.out.println("---------------------添加完成---------------------");} else {System.out.println("----------------记录已满,无法添加-----------------");}}private void modifyCustomer() {System.out.println("---------------------修改客户---------------------");int index = 0;Customer cust = null;for (;;) {System.out.print("请选择待修改客户编号(-1退出):");index = CMUtility.readInt();if (index == -1) {return;}cust = customerList.getCustomer(index - 1);if (cust == null) {System.out.println("无法找到指定客户!");} elsebreak;}System.out.print("姓名(" + cust.getName() + "):");String name = CMUtility.readString(4, cust.getName());System.out.print("性别(" + cust.getGender() + "):");char gender = CMUtility.readChar(cust.getGender());System.out.print("年龄(" + cust.getAge() + "):");int age = CMUtility.readInt(cust.getAge());System.out.print("电话(" + cust.getPhone() + "):");String phone = CMUtility.readString(15, cust.getPhone());System.out.print("邮箱(" + cust.getEmail() + "):");String email = CMUtility.readString(15, cust.getEmail());cust = new Customer(name, gender, age, phone, email);boolean flag = customerList.replaceCustomer(index - 1, cust);if (flag) {System.out.println("---------------------修改完成---------------------");} else {System.out.println("----------无法找到指定客户,修改失败--------------");}}//删除客户private void deleteCustomer() {System.out.println("---------------------删除客户---------------------");int index = 0;Customer cust = null;for (;;) {System.out.print("请选择待删除客户编号(-1退出):");index = CMUtility.readInt();if (index == -1) {return;}cust = customerList.getCustomer(index - 1);if (cust == null) {System.out.println("无法找到指定客户!");} elsebreak;}System.out.print("确认是否删除(Y/N):");char yn = CMUtility.readConfirmSelection();if (yn == 'N')return;boolean flag = customerList.deleteCustomer(index - 1);if (flag) {System.out.println("---------------------删除完成---------------------");} else {System.out.println("----------无法找到指定客户,删除失败--------------");}}//客户列表private void listAllCustomers() {System.out.println("---------------------------客户列表---------------------------");Customer[] custs = customerList.getAllCustomers();if (custs.length == 0) {System.out.println("没有客户记录!");} else {System.out.println("编号\t姓名\t\t性别\t年龄\t电话\t\t\t邮箱");for (int i = 0; i < custs.length; i++) {//            System.out.println(i + 1 + "\t" + custs[i].getName() + "\t" + custs[i].getGender() + "\t" + custs[i].getAge() + "\t\t" + custs[i].getPhone() + "\t" + custs[i].getEmail());System.out.println((i+1) + "\t" + custs[i].getDetails());}}System.out.println("-------------------------客户列表完成-------------------------");}public static void main(String[] args){//创建当前类的对象CustomerView view =new CustomerView();view.enterMainMenu();}}

(4)CMUtility工具类

项目中提供了CMUtility.java类,可用来方便地实现键盘访问。

该类提供了以下静态方法:

  • public static char readMenuSelection()

    • 用途:该方法读取键盘,如果用户键入’1’-’5’中的任意字符,则方法返回。返回值为用户键入字符。
  • public static char readChar()和 public static char readChar(char defaultValue)

    • 用途:这两个方法功能相同,均从键盘读取一个字符,并将其作为方法的返回值。
    • 参数:defaultValue— 如果用户不输入字符而直接回车,方法将以defaultValue 作为返回值。(提示:此方法可在修改客户时调用)
  • public static int readInt() public static int readInt(int defaultValue)

    • 用途:这两个方法功能相同,均从键盘读取一个长度不超过2位的 整数,并将其作为方法的返回值。
    • 参数:defaultValue— 如果用户不输入字符而直接回车,方法将以defaultValue 作为返回值。
  • public static String readString(int limit) public static String readString(int limit, String defaultValue)

    • 用途:这两个方法功能相同,均从键盘读取一个长度不超过limit的字符串,并将其作为方法的返回值。

    • 参数:limit — 指定字符串的最大长度

        defaultValue— 如果用户不输入字符而直接回车,方法将以defaultValue 作为返回值。
      
  • public static char readConfirmSelection()

    • 用途:从键盘读取‘Y’或’N’,并将其作为方法的返回值。

【CMUtility.java】

package com.atguigu02.project;import java.util.Scanner;/**
* CMUtility工具类:
* 将不同的功能封装为方法,就是可以直接通过调用方法使用它的功能,而无需考虑具体的功能实现细节。
*
* @author 尚硅谷-宋红康
* @create 17:17
*/
public class CMUtility {private static Scanner scanner = new Scanner(System.in);/**用于界面菜单的选择。该方法读取键盘,如果用户键入’1’-’5’中的任意字符,则方法返回。返回值为用户键入字符。*/public static char readMenuSelection() {char c;for (; ; ) {String str = readKeyBoard(1, false);c = str.charAt(0);if (c != '1' && c != '2' && c != '3' && c != '4' && c != '5') {System.out.print("选择错误,请重新输入:");} else break;}return c;}/**从键盘读取一个字符,并将其作为方法的返回值。*/public static char readChar() {String str = readKeyBoard(1, false);return str.charAt(0);}/**从键盘读取一个字符,并将其作为方法的返回值。如果用户不输入字符而直接回车,方法将以defaultValue 作为返回值。*/public static char readChar(char defaultValue) {String str = readKeyBoard(1, true);return (str.length() == 0) ? defaultValue : str.charAt(0);}/**从键盘读取一个长度不超过2位的整数,并将其作为方法的返回值。*/public static int readInt() {int n;for (; ; ) {String str = readKeyBoard(2, false);try {n = Integer.parseInt(str);break;} catch (NumberFormatException e) {System.out.print("数字输入错误,请重新输入:");}}return n;}/**从键盘读取一个长度不超过2位的整数,并将其作为方法的返回值。如果用户不输入字符而直接回车,方法将以defaultValue 作为返回值。*/public static int readInt(int defaultValue) {int n;for (; ; ) {String str = readKeyBoard(2, true);if (str.equals("")) {return defaultValue;}try {n = Integer.parseInt(str);break;} catch (NumberFormatException e) {System.out.print("数字输入错误,请重新输入:");}}return n;}/**从键盘读取一个长度不超过limit的字符串,并将其作为方法的返回值。*/public static String readString(int limit) {return readKeyBoard(limit, false);}/**从键盘读取一个长度不超过limit的字符串,并将其作为方法的返回值。如果用户不输入字符而直接回车,方法将以defaultValue 作为返回值。*/public static String readString(int limit, String defaultValue) {String str = readKeyBoard(limit, true);return str.equals("")? defaultValue : str;}/**用于确认选择的输入。该方法从键盘读取‘Y’或’N’,并将其作为方法的返回值。*/public static char readConfirmSelection() {char c;for (; ; ) {String str = readKeyBoard(1, false).toUpperCase();c = str.charAt(0);if (c == 'Y' || c == 'N') {break;} else {System.out.print("选择错误,请重新输入:");}}return c;}private static String readKeyBoard(int limit, boolean blankReturn) {String line = "";while (scanner.hasNextLine()) {line = scanner.nextLine();if (line.length() == 0) {if (blankReturn) return line;else continue;}if (line.length() < 1 || line.length() > limit) {System.out.print("输入长度(不大于" + limit + ")错误,请重新输入:");continue;}break;}return line;}}

五、结果展示

项目简图
image.png

①主菜单
image.png

②添加客户(1)
image.png

③客户列表(4)
image.png

④修改客户(2)
image.png

⑤删除客户(3)
image.png

⑥退出(5)
image.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/173117.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

20.1 OpenSSL 字符BASE64压缩算法

OpenSSL 是一种开源的加密库&#xff0c;提供了一组用于加密和解密数据、验证数字证书以及实现各种安全协议的函数和工具。它可以用于创建和管理公钥和私钥、数字证书和其他安全凭据&#xff0c;还支持SSL/TLS、SSH、S/MIME、PKCS等常见的加密协议和标准。 OpenSSL 的功能非常…

matlab创建矩阵、理解三维矩阵

1.创建矩阵 全0矩阵&#xff1a;a zeros(2,3,4) 全1矩阵&#xff1a;a ones(2,3,4) &#xff01;和python不一样的地方&#xff01;此处相当于创建了4页2行3列的矩阵&#xff0c;而在python里是2页3行4列。 对第1页的第2行第3列元素进行修改&#xff1a;

拉扎维模拟CMOS集成电路设计西交张鸿老师课程P2~5视频学习记录

目录 p2 p3 p4 p5 --------------------------------------------------------------------------------------------------------------------------------- p2 -----------------------------------------------------------------------------------------------------…

进程程序替换

什么是进程程序替换&#xff1a; 用fork创建子进程后执行的是和父进程相同的程序(但有可能执行不同的代码分支),子进程往往要调用一种exec函数 以执行另一个程序。当进程调用一种exec函数时,该进程的用户空间代码和数据完全被新程序替换,从新程序的启动 例程开始执行。调用ex…

Qt配置OpenCV教程,亲测已试过

详细版可参考&#xff1a;Qt配置OpenCV教程&#xff0c;亲测已试过&#xff08;详细版&#xff09;_qt opencv_-_Matrix_-的博客-CSDN博客 软件准备&#xff1a;QtOpenCVCMake (QtOpenCV安装不说了&#xff0c;CMake的安装&#xff0c;我用的是&#xff1a;可参考博客&#x…

《动手学深度学习 Pytorch版》 10.6 自注意力和位置编码

在注意力机制中&#xff0c;每个查询都会关注所有的键&#xff0d;值对并生成一个注意力输出。由于查询、键和值来自同一组输入&#xff0c;因此被称为 自注意力&#xff08;self-attention&#xff09;&#xff0c;也被称为内部注意力&#xff08;intra-attention&#xff09;…

【深度学习】吴恩达课程笔记(一)——深度学习概论、神经网络基础

笔记为自我总结整理的学习笔记&#xff0c;若有错误欢迎指出哟~ 吴恩达课程笔记——深度学习概论、神经网络基础 一、概念区别1.深度学习与机器学习2.深度学习与神经网络 二、什么是神经网络1.分类2.特点3.工作原理4.神经网络示意图5.神经网络进行监督学习6.深度学习的发展 三、…

Domino中的源代码管理工具

大家好&#xff0c;才是真的好。 上次Notes/Domino 14 Drop2发布的时候&#xff0c;我们就提到&#xff0c;HCL一起发布了一款源代码管理工具。 这里还是简单科普一下&#xff0c;源代码管理工具&#xff0c;可以实现代码版本控制、备份&#xff0c;还有多个程序员之间的协作…

2023版 STM32实战12 IIC总线读写AT24C02

IIC简述 一个多主从的串行总线&#xff0c;又叫I2C&#xff0c;是由飞利浦公司发明的通讯总线 IIC特点 -1- 串行(逐bit传输) -2- 同步(共用时钟线) -3- 半双工(收发不同进行) -4- 总线上的任何设备都可以是主机 开发使用习惯和理解 -1- 通过地址寻址 -2- 数据线的…

JVM进阶(2)

一)方法区: java虚拟机中有一个方法区&#xff0c;该区域被所有的java线程都是共享&#xff0c;虚拟机一启动&#xff0c;运行时数据区就被开辟好了&#xff0c;官网上说了方法区可以不压缩还可以不进行GC&#xff0c;JAVA虚拟机就相当于是接口&#xff0c;具体的HotSpot就是虚…

IP应用场景API的反欺诈潜力:保护在线市场不受欺诈行为侵害

前言 在数字化时代&#xff0c;网络上的商业活动迅速增长&#xff0c;但与之同时&#xff0c;欺诈行为也在不断演化。欺诈者不断寻找新方法来窃取个人信息、进行金融欺诈以及实施其他不法行为。为了应对这一威胁&#xff0c;企业和组织需要强大的工具&#xff0c;以识别和防止…

VScode远程连接错误:进程试图写入不存在的管道

使用VScode连接树莓派时&#xff0c;出现远程连接错误&#xff1a;进程试图写入不存在的管道 解决方案&#xff1a; &#xff08;1&#xff09;可以进入config所在文件夹&#xff0c;删除文件 &#xff08;2&#xff09;无法解决的化尝试下述方法 输入 Remotting-SSH:Settin…

Go学习第十八章——Gin日志与第三方工具Logrus

Go web框架——Gin日志与第三方工具Logrus Gin日志功能1 基础介绍1.1 快速入门1.2 日志基础使用1.3 将日志输出到文件 2 定义路由格式3 修改日志级别4 修改日志格式 第三方日志工具logrus1 快速入门1.1 安装1.2 使用 2 基本功能使用2.1 设置日志输出格式2.2 设置日志输出位置2.…

【C++初阶(三)】引用内联函数auto关键字

目录 前言 1. 引用 1.1 引用的概念 1.2 引用的特性 1.3 引用的权限 1.4 引用的使用 1.5 引用与指针的区别 2. 内联函数 2.1 什么是内联函数 2.2 内联函数的特性 3. auto关键字 3.1 auto简介 3.2 auto使用规则 3.3 auto不能使用的场景 4. 基于范围的for循环 4.1 范围for…

震惊!原来BUG是这么理解的!什么是BUG?软件错误(BUG)的概念

较为官方的概念&#xff1a; 当且仅当规格说明是存在的并且正确&#xff0c;程序与规格说明之间的 不匹配才是错误。 当需求规格说明书没有提到的功能&#xff0c;判断标准以最终用户为准&#xff1a;当程序没有实现其最终用户合理预期的 功能要求时&#xff0c;就是软…

【Python · PyTorch】线性代数 微积分

本文采用Python及PyTorch版本如下&#xff1a; Python&#xff1a;3.9.0 PyTorch&#xff1a;2.0.1cpu 本文为博主自用知识点提纲&#xff0c;无过于具体介绍&#xff0c;详细内容请参考其他文章。 线性代数 & 微积分 1. 线性代数1.1 基础1.1.1 标量1.1.2 向量长度&…

JEnv使用初体验

Java多版本控制器初体验 1、前言 由于公司项目使用jdk8版本&#xff0c;而日常学习会使用其他版本例如jdk17等&#xff0c;往常都是修改环境配置目录实现。 2、下载资料 链接&#xff1a;https://pan.baidu.com/s/1UqzHv8K8WBu-75Ysyc_h3A 提取码&#xff1a;ra6a 3、安装 …

目前和未来的缓存构建

说起来可能有点反直觉&#xff0c;有时候不运行反而可以帮助我们加快速度&#xff0c;这正是网络浏览器运行的指导原则。不必在页面上加载所有内容&#xff0c;缓存的元素已经存在&#xff0c;不需要每次访问网站或网页时都重新加载。页面加载速度越快&#xff0c;浏览器的工作…

汇编学习(1)

汇编、CPU架构、指令集、硬编码之间的关系 ● 汇编语言&#xff1a;这是一种低级语言&#xff0c;用于与硬件直接交互。它是由人类可读的机器码或指令组成的&#xff0c;这些指令告诉CPU如何执行特定的任务。每条汇编指令都有一个对应的机器码指令&#xff0c;CPU可以理解和执…

Ps:对象选择工具

对象选择工具 Object Selection Tool是 Photoshop 2020 版以后新增的选区工具&#xff0c;可用于自动选择图像中的对象或区域&#xff0c;如人物、汽车、宠物、天空、水、建筑物和山脉等。 快捷键&#xff1a;W 让对象选择工具自动检测并选择图像内的对象或区域&#xff0c;或者…