Java在线购物系统

Java在线购物系统
Java在线购物系统

大作业二图书馆系统

重要提示:学生中一切抄袭、复制,剽窃行为,将会给以严厉处置。

一、总任务书

在开始编程之前,请仔细阅读以下说明:

该作业只允许你创建一个项目,且项目名只能为:asn2,否则我们不会批改你的作业,你的成绩为0分。跟该项目有关的类都必须存放在项目文件夹中,确保项目中包括表1-1所示的所有文件:

每写完一个类,请编写一个测试程序来测试它。也就是说,你的测试程序中得包含一个main方法来调用类中的各个方法,要用不同的对象、参数调用若干次。你递交完作业后,我们会用我们的main方法来测试它们。你必须递交以上表中所列出的所有的测试类。

在这个作业中,要求你编写一个应用程序,来实现简单的图书馆系统。当运行这个应用程序时,该程序将从磁盘上访问两个文本文件并把文件中的数据读入到程序中。(我们会给你提供这两个文本文件及实现文件输入输出的方法)。其中一个文件中包含有图书馆借书人的信息,另一个包含图书资料信息。要求程序从文件中读完数据后,能显示包含以下选项的主菜单:

●图书(允许用户进入“图书菜单”来进行跟馆中的图书有关的操作)

●借书人(允许用户进入“借书人菜单”来进行跟已注册到图书馆中的借书人有关的操

作)

●查询(允许用户进入“查询菜单”来实现对图书馆中的图书或赞助人的查询操作)

●退出(退出图书系统,终止该应用程序)

你的输出窗口应如图1-1所示:

图1-1 主菜单界面

下面将讨论前3个菜单:

1. BookMenu(图书菜单)

●给图书馆添加一本新书(给图书目录添加一本新书)

●删除一本书(从图书目录中删除一本书)

●图书统计(显示图书中的图书数目)

●打印图书目录(打印目前图书目录中所包含的所有图书的清单)

●借书(允许借书人借书)

●还书(允许借书人归还图书)

●返回(返回主菜单)

你的输出窗口应如图1-2所示:

图1-2 图书菜单界面

2. Patron Menu(借书菜单)

●添加一个新的借书人(往图书馆的借书人目录中注册一个新的借书人)

●删除一个借书人(从图书馆的借书人目录中现有的借书人)

●借书人数统计(显示图书系统中借书的总人数)

●打印借书人目录(打印目前已注册的借书人目录及他们的图书证号码的清单)

●打印某个借书人的借书信息(打印某个借书人所借的所有图书的基本信息。如:书号,

书名和作者)

●打印所有人的借书信息(打印所有借书人所借的所有图书的基本信息。如:书号,书名

和作者,及借书人名称)

●返回(返回主菜单)

界面如图1-3所示:

图1-3 借书人管理界面

3. Book and Pat ron S ea rch Menu (图书和借书人检索菜单)?图书和借书人检索菜

单提供以下菜单项:

● 按书号检索一本书(提示用户输入书号,若能找到,显示该书的书号、书名和作者) ● 按作者检索一本书(提示用户输入作者,若能找到,显示该书的、书号和书名) ● 按借书证号检索一借书人(提示用户输入借书证,若能找到,显示该借书证号与借书人的姓名)

● 按借书人的全名检索(提示用户输入全名,若能找到,显示该借书人的借书证号与姓名)

● 返回(返回主菜单)

界面如图1-4所示:

图1-4 图书和借书人检索

请注意:你的图书系统应该能够处理输入的无效数据和非正常终止的情况。如:如果用户输入了无效的菜单选项,或在该输入书号的地方输入了“Hello ”,你的程序应该能够等到输入有效数据为止,不能中断程序的执行。

4. 文本文件?你可以从指导老师哪里获取以下两个文本文件: boo ks.tx t,pat rons .txt

这两个文件里包含一些数据。我们已经给你们提供了能够将这些文件中的数据读入到你程序中的代码(祥见:PatronCa talo g.ja va 和 BookCata log.java 类)。在这个作业中你不必考虑将数据写回文件中的问题,但是你提交完作业后,可以试着实现一下文件的输入输出操作,对你将会是个很有用的训练。

类的框架代码:

以下的类不需要你了解循环与Ve ctor,你在实验8中才会接触到他们。因此你在完成实验8之前就可以着手做这个作业。

5. 第一部分应包含的类

A ssignmen t2.ja va(写好的类,没有分)?Boo k.java (12 分)

I nput Va li dato r.j ava (9分)

Co nfirm.java (10 分)?L ibrary .java (14 分)

在完成实验8之前你可以开始写Libr ary .java 类,但是你在完成以下列类之前,你还不能结束对Li brar y.ja va 的编码。作为开始,你的 Li brar

y应该能够显示菜单就可以了。

当你完成剩余的类之后,再返回Library类,在其中添加通过调用其他类中的方法实现各菜单项功能的代码。记住:每在你的类中增加代码,你都得测试你的类。

以下的类需要你了解循环与Vector,所以你在完成实验8之后,才可以开始对它们进行编码。以下列列出的顺序进行编码将会对你有所帮助:

6.第二部分应包含的类

Patron.java (11分)

PatronCatalog.java(17分) ?BookCatalog.java (14 分)?Transactions.java (13分)

二、完成作业的步骤

为了完成作业,你需要编写若干个类—以以上所列的类的顺序进行编写。因为对列在后面的类进行编码时,会用到前面的类。开始对一个类进行编码时,请把该类的框架代码复制到Visual J++中。写完一个类以后,请编写一个测试应用程序来对其进行测试。你的测试程序应该包含能够调用你的类中的各个方法的main方法,你可以用不同的对象作为参数,多调用几次。你递交作业后,我们会用我们的main程序测试你的类。

在开始下一个类的编码之前,切记测试你已经写好了的类。

以下是对Book.java举的一个例子(如果你喜欢,你也可以这么起名)

BookTest.java

InputValidatorTest.java

BookTest.java

InputValidatorTest.java

三、第一部分要编写的类及其框架

1. Assignment2.java

/*

*图书馆系统(Library system)的驱动类(drive class) */

public class Assignment2 {

?/*主程序 Main program */

?public static voidmain(String args[ ]) {

??Library library =new Library();

?library.browseLibrary();

?}

2. Book.java

/*该类的每个实例代表图书馆中的一本书。

*每本书都有一个唯一的书号,即:ID号(int),作者(String),书名(String).

*该书被借出与否,整型变量loanedTo将会代表借书人的借书证号。若该书没有被借出,lo anedTo的值为-1

*/?

public class Book{

//实例变量:尽可能少使用实例变量

//构造方法

public Book (String title, String author, int number) {

/*用给定的书名、作者和书号对我(实例变量)进行初始化,并设置我的借出状态为未借出状态,将书名和作者转换为大写字母*/?}?//公共实例方法

public intloanedTo() {?/*

*返回当前借书人的借书证号*/

}

?*如果我被借出返回true,否则返回false.*/

/*

public boolean onLoan() {?

}

public int number() {

/*

* 返回我的号码(书号)return mynumber?*/

?*返回我的作者

public String author() {?

/*

*/

}

public Stringtitle() {

/*?* 返回我的标题(书名)

*/?}?public void returnMe() {?/*?*如果我被归还,设置我的状态为可获得状态,否则什么都别做。*/?}?public void borrowMe(int patronNum) {

/*

* 标记我被借给给定的借书证号。*/

}

public String toString() {?/*返回代表我的字符串,该字符串中应包含我的书号,书名和我的作者(如:0 "ON TOJAVA" 作者: Winston )。因为这个类定义了toString()方法,可以用PrintStream类中的print(Object)和println(Object)打印实例变量的值。也就是说我们可以用System.out.print(aBook)语句。*/?}

}

3. InputValidator.java

/*该类允许用户问一个问题并得到有效的整数和字符串*/?

public classInputValidator {

/*公共的静态方法*/

public static int getInt(StringpromptMsg) {

?/*

?* 输出所给定的提示信息并返回一个有效的整型值

* 例如:输出”输入一个书号”,直到输入一个有效的整数

*/

?}

?public static String getStr(String promptMsg) {

/*输出一个给定的提示信息并返回一个有效字符串,空字符串无效

?* 例如:输出”输入书名”,直到输入有效的字符串

?* 返回的字符串应该被压缩首尾空格

* /

}

4. Confirm.java

public class Confirm {

/**该类的一个实例能够向用户提出yes或no的问题*/

//常量

//实例变量

//构造方法

public Confirm(String question){

/* 用给定的问题初始化我。如:问题字符串可能是:“你想要退出吗?”

*/

}

/*公共实例方法*/?public boolean ask() {?/*向用户提问我的问题,如果回答为yes返回true,若回答为no返回false。显示我的问题的时候,输出的字符串后面要跟字符串" es或 o?"。例如:如果我的字符串是“你想要退出吗”,我应该显示以下的字符串:“你想要退出吗o?”。如果用户输入任何一个“y”或“Y”开头的字符串,我会返回true。如果用户输入任何一个“n”或“N”开头的字符串,我会返回false。如果用户不输入任何一个“y”,“Y”,“n”或“N”开头的字符串,我会一直提问,直到用户输入“y”,“Y”,“n”或“N”中的一个。*/

}

}

5.Library.java

Library模拟图书馆本身。一个图书馆有一系列书的清单(保存在一个书的目录里)和借书人清单(保存在一个借书人目录里)。为了使得用户能够跟该系统交互,该类有以下的功能:

(1)显示各种的菜单(主菜单,图书菜单,借书人菜单,查询菜单)

(2)进行数据的有效性检验(如:如果不能把用户的输入确认为有效的菜单项,那么程序就等下去,直到一个有效的输入,而不会中断程序)

(3)对用户的输入作出适当的反应(如:当用户输入一个有效的菜单项,将会作出适当的反应) 在完成实验8之前,你可以开始编写该类。在实验8,你将会学会如何用循环和Vector s。虽然你在Library类中用不到这些知识点,你在该作业的其它类中会用到它们,所以你必须得掌握它们,你编写完其它的类之后,才能够实现所有的菜单项的功能。开始,你在写Library类时,只写一些简单的用于显示菜单的代码。当你完成其它的类之后,你可以回到Library类,实现更多的菜单项功能。

/*?* 该类的一个实例是一个图书馆。这个图书馆允许你借书,还书,查找图书和查找借书人。它*还允许你添加图书,删除图书,添加借书人和删除借书人。借书人和图书的详细资料要从磁盘*文件中读取。该类处理所有用户和图书馆系统之间的交互。例如:获得用户的输入,打印输出*操作结果等*/?public class Library {

//常量

//实例变量?private PatronCatalog patronCatalog;?private BookCatalog bookCatalog;

.....

//构造方法

public Library(){

/*初始化图书馆系统,以便于它准备处理各种事务。在这里可能有更多的代码。*/

this.patronCatalog =new PatronCatalog();?this.bookCatalog =new BookCatalog(); ?this.bookCatalog.readBookFile();

this.patronCatalog.readPatronFile();

}

//公共的实例方法

public void browseLibrary() {

/*浏览图书馆,该方法提供用户界面,用于用户访问图书馆系统的各个功能(如:*主菜单,图书菜单)*/

提示:你应该至少编写4个私有方法,每个都得实现一个菜单。如:图书菜单…

6. Book.txt文件的内容

Java Structures

Bailey

Java Programming

King

Java

Patterson Hume

On to Java

Winston

Java, How To Program

Deitel and Deitel

AN INTRODUCTION TO COMPUTERSCIENCE USING JAVA

Kamin

7.Patrons.txt文件的内容

Bill Armstrong

Anup Basu

Joe Culberson

Renee Elio

Ehab Elmallah

Pawel Gburzynski

四、第二部分要编写类的及其框架

1.Patron.java

/*?* 该类的一个实例代表图书馆里的一个借书人。

*每个借书人有唯一的借书证号码ID(int),姓名(String)和所借书的清单(Vector)。

*/

import java.util.Vector;

public class Patron {

//常量

//实例变量?

//构造方法?public Patron(String name, int number){?/*

* 把我用给定的姓名与号码初始化,姓名转为大写字母。?* 我被初始化了,所以我还没有借任何书。

*/

}

??public int numb //公共实例方法?public String name() {?/*?* 返回我的姓名*/?}

er(){

/*

*返回我的号码 */

}

publicintcountL

oans() {?/*

* 返回我借的书的总数*/

}

public String allLoans() {

/*

* 返回一个字符串,其代表所有我在图书馆系统所借的书,如果没有借任何书,*返回"Non

e"

* (例如:#0号借书人所借的书为:?* #: 0"JAVA STRUCTURES" By: BAILE

*/?)?public void borrowBook(Book aBook) {?/*

* 将给定的书填加到我的借书清单中

*/?}?publicvoid returnBook(intbookNum) {?/*

* 从我的借书清单中删除给定的书

*/?}

public String toString() {

/*

*返回代表我的一个字符串,该字符串中包含我的借书证号和我的姓名

* (例如: #:0 BILL ARMSTRONG)

*由于该类定义了方法toString(),可以用PrintStream类中的print(Object) *和println(Object)打印该类的实例。也就是说:我们可以用语句*System.out.print(aPa tron)。

*/

}

}

2. PatronCatalog.java

PatronCatalog类模拟了已注册到图书馆中的借书人清单(或“目录”)。借书人的详细信息保存在一个磁盘文件中。这个数据将会从磁盘文件读入到程序中。我们将会提供读入这些数据的方法。

import java.util.Vector;

import java.io.*;

/*

*该类的一个实例代表已注册到图书馆中的所有借书人清单。

*/

public classPatronCatalog {

//常量

// 实例变量?private Vectorpatrons;?privateint lastPatronNum; // 填加你的实例变量?// 构造方法?public PatronCatalog() {

/*?* 把我初始化为0个借书人

* 把借书人的借书证号初始化为0?

?}

*/

//公共实例方法

public voidreadPatronFile() {

/* 该方法会从patrons.txt文件中读取数据,然后用它们填充vector *this.patrons。*/

StringpatronFile = "patrons.txt";

BufferedReader bfreader;

String str;

try {

bfreader = new BufferedReader(new FileReader(patronFile));

while((str=bfreader.readLine()) !=null) {?this.patrons.addElement(new Patron(str.trim().toUpperCase(), this.lastPatronNum++));}

} catch (IOException e) {

}

}

public int patronCount() {

/*?*返回借书人总数

*/?}

public void addPatron(Stringname) {?/*

* 用给定的姓名创建一个借书人实例,将他填加到借书人目录中,增加借书人

*号码。借书人号码代表借书人的证件号,而不是Vector的下标。?*如果你删除了#4借书人,然后又填加了一个借书人,那么该人的号码会为5,*而不是4。

*/

}

public String deletePatron(int patronNum) {

/*从借书人目录中删除给定的借书人并返回结果*删除借书人,如果1)借书人在目录中并且2)此人没有在借的书* 如果是无效证件号码,返回 "无效证件号"

* 如果有效,删除并返回代表借书人的字符串后接结果说明id, * 如果有在接的书,返回(例如: #:0 BILL ARMSTRONG有在借的书,不能删除)

*并且在删除之前让用户确认 (例如: "你确信要删除#0借书人吗 <Y>es <N>o?"

* 如果有效并为yes删除然后返回(例如: #: 0 BILL ARMSTRONG被删除了)?* 如果

?)

*/

有效,但没有被删除,返回(例如:#: 0 BILL ARMSTRONG 没有被删除)?

public String listLoans(int patronNum) {?/*?*找出给定借书证号所借的所有图书,当借书人存在时返回结果

* 如果是无效的借书证号,返回"无此借书证号码"

*/

}

public String printAllLoans() {?/*

* 返回图书馆系统中的所有借书人所借的所有图书的清单,若没有任何借书人,* 则什么都不返回。*/?}?public String searchPatronByNum(intpatronNum) {?/* *按借书证号查找借书人并返回查找结果

*如果找到返回代表借书人的字符串 (如 "#: 0 BILLARMSTRONG)"

*若找不到返回"查无此人";

*/

}?public String searchPatronByFullName(String name) {?/*

* 查找给定的姓名的所有借书人并返回查找结果?* 如果找到返回代表借书人的字符串

(如"#: 0 BILL ARMSTRONG)"?*若找不到返回"查无此人";?*/

}

public Patron findPatron(int patronNum) {

/*?* 返回一个给定借书证号所代表的借书人对象(patron),若找不到返回NULL

*/

}?publicString toString(){?/*返回代表我(PatronCatalog)的字符串,该字符串中应包含所有借书人的证件号码和姓名。因为这个类定义了toString()方法,可以用PrintStream类中的print(Object) 和println(Object) 打印实例变量的值。也就是说我们可以用System.out.print(aPatronCatalog)语句。

*/?}

3. BookCatalog.java

图书馆里包含书的清单(例如:图书馆中的“书的目录”)。最新的图书清单也保存在图书目录BookCatalog中。当运行图书应用程序时,会从一个文本文件中读去图书数据(执行此操作的代码已在以下提供)并且用这些数据来初始化BookCatalog对象。由于每本书是从

文件里读出来的,所以每本书都分配有唯一的书号。第一本书的ID号为0,下一本的ID号为1,等等。读完图书文件后,你不必担心检查书的ID号。

import java.util.*;?importjava.io.*;

/*

*该类的一个实例代表图书馆里的所有图书

*/?public class BookCatalog {

//常量

//实例变量?private Vector books;

private int lastBookNum;

//填加你的实例变量?//构造方法

public BookCatalog() {?/*

* 将我初始化为0本书?* 初始化书的编号为0

*/?

}

?//公共实例方法?public void readBookFile() {

/*每一个图书的最新书号-你不必理解这个代码是怎么工作的

*只是简单的把它用在你的程序中?*/

String bookFile = "books.txt";

BufferedReader bfreader;?String title;?Stringauthor;?try { bfreader= new BufferedReader(new FileReader(bookFile));

while ((title=bfreader.readLine()) !=null) {

author = bfreader.readLine();

this.books.addElement(new Book(title.trim().toUpperCase(), aut hor.trim().toUpperCase(), this.lastBookNum++));

}

} catch (IOException e) {

}

*/

?}

?* 返回图书馆中藏书总数?

}?public int bookCount() {?

/*

public void addBook(String title, String author) {?/*

* 用给定的书名和作者创建一本书,并把它添加到图书目录中?*增加书号

*书号代表书的号码,而不是Vector的下标?*如果你删除了4号书并且又增加了另一本书,最后增加的书的号码应该是5而不是4 */??}

public String deleteBook(int bookNum){?/*?*从图书目录中删除给定的书并返回结果

* 删除书如果1)图书清单中有这本书 2)目前该书没有被借出去。如果是无效的书号,返回"没有这样的书号"

*如果有效,删除并返回代表书的后接结果说明的字符串?* (例如: #: 0 "ON TO JAVA" By: Winston 被删除)?* 如果该书被借,返回( #: 0 "ON TO JAVA" By: Winston 被借,不能被删除)?* 并在删除之前要用户确认 (例如: "你确实想要删除 #0 <Y>es

* 如果有效并且用户的回答为yes 删除并返回 (例如: #: 0 "ON TO JAVA" B y: Winston被删除了)

*如果有效并且用户的回答为no,则返回(例如 #: 0"ON TO JAVA" By: Winston 没有被删除)?*/

相关主题
相关文档
最新文档