柚子快報(bào)激活碼778899分享:【javaSE】圖書管理系統(tǒng)
柚子快報(bào)激活碼778899分享:【javaSE】圖書管理系統(tǒng)
??????前言~拾???
hellohello~,大家好??,這里是E綿綿呀???,如果覺得這篇文章還不錯(cuò)的話還請(qǐng)點(diǎn)贊????收藏????關(guān)注??,如果發(fā)現(xiàn)這篇文章有問題的話,歡迎各位評(píng)論留言指正,大家一起加油!一起chin up!???
?個(gè)人主頁:E綿綿的博客 ?所屬專欄:JAVASE題目練習(xí)??JAVASE知識(shí)點(diǎn)專欄??c語言知識(shí)點(diǎn)專欄? ?c語言題目練習(xí)
? ? ? 現(xiàn)在我們將把之前學(xué)過的知識(shí)點(diǎn)總結(jié)做成一個(gè)小項(xiàng)目?,叫圖書管理系統(tǒng),來看一下吧。?
?設(shè)計(jì)思路
?我們?cè)谠O(shè)計(jì)系統(tǒng)前要遵循面向?qū)ο蟮脑瓌t:
1.找到對(duì)象
2.創(chuàng)建對(duì)象
3.使用對(duì)象
所以我們需要先理清自己的思緒,想明白需要?jiǎng)?chuàng)建的對(duì)象和需要實(shí)現(xiàn)的功能。
?
1. 首先,想清楚系統(tǒng)的界面。系統(tǒng)對(duì)于圖書管理員來說是管理系統(tǒng),對(duì)于普通用戶來說是服務(wù)系統(tǒng)。所以我們針對(duì)管理員和普通用戶所展示的界面是不同的。
?2.書的屬性有書名,作者,價(jià)格,類型,是否被借出。所以我們可以將書的屬性進(jìn)行封裝,同時(shí)設(shè)置一個(gè)書架類,用于存放書籍。設(shè)置一個(gè)書的數(shù)組可以解決。
3.管理員界面上,我們可以添加書籍,查找書籍,刪除書籍,顯示書籍和退出系統(tǒng)。
4.普通用戶界面上,我們可以查找書籍,借閱書籍,歸還書籍和退出系統(tǒng)。
5.所以我們可以將這些操作封裝起來,設(shè)計(jì)成單獨(dú)的類,但可以通過一些操作將這些功能分成兩部分。
書籍和書架
? ????首先我們面對(duì)對(duì)象時(shí),找對(duì)象書肯定是一個(gè)對(duì)象,所以我們創(chuàng)建跟書有關(guān)的對(duì)象,如書和書架?,F(xiàn)在我們就先來創(chuàng)建這兩個(gè)對(duì)象吧:
書(Book)
????我們創(chuàng)建一個(gè)book的包,用于存放與書有關(guān)的類。根據(jù)上述思路,我們可以在Book包中創(chuàng)建一個(gè)Book的類和一個(gè)Booklist (書架) 的類。首先創(chuàng)建一個(gè)book類,在book中寫入書的有關(guān)屬性,書名 (name) ,作者 (author) ?,價(jià)格 (price) ?,類型 (type) 以及是否被借出。我們通過封裝,將屬性前的訪問修飾符設(shè)置為private權(quán)限,然后通過提供相應(yīng)的get方法和set方法以及一個(gè)不包含是否被借出的構(gòu)造方法(我們將是否被借出屬性的類型設(shè)置為boolean,因?yàn)锽oolean類型默認(rèn)為false,所以可以不初始化),然后通過快捷鍵提供相應(yīng)的toString方法的重寫。
注意這些方法很多都能通過快捷鍵去生成,代碼如下:
public class Book {
private String name;
private String author;
private String type;
private int price;
private boolean isborrowed;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAuthor() {
return author;
}
public void setAuthor(String author) {
this.author = author;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
public int getPrice() {
return price;
}
public void setPrice(int price) {
this.price = price;
}
之所以用private修飾其書的屬性,是為了體現(xiàn)書的密封性(書架中的屬性也同理)
書架(BookList)
??我們首先設(shè)置一個(gè)private權(quán)限的Book數(shù)組books,同時(shí)設(shè)置一個(gè)usedSize的變量,用于記錄當(dāng)前書架上存放了多少本書。我們寫一個(gè)BookList的構(gòu)造方法,同時(shí)將數(shù)組的長(zhǎng)度初始化為10,然后通過快捷鍵設(shè)置userSize的getter and setter方法。注意不要使用編譯器生成的Book數(shù)組books的getter and setter 方法,因?yàn)樗槍?duì)的是books數(shù)組,并不是針對(duì)數(shù)組中存放的書,那并不是我們想要的。所以我們單獨(dú)設(shè)置一個(gè)名為pos的數(shù)組下標(biāo)參數(shù),在getter方法中返回books的數(shù)組下標(biāo)pos,在setter方法中,我們將 books數(shù)組的pos下標(biāo)設(shè)置為一本書 。這樣就能通過這兩個(gè)方法去訪問該數(shù)組的書成員。
現(xiàn)在請(qǐng)看以下代碼:
public class BookList {
private Book[] books;
private int usedsize;//書架上目前存放的書量
public BookList() {
this.books=new Book[10];
usedsize=4;
this.books[0] = new Book("三國(guó)演義","羅貫中",20,"小說");
this.books[1] = new Book("西游記","吳承恩",9,"小說");
this.books[2] = new Book("紅樓夢(mèng)","曹雪芹",19,"小說");
this.books[3]=new Book("Java","xx",18,"學(xué)習(xí)資料");
}
public int getUsedsize() {
return usedsize;
}
public void setUsedsize(int usedsize) {
this.usedsize = usedsize;
}
public Book getBook(int i){
return books[i];
}
public void setBook(int i,Book book){
books[i]=book;
}
}
這里的屬性也是用private修飾,呈封裝性。
?用戶
???除此之外,除了書是對(duì)象,圖書管理系統(tǒng)也要人使用對(duì)吧,所以人也是個(gè)對(duì)象。并且因?yàn)樯矸莸牟煌?,分為普通用戶和管理員。而又因?yàn)槎际侨?,所以?huì)有一些相同點(diǎn)。所以我們就創(chuàng)建一個(gè)子類user ,兩個(gè)父類。
user(用戶抽象類)(子類)?
??在普通用戶和管理員用戶中存在許多共性,因此我們這里設(shè)置一個(gè)抽象類供普通用戶和管理員用戶來繼承使用,并且將其變?yōu)槌橄箢惛奖憷^承。
abstract public class User {
protected String name;
protected IOperation[] iOperations;
abstract public int menu();
public User(String name) {
this.name = name;
}
public void useoperation(int choice,BookList bookList){
IOperation iOperation = iOperations[choice];
iOperation.work(bookList);
}
}
?管理員類(Administrator)
??我們?cè)O(shè)置管理用戶的菜單,再對(duì)應(yīng)著菜單在構(gòu)造方法中設(shè)置接口類型的數(shù)組的具體操作
?
public class Administrator extends User{
public Administrator(String name) {
super(name);
iOperations = new IOperation[]{
new ExitOperation(),
new FindOperation(),
new AddOperation,
new DeleteOperation(),
new ShowOperation()
};
}
@Override
public int menu() {
System.out.println("********管理員菜單********");
System.out.println("1.查找圖書");
System.out.println("2.新增圖書");
System.out.println("3.刪除圖書");
System.out.println("4.顯示圖書");
System.out.println("0.退出系統(tǒng)");
System.out.println("************************");
System.out.println("請(qǐng)輸入你的操作:");
Scanner scanner = new Scanner(System.in);
int choice = scanner.nextInt();
return choice;
}
}
?
?普通用戶(NormalUser)
??它和管理員類的操作大致相同,這里就不過多講述了,直接上代碼
?
public class NormalUser extends User {
public NormalUser( String name){
super(name);
iOperations=new IOperation[] {
new ExitOperation(),
new FindOperation(),
new BorrowOperation(),
new RetrunOperation()
};
}
public int menu() {
System.out.println("********普通用戶菜單********");
System.out.println("1.查找圖書");
System.out.println("2.借閱圖書");
System.out.println("3.歸還圖書");
System.out.println("0.退出系統(tǒng)");
System.out.println("***************************");
System.out.println("請(qǐng)輸入你的操作");
Scanner scanner=new Scanner(System.in);
int choice=scanner.nextInt();
return choice;
}
}
?
?對(duì)書籍的相關(guān)操作
????我們知道面對(duì)對(duì)象分為三步,最后一步是使用對(duì)象,而這里就是對(duì)于對(duì)象的使用。其中有很多操作,我們來看一下吧。
操作接口(IOperation)
????所有的操作都是要對(duì)于書架進(jìn)行操作的,所以我們?cè)谶@里提供一個(gè)接口供不同操作來實(shí)現(xiàn),并且給他們傳入書架類的參數(shù),代碼如下:
?
public interface IOperation {
public void work(BookList bookList);
}
?
?借閱圖書(BorrowOperation)
????首先,我們需要讓用戶輸入想要借閱的圖書的名字,然后我們挨個(gè)遍歷書架上的書,如果有,那就可以借,將書籍的借閱狀態(tài)改為true就可以,如果沒有就告訴用戶沒有此書,無法借閱。
public class BorrowOperation implements IOperation{
@Override
public void work(BookList bookList) {
System.out.println("該操作進(jìn)行中,請(qǐng)輸入要借閱的書");
Scanner scanner=new Scanner(System.in);
String name =scanner.nextLine();
for (int i = 0; i < bookList.getUsedsize() ; i++) {
if ((bookList.getBook(i).getName()).equals(name)){
if(bookList.getBook(i).getIsborrowed()==true) {
System.out.println("該書已被借出,現(xiàn)在沒有這本書");
return;
}else {
System.out.println("該書借出后請(qǐng)及時(shí)歸還");
bookList.getBook(i).setIsborrowed(true);
return;
}
}
if(i== bookList.getUsedsize()-1){
System.out.println("未查找到該書");
}
}
}
}
歸還圖書(ReturnOperation)
?????和借閱圖書思路相似,這里不多說了。直接上代碼:
public class RetrunOperation implements IOperation {
@Override
public void work(BookList bookList) {
System.out.println("該操作進(jìn)行中,請(qǐng)輸入要?dú)w還的書");
Scanner scanner=new Scanner(System.in);
String name =scanner.nextLine();
for (int i = 0; i < bookList.getUsedsize() ; i++) {
if ((bookList.getBook(i).getName()).equals(name)) {
bookList.getBook(i).setIsborrowed(false);
System.out.println("該書歸還成功");
return;
}
}
System.out.println("不存在該書");
}
}
?查找圖書(FindOperation)
?????查找功能和遍歷類似,只要利用equals關(guān)鍵字比較字符串輸出就行。在 Findioperation?類中,先輸入要查找的書名,遍歷所有的書,比較書名,書名一樣輸出即可。?
public class FindOperation implements IOperation {
@Override
public void work(BookList bookList) {
System.out.println("該操作進(jìn)行中,請(qǐng)輸入要查找的書");
Scanner scanner = new Scanner(System.in);
String name = scanner.nextLine();
for (int i = 0; i < bookList.getUsedsize(); i++) {
if ((bookList.getBook(i).getName()).equals(name)) {
System.out.println("找到該書");
System.out.println(bookList.getBook(i));
return;
}
}
System.out.println("沒找到該書");
}
}
顯示圖書 (ShowOperation)
?????遍歷整個(gè)書架,然后挨個(gè)打印輸出圖書信息就可以了。
public class ShowOperation implements IOperation{
@Override
public void work(BookList bookList) {
System.out.println("該操作進(jìn)行中,將展示所有書的信息");
for (int i = 0; i < bookList.getUsedsize() ; i++) {
System.out.println(bookList.getBook(i));
}
}}
?添加圖書(AddOperation)
????首先,我們需要讓用戶輸入想要添加的圖書的相關(guān)信息,然后我們?yōu)橛脩糨斎氲膱D書新建一個(gè)對(duì)象,接下來就是合法性判斷,我們拿剛才新建的圖書對(duì)象和書架上的每一個(gè)圖書對(duì)象進(jìn)行遍歷對(duì)比,如果沒有重復(fù)的圖書就可以存入這本書,要存入這本書就調(diào)用剛才書架類中提供的方法setBooks,在新加一本書籍后,對(duì)應(yīng)的書籍?dāng)?shù)量也得增加,也就是調(diào)用setUesdSize方法來增加書籍的數(shù)量。
public class AddOperation implements IOperation {
@Override
public void work(BookList bookList) {
System.out.println("該操作進(jìn)行中,請(qǐng)輸入要添加的書");
Scanner scanner = new Scanner(System.in);
System.out.println("請(qǐng)輸入書名");
String name = scanner.nextLine();
if(bookList.getUsedsize()==10) {
System.out.println("書架滿了,無法添加");
return;
}
for (int i = 0; i < bookList.getUsedsize(); i++) {
if ((bookList.getBook(i).getName()).equals(name)) {
System.out.println("該書在書架中已有,無需添加");
return;
}}
System.out.println("請(qǐng)輸入作者名");
String author=scanner.nextLine();
System.out.println("請(qǐng)輸入其書種類");
String type=scanner.nextLine();
System.out.println("請(qǐng)輸入價(jià)格");
int price=scanner.nextInt();
Book book=new Book(name,author,price,type);
bookList.setBook(bookList.getUsedsize(),book );
System.out.println("添加成功");
bookList.setUsedsize(bookList.getUsedsize()+1);
}}
這里有個(gè)重要的點(diǎn),對(duì)于新建對(duì)象時(shí)的輸入,必須nextint在最后面,否則會(huì)導(dǎo)致以下現(xiàn)象。
這里只接受了三個(gè),第四個(gè)還沒輸入就結(jié)束了。所以應(yīng)該把nextint放在最后,這樣就不會(huì)有異?,F(xiàn)象。
對(duì)于其原因,這里有篇文章可以解釋以上現(xiàn)象java中程序邏輯控制-CSDN博客,在這部分有提到過該現(xiàn)象。
刪除圖書 (DeleteOperation)
????思路:首先找到有沒有這本書,如果找到了,這書后邊的書就從后往前直接覆蓋掉之前的書數(shù)據(jù),然后將usedsize減一就行了,從而最后一個(gè)數(shù)據(jù)我們就使用不了(之后的其他操作會(huì)將最后一個(gè)數(shù)據(jù)覆蓋掉)。
所以在循環(huán)時(shí),i 要小于usedSize - 1,,如果大于等于usedsize-1的話,就會(huì)越界訪問數(shù)組之外的數(shù)據(jù),從而報(bào)錯(cuò)。
public class DeleteOperation implements IOperation{
@Override
public void work(BookList bookList) {
System.out.println("該操作進(jìn)行中,請(qǐng)輸入要?jiǎng)h除的書");
Scanner scanner = new Scanner(System.in);
String name = scanner.nextLine();
int deletesize=0;
for (int i = 0; i < bookList.getUsedsize(); i++) {
if ((bookList.getBook(i).getName()).equals(name)) {
deletesize=i;
break;
}
if(i== bookList.getUsedsize()-1)
{
System.out.println("該書架中不存在該書");
return;
}
}
for (int i = deletesize; i < bookList.getUsedsize()-1 ; i++) {
bookList.setBook(i,bookList.getBook(i+1));
}
bookList.setUsedsize(bookList.getUsedsize()-1);
System.out.println("刪除"+name+"成功");
}}
退出系統(tǒng)?
????最簡(jiǎn)單的一個(gè)操作,System.exit(0)代表著結(jié)束程序,所以我們只需要使用該方法就能退出系統(tǒng)。
public class ExitOperation implements IOperation{
@Override
public void work(BookList bookList) {
System.out.println("系統(tǒng)已退出");
System.exit(0);//作用是結(jié)束該程序
}
}
?main類
所以有了前面的這些基礎(chǔ),我們就將它們組合起來利用,形成這個(gè)main類。
我們?cè)趍ain類中除了有main方法外,還要設(shè)置一個(gè)登錄程序的方法,登錄管理員我們就新建一個(gè)管理員對(duì)象,登錄普通用戶我們就新建一個(gè)普通用戶對(duì)象,然后我們根據(jù)用戶的輸入來調(diào)用我們菜單中的選項(xiàng),我們通過設(shè)置接口數(shù)組從而來操作它。
public class Main {
public static User login() {
System.out.println("請(qǐng)輸入你的名字");
Scanner scanner = new Scanner(System.in);
String name = scanner.nextLine();
System.out.println("請(qǐng)確認(rèn)你的身份 1:普通用戶 2:管理員 ");
while (true) {
int choice = scanner.nextInt();
if (choice == 1) {
return new NormalUser(name);
} else if (choice == 2) {
return new Administrator(name);
} else {
System.out.println("只能輸入1或2,請(qǐng)重新輸入");
continue;
}
}
}
public static void main(String[] args) {
BookList bookList=new BookList();
User user =login();
while (true){
int choice= user.menu();
user.useoperation(choice,bookList);
}
}
總結(jié)?
?所以這就是我們的圖書管理系統(tǒng),如果想看完整的代碼,我這里有我碼云的鏈接,大家可以看一下:
_2024_4_6/src · Eason綿綿/JAVASE代碼倉庫 - 碼云 - 開源中國(guó) (gitee.com)
本篇文章制作不易,還請(qǐng)各位大佬給個(gè)三連,點(diǎn)點(diǎn)關(guān)注,點(diǎn)點(diǎn)贊,評(píng)評(píng)論,謝謝各位大佬們呀,一起加油????~拾???
柚子快報(bào)激活碼778899分享:【javaSE】圖書管理系統(tǒng)
相關(guān)文章
本文內(nèi)容根據(jù)網(wǎng)絡(luò)資料整理,出于傳遞更多信息之目的,不代表金鑰匙跨境贊同其觀點(diǎn)和立場(chǎng)。
轉(zhuǎn)載請(qǐng)注明,如有侵權(quán),聯(lián)系刪除。