JAVA 小项目银行新用户现金业务办理
任务描述
编写一个银行新用户现金业务办理程序,使其模拟新用户到银行办理现金存取业务时的场景。要求此场景中,要模拟出银行对用户到来的欢迎动作、对用户离开的提醒动作,以及用户的开户、存款和取款动作,在完成开户、存款和取款操作后,要提示用户的账户余额。例如,一个新用户来到招商银行,首先银行要表示欢迎,然后银行工作人员会为用户办理开户手续;开户后,用户先进行存款操作,之后又进行了取款操作,取款操作时需要用户输入正确的密码和取款金额需小于当前账户金额,如果条件不满足,系统产生异常。当业务办理完,用户离开银行,银行提醒用户携带好随身财物。至此银行新用户现金业务办理结束。
先是创建数据库的表格
先是id用了自增主键 然后账号密码都是不为空的
之后写数据库注册的类这个视频也讲过几乎差不多就加一下输出语句
package BANK;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Scanner;
public class Register {
String username;
String pwd;
Scanner sc = new Scanner(System.in);
int balance;
boolean flag = false;
public void register(){
System.out.println("*******************************");
System.out.println("\t欢迎注册本银行账户");
System.out.println("注册本银行账户需要用户输入用户名,密码,存储金额 .注册需要缴纳10元卡费");
System.out.println("请输入用户名:");
username = sc.next();
System.out.println("请输入密码:");
pwd = sc.next();
System.out.println("请输入开户金额:");
balance = sc.nextInt();
while(balance<10) {
System.out.println("充值金额不足10元,请重新输入充值金额");
balance = sc.nextInt();
}
Connection conn = null;
Statement stmt = null;
int count = 0;
try {
Class.forName("com.mysql.cj.jdbc.Driver"); //注册驱动
String url = "jdbc:mysql://localhost:3306/yyf?serverTimezone=UTC";
String user = "root";
String password = "316420";
conn = DriverManager.getConnection(url, user, password);//连接数据库
stmt = conn.createStatement();
String sql = "insert into t_bank(username,password,balance) values('"+username+"','"+pwd+"','"+(balance-10)+"')";
count = stmt.executeUpdate(sql);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
//关闭资源
if(stmt !=null) {
try {
stmt.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if(conn !=null) {
try {
conn.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
if(count ==1) {
System.out.println("欢迎"+username+"注册,卡内余额剩余"+(balance-10)+"元,将自动返回主界面");
}else {
System.out.println("输入有误 请重新开户");
register();
}
}
}
之后是数据库登录的类这个也是讲过因为我想在登录进去之后换个界面但是每次连接数据库都需要条件约束要是每次输入账号太麻烦然后就把这个Enter.username作为之后查询的所有用户参数
package BANK;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Scanner;
public class Enter {
static String username = null;
static String pwd;
static boolean flag = false;
static Scanner sc = new Scanner(System.in);
public static void enter() {
System.out.println("*******************************");
System.out.println("\t欢迎使用银行登录系统");
System.out.println("请输入用户名和密码");
System.out.println("请输入用户名:");
username = sc.next();
System.out.println("请输入密码:");
pwd = sc.next();
Connection conn = null;
ResultSet rs = null;
PreparedStatement ps = null;
try {
//1.注册驱动
Class.forName("com.mysql.cj.jdbc.Driver");
String url = "jdbc:mysql://localhost:3306/yyf?serverTimezone=UTC";
String user = "root";
String password = "316420";
//2.连接数据库
conn = DriverManager.getConnection(url, user, password);
//3.定义SQL语句框架
String sql = "select username from t_bank where username = ? and password = ?";
//4.进行SQL语句预编译
ps = conn.prepareStatement(sql);
//5.对SQL语句进行赋值
ps.setString(1, username);
ps.setString(2, pwd);
//6.执行SQL语句
rs = ps.executeQuery();
if(rs.next()) {
flag = true;
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
if(rs!=null) {
try {
rs.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if(ps!=null) {
try {
ps.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if(conn!=null) {
try {
conn.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
if(flag) {
System.out.println("登录成功 将登录界面");
}else {
System.out.println("您输入的用户名或密码错误 即将重新输入");
username = null;
}
}
public Enter(String username) {
this.username = username;
}
public Enter() {
}
}
查询界面的类这个没有什么就是连接数据库然后传入用户名参数进行查询
package BANK;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Scanner;
public class Balance {
String username = Enter.username;
static int money;
Scanner sc = new Scanner(System.in);
public static int returnMoney() {
return money;
}
public void chaxun(String username) {
int balance = 0;
Connection conn = null;
ResultSet rs = null;
PreparedStatement ps = null;
try {
//1.注册驱动
Class.forName("com.mysql.cj.jdbc.Driver");
String url = "jdbc:mysql://localhost:3306/yyf?serverTimezone=UTC";
String user = "root";
String password = "316420";
//2.连接数据库
conn = DriverManager.getConnection(url, user, password);
//3.定义SQL语句框架
String sql = "select balance from t_bank where username = ?";
//4.进行SQL语句预编译
ps = conn.prepareStatement(sql);
//5.对SQL语句进行赋值
ps.setString(1, username);
//6.执行SQL语句
rs = ps.executeQuery();
while(rs.next()) {
money = rs.getInt("balance");
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
if(rs!=null) {
try {
rs.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if(ps!=null) {
try {
ps.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if(conn!=null) {
try {
conn.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
}
然后存钱和取钱的类
package BANK;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.Scanner;
public class BankSystem {
static int money;
static Scanner sc = new Scanner(System.in);
static Balance b = new Balance();
public static void update(String username,int money) {
Connection conn = null;
PreparedStatement ps = null;
int rs = 0;
try {
//1.注册驱动
Class.forName("com.mysql.cj.jdbc.Driver"); //注册驱动
//2.连接数据库
String url = "jdbc:mysql://localhost:3306/yyf?serverTimezone=UTC";
String user= "root";
String password = "316420";
conn = DriverManager.getConnection(url,user, password);//连接数据库
//3.定义SQL语句框架
String sql = "update t_bank set balance = ? where username = ?";
//4.进行SQL语句预编译
ps = conn.prepareStatement(sql);
//5.对SQL语句进行赋值
ps.setInt(1,money);
ps.setString(2, username);
rs = ps.executeUpdate();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
//关闭资源
if(ps !=null) {
try {
ps.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if(conn !=null) {
try {
conn.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
public static void save(String username,int money) {
System.out.println("*******************************");
System.out.println("输入要存储的金额");
int money1 = sc.nextInt();
if(money1>=0) {
money = money + money1;
update(Enter.username,money);
System.out.println("操作成功,账户余额为"+money+"元");
}else {
System.out.println("存入金额不正确,请重新输入");
}
}
public static void take(String username,int money) {
System.out.println("*******************************");
System.out.println("输入要取出的金额");
int money1 = sc.nextInt();
if(money1>=0&&money1<=money) {
money = money - money1;
update(Enter.username,money);
System.out.println("操作成功,账户余额为"+money+"元");
}else {
System.out.println("操作失败 账户余额不足,请重新输入");
}
}
}
最后主界面这个想了半天一开始的是输一次返回一次感觉太繁琐了然后分开了之后就感觉有点乱最后感觉一直调试调试才弄好
package BANK;
import java.util.Scanner;
public class Menu {
static Scanner sc = new Scanner(System.in);
static Register rs = new Register();
static Enter et = new Enter();
static Balance bl = new Balance();
static BankSystem bs = new BankSystem();
static int choose;
static int money;
static String username = null;
public static void first(){
if(username == null) {
System.out.println("*******************************");
System.out.println("\t欢迎使用银行管理系统");
System.out.println(" 老用户可以直接登录 如果您为新用户请注册");
System.out.println("*******************************");
System.out.println("\t1.注册 2.登录");
System.out.println("请输入选项");
}
while(true) {
choose = sc.nextInt();
if(choose==1) {
record(choose);
break;
}else if(choose==2){
et.enter();
second();
break;
}else {
System.out.println("请输入正确的选项 返回主界面");
}
}
}
public static void second() {
System.out.println("*******************************");
System.out.println("\t欢迎光临本银行");
System.out.println("\t1.存钱 2.取钱");
System.out.println("\t3.查询 4.退出");
System.out.println("请输入选项");
while(true) {
int a =sc.nextInt();
caozuo(a);
break;
}
}
public static void record(int number) {
if (number==1) {
rs.register();
first();
}else if(number==2) {
Enter.enter();
username = Enter.username;
}else {
System.out.println("您输入的数字有误,请重新输入");
}
}
public static void caozuo(int number) {
if(number==1) {
bl.chaxun(Enter.username);
bs.save(Enter.username, bl.returnMoney());
second();
}else if(number==2) {
bl.chaxun(Enter.username);
bs.take(Enter.username, bl.returnMoney());
second();
}else if(number==3) {
bl.chaxun(Enter.username);
money = bl.returnMoney();
System.out.println("账户余额为"+money+"元");
second();
}else if(number==4) {
bye();
}else {
System.out.println("请输入正确的数字");
}
}
public static void bye() {
System.out.println("请携带好您的随身财物,欢迎下次光临");
System.out.println("*******************************");
}
public static void main(String[] args) {
first();
}
}
下面为具体代码测试图
总结做完这个感觉不足的地方还是很多做的比较繁琐但是要求还是基本实现了而且登陆了一个账号退出之后程序结束得重新运行希望之后能更加完善。
答案
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
public class 字符串距离 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String str = sc.nextLine();
String str1 = str;
String ch = sc.nextLine();
List<Integer> list = getCharList(str1, ch);
List<Integer> result = new ArrayList<>();
for (int p = 0; p < str.length(); p++) {
if (p <= list.get(0)) {
result.add(list.get(0) - p);
} else if (p >= list.get(list.size() - 1)) {
result.add(p - list.get(list.size() - 1));
} else {
for (int q = 1; q < list.size(); q++) {
if (list.get(q) >= p) {
result.add(compare(list.get(q - 1), list.get(q), p));
break;
}
}
}
}
System.out.println(result.toString());
}
// 得到ch位置数组
private static List<Integer> getCharList(String str1, String ch) {
List<Integer> list = new ArrayList<>();
int i = 0;
int j = 0;
while (str1.contains(ch)) {
i = str1.indexOf(ch);
list.add(i + j);
j = i + j + 1;
str1 = str1.substring(i + 1);
}
return list;
}
// 比较不是头尾段的其他字符与ch的距离
private static int compare(int ch1, int ch2, int num) {
int d1 = num - ch1;
int d2 = ch2 - num;
if (d1 < d2) {
return d1;
}
return d2;
}
}
这个题我一开始用的双循环但是一直报错,之后看到个做题思路创造泛型集合来存储数据然后用循环来判断先getCharList方法得到ch位置数组然后用cmpare比较出了头和与ch的距离最后输出。