使用eclipse创建一个图书管理系统(2)---------逻辑的实现

news2024/12/29 4:20:42

就像使用C语言写代码一样。比如要用​​​​​​C语言写一个小游戏的代码,我们的逻辑实现是在哪里实现的啊?是不是在一个test.c源文件里面啊?没错,就是的!在之前的文章里,我说过我定义的Main函数就像C语言里的test.c文件一样!所以,为了不打自己的脸。那我便在main函数里面实现我的图书管理系统的逻辑。

 

目录

逻辑实现:

第一步:登录界面

第二步:菜单的实现

第三步:增,删,查,显示等操作方法的实现和调用

 方法实现:


 

逻辑实现:

第一步:登录界面

就像我们在日常生活中使用其它的系统有界面一样,为了使我们的图书馆管理系统更好的使用我们就需要有一个登录界面。

我的界面是这样的:

登录方法:landing

package User;

import java.util.Scanner;

import Library.Booklist;

public class Main {
	public static User landing() {//登录界面的方法
		System.out.println("请输入你的名字:>");
		Scanner scanner = new Scanner(System.in);
		String name = scanner.nextLine();	
		System.out.println("请选择:0->普通用户,1——>管理员");
		int choice = scanner.nextInt();
		if(choice == 0 ) {
			return new NormalUser(name);
		}
		else {
			return new AdminUser(name);}
	}

	public static void main(String[] args) {
	Booklist booklist = new Booklist();//准备数据
	User user = landing();//用来选择登录那个界面的

	}

}

说明:

1.这里最关键的一点是什么呢?其实是landing方法的返回类型!也就是这个:

 可以看到这里的返回类型是User!为什么要使用User来作为返回类型呢?是因为User是AdminUser与NormalUser的父类!父类?父类又能如何呢?其实这是因为我写这段代码时这个登陆的方法是为了先让使用者选择身份,所以我们在登陆时就要有AdminUser与NormalUser两种不同的界面选择!所以为了兼容AdminUser与NormalUser于是我就使用了这两者的父类User来作为返回类型!

 2.接收也要用User类型的变量来接收

第二步:菜单的实现

经过上述代码,现在我能实现的效果就是这样的:能输入一个名字,能选择一个身份。

 但是,我们要的是这样的:

一步一步来,先加个菜单: 

首先来设想一下,菜单是用来干吗的?菜单吗,选择的呗!那我们该如何选择呢?想一下当初用C语言写的游戏,无一例外都是用数字来进行选择的!所以,这个菜单的返回类型就是int型,我们在main方法里面便用int 型的变量来接收返回值,于是我们在main方法里面就多加了一条语句:

有了设想,现在就可以来实现这个菜单了:

先在User父类里定义一个抽象方法menu(),返回类型为int。但是抽象方法只能放在抽象类里边,所以User父类就被迫变成一个抽象类了!

代码:

package User;


public abstract class User {
 
  protected String name;
  public User(String name) {
	// TODO Auto-generated constructor stub
	  this.name = name;
}
  public  abstract int menu();
	
	
}

说明:可能大家对这个操作会有疑问:

1.为什么要用抽象类呢?这是因为你用了抽象方法menu()!

2.为什么要用抽象方法呢?这是因为menu()这个方法是不用在User父类中具体实现的。

3.既然不用实现那我们为什么要搞出这么个玩意呢?这是因为我们在main方法中就是用User user来调用menu的,如果User(父类)没有menu()这个方法,那user将会报错!

 好了,解释完毕!现在来看看menu()方法的具体实现:

AdminUser中:

package User;

import java.util.Scanner;



public class AdminUser extends User{
	public AdminUser(String name) {
		// TODO Auto-generated constructor stub
		super(name);//先帮父类构造
		this.name = name;//再自己构造
	}
	public int menu() {
		System.out.println("欢迎 "+name+"来到图书管理系统");
		System.out.println("*******************************");
		System.out.println("0.退出系统");
		System.out.println("1.添加图书");
		System.out.println("2.移除图书");
		System.out.println("3.查找图书");
		System.out.println("4.显示图书");
		System.out.println("*******************************");
		System.out.println("请选择你的操作");
		Scanner scanner = new Scanner(System.in);
		int choice = scanner.nextInt();
		return choice;
	}

}

NormalUser类中:

package User;

import java.util.Scanner;

public class NormalUser extends User{
	public NormalUser(String name) {
		// TODO Auto-generated constructor stub
		super(name);
		this.name = name;
	}
	public int menu() {
		System.out.println("欢迎 "+name+"来到图书管理系统");
		System.out.println("*******************************");
		System.out.println("0.退出系统");
		System.out.println("1.借阅图书");
		System.out.println("2.归还图书");
		System.out.println("3.查找图书");
		System.out.println("4.显示图书");
		System.out.println("请选择你的操作");
		Scanner scanner = new Scanner(System.in);
		int choice = scanner.nextInt();
		return choice;
	}
	
}

第三步:增,删,查,显示等操作方法的实现和调用

在介绍搭建图书管理系统框架的那篇博客当中我已经将图书管理系统中的各种方法粗略的讲了一遍了。现在我就来实现一下这些方法!但是方法实现了又能怎样呢?有了方法要用才是真的!所以我们先来讲讲如何用我们的选择调用这些方法!

思路:

还记得我说这些方法就是一个多态,但是他们都间接继承于IOperation这个接口。所以我们是否能定义一个IOperation接口型的数组来通过下标来对这些方法来进行调用呢?答案是当然可以的。

 第一步:User(父类)中

第二步:在AdminUser(子类)中

  

 第三步:在NormalUser(子类)中

 

 

调用:

在搞清楚如何调用并且做了相关的准备以后我们就可以来写调用方法了

调用方法:doOperation

这个方法要定义在User里,为什么呢?这是因为我们在main方法里面是要用User类型的user来对这个方法来进行使用的,假如我的User父类里面没有这个方法那还怎么使用这个方法呢?所以这个方法就要定义在User(父类)中。

 

代码:

public void doOperation(int choice,Booklist booklist) {
		ioperations[choice].work(booklist);//利用之前定义的接口数组来访问各种操作方法
		
	}

 方法实现:

1.AddOperation

代码:

package Operation;

import java.util.Scanner;

import Library.Booklist;

public class AddOperation implements IOperation{
	public void work(Booklist booklist) {//重写方法,使这个方法变为Addoperation的方法
		System.out.println("添加图书!");
		Scanner scanner  = new Scanner(System.in);
		System.out.println("请输入你要添加的图书的名字:>");
		String name = scanner.nextLine();
		System.out.println("请输入你要添加的图书的类型:>");
		String type = scanner.nextLine();
		System.out.println("请输入你要添加的图书的作者:>");
		String author = scanner.nextLine();
		System.out.println("请输入你要添加的图书的价格:>");
		int price = scanner.nextInt();	
		System.out.println("添加成功!");
	}


}

2.DisplayOperation

代码:

package Operation;

import Library.Book;
import Library.Booklist;

public class DisplayOperation implements IOperation {
public void work(Booklist booklist) {
	System.out.println("显示图书!");
	int curSize = booklist.getSize();
	
	for(int i = 0;i<curSize;i++) {
		Book book = booklist.getPos(i);
		System.out.println(book);
	}
}
}

当然,这个代码要实现就要在原来的代码中添加一些细节的东西,三处细节:

因为我这里是使用遍历的方法来对每一本书的信息进行打印的。所以,我就要知道整个数组的长度。所以,原来的booklist类中就要有代表数组长度的变量和获取数组长度的方法,所以原来的代码就被多加了:

获取完长度以后,我们就要对一本书的各种信息进行打印了,一般是System.out.println(book)这样来打印的。所以我们要获取到每一本书,所以我们又要添加一个获取每一本书的方法:

  但是很快你就会又发现一个错误:

打印出来了一堆奇奇怪怪的东西,为什么呢?没有重写呗。所以我们又要在Book这个类里面加一个重写的方法:

 

搞完收工!  

 3.DelOperation

package Operation;

import java.util.Scanner;

import Library.Book;
import Library.Booklist;

public class DelOperation implements IOperation {
	public void work(Booklist booklist) {//重写方法,使work方法变成DelOperation的方法
		Scanner scanner = new Scanner(System.in);
		System.out.println("删除图书!");
		System.out.println("请输入你要删除的图书的名字:>");
		String name = scanner.nextLine();
		int curSize = booklist.getSize();
		int index = -1;
		for(int i = 0;i<curSize;i++) {
			Book book = booklist.getPos(i);
			if(name.equals(book.getName())) {
				index = i;
				break;
			
			}
		}
		if(index == -1) {
			System.out.println("没有你要删除的书!");
		}
		else {
			for(int i = index;i<curSize-1;i++) {
				Book book = booklist.getPos(i+1);
				booklist.setBooks(book, i);
			
			}
			booklist.setSize(curSize-1);
			booklist.setBooks(null, curSize);
			System.out.println("删除成功!");
		}
		
		
	}

}

当然这个代码也要添加一些细节的东西,比如设置书架某一位置设置为下一本书东西的方法,setBooks:

 当然,在删除完一本书以后书的数量就要减少,书的最后一个位置就要置空:

 

4.其它方法

 其实在写完前面的几个方法以后其它的代码都很好写了,这里我就不写了!如果读者感兴趣的话可以自己思考一下来写那几个方法!

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

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

相关文章

【《中国工业经济》数据复现】数字化转型与企业分工:专业化还是纵向一体化

一.研究内容 本文使用机器学习方法刻画微观企业数字化水平&#xff0c;并在构建数理模型的基础上实证考察了企业数字化转型对企业分工的影响及其机理。结果表明&#xff0c;企业数字化转型显著提升了中国上市企业专业化分工水平。机制分析表明&#xff0c;数字化转型对企业专业…

实现chatgpt自然对话

1.概述 ChatGPT是当前自然语言处理领域的重要进展之一&#xff0c;通过预训练和微调的方式&#xff0c;ChatGPT可以生成高质量的文本&#xff0c;可应用于多种场景&#xff0c;如智能客服、聊天机器人、语音助手等。本文将详细介绍ChatGPT的原理、实战演练和流程图&#xff0c…

C/C++每日一练(20230503)

目录 1. 输出最长的递增数字字符串 &#x1f31f;&#x1f31f; 2. 缺失的第一个正数 &#x1f31f;&#x1f31f;&#x1f31f; 3. 最大矩形 &#x1f31f;&#x1f31f;&#x1f31f; &#x1f31f; 每日一练刷题专栏 &#x1f31f; Golang每日一练 专栏 Python每日…

SaaS模医学检验信息管理系统源码,系统预设几十种报告模板,可在几分钟内批量生成报告

实验室信息管理系统云LIS源码 SaaS模式运维管理系统 云LIS系统源码是一款全面的实验室信息管理系统源码&#xff0c;其主要功能包括样本管理、检测项目管理、质控管理、报告管理、数据分析、两癌筛查等多个方面。具有独立的配套SaaS模式运维管理系统&#xff0c;支持远程运维&…

Redis高频面试题,使用场景

一、缓存 1、什么是缓存穿透 ? 怎么解决 ? 缓存穿透 查询一个不存在的数据&#xff0c;mysql查询不到数据也不会直接写入缓存&#xff0c;就会导致每次请求都查数据库。 解决 方案一&#xff1a;缓存空数据&#xff0c;查询返回的数据为空&#xff0c;仍把这个空结果进行…

《花雕学AI》28:革命性的 ChatGPT for SEO——让您的排名飙升 50%!

引言&#xff1a; 如果您想写篇有吸引力的文章&#xff0c;或者您是一个博客和网站的拥有者&#xff0c;那么您一定知道 SEO&#xff08;搜索引擎优化&#xff09;的重要性。SEO 可以帮助您提高相应的流量、转化率和收入&#xff0c;但是 SEO 也是一个复杂和耗时的过程&#x…

【开源项目】Dynamic-Tp核心流程源码解读

序.介绍 dynamic-tp 是一款动态线程池组件&#xff0c;可以实现线程池的实时动态调参及监控报警&#xff0c;线程池配置放在配置中心统一管理&#xff0c;达成业务代码零侵入&#xff0c;支持多配置中心的选择和常见的第三方组件的线程池的集成管理。 官网: https://dynamict…

C++学习day--01 C生万物

1、C/C学习中遇到的问题&#xff1a; 1. 大部分初学者&#xff0c;学习 C/C 都是从入门到放弃。 C/C太难吗&#xff1f; 2. 90% 以上的初学者&#xff0c;学完 C/C 以后&#xff0c;考试完了&#xff0c;书看完了&#xff0c; 但还是不会做项目 是学的不够好吗&#xff1…

基于KZG多项式承诺方案的RLN

1. 引言 RLN——Rate-Limiting Nullifier为PSE团队主导的项目&#xff0c;源自&#xff1a; Barry White Hat 2019年博客 Semaphore RLN, rate limiting nullifier for spam prevention in anonymous p2p setting RLN&#xff08;Rate-Limiting Nullifier&#xff09;是一种…

Servlet原理

什么是Servlet? Servlet是JavaWeb应用程序中的一种Java类&#xff0c;用于接收和处理来自客户端的请求&#xff0c;并将生成的响应发送回客户端。 Servlet是按照Java Servlet规范开发的&#xff0c;可以通过Servlet容器&#xff08;如Tomcat&#xff09;来管理和运行。Servl…

二十二、SQL 数据分析实战(案例1~案例10)

文章目录 案例1&#xff1a;用户信息表 stu_table案例2&#xff1a;员工绩效表 score_table案例3&#xff1a;销售冠军信息表 month_table案例4&#xff1a;月销售额记录表 sale_table案例5&#xff1a;每季度员工绩效得分表 score_info_table案例6&#xff1a;员工信息表 stu_…

【大数据】Hadoop总结

本文对于Hadoop中的HDFS和MapReduce的相关面试重点进行了总结&#xff0c;下篇将介绍调优、数据倾斜等进阶知识。 Hadoop总结 一、概述1. Hadoop特性2. HDFS结构HDFS 架构 二、HDFS分布式文件系统1 概述2. HDFS存储数据架构图NameNodeDataNode 3 HDFS优点4 HDFS缺点&#xff08…

利用 Delte-Sigma ADC简化电路设计

很多时候在电路中选择合适的 ADC可以很大程度上简化前端的电路。这里我们一起来看一个电阻电桥的例子&#xff1a; 这里用到了一只仪表放大器和一只运算放大器&#xff0c;他们实际上主要完成了三个功能&#xff1a; 1. 抑制了 2.5V的共模信号&#xff1b; 2. 将-1…

「业务架构」波特的五力分析教程介绍

波特五力分析模型最早出现在哈佛商学院教授迈克尔E波特1979年发表在《哈佛商业评论》上的文章中。这篇论文的发表在历史上改变了企业、组织甚至国家对战略的理解。自《哈佛商业评论》创刊以来&#xff0c;它被评为十大最具影响力的论文之一。 五力分析可以帮助公司评估行业吸引…

Baumer工业相机堡盟工业相机如何联合BGAPISDK和Halcon实现图像的对数Log变换算法增强(C#)

Baumer工业相机堡盟工业相机如何联合BGAPISDK和Halcon实现图像的对数Log变换算法增强&#xff08;C#&#xff09; Baumer工业相机Baumer工业相机使用图像算法增加图像的技术背景Baumer工业相机通过BGAPI SDK联合Halcon使用Log图像增强算法1.引用合适的类文件2.BGAPI SDK在图像回…

【ChatGLM】本地版ChatGPT ?6G显存即可轻松使用 !ChatGLM-6B 清华开源模型本地部署教程

目录 感谢B站秋葉aaaki大佬 前言 部署资源 部署流程 实机演示 ChatGML微调&#xff08;人格炼成&#xff09;&#xff08;个人感觉蛮有趣的地方&#xff09; 分享有趣の微调人格 实机演示&#xff08;潘金莲人格&#xff09; 感谢B站秋葉aaaki大佬 秋葉aaaki的个人空间…

《可穿戴监测中的数据质量评估》阅读笔记

目录 一、论文摘要 二、论文十问 三、论文亮点与不足之处 四、与其他研究的比较 五、实际应用与影响 六、个人思考与启示 参考文献 一、论文摘要 从手腕捕获的神经生理信号的可穿戴记录为癫痫监测提供了巨大的潜力。然而&#xff0c;数据质量仍然是影响数据可靠性的最具…

康耐视Visionpro常见问题汇总-视觉人机器视觉粉丝-千问之六十五解答

(2023年5月2日更,下次更新2023年10月1日-10月7日) Question0: 康耐视visionpro9.8/9.9-BeadInspect工具详细使用流程 原因分析或解决办法 康耐视visionpro9.8-BeadInspect工具详细使用流程 (qq.com) Question1: C#与visisionpro联合开发exe文件开机启动设置 原因分析…

Java 基础进阶篇(八)—— 匿名内部类与 Lambda 表达式

文章目录 一、内部类概述二、需要了解的内部类2.1 静态内部类2.2 成员内部类2.3 局部内部类2.4 面试笔试题 三、匿名内部类 ★四、Lambda表达式 ★4.1 Lambda 表达式的概述4.2 Lambda 表达式的省略规则4.3 Lambda 的使用 一、内部类概述 内部类就是定义在一个类里面的类&#…

SPSS如何管理数据之案例实训?

文章目录 0.引言1.数据文件的分解2.数据文件的横向合并3.数据文件的纵向合并4.数据文件的变换5.观测量的加权6.根据已存在的变量建立新变量7.产生计数变量8.对变量自身重新赋值9.赋值生成新的变量10.变量取值的求等级11.缺失数据的处理12.数据的汇总13.由变量组到观测量组的重组…