java实验报告之模拟银行存取款业务

news2025/2/6 6:41:03

一个不知名大学生,江湖人称菜狗
original author: jacky Li
Email : 3435673055@qq.com

Time of completion:2022.12.20
Last edited: 2022.12.20

 

目录

一、实验目的

二、实验内容

三、总体设计(设计原理、设计方案及流程等)

四、参考代码

有关银行子类的代码1  BankAccount

有关该项目的主体实现代码2  Main

五、运行效果

作者有言


课程名称

面向对象程序设计(Java)

指导教师

***

学号

姓名

实验地点

***

实验时间

***

项目名称

模拟银行存取款业务

实验类型

综合性

一、实验目的

(1)全面检验面向对象编程思想,巩固Java面向对象、集合和常用API类等方面知识的应用;

(2)加强实践动手能力,能够将从书本上学习到的理论知识用到了实践上。

二、实验内容

模拟网上银行业务,当用户登录时需判断银行卡号和银行卡密码,当输入的卡号和密码都正确时,登录成功,提示当前登录的账户名,并进入下一步选择操作类型。操作类型包括四种(存款:1  取款:2  余额:3  修改个人密码:4  退出:0),输入数字1、2时,将进行存取款操作,此时需要输入存取的金额,并进行正确的金额加减计算;输入数字3时,显示当前账户的余额;输入数字4时,可修改当前账户的密码;输入数字0时将退出整个系统。提示:可利用HashMap集合存储模拟的账户信息,其中key值用于存储银行卡号,value值用于存储整个账户对象。

三、总体设计(设计原理、设计方案及流程等)

我的代码使用了对象序列化和反序列化的方式 将对象属性保存到磁盘中去,从而实现记录底层数据,并且将序列化和反序列化写成两个独立的方法,我们只需在主类中调用方法即可;在对象类中实现了Serializable类。

在com.ggc包下创建了BankAccount对象类

在BankAccount类中定义了一些private属性和对应的public型setter和getter方法用于对成员变量赋值和引用

在主类中定义的mothod1方法用于对错误卡号报错并重新输入

Mothod2方法用于对错误密码报错并重新输入

卡号为键,对象为值。用keySet方法得到键的set集合,用增强for循环,并在循环中对输入的卡号进行判断,如果错误就一直调用mothod1方法,从而实现卡号报错并重新输入;

密码判断与卡号判断大致相同mothod2方法

1.存款 2.取款 3.余额查询 4.修改密码 0.退出

该业务使用switch开关语句,在语句中使用while语句检验输入的金额是否合法,并实现重新输入。

特点:在switch语句外面使用while语句来实现0.退出功能

使用方法循环调用的形式对错误内容报错并重新输入

四、参考代码

有关银行子类的代码1  BankAccount

/*
	original author: jacky Li
	Email : 3435673055@qq.com
	Time of completion:2022.12.20
	Last edited: 2022.12.20
*/

package bank;

/**
 * 银行账户实体类
 *
 */
public class BankAccount {
	private String name;
	private String bankId;
	private String password;
	private double money;

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getBankId() {
		return bankId;
	}

	public void setBankId(String bankId) {
		this.bankId = bankId;
	}

	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;
	}

	@Override
	public String toString() {
		return "账户名:" + name + "\n银行卡号:" + bankId + "\n银行卡密码:" + password + "\n余额:" + money;
	}

	public BankAccount(String name, String bankId, String password, double money) {
		super();
		this.name = name;
		this.bankId = bankId;
		this.password = password;
		this.money = money;
	}

	public BankAccount() {
		super();
	}

}

有关该项目的主体实现代码2  Main

/*
	original author: jacky Li
	Email : 3435673055@qq.com
	Time of completion:2022.12.20
	Last edited: 2022.12.20
*/



package bank;

import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;

public class Main {
	// 储存账户信息
	private static Map<String, BankAccount> accounts;
	private static Scanner scanner = new Scanner(System.in);
	private static BankAccount bankAccount;

	/**
	 * 初始化账户信息
	 * 
	 * @return 初始化结果
	 */
	public static boolean init() {
		BankAccount account1 = new BankAccount("张三", "11234", "123", 1000.99);
		BankAccount account2 = new BankAccount("李四", "22134", "456", 2000);
		BankAccount account3 = new BankAccount("王五", "33124", "789", 100.99);
		accounts = new HashMap<String, BankAccount>();
		accounts.put(account1.getBankId(), account1);
		accounts.put(account2.getBankId(), account2);
		accounts.put(account3.getBankId(), account3);
		// 返回初始化结果
		return accounts.isEmpty() ? false : true;
	}

	/**
	 * 系统入口
	 * 
	 * @param args
	 */
	public static void main(String[] args) {
		System.out.println("银行系统正在启动...");
		if (init()) {
			System.out.println("--系统启动成功--");
			System.out.println("输入卡号:");
			String id = scanner.next();
			System.out.println("输入密码:");
			String psw = scanner.next();
			if (login(id, psw)) {
				// 进入系统
				System.out.println("--登录成功--");
				menu(bankAccount);
			} else {
				System.out.println("--登录失败--");
			}
		} else {
			System.out.println("--系统启动失败--");
		}

	}

	/**
	 * 返回登录结果
	 * 
	 * @param id
	 * @param psw
	 * @return
	 */
	private static boolean login(String id, String psw) {
		bankAccount = accounts.get(id);
		return null == bankAccount ? false : true;
	}

	/**
	 * 功能菜单
	 * 
	 * @param account
	 */
	private static void menu(BankAccount account) {
		System.out.println("--当前账户:" + account.getName() + "--");
		main: while (true) {
			System.out.println("1:存款	2:取款	3:余额	4:修改密码	0:退出");
			int item = scanner.nextInt();
			switch (item) {
			case 0:
				scanner.close();
				System.out.println("--退出系统--");
				break main;
			case 1:
				System.out.println("--存款系统--");
				saveMoney(accounts, account);
				break;
			case 2:
				System.out.println("--取款系统--");
				ereduceMoney(accounts, account);
				break;
			case 3:
				System.out.println("--余额系统--");
				showMoney(account);
				break;
			case 4:
				System.out.println("--修改密码--");
				rePassword(accounts, account);
				break;
			default:
				System.out.println("--错误的指令--");
				break;
			}

		}
	}

	/**
	 * 修改密码
	 * 
	 * @param accounts2
	 * @param account
	 */
	private static void rePassword(Map<String, BankAccount> accs, BankAccount account) {
		System.out.println("输入旧的密码:");
		String oldPsw = scanner.next();
		if (oldPsw.equals(account.getPassword())) {
			System.out.println("输入新的密码:");
			String newPsw = scanner.next();
			account.setPassword(newPsw);
			accs.put(account.getBankId(), account);
			System.out.println("--修改成功--");
		} else {
			System.out.println("--旧密码错误--");
		}
	}

	private static void showMoney(BankAccount account) {
		System.out.println(account);
	}

	/**
	 * 取款
	 * 
	 * @param accounts2
	 * @param account
	 */
	private static void ereduceMoney(Map<String, BankAccount> accounts2, BankAccount account) {
		System.out.println("输入取款金额:");
		double money = scanner.nextDouble();
		double now = account.getMoney();
		if (money <= now) {
			account.setMoney(now - money);
			accounts2.put(account.getBankId(), account);
			System.out.println("--取款成功--");
		} else {
			System.out.println("--余额不足--");
		}
	}

	private static void saveMoney(Map<String, BankAccount> accounts2, BankAccount account) {
		System.out.println("输入存入金额:");
		double money = scanner.nextDouble();
		account.setMoney(account.getMoney() + money);
		accounts2.put(account.getBankId(), account);
		System.out.println("--存款成功--");
	}
}

五、运行效果

 

作者有言

如果感觉博主讲的对您有用,请点个关注支持一下吧,将会对此类问题持续更新……

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

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

相关文章

医院导诊图怎么做,专业便捷、低成本的室内电子地图绘制平台!

目前的医院综合性强&#xff0c;面积大&#xff0c;科室多&#xff0c;布局复杂&#xff0c;病患在就医过程中&#xff0c;往往因为对医院各科室与区域分布不清晰而找不到方向&#xff0c;多走冤枉路&#xff0c;耗费时间&#xff0c;影响就医体验。上海懒图信息科技有限公司上…

轻量级网络模型MobileNet发展脉络(V1-V2-V3)

卷积神经网络发展 卷积神经网络被广泛应用在图像分类、目标检测等视觉任务中&#xff0c;并取得了巨大的成功。然而&#xff0c;卷积神经网络通常需要较大的运算量和内存占用&#xff0c;在移动端以及嵌入式设备等资源受限的环境中受到限制&#xff0c;因此需要进行网络压缩。从…

虹科案例 | 如何快速精准监测打桩机打桩深度?

想要精准测量打桩设备每个桩的测量深度&#xff0c;以正确设置多排电池板的太阳能农场&#xff1f;但是由于测量环境恶劣&#xff0c;导致普通传感器无法正常工作&#xff1f;那快了解一下我们的虹科Dimetix激光测距传感器吧&#xff0c;它可以完美解决上述问题&#xff01; 一…

NFC技术的特点与应用

NFC技术能给我们的生活带来极大的便利&#xff0c;能够用于乘车、购物、交换信息、刷门禁卡&#xff0c;可以说它能够应用到我们生活的方方面面。 但是&#xff0c;NFC到底是谁发明的&#xff1f;什么时候发明的&#xff1f;我们就来了解一下。 NFC的中文全称为近场通信技术&…

85%的攻击现在使用加密通道

©网络研究院 加密攻击仍然是全球各国面临的一个重大问题&#xff0c;美国、印度和日本的攻击数量在过去12个月中增长最快。 此外&#xff0c;与2021年相比&#xff0c;南非的TLS/SSL攻击显著增加。 Zscaler的安全研究和运营副总裁表示:“随着组织网络防御的成熟&#x…

22-12-19 西安 vue-cli(01) vue-cli脚手架、组件化编程、vue-router路由

"对A&#xff0c;我还剩一张牌啦&#xff01;" "呃。。。要不起" 周六&#xff08;12-03&#xff09;&#xff0c;早上刷到印度的三相神。梵天&#xff0c;毗湿奴&#xff0c;湿婆&#xff0c;看来很多个相关的视频介绍&#xff0c;结果睡觉&#xff08;不…

蓝桥杯题目类型总结

搜索类 BFS 大胖子走迷宫&#xff08;简单&#xff09;&#xff08;2019国赛&#xff09; 迷宫与陷阱&#xff1a;&#xff08;中等2018国赛&#xff09; 迷宫与陷阱&#xff1a;&#xff08;中等2018国赛&#xff09; 迷宫与陷阱&#xff1a;&#xff08;中等2018国赛&…

安卓PorterDuffXfermode之正片叠底 PorterDuff.Mode.MULTIPLY

setXfermode Paint#setXfermode()接口是在绘制时设置画笔的图形混合模式的,下面是官网的介绍&#xff1a; public Xfermode setXfermode (Xfermode xfermode) Set or clear the transfer mode object. A transfer mode defines how source pixels (generate by a drawing com…

three.js之旋转成型(车削缓冲几何体)

文章目录简介例子解释专栏目录请点击 简介 一条曲线围绕空间中的某个轴进行旋转&#xff0c;会形成一个几何体这个在three.js中也是可以实现的&#xff0c;主要就是使用到了three.js中的LatheGeometry&#xff0c;官网 例子 <!DOCTYPE html> <html lang"en&qu…

SpringBoot2.X+Vue+UniAPP 全栈开发医疗小程序 中间件搭建

文章目录一、安装Docker环境1. 关闭SELINUX服务2. 更新yum程序3. 安装Docker4. 管理Docker二、搭建HBasePhoenix大数据平台2.1. 加载镜像2.2. 创建容器2.3. 创建逻辑库2.4. 创建数据表与导入数据2.5. 配置JDBC连接信息三、Redis服务3.1. 加载镜像3.2. 配置文件3.3. 创建Redis容…

专注性能的多端研发框架 - ice.js 3 正式发布!

ice.js 框架在之前的版本中&#xff0c;主要服务于中后台 / PC 的项目研发&#xff0c;而随着无线端以及多端能力的拓展&#xff0c;ice.js 3 将成为一套面向大淘宝技术的终端应用框架。因此在 ice.js 3 的版本中除了「开发者体验」之外&#xff0c;还围绕「用户体验」探索了大…

拥抱实体经济,可以说是当下互联网参与者的首要选择

拥抱实体经济&#xff0c;绝对是当下互联网玩家们的首要选择。无论是头部的互联网企业来讲&#xff0c;还是新生的互联网玩家而言&#xff0c;它们都不约而同地将关注的焦点聚焦在了这样一个方向上。   透过这一点&#xff0c;我们可以非常明显地感受到&#xff0c;一个全新的…

1574_AURIX_TC275_SCU中的杂项控制

全部学习汇总&#xff1a; GitHub - GreyZhang/g_TC275: happy hacking for TC275! 接下来的这一段算是SCU章节最后的一次内容梳理了&#xff0c;剩下的内容也不是很多了。杂项并不是英文的直接翻译&#xff0c;算是我自己选择的一个表达方式。 这里涉及到的功能有CCU6&#x…

基于机器学习算法与历史数据预测未来的站点关闭(Matlab代码实现)

目录 &#x1f4a5;1 概述 &#x1f4da;2 运行结果 &#x1f389;3 参考文献 &#x1f468;‍&#x1f4bb;4 Matlab代码 &#x1f4a5;1 概述 应用背景&#xff1a; 通过分析序列进行合理预测&#xff0c;做到提前掌握未来的发展趋势&#xff0c;为业务决策提供依据&am…

2023材料科学与工程国际会议(CoMSE 2023)

2023材料科学与工程国际会议&#xff08;CoMSE 2023&#xff09; 重要信息 会议网址&#xff1a;www.icomse.org 会议时间&#xff1a;2023年3月24-26日 召开地点&#xff1a;中国上海 截稿时间&#xff1a;2023年1月25日 录用通知&#xff1a;投稿后2周内 收录检索&…

手把手教你使用Appium进行IOS真机自动化测试

讲解方式&#xff1a; 课程内容条理清晰&#xff0c;目标明确&#xff0c;由浅入深&#xff0c;环环相扣。重点部分进行额外梳理和总结&#xff0c;更易理解和吸收。 教程推荐&#xff1a;使用Appium进行IOS真机自动化测试 课程亮点&#xff1a;1&#xff0c;讲解清晰&a…

VRRP多备份组+策略路由实现主备负载

上篇文章&#xff0c;我们介绍了VRRP单备份组和策略路由之间主备切换的差异&#xff08;&#xff09;&#xff0c;整体上看&#xff0c;单备份组VRRP的主备切换速度非常快&#xff0c;用过调整配置&#xff0c;可以轻轻松松将切换时间压缩到1秒钟以内&#xff1b;但是主备之间无…

【大数据技术Spark】DStream编程操作讲解实战(图文解释 附源码)

DStream编程 批处理引擎Spark Core把输入的数据按照一定的时间片&#xff08;如1s&#xff09;分成一段一段的数据&#xff0c;每一段数据都会转换成RDD输入到Spark Core中&#xff0c;然后将DStream操作转换为RDD算子的相关操作&#xff0c;即转换操作、窗口操作以及输出操作…

和冬天有关的歌

我写过关于四季《新朝花夕拾》&#xff0c;我也写过关于夏天的歌&#xff1a;《和夏天有关的歌》&#xff0c;所以我也想写写冬天。&#xff08;1&#xff09;北风当你想到冬天的时候&#xff0c;你会想起什么&#xff1f;我会想到&#xff1a;北风、北方。正好有这么一首歌&am…

神经网络架构搜索

神经网络架构搜索 定义内涵 神经网络架构搜索是为给定数据集自动找到一个或多个架构的任务&#xff0c;这些架构将为给定 的数据集生成具有良好结果的模型&#xff0c;其本质是在高维空间的最优参数搜索问题。 技术背景 深度学习模型的使用越来越大众化&#xff0c;在很多行…