Java基础 —— 项目一:ATM存取款系统

目录

一、系统架构搭建

二、系统欢迎页设计

三、用户开户功能

卡号去重复

根据卡号查找账户

四、用户登录功能

展示用户登录后的操作页面

 查询账户信息

存款

取款

转账

销户

修改密码

五、整体代码

1.账户类Account

2.银行系统类ATM

3.测试类Test

运行结果


他人之得,不必视为自己之失

                                          —— 24.7.15

一、系统架构搭建

① 定义一个账户类Account,需要包含(卡号、姓名、性别、密码、余额、取现额度)

② 定义一个ATM类,用来代替ATM系统,负责提供所有的业务需求,比如:展示ATM的系统欢迎页、开通账户、转账等

③ 定义一个测试类Test,负责对我们开发的ATM系统进行测试

package ATM_Project;public class Account {private String cardID;private String userName;private char sex;private String passWord;private double money;private double limit;public Account(String userName, String cardID, char sex, String passWord, double money, double limit) {this.userName = userName;this.cardID = cardID;this.sex = sex;this.passWord = passWord;this.money = money;this.limit = limit;}public String getCardID() {return cardID;}public void setCardID(String cardID) {this.cardID = cardID;}public String getUserName() {return userName;}public void setUserName(String userName) {this.userName = userName;}public char getSex() {return sex;}public void setSex(char sex) {this.sex = sex;}public String getPassWord() {return passWord;}public void setPassWord(String passWord) {this.passWord = passWord;}public double getMoney() {return money;}public void setMoney(double money) {this.money = money;}public double getLimit() {return limit;}public void setLimit(double limit) {this.limit = limit;}
}

二、系统欢迎页设计

在ATM中设计一个方法start(),方法中负责展示欢迎页面

package ATM_Project;import java.util.ArrayList;
import java.util.Scanner;public class ATM {private ArrayList<Account> accounts = new ArrayList<>();private Scanner sc = new Scanner(System.in);
//    启动ATM系统,展示欢迎界面public void start(){while(true){System.out.println("————————————————————————————————");System.out.println("——————————欢迎您进入ATM系统————————");System.out.println("———————————— 1.用户登录 ———————————");System.out.println("———————————— 2.用户开户 ———————————");System.out.println("——————————————— 请选择 —————————————");int choice = sc.nextInt();switch(choice){case 1:break;case 2:break;default:System.out.println("没有该操作,请重新输入");}}}
}

三、用户开户功能

就是新增一个账户,也就是往系统的账户集合中添加一个账户对象。

账户要求 

        ① 用户信息包含:姓名、性别、密码、每次提现额度、卡号

        ② 注意:卡号由系统生成,要求是8位的数字组成的(且卡号不能重复)

    //  用户开户操作private void createAccount(){System.out.println("——————————系统开户操作——————————");Account account = new Account();System.out.println("请你输入您的姓名:");String name = sc.next();account.setUserName(name);while(true){System.out.println("请您输入您的性别:");char sex = sc.next().charAt(0);if (sex == '男'||sex == '女'){account.setSex(sex);break;}else {System.out.println("请重新输入");}}while (true) {System.out.println("请您输入账户密码:");String password = sc.next();System.out.println("请您确认您的密码");String OkPassword = sc.next();if(OkPassword.equals(password)){System.out.println("密码输入成功");account.setPassWord(password);break;}else{System.out.println("密码不一致重新确认");}}System.out.println("请您输入您的取现额度:");double limit = sc.nextDouble();account.setLimit(limit);String newCardId = createCardId();account.setCardID(newCardId);accounts.add(account);System.out.println("恭喜您"+account.getUserName()+"开户成功,您的卡号是:"+account.getCardID());}

卡号去重复

为新开户的账户生成一个新卡号:
新卡号要求是一个8位的数字,且不能与其他账户对象的卡号重复。
新卡号得到后,需要赋值给当前账户对象。

    // 返回一个八位数字的卡号,且这个卡号不呢与其他账户的卡号重复private String createCardId(){while (true) {String cardId = "";Random r = new Random();for (int i = 0; i < 8; i++) {int data = r.nextInt(10);cardId = cardId + data;}Account acc = getAccByCardId(cardId);if(acc == null){return cardId;}else{System.out.println("该卡号已被注册");}}}

根据卡号查找账户

    // 根据卡号查找账户对象private Account getAccByCardId(String cardId){for (int i = 0; i < accounts.size(); i++) {Account acc = accounts.get(i);if(acc.getCardID().equals(cardId)){return acc;}}return null;}

四、用户登录功能

如果系统没有任何账户对象,则不允许登录。
让用户输入登录的卡号,先判断卡号是否正确,如果不正确要给出提示如果卡号正确,再让用户输入账户密码,如果密码不正确要给出提示如果密码也正确,则给出登录成功的提示。

    // 用户登录功能private void login() {System.out.println("——————————用户登录——————————");if (accounts.size()==0){System.out.println("系统中无账户,请先注册");return;}while (true) {System.out.println("请您选择要登录:1 还是退出:0");int choice = sc.nextInt();if (choice==1) {System.out.println("请输入你登陆的卡号:");String cardId = sc.next();Account acc = getAccByCardId(cardId);if(acc == null){System.out.println("卡号不存在,请重新输入:1 或 选择退出:0");int exit = sc.nextInt();if (exit==1){System.out.println("重新输入");}else{System.out.println("退出系统");return;}}else{while (true) {System.out.println("请您输入密码");String password = sc.next();if (acc.getPassWord().equals(password)){loginAccount=acc;System.out.println("恭喜您,登陆成功");userManage();return;}else{System.out.println("密码错误,请重新输入:1 或 选择退出:0");int exit = sc.nextInt();if (exit==1){System.out.println("重新输入");}else{System.out.println("退出系统");return;}}}}}else{System.out.println("您已退出");return;}}}

展示用户登录后的操作页面

用户操作页设计、查询账户、退出账户功能分析

用户登录成功后,需要进入用户操作页。

查询就是直接展示当前登录成功的用户的账户信息,退出账户就是回到欢迎页面

    // 展示用户登陆后的操作页面private void userManage() {System.out.println("您可以选择如下功能进行账户的处理:");System.out.println("1.查询账户");System.out.println("2.存款");System.out.println("3.取款");System.out.println("4.转账");System.out.println("5.修改密码");System.out.println("6.退出登录");System.out.println("7.注销当前账户");int choice = sc.nextInt();switch (choice){case 1:showLoginAcc();break;case 2:SaveMoney();break;case 3:GetMoney();break;case 4:transforMoney();break;case 5:updatePassword();return;case 6:System.out.println(loginAccount.getUserName()+"已退出");return;case 7:if (deleteAccount()) {return;}break;default:System.out.println("选择错误");}}

 查询账户信息

用户登录成功后,需要进入用户操作页。
查询就是直接展示当前登录成功的用户的账户信息。
退出账户就是回到欢迎页面,

    // 查询private void showLoginAcc() {System.out.println("您的帐户信息如下:");System.out.println("卡号:"+loginAccount.getCardID());System.out.println("户主:"+loginAccount.getUserName());System.out.println("性别:"+loginAccount.getSex());System.out.println("余额:"+loginAccount.getMoney());System.out.println("每次提现额度:"+loginAccount.getLimit());}
}

存款

就是用户为自己的账户存钱,存钱后更新账户的余额即可。

    // 存钱private void SaveMoney() {System.out.println("—————————存钱操作———————");System.out.println("请您输入存款金额");double money = sc.nextDouble();if (money<0){System.out.println("您输入有误");return;}loginAccount.setMoney(loginAccount.getMoney()+money);System.out.println("恭喜您存钱成功,存入:"+money+"余额为:"+loginAccount.getMoney());}

取款

就是从自己的账户中取钱,取钱的要求
需要先判断账户的余额是否大于>=100元,如果够,让用户输入取款金额。
需要判断取款金额是否超过了当次限额,以及余额是否足够。

    // 取款private void GetMoney() {System.out.println("—————————取钱操作———————");if (loginAccount.getMoney()<100){System.out.println("卡上余额不足,无法从ATM系统取钱,请前往营业厅办理");return;}System.out.println("请您输入您的取款金额:");double money = sc.nextDouble();if (money<=loginAccount.getMoney()&&money<=loginAccount.getLimit()) {loginAccount.setMoney(loginAccount.getMoney()-money);System.out.println("恭喜您取款成功,取出:"+money+"余额为:"+loginAccount.getMoney());}else{System.out.println("账户余额不足或取钱超过当日限额,您的余额是:"+loginAccount.getMoney()+"您的限额是:"+loginAccount.getLimit());}}

转账

把钱转给别人,转账前需要判断:
1.自己账户是否有钱,系统中是否有其他账户
2.接下来让用户输入对方卡号,判断对方账户是否存在,账户如果存在,还需要认证对方账户的户主姓氏。

    // 转账private void transforMoney() {System.out.println("———————————————用户转账——————————————");if (accounts.size()<2){System.out.println("当前系统无其他账户,无法转账");return;}if (loginAccount.getMoney()==0){System.out.println("当前账户余额不足");return;}while (true) {System.out.println("请您输入对方账户号码:");String other = sc.next();Account acc = getAccByCardId(other);if(acc == null){System.out.println("卡号输入错误,请重新输入:1 或退出:0");int exit = sc.nextInt();if (exit==0){break;}}else {System.out.println("请您输入对方账户姓氏:");String X = sc.next();if (acc.getUserName().startsWith(X)){while (true) {System.out.println("请您输入转账金额:");double Omoney = sc.nextDouble();if(Omoney>loginAccount.getMoney()){System.out.println("当前账户余额不足"+",当前账户余额:"+loginAccount.getMoney());}else{loginAccount.setMoney(loginAccount.getMoney()-Omoney);acc.setMoney(acc.getMoney()+Omoney);System.out.println("转账成功,您现在账户余额为:"+loginAccount.getMoney());return;}}}else{System.out.println("核验失败,请再次核验");}}}}

销户

销户就是从系统中删除当前账户,销户的要求:
1.首先要询问用户是否确定要销户,如果不确定,则回到操作界面,
2.如果确定,要判断用户的账户中是否有钱,有则不允许销户,并回到操作界面
3.如果没钱,则完成销户,并回到欢迎页,

    // 销户private boolean deleteAccount() {System.out.println("—————————————销户操作—————————————");while (true) {System.out.println("您确认要销户吗?确认:1 不确认:0");int choice = sc.nextInt();if (choice==1){if (loginAccount.getMoney()!=0){System.out.println("您的账户中有钱,请先取出再销户");return false;}else{accounts.remove(loginAccount);System.out.println("您好,您的帐户已经成功销户");return true;}} else if (choice == 0) {System.out.println("退出销户");return false;}else{System.out.println("您点击错误,请重新选择");}}}

修改密码

就是更改账户的密码,修改密码的要求:
1.需要先认证用户当前的密码
2.认证通过后,需要让用户输入两次新密码,
两次密码一样,则更新账户密码,并回到欢迎界面

    // 密码修改private void updatePassword() {System.out.println("——————————————账户密码修改操作————————————");System.out.println("请输入当前账户密码:");String password = sc.next();if (loginAccount.getPassWord().equals(password)){while (true) {System.out.println("请您输入新密码");String newPassword1 = sc.next();System.out.println("请您输入确认密码");String newPassword2 = sc.next();if (newPassword1.equals(newPassword2)){loginAccount.setPassWord(newPassword1);System.out.println("密码修改成功,新密码为:");return;}else {System.out.println("两次密码输入不一致,请重新输入");}}}else{System.out.println("两次输入密码不正确");}}

五、整体代码

1.账户类Account

package ATM_Project;public class Account {private String cardID;private String userName;private char sex;private String passWord;private double money;private double limit;public Account(String userName, String cardID, char sex, String passWord, double money, double limit) {this.userName = userName;this.cardID = cardID;this.sex = sex;this.passWord = passWord;this.money = money;this.limit = limit;}public Account() {}public String getCardID() {return cardID;}public void setCardID(String cardID) {this.cardID = cardID;}public String getUserName() {return userName + (sex == '男'?"先生":"女士");}public void setUserName(String userName) {this.userName = userName;}public char getSex() {return sex;}public void setSex(char sex) {this.sex = sex;}public String getPassWord() {return passWord;}public void setPassWord(String passWord) {this.passWord = passWord;}public double getMoney() {return money;}public void setMoney(double money) {this.money = money;}public double getLimit() {return limit;}public void setLimit(double limit) {this.limit = limit;}
}

2.银行系统类ATM

package ATM_Project;import java.util.ArrayList;
import java.util.Random;
import java.util.Scanner;public class ATM {private ArrayList<Account> accounts = new ArrayList<>();private Scanner sc = new Scanner(System.in);public Account loginAccount;//    启动ATM系统,展示欢迎界面public void start(){while(true){System.out.println("————————————————————————————————");System.out.println("——————————欢迎您进入ATM系统————————");System.out.println("———————————— 1.用户登录 ———————————");System.out.println("———————————— 2.用户开户 ———————————");System.out.println("———————————— 3.退出系统 ———————————");System.out.println("——————————————— 请选择 —————————————");int choice = sc.nextInt();switch(choice){case 1:login();break;case 2:createAccount();break;case 3:System.out.println("您已退出系统");return;default:System.out.println("没有该操作,请重新输入");return;}}}//  用户开户操作private void createAccount(){System.out.println("——————————系统开户操作——————————");Account account = new Account();System.out.println("请你输入您的姓名:");String name = sc.next();account.setUserName(name);while(true){System.out.println("请您输入您的性别:");char sex = sc.next().charAt(0);if (sex == '男'||sex == '女'){account.setSex(sex);break;}else {System.out.println("请重新输入");}}while (true) {System.out.println("请您输入账户密码:");String password = sc.next();System.out.println("请您确认您的密码");String OkPassword = sc.next();if(OkPassword.equals(password)){System.out.println("密码输入成功");account.setPassWord(password);break;}else{System.out.println("密码不一致重新确认");}}System.out.println("请您输入您的取现额度:");double limit = sc.nextDouble();account.setLimit(limit);String newCardId = createCardId();account.setCardID(newCardId);accounts.add(account);System.out.println("恭喜您"+account.getUserName()+"开户成功,您的卡号是:"+account.getCardID());}// 返回一个八位数字的卡号,且这个卡号不呢与其他账户的卡号重复private String createCardId(){while (true) {String cardId = "";Random r = new Random();for (int i = 0; i < 8; i++) {int data = r.nextInt(10);cardId = cardId + data;}Account acc = getAccByCardId(cardId);if(acc == null){return cardId;}else{System.out.println("该卡号已被注册");}}}// 根据卡号查找账户对象private Account getAccByCardId(String cardId){for (int i = 0; i < accounts.size(); i++) {Account acc = accounts.get(i);if(acc.getCardID().equals(cardId)){return acc;}}return null;}// 用户登录功能private void login() {System.out.println("——————————用户登录——————————");if (accounts.size()==0){System.out.println("系统中无账户,请先注册");return;}while (true) {System.out.println("请您选择要登录:1 还是退出:0");int choice = sc.nextInt();if (choice==1) {System.out.println("请输入你登陆的卡号:");String cardId = sc.next();Account acc = getAccByCardId(cardId);if(acc == null){System.out.println("卡号不存在,请重新输入:1 或 选择退出:0");int exit = sc.nextInt();if (exit==1){System.out.println("重新输入");}else{System.out.println("退出系统");return;}}else{while (true) {System.out.println("请您输入密码");String password = sc.next();if (acc.getPassWord().equals(password)){loginAccount=acc;System.out.println("恭喜您,登陆成功");userManage();return;}else{System.out.println("密码错误,请重新输入:1 或 选择退出:0");int exit = sc.nextInt();if (exit==1){System.out.println("重新输入");}else{System.out.println("退出系统");return;}}}}}else{System.out.println("您已退出");return;}}}// 展示用户登陆后的操作页面private void userManage() {System.out.println("您可以选择如下功能进行账户的处理:");System.out.println("1.查询账户");System.out.println("2.存款");System.out.println("3.取款");System.out.println("4.转账");System.out.println("5.修改密码");System.out.println("6.退出登录");System.out.println("7.注销当前账户");int choice = sc.nextInt();switch (choice){case 1:showLoginAcc();break;case 2:SaveMoney();break;case 3:GetMoney();break;case 4:transforMoney();break;case 5:updatePassword();return;case 6:System.out.println(loginAccount.getUserName()+"已退出");return;case 7:if (deleteAccount()) {return;}break;default:System.out.println("选择错误");}}// 密码修改private void updatePassword() {System.out.println("——————————————账户密码修改操作————————————");System.out.println("请输入当前账户密码:");String password = sc.next();if (loginAccount.getPassWord().equals(password)){while (true) {System.out.println("请您输入新密码");String newPassword1 = sc.next();System.out.println("请您输入确认密码");String newPassword2 = sc.next();if (newPassword1.equals(newPassword2)){loginAccount.setPassWord(newPassword1);System.out.println("密码修改成功,新密码为:");return;}else {System.out.println("两次密码输入不一致,请重新输入");}}}else{System.out.println("两次输入密码不正确");}}// 销户private boolean deleteAccount() {System.out.println("—————————————销户操作—————————————");while (true) {System.out.println("您确认要销户吗?确认:1 不确认:0");int choice = sc.nextInt();if (choice==1){if (loginAccount.getMoney()!=0){System.out.println("您的账户中有钱,请先取出再销户");return false;}else{accounts.remove(loginAccount);System.out.println("您好,您的帐户已经成功销户");return true;}} else if (choice == 0) {System.out.println("退出销户");return false;}else{System.out.println("您点击错误,请重新选择");}}}// 转账private void transforMoney() {System.out.println("———————————————用户转账——————————————");if (accounts.size()<2){System.out.println("当前系统无其他账户,无法转账");return;}if (loginAccount.getMoney()==0){System.out.println("当前账户余额不足");return;}while (true) {System.out.println("请您输入对方账户号码:");String other = sc.next();Account acc = getAccByCardId(other);if(acc == null){System.out.println("卡号输入错误,请重新输入:1 或退出:0");int exit = sc.nextInt();if (exit==0){break;}}else {System.out.println("请您输入对方账户姓氏:");String X = sc.next();if (acc.getUserName().startsWith(X)){while (true) {System.out.println("请您输入转账金额:");double Omoney = sc.nextDouble();if(Omoney>loginAccount.getMoney()){System.out.println("当前账户余额不足"+",当前账户余额:"+loginAccount.getMoney());}else{loginAccount.setMoney(loginAccount.getMoney()-Omoney);acc.setMoney(acc.getMoney()+Omoney);System.out.println("转账成功,您现在账户余额为:"+loginAccount.getMoney());return;}}}else{System.out.println("核验失败,请再次核验");}}}}// 取款private void GetMoney() {System.out.println("—————————取钱操作———————");if (loginAccount.getMoney()<100){System.out.println("卡上余额不足,无法从ATM系统取钱,请前往营业厅办理");return;}System.out.println("请您输入您的取款金额:");double money = sc.nextDouble();if (money<=loginAccount.getMoney()&&money<=loginAccount.getLimit()) {loginAccount.setMoney(loginAccount.getMoney()-money);System.out.println("恭喜您取款成功,取出:"+money+"余额为:"+loginAccount.getMoney());}else{System.out.println("账户余额不足或取钱超过当日限额,您的余额是:"+loginAccount.getMoney()+"您的限额是:"+loginAccount.getLimit());}}// 存钱private void SaveMoney() {System.out.println("—————————存钱操作———————");System.out.println("请您输入存款金额");double money = sc.nextDouble();if (money<0){System.out.println("您输入有误");return;}loginAccount.setMoney(loginAccount.getMoney()+money);System.out.println("恭喜您存钱成功,存入:"+money+"余额为:"+loginAccount.getMoney());}// 查询private void showLoginAcc() {System.out.println("您的帐户信息如下:");System.out.println("卡号:"+loginAccount.getCardID());System.out.println("户主:"+loginAccount.getUserName());System.out.println("性别:"+loginAccount.getSex());System.out.println("余额:"+loginAccount.getMoney());System.out.println("每次提现额度:"+loginAccount.getLimit());}
}

3.测试类Test

public class Test {public static void main(String[] args) {ATM atm = new ATM();atm.start();}
}

运行结果

注:转账金额不受取现额度控制

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

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

什么是AGI?以及AGI最新技术如何?

首先&#xff0c;AGI是Artificial General Intelligence的缩写&#xff0c;意为人工通用智能。AGI指的是一种拥有与人类相当智能水平的人工智能系统&#xff0c;能够在各种不同的任务和环境中进行智能决策和问题解决。与目前大多数人工智能系统只能在特定领域下执行特定任务不同…

上线 Airflow 官方!DolphinDB 带来数据管理新体验

在数据驱动的商业时代&#xff0c;企业对数据的实时处理和分析能力提出了更高的要求。同时&#xff0c;自动化地管理及优化数据处理流程&#xff0c;以提升效率和精准度&#xff0c;始终是企业不断追求的目标。 近期&#xff0c; DolphinDB 正式登陆 Apache Airflow 官方&…

悠律Ringbud pro开放式耳机:双奖设计,开放式畅听的舒适体验

悠律Ringbud pro凝声环开放式耳机 凭借其潮酷的外观&#xff0c;轻奢的体验&#xff0c;斩获2024红点设计奖&#xff1a;德国红点奖设立于1955年&#xff0c;被公认为国际性创意和设计的认可标志&#xff1b;而且还获得美国MUSE设计金奖&#xff1a;美国MUSE设计奖是最具代表性…

语法错误检测工具哪个好用?5个工具一键扫除错别字

在撰写文章或编辑文档的过程中&#xff0c;你是否曾为了寻找并修正那些细微的语法错误而耗费大量时间&#xff1f; 想象一下&#xff0c;如果有一个便捷的工具&#xff0c;能够即时在线帮你捕捉并修正这些错误&#xff0c;是不是既高效又省心&#xff1f;这正是“语法错误检测…

【React】React18 Hooks 之memo、useCallback

目录 React.memo()案例1: 无依赖项&#xff0c;无props案例1: props比较机机制&#xff08;1&#xff09;传递基本类型&#xff0c;props变化时组件重新渲染&#xff08;2&#xff09;传递的是引用类型的prop&#xff0c;比较的是新值和旧值的引用&#xff08;3&#xff09;保证…

React的usestate设置了值后马上打印获取不到最新值

我们在使用usestate有时候设置了值后&#xff0c;我们想要更新一些值&#xff0c;这时候&#xff0c;我们要想要马上获取这个值去做一些处理&#xff0c;发现获取不到&#xff0c;这是为什么呢&#xff1f; 效果如下&#xff1a; 1、原因如下 在React中,当你使用useState钩子…

【STM32 HAL库】I2S的使用

使用CubeIDE实现I2S发数据 1、配置I2S 我们的有效数据是32位的&#xff0c;使用飞利浦格式。 2、配置DMA **这里需要注意&#xff1a;**i2s的DR寄存器是16位的&#xff0c;如果需要发送32位的数据&#xff0c;是需要写两次DR寄存器的&#xff0c;所以DMA的外设数据宽度设置16…

一文详解数据仓库、数据湖、湖仓一体和数据网格

随着数字化时代的到来&#xff0c;近几年数据领域的新技术概念不断涌现&#xff0c;数据湖、湖仓一体、流批一体、存算一体、数据编织抑或数据网格等新概念层出不穷&#xff0c;成为数据管理领域的新宠。本文将探讨主要探讨数据仓库、数据湖、湖仓一体以及数据网格的优势和局限…

【第三章】Bug篇

文章目录 软件测试的生命周期BUG分级如何描述BUGBUG分级BUG的生命周期 在工作中与开发人员产生争执怎么办 软件测试的生命周期 软件测试贯穿于软件的整个生命周期&#xff0c;具体的软件开发到维护的每一个阶段都需要有测试步骤去保证产品质量。下面简要分析软件测试的具体流程…

变频压缩机变频调节特点

变频压缩机以其能耗低、工况适应性强等优点让其得到更多的应用&#xff0c;但它的特点和注意事项&#xff0c;也不能忽视&#xff0c;以免产生相反的效果。 一、变频调节的特点 1、按照额定负荷设计的制冷空调系统在压缩机低转速运行时&#xff0c;压缩机的质量流量减少&#…

Unity格斗游戏,两个角色之间互相锁定对方,做圆周运动

1&#xff0c;灵感来源 今天手头的工作忙完了&#xff0c;就等着服务器那边完活&#xff0c;于是开始研究同步问题。 正好想到之前想做的&#xff0c;两个小人对线PK&#xff0c;便有了这篇文章。 2&#xff0c;要实现的效果 如图所示&#xff0c;两个小人可以互相锁定&…

Python中发送邮件的艺术:普通邮件、PDF附件与Markdown附件

用的是qq邮箱,具体获取smtp的password可以看这个文章 获取密码 Python中发送邮件的艺术:普通邮件、PDF附件与Markdown附件 在今天的博客中,我们将探讨如何使用Python的smtplib库来发送电子邮件,包括发送普通文本邮件、携带PDF文件的邮件和附带Markdown文件的邮件。这些功能…

力扣2296.设计一个文本编辑器

力扣2296.设计一个文本编辑器 对顶栈 将光标看作左右栈的分隔添加元素&#xff1a;往左栈添加元素删除元素&#xff1a;从左栈删除元素光标左(右)移&#xff1a;左(右)栈元素加到右(左)栈 class TextEditor {string left,right;public:TextEditor() {}void addText(string…

linux下JDK的安装

前言&#xff1a; 安装部署java开发的代码都需要java环境&#xff0c;这里记录下linux下JDK的安装过程&#xff0c;仅供学习参考。 JDK的下载 下载地址&#xff1a;https://www.oracle.com/java/technologies/downloads 选择和操作系统匹配的版本进行下载 查看操作系统&…

乐尚代驾二乘客登录与司机登录

乘客登录 需求说明 openid是小程序端微信的唯一标识 数据库表 表中存在openid就不是第一次登录&#xff0c;否则就是第一次登录 登录流程时序 如果是第一次登录&#xff0c;注册之后也是要返回token的code就是单纯什么参数都没有&#xff0c;直接调用微信接口服务的wx.logi…

Games101学习笔记 Lecture22 Animation(cont.)

Lecture22 Animation(cont. 一、单个粒子模拟Ordinary Differential Equation ODE 常微分方程ODE求解方法——欧拉方法解决不稳定中点法改进欧拉方法自适应步长隐式欧拉方法 二、流体模拟基于位置的方法物质点方法 一、单个粒子模拟 想模拟粒子在场中的运动 Ordinary Differe…

使用OpenCV寻找图像中的轮廓

引言 OpenCV&#xff08;Open Source Computer Vision Library&#xff09;是一个开源的计算机视觉和机器学习软件库。它提供了大量的视觉处理功能&#xff0c;包括图像和视频捕获、特征检测与匹配、图像变换、图像分割、颜色空间转换等。在图像处理中&#xff0c;寻找图像中的…

Docker容器下安装Matlab,无需挂载

Matlab的安装需要这些文件 传入ubuntu后&#xff0c;改过相关的文件权限后&#xff0c;发现还是无法挂载 这有可能是docker的安全管理策略导致容器不能挂载&#xff0c;因此采用不挂载形式&#xff0c;直接解压的方式安装Matlab 1.将iso改成zip&#xff0c;并解压 2.解压rar文件…

MimicMotion-腾讯开源视频生成框架

腾讯宣布开源可控视频生成框架 MimicMotion&#xff0c;该框架可以通过提供参考人像及由骨骼序列表示的动作&#xff0c;来产生平滑的高质量人体动作视频 MimicMotion 具有以下几个亮点&#xff1a; 首先&#xff0c;通过引入了置信度感知的姿态引导信号&#xff0c;大幅提升了…

Ubuntu20.04从零开搭PX4MavrosGazebo环境并测试

仅仅是个人搭建记录 参考链接&#xff1a; https://zhuanlan.zhihu.com/p/686439920 仿真平台基础配置&#xff08;对应PX4 1.13版&#xff09; 语雀 mkdir -p ~/tzb/catkin_ws/src mkdir -p ~/tzb/catkin_ws/scripts cd catkin_ws && catkin init catkin build cd…