




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
PAGEPAGE37大作业二图书馆系统重要提示:学生中一切抄袭、复制,剽窃行为,将会给以严厉处置。一、总任务书在开始编程之前,请仔细阅读以下说明:该作业只允许你创建一个项目,且项目名只能为:asn2,否则我们不会批改你的作业,你的成绩为0分。跟该项目有关的类都必须存放在项目文件夹中,确保项目中包括表1-1所示的所有文件:表1-1图书馆系统中的类列表类测试类Assignment2.java
Book.java
BookCatalog.java
Confirm.java
InputValidator.java
Library.java
Patron.java
PatronCatalog.java
Transactions.javaBookTest.java
BookCatalogTest.java
ConfirmTest.java
InputValidatorTest.java
PatronTest.java
PatronCatalogTest.java
TransactionsTest.java
每写完一个类,请编写一个测试程序来测试它。也就是说,你的测试程序中得包含一个main方法来调用类中的各个方法,要用不同的对象、参数调用若干次。你递交完作业后,我们会用我们的main方法来测试它们。你必须递交以上表中所列出的所有的测试类。在这个作业中,要求你编写一个应用程序,来实现简单的图书馆系统。当运行这个应用程序时,该程序将从磁盘上访问两个文本文件并把文件中的数据读入到程序中。(我们会给你提供这两个文本文件及实现文件输入输出的方法)。其中一个文件中包含有图书馆借书人的信息,另一个包含图书资料信息。要求程序从文件中读完数据后,能显示包含以下选项的主菜单:图书(允许用户进入“图书菜单”来进行跟馆中的图书有关的操作)借书人(允许用户进入“借书人菜单”来进行跟已注册到图书馆中的借书人有关的操作)查询(允许用户进入“查询菜单”来实现对图书馆中的图书或赞助人的查询操作)退出(退出图书系统,终止该应用程序)你的输出窗口应如图1-1所示:欢迎进入Java图书系统欢迎进入Java图书系统主菜单1.图书(允许用户进入“图书菜单”来进行跟馆中的图书有关的操作)2.借书人(允许用户进入“借书人菜单”来进行跟已注册到图书馆中的借书人有关的操作)3.查询(允许用户进入“查询菜单”来实现对图书馆中的图书或赞助人的查询操作)4.退出(退出图书系统,终止该应用程序)请选择一项:图1-1主菜单界面下面将讨论前3个菜单:1.BookMenu(图书菜单)给图书馆添加一本新书(给图书目录添加一本新书)删除一本书(从图书目录中删除一本书)图书统计(显示图书中的图书数目)打印图书目录(打印目前图书目录中所包含的所有图书的清单)借书(允许借书人借书)还书(允许借书人归还图书)返回(返回主菜单)你的输出窗口应如图1-2所示:图书菜单图书菜单添加一本新书(给图书目录添加一本新书)删除一本书(从图书目录中删除一本书)图书统计(显示图书中的图书数目)打印图书目录(打印目前图书目录中所包含的所有图书的清单)借书(允许借书人借书)还书(允许借书人归还图书)返回(返回主菜单)请选择一项:图1-2图书菜单界面2.PatronMenu(借书菜单)添加一个新的借书人(往图书馆的借书人目录中注册一个新的借书人)删除一个借书人(从图书馆的借书人目录中现有的借书人)借书人数统计(显示图书系统中借书的总人数)打印借书人目录(打印目前已注册的借书人目录及他们的图书证号码的清单)打印某个借书人的借书信息(打印某个借书人所借的所有图书的基本信息。如:书号,书名和作者)打印所有人的借书信息(打印所有借书人所借的所有图书的基本信息。如:书号,书名和作者,及借书人名称)返回(返回主菜单)界面如图1-3所示:请选择一项:2请选择一项:2借书人菜单添加一个新的借书人(往图书馆的借书人目录中注册一个新的借书人)删除一个借书人(从图书馆的借书人目录中删除一位现有的借书人)借书人数统计(显示图书系统中借书的总人数)打印借书人目录(打印目前已注册的借书人目录及他们的图书证号码的清单)打印某个借书人的借书信息(打印某个借书人所借的所有图书的基本信息。如:书号,书名和作者)打印所有人的借书信息(打印所有借书人所借的所有图书的基本信息。如:书号,书名和作者,及借书人名称)7.返回(返回主菜单)图1-3借书人管理界面3.BookandPatronSearchMenu(图书和借书人检索菜单)
图书和借书人检索菜单提供以下菜单项:按书号检索一本书(提示用户输入书号,若能找到,显示该书的书号、书名和作者)按作者检索一本书(提示用户输入作者,若能找到,显示该书的、书号和书名)按借书证号检索一借书人(提示用户输入借书证,若能找到,显示该借书证号与借书人的姓名)按借书人的全名检索(提示用户输入全名,若能找到,显示该借书人的借书证号与姓名)返回(返回主菜单)界面如图1-4所示:请选择一项:3请选择一项:3图书和借书人检索菜单:1.按书号检索一本书(提示用户输入书号,若能找到,显示该书的书号、书名和作者)2.按作者检索一本书(提示用户输入作者,若能找到,显示该书的、书号和书名)3.按借书证号检索一借书人(提示用户输入借书证,若能找到,显示该借书证号与借书人的姓名)4.按借书人的全名检索(提示用户输入全名,若能找到,显示该借书人的借书证号与姓名)5.返回(返回主菜单)请选择一项:图1-4图书和借书人检索请注意:你的图书系统应该能够处理输入的无效数据和非正常终止的情况。如:如果用户输入了无效的菜单选项,或在该输入书号的地方输入了“Hello”,你的程序应该能够等到输入有效数据为止,不能中断程序的执行。4.文本文件
你可以从指导老师哪里获取以下两个文本文件:books.txt,patrons.txt这两个文件里包含一些数据。我们已经给你们提供了能够将这些文件中的数据读入到你程序中的代码(祥见:PatronCatalog.java和BookCatalog.java类)。在这个作业中你不必考虑将数据写回文件中的问题,但是你提交完作业后,可以试着实现一下文件的输入输出操作,对你将会是个很有用的训练。类的框架代码:以下的类不需要你了解循环与Vector,你在实验8中才会接触到他们。因此你在完成实验8之前就可以着手做这个作业。5.第一部分应包含的类Assignment2.java(写好的类,没有分)
Book.java(12分)
InputValidator.java(9分)
Confirm.java(10分)
Library.java(14分)在完成实验8之前你可以开始写Library.java类,但是你在完成以下列类之前,你还不能结束对Library.java的编码。作为开始,你的
Library应该能够显示菜单就可以了。当你完成剩余的类之后,再返回Library类,在其中添加通过调用其他类中的方法实现各菜单项功能的代码。记住:每在你的类中增加代码,你都得测试你的类。以下的类需要你了解循环与Vector,所以你在完成实验8之后,才可以开始对它们进行编码。以下列列出的顺序进行编码将会对你有所帮助:6.第二部分应包含的类Patron.java(11分)
PatronCatalog.java(17分)
BookCatalog.java(14分)
Transactions.java(13分)二、完成作业的步骤为了完成作业,你需要编写若干个类—以以上所列的类的顺序进行编写。因为对列在后面的类进行编码时,会用到前面的类。开始对一个类进行编码时,请把该类的框架代码复制到VisualJ++中。写完一个类以后,请编写一个测试应用程序来对其进行测试。你的测试程序应该包含能够调用你的类中的各个方法的main方法,你可以用不同的对象作为参数,多调用几次。你递交作业后,我们会用我们的main程序测试你的类。在开始下一个类的编码之前,切记测试你已经写好了的类。以下是对Book.java举的一个例子(如果你喜欢,你也可以这么起名)BookTest.javaInputValidatorTest.javaBookTest.javaInputValidatorTest.java三、第一部分要编写的类及其框架1.Assignment2.java/**图书馆系统(Librarysystem)的驱动类(driveclass)*/publicclassAssignment2{ /*主程序Mainprogram*/ publicstaticvoidmain(Stringargs[]){ Librarylibrary=newLibrary(); library.browseLibrary(); }}2.Book.java/*该类的每个实例代表图书馆中的一本书。*每本书都有一个唯一的书号,即:ID号(int),作者(String),书名(String).*该书被借出与否,整型变量loanedTo将会代表借书人的借书证号。若该书没有被借出,loanedTo的值为-1*/
publicclassBook{//实例变量:尽可能少使用实例变量
//构造方法
publicBook(Stringtitle,Stringauthor,intnumber){
/*用给定的书名、作者和书号对我(实例变量)进行初始化,并设置我的借出状态为未借出状态,将书名和作者转换为大写字母*/
}
//公共实例方法
publicintloanedTo(){
/*
*返回当前借书人的借书证号*/}
publicbooleanonLoan(){
/*
*如果我被借出返回true,否则返回false.*/
}
publicintnumber(){
/*
*返回我的号码(书号)returnmynumber
*/
}
publicStringauthor(){
/*
*返回我的作者
*/
}
publicStringtitle(){
/*
*返回我的标题(书名)
*/
}
publicvoidreturnMe(){
/*
*如果我被归还,设置我的状态为可获得状态,否则什么都别做。*/
}
publicvoidborrowMe(intpatronNum){
/*
*标记我被借给给定的借书证号。*/
}
publicStringtoString(){
/*返回代表我的字符串,该字符串中应包含我的书号,书名和我的作者(如:0
"ONTOJAVA"
作者:
Winston)。因为这个类定义了toString()方法,可以用PrintStream类中的print(Object)和println(Object)打印实例变量的值。也就是说我们可以用System.out.print(aBook)语句。
*/
}}3.InputValidator.java/*该类允许用户问一个问题并得到有效的整数和字符串*/ publicclassInputValidator{/*公共的静态方法*/ publicstaticintgetInt(StringpromptMsg){ /* *输出所给定的提示信息并返回一个有效的整型值 *例如:输出”输入一个书号”,直到输入一个有效的整数 */ } publicstaticStringgetStr(StringpromptMsg){ /*输出一个给定的提示信息并返回一个有效字符串,空字符串无效 *例如:输出”输入书名”,直到输入有效的字符串 *返回的字符串应该被压缩首尾空格*/ }}4.Confirm.javapublicclassConfirm{
/**该类的一个实例能够向用户提出yes或no的问题*///常量//实例变量//构造方法
publicConfirm(Stringquestion){
/*用给定的问题初始化我。如:问题字符串可能是:“你想要退出吗?”
*/
}/*公共实例方法*/
publicbooleanask(){
/*向用户提问我的问题,如果回答为yes返回true,若回答为no返回false。显示我的问题的时候,输出的字符串后面要跟字符串"<y>es或<n>o?"。例如:如果我的字符串是“你想要退出吗”,我应该显示以下的字符串:“你想要退出吗<y>es或<n>o?”。如果用户输入任何一个“y”或“Y”开头的字符串,我会返回true。如果用户输入任何一个“n”或“N”开头的字符串,我会返回false。如果用户不输入任何一个“y”,“Y”,“n”或“N”开头的字符串,我会一直提问,直到用户输入“y”,“Y”,“n”或“N”中的一个。*/
}}5.Library.javaLibrary模拟图书馆本身。一个图书馆有一系列书的清单(保存在一个书的目录里)和借书人清单(保存在一个借书人目录里)。为了使得用户能够跟该系统交互,该类有以下的功能:(1)显示各种的菜单(主菜单,图书菜单,借书人菜单,查询菜单)(2)进行数据的有效性检验(如:如果不能把用户的输入确认为有效的菜单项,那么程序就等下去,直到一个有效的输入,而不会中断程序)(3)对用户的输入作出适当的反应(如:当用户输入一个有效的菜单项,将会作出适当的反应)在完成实验8之前,你可以开始编写该类。在实验8,你将会学会如何用循环和Vectors。虽然你在Library类中用不到这些知识点,你在该作业的其它类中会用到它们,所以你必须得掌握它们,你编写完其它的类之后,才能够实现所有的菜单项的功能。开始,你在写Library类时,只写一些简单的用于显示菜单的代码。当你完成其它的类之后,你可以回到Library类,实现更多的菜单项功能。/*
*该类的一个实例是一个图书馆。这个图书馆允许你借书,还书,查找图书和查找借书人。它*还允许你添加图书,删除图书,添加借书人和删除借书人。借书人和图书的详细资料要从磁盘*文件中读取。该类处理所有用户和图书馆系统之间的交互。例如:获得用户的输入,打印输出*操作结果等*/
publicclassLibrary{//常量
//实例变量
privatePatronCatalogpatronCatalog;
privateBookCatalogbookCatalog;
//构造方法
publicLibrary(){
/*初始化图书馆系统,以便于它准备处理各种事务。在这里可能有更多的代码。*/this.patronCatalog=newPatronCatalog();
this.bookCatalog=newBookCatalog();
this.bookCatalog.readBookFile();
this.patronCatalog.readPatronFile();}//公共的实例方法
publicvoidbrowseLibrary(){
/*浏览图书馆,该方法提供用户界面,用于用户访问图书馆系统的各个功能(如:*主菜单,图书菜单)*/
}}提示:你应该至少编写4个私有方法,每个都得实现一个菜单。如:图书菜单…6.Book.txt文件的内容JavaStructuresBaileyJavaProgrammingKingJavaPattersonHumeOntoJavaWinstonJava,HowToProgramDeitelandDeitelANINTRODUCTIONTOCOMPUTERSCIENCEUSINGJAVAKamin7.Patrons.txt文件的内容BillArmstrongAnupBasuJoeCulbersonReneeElioEhabElmallahPawelGburzynski四、第二部分要编写类的及其框架1.Patron.java/*
*该类的一个实例代表图书馆里的一个借书人。
*每个借书人有唯一的借书证号码ID(int),姓名(String)和所借书的清单(Vector)。
*/
importjava.util.Vector;publicclassPatron{//常量//实例变量
//构造方法
publicPatron(Stringname,intnumber){
/*
*把我用给定的姓名与号码初始化,姓名转为大写字母。
*我被初始化了,所以我还没有借任何书。
*/}
//公共实例方法
publicStringname(){
/*
*返回我的姓名*/
}
publicintnumber(){
/*
*返回我的号码*/
}
publicintcountLoans(){
/*
*返回我借的书的总数*/
}
publicStringallLoans(){
/*
*返回一个字符串,其代表所有我在图书馆系统所借的书,如果没有借任何书,*返回"None"
*(例如:#0号借书人所借的书为:
*#:0"JAVASTRUCTURES"By:BAILE*/
)
publicvoidborrowBook(BookaBook){
/*
*将给定的书填加到我的借书清单中
*/
}
publicvoidreturnBook(intbookNum){
/*
*从我的借书清单中删除给定的书
*/
}publicStringtoString(){
/*
*返回代表我的一个字符串,该字符串中包含我的借书证号和我的姓名*(例如:#:0BILLARMSTRONG)
*由于该类定义了方法toString(),可以用PrintStream类中的print(Object)*和println(Object)打印该类的实例。也就是说:我们可以用语句*System.out.print(aPatron)。
*/
}}2.PatronCatalog.javaPatronCatalog类模拟了已注册到图书馆中的借书人清单(或“目录”)。借书人的详细信息保存在一个磁盘文件中。这个数据将会从磁盘文件读入到程序中。我们将会提供读入这些数据的方法。importjava.util.Vector;
importjava.io.*;/*
*该类的一个实例代表已注册到图书馆中的所有借书人清单。
*/publicclassPatronCatalog{//常量
//实例变量
privateVectorpatrons;
privateintlastPatronNum;
//填加你的实例变量
//构造方法
publicPatronCatalog(){
/*
*把我初始化为0个借书人
*把借书人的借书证号初始化为0
*/
}//公共实例方法
publicvoidreadPatronFile(){
/*该方法会从patrons.txt文件中读取数据,然后用它们填充vector*this.patrons。*/StringpatronFile="patrons.txt";
BufferedReaderbfreader;
Stringstr;
try{bfreader=newBufferedReader(newFileReader(patronFile));
while((str=bfreader.readLine())!=null){
this.patrons.addElement(newPatron(str.trim().toUpperCase(),this.lastPatronNum++));
}}catch(IOExceptione){
}}publicintpatronCount(){
/*
*返回借书人总数
*/
}publicvoidaddPatron(Stringname){
/*
*用给定的姓名创建一个借书人实例,将他填加到借书人目录中,增加借书人
*号码。借书人号码代表借书人的证件号,而不是Vector的下标。
*如果你删除了#4借书人,然后又填加了一个借书人,那么该人的号码会为5,*而不是4。
*/}
publicStringdeletePatron(intpatronNum){
/*从借书人目录中删除给定的借书人并返回结果*删除借书人,如果1)借书人在目录中并且2)此人没有在借的书*如果是无效证件号码,返回"无效证件号"
*如果有效,删除并返回代表借书人的字符串后接结果说明id,*如果有在接的书,返回(例如:#:0BILLARMSTRONG有在借的书,不能删除)
*并且在删除之前让用户确认(例如:"你确信要删除#0借书人吗<Y>es<N>o?"
*如果有效并为yes删除然后返回(例如:#:0BILLARMSTRONG被删除了)
*如果有效,但没有被删除,返回(例如:#:0BILLARMSTRONG没有被删除)
*/
)
publicStringlistLoans(intpatronNum){
/*
*找出给定借书证号所借的所有图书,当借书人存在时返回结果
*如果是无效的借书证号,返回"无此借书证号码"
*/
}
publicStringprintAllLoans(){
/*
*返回图书馆系统中的所有借书人所借的所有图书的清单,若没有任何借书人,*则什么都不返回。*/
}
publicStringsearchPatronByNum(intpatronNum){
/*
*按借书证号查找借书人并返回查找结果
*如果找到返回代表借书人的字符串(如"#:
0
BILLARMSTRONG)"
*若找不到返回"查无此人";
*/
}
publicStringsearchPatronByFullName(Stringname){
/*
*查找给定的姓名的所有借书人并返回查找结果
*如果找到返回代表借书人的字符串(如"#:
0
BILLARMSTRONG)"
*若找不到返回"查无此人";
*/
}
publicPatronfindPatron(intpatronNum){
/*
*返回一个给定借书证号所代表的借书人对象(patron),若找不到返回NULL
*/}
publicStringtoString(){
/*返回代表我(PatronCatalog)的字符串,该字符串中应包含所有借书人的证件号码和姓名。因为这个类定义了toString()方法,可以用PrintStream类中的print(Object)和println(Object)打印实例变量的值。也就是说我们可以用System.out.print(aPatronCatalog)语句。
*/
}}3.BookCatalog.java图书馆里包含书的清单(例如:图书馆中的“书的目录”)。最新的图书清单也保存在图书目录BookCatalog中。当运行图书应用程序时,会从一个文本文件中读去图书数据(执行此操作的代码已在以下提供)并且用这些数据来初始化BookCatalog对象。由于每本书是从文件里读出来的,所以每本书都分配有唯一的书号。第一本书的ID号为0,下一本的ID号为1,等等。读完图书文件后,你不必担心检查书的ID号。importjava.util.*;
importjava.io.*;
/*
*该类的一个实例代表图书馆里的所有图书
*/
publicclassBookCatalog{//常量
//实例变量
privateVectorbooks;
privateintlastBookNum;
//填加你的实例变量
//构造方法
publicBookCatalog(){
/*
*将我初始化为0本书
*初始化书的编号为0
*/
}
//公共实例方法
publicvoidreadBookFile(){
/*每一个图书的最新书号-你不必理解这个代码是怎么工作的
*只是简单的把它用在你的程序中
*/StringbookFile="books.txt";
BufferedReaderbfreader;
Stringtitle;
Stringauthor;
try{bfreader=newBufferedReader(newFileReader(bookFile));
while((title=bfreader.readLine())!=null){
author=bfreader.readLine();
this.books.addElement(newBook(title.trim().toUpperCase(),author.trim().toUpperCase(),this.lastBookNum++));
}}catch(IOExceptione){
}}
publicintbookCount(){
/*
*返回图书馆中藏书总数
*/
}
publicvoidaddBook(Stringtitle,Stringauthor){
/*
*用给定的书名和作者创建一本书,并把它添加到图书目录中
*增加书号
*书号代表书的号码,而不是Vector的下标
*如果你删除了4号书并且又增加了另一本书,最后增加的书的号码应该是5而不是4*/
}publicStringdeleteBook(intbookNum){
/*
*从图书目录中删除给定的书并返回结果
*删除书如果1)图书清单中有这本书2)目前该书没有被借出去。如果是无效的书号,返回"没有这样的书号"
*如果有效,删除并返回代表书的后接结果说明的字符串
*(例如:#:
0
"ONTOJAVA"
By:
Winston被删除)
*如果该书被借,返回(#:
0
"ONTOJAVA"
By:
Winston被借,不能被删除)
*并在删除之前要用户确认(例如:"你确实想要删除#0<Y>es<N>o?"
*如果有效并且用户的回答为yes删除并返回(例如:#:
0
"ONTOJAVA"
By:
Winston被删除了)
*如果有效并且用户的回答为no,则返回(例如#:
0
"ONTOJAVA"
By:
Winston没有被删除)
*/
publicStringsearchBookByNum(intbookNum){
/*
*查找给定书号的图书,并返回查找结果
*如果找到,返回代表书的字符串(例如:#:
0
"ONTOJAVA"
By:
Winston)
*若没找到,则返回"查无此书";
*/
}
publicStringsearchBookByAuthor(Stringauthor){
/*
*查找给定作者的所有图书,并返回查找结果
*如果找到,返回代表书的字符串(例如:#:
0
"ONTOJAVA"
By:
Winston)
*若没找到,则返回"查无此书";
*/
}publicBookfindBook(intbookNum){
/*
*返回给定书号的图书对象(book),若没有找到返回NULL
*/
}
publicStringtoString(){
/*返回代表我(BookCatalog)的字符串,该字符串中应包含所有书的(书号,书名和作者。因为这个类定义了toString()方法,可以用PrintStream类中的print(Object)和println(Object)打印实例变量的值。也就是说我们可以用System.out.print(aBookCatalog)语句。
*/
)}4.Transactions.java
/*
*该类的一个实例,允许借书人从图书馆借书并向图书馆还书。
*/
publicclassTransactions{//常量//实例变量//构造方法publicTransactions(PatronCatalogpatronCatalog,BookCatalogbookCatalog){
/*
*将我初始化,使我为借书还书事务做准备
*/
}//公共实例方法publicStringborrowBook(intpatronNum,intbookNum){
/*
*校验给定的借书证号与书号
*如果有效,图书馆里有此藏书,结束交易并且不返回任何结果
*如果该书已被借出去,返回:#:0:ONTOJAVAByWINSTON被借出。
*如果借书证号无效,返回:"没有此证件号"
*如果书号无效,返回:"没有此书号"*/
}
publicStringreturnBook(intpatronNum,intbookNum){
/*
*校验给定的借书证号与书号
*如果有效,并且书是借给此人的,结束交易并返回"#:0:ONTOJAVAByWINSTON被还"
*如果该书没有借给此人,则返回:"书没有被借出"。
*如果借书证号无效,返回:"没有此证件号"
*如果书号无效,返回:"没有此书号"*/}}五、运行时例外及其说明表5-1普遍存在于程序中的例外与错误列表例外原因修改提示ArrayIndexOutOfBoundsException数组下标越界例外当数组下标小于0或大于数组的实际长度时发生。需要注意的是数组的下标从0开始,而不是从1。最后的下标值比数组的长度少1ClassNotFoundException类没有找到例外不能够装载被请求的类确保java文件的名字与在此文件中定义的类名匹配。IndexOutOfBoundsException下标越界例外下标越界见以上的ArrayIndexOutOfBoundsExceptionNoSuchMethodException没有这样的方法例外不能够解决的方法也许方法名的拼写有误或者方法不在那个类中NullPointerException空指针例外试图访问一个空的对象成员通常,是因为使用了一个没有被初始化的接受者对象,例如:没有给值。确保你的构造方法的定义是准确的。构造方法没有返回值类型,不像普通方法。如果像给普通方法一样,也给构造方法定义了一个返回值类型并且在其中定义了初始化代码,那么对该类进行对象初始化时,初始化代码就不能被调用。NumberFormatException数字格式例外不能够把字符串转换成数字类型可能会在使用键盘类中的readInt()方法时发生。StringIndexOutOfBoundsException字符串下标越界例外下标值为负数或大于字符串的长度可能会在使用subString()得到子串时发生。表5-2普遍存在的错误提示及其原因(java.langerrors)错误原因修改提示NoClassDefFoundError没有找到类定义的错误没有找到类定义时发生在项目文件夹下没有该类文件时发生,确认有没有该类或类名是否有拼写错误。NoSuchMethodError没有这样的方法错误当找不到被请求的方法时发生确认被请求调用的方法存在,并检查方法名是否有拼写错误.表5-3程序中普遍存在的输入输出类例外例外原因修改提示FileNotFoundException文件没找到例外文件找不到时发生确保文件存在,并且其路径正确表5-4Applet例外例外原因修改提示java.io.FileNotFoundException输入输出文件没找到例外java.lang.ClassNotFoundException类没有找到HTML文件中的类名可能与java文件名不一致。HTML文件不在项目文件夹里面。确保文件存在,并且其路径正确例外举例:importjava.util.*; publicclassTest{ //保存一些值 privateVectorstorage; //初始化Vector的构造方法 publicvoidTest(){ this.storage=newVector(); } //往Vector里添加一个整型类 publicvoidadd(Integervalue){ this.storage.add(value); } //测试输出 publicstaticvoidmain(String[]args){ TestaTest=newTest(); aTest.add(newInteger(1)); } }以上的代码将会发生以下的错误,你知道为什么吗?Exceptioninthread"main"java.lang.NullPointerException("main"线程例外java.lang.NullPointerException,即:空指针例外) atTest.add(Test.java) atTest.main(Test.java)六、大作业二测试代码
1.BookTest.java/**用于单独测试Book类*测试每个方法是基本功能**类方法的结果<->所期望的结果*/publicclassBookTest{ publicstaticvoidmain(String[]argv){ BookaBook; Stringtitle="Javaprogramming"; Stringauthor="Deitel"; intbookNum=1; intpatronNum=10; System.out.println("======BookTest======"); aBook=newBook(title,author,bookNum); System.out.print(aBook.title()); System.out.println("<->"+title.toUpperCase()); System.out.print(aBook.author()); System.out.println("<->"+author.toUpperCase()); System.out.print(aBook.number()); System.out.println("<->"+bookNum); System.out.print(aBook.onLoan()); System.out.println("<->false"); System.out.print(aBook.loanedTo()); System.out.println("<->-1"); aBook.returnMe(); System.out.print(aBook.onLoan()); System.out.println("<->false"); System.out.println(); System.out.print(aBook); System.out.println("<->#1\"CMPUT114\"By:UOFA"); aBook.borrowMe(10); System.out.print(aBook.onLoan()); System.out.println("<->true"); System.out.print(aBook.loanedTo()); System.out.println("<->"+patronNum); System.out.println(); aBook.returnMe(); System.out.print(aBook.onLoan()); System.out.println("<->false"); System.out.print(aBook.loanedTo()); System.out.println("<->-1"); }}2.InputValidatorTest.javapublicclassInputValidatorTest{publicstaticvoidmain(String[]arg){ StringpromptMsgInt="Enterainteger:"; StringpromptMsgStr="EnteraString:"; System.out.println("1)Enterabc");//你的输入 System.out.println("2)Enter1"); System.out.println(InputValidator.getInt(promptMsgInt)+"<>1"); System.out.println("\n1)Enter\"abc\"");//输入时前面留空格 System.out.println(InputValidator.getStr(promptMsgStr)+"<>abc"); System.out.println("2)Enter\"\"");//空格无效,你的程序应该重新提示,直到输入一个字符串为止 System.out.println(InputValidator.getStr(promptMsgStr));}}七、编程风格要求以下说明了对实验5,大作业一,大作业二中编码风格的要求。你应该对所有的变量或方法起描述性的名字。(用x,y表示坐标时例外。)在你定义的每个类和方法的开头加上好的注释说明。你应该使你的方法尽量的短,以至于每个方法只做一件事情。如果你认为一个方法太长了,你可以建立私有的实例方法并把一些代码写在它们当中。程序里有许多私有实例方法不会丢分,但太少会被扣分。你应该对缩进,空格和空行使用一致的、易阅读的方案。如果一个变量只被一个方法使用中,你应该把它定义为局部变量而非实例变量。你应该尽量少使用实例变量,多使用参数。你不应该改变在作业的说明中所给定的任何公共方法的属性。你必须恰当使用关键字this你必须在所有的私有实例变量前面加上this.你必须在所有调用的私有实例方法前面加上this,该规则只应用于定义在当前类中的私有实例方法。八、'this'的恰当使用你必须在所有的私有实例变量前面加this.你在调用类中的私有实例方法时,必须在其前面加this.以下的代码说明了如何使用this:/**该类阐述了'this'的恰当使用*/publicclassTest{/**构造方法*/publicTest(){intlocalVariable;//私有实例变量前面加“this” this.aVariable=1;//调用类中的私有实例方法时其前面加“this”this.test1Method();localVariable=this.test2Method();}publicvoidtest1Method(){System.out.println(Test.OUTPUT);}/**该私有实例方法发挥1.*/privateinttest2Method(){return1;} //实例变量privateintaVariable; //静态变量 privatestaticfinalStringOUTPUT="Useless!";}以下是没有正确使用this的例子:publicclassTest{publicTest(){intlocalVariable;//私有实例变量前面没有加“this” //要扣分!!aVariable=1;//调用类中的私有实例方法时其前面没有加“this” //要扣分!!test1Method();localVariable=test2Method();}publicvoidtest1Method(){System.out.println("Useless!");}privateinttest2Method(){return1;} //实例变量privateintaVariable;}你的代码中不应该直接出现任何的常量,除了0,1,true,false和null。如果你确实需要使用其它常量,你把它们可以成私有的、静态的、final常量。/*用于实验5.*/privatestaticfinalintWIDTH=190;privatestaticfinalintROOF_HEIGHT=50;privatestaticfinalStringA_STRING="Justanexample";/*用于大作业一*/privatestaticfinalStringRED="Red";
privatestaticfinalStringYELLOW="Yellow";
privatestaticfinalStringBLUE="Blue";
/*用于大作业二*/privatestaticfinalStringQUESTION="Doyoureallywanttoquit?";privatestaticfinalStringMAIN_MENU= "1.Books\n"+ "2.Patrons\n"+ "3.Searches\n"+"4.Quit";前述的privatestaticfinal常量只是个例子,并没有列举所有用于实验5、大作业一、大作业二的常量。当比较对象时(不是简单数据类型,例如:int,float…),用equals方法,而不是==。(用!equals而不是!=)。如果对同一件事有两种方法,选择容易理解的那一个。你不能增加任何你自己的公共方法,你只能使用作业的说明中给出的公共方法。然而,如果你愿意,你可以增加自己的私有方法。如果你觉得你的代码太长(超过30行),你可以通过创建多个私有方法对它进行划分。
大作业三基于Javaapplication的纸牌游戏一、任务书在这个作业里,你要编写一系列能够实现纸牌游戏的类。以指导书中所提供的类的顺序写。因为后面的类里会用到前面实现的类。开始编写一个类之前,请把该类的框架复制到MicrosoftVisualJ++6.0里。写完一个类后,请编写自己的测试程序来检查它。也就是说,你的测试程序中得包含一个main方法来调用类中的各个方法,要用不同的对象、参数调用若干次。你递交完作业后,我们会用我们的main方法来测试它们。在写后面的类之前,对你写的每一个类都进行测试。测试类不得分。给你的作业打分时不仅要看你的代码是否能执行,而且要看代码的质量。代码的质量要看你编码的方式和你的代码易读、易理解性等方面。除此之外,你必须遵循以下的四个规则:
你不能创建,除了在该文档描述的类之外的任何类。你不能在你的任何类中创建除了在该文档描述的非私有方法之外的任何非私有方法。但是,如果你愿意可以编写任意数量的私有方法。你不能修改任何public方法的属性(变量名可以改)。你不能定义任何非私有实例变量或非私有静态变量。每个类的分值已在其后的括弧中给出。其中,程序的质量分占5分,剩余的分将给予程序的正确性。除此之外,学生如果破坏了以上4个规则之一,将从总分里扣除5到10分。然而,如果你提供的代码,不能通过编译,你将会得0分。重要信息:开始编程之前请仔细阅读。你必须为该作业创建一个项目。你的项目名必须为:asn3否则,你的作业将不予评分,你将会得0分。作业中的所有类都必须加入该项目中,因此你的项目中应该包含以下文件:Assignment2.java
Card.java
CardGame.java
Confirm.java
Deck.java
Hand.java
Player.java
Rank.java
Round.java
Suit.java你必须递交你所有的测试文件,因此你一定得交以下的测试文件:CardTest.java
ConfirmTest.java
DeckTest.java
HandTest.java
PlayerTest.java
RankTest.java
RoundTest.java
SuitTest.java三、作业中要编写的类及其基本框架1.Rank类(12分)publicclassRank{/*该类的一个实例代表扑克牌的等级:Ace(A),King(K),Queen(Q),Jack(J),10...,3或2.*//*构造方法*/publicRank(charaChar){/*初始化我的等级:按照给定的字符'A'->Ace,'K'->King,'Q'->Queen,'J'->Jack'T'->10,'9'->9...,'2'->2,来初始化我的等级,如果使用了无效字符,显示*.*/
}publicRank(intanInt){/*初始化我的等级:给出对应参数值的等级,按照给定的数值13->Ace,12->King,11->Queen,10->Jack,9->Ten,8->Nine...,1->Deuce来初始化我的等级,如果使用了无效整数,显示*。如果参数值无效,输出*号。*/
}/*实例方法*/publicintvalue(){/*返回我的值:Ace->13,King->12,...,Deuce->1.如果我有无效等级返回0。*/
}publicStringtoString(){/*返回能代表我的字符串,用大写字母:A,K,Q,J,T,9,...或2表示。如果我无效,返回*号。由于定义了toString()方法,可以用PrintStream类中的方法print(Object)和println(Object)打印该类的实例。也就是说我们可以使用System.out.print(aRank)。*/
}}提示:你应该为该类只定义一个实例变量。想一下应该将实例变量定义为什么类型能够更容易实现所需要的信息?你可以在该类中使用字符常量;常量不必定义为私有静态常量privatestaticfinal。1.1用于测试Rank类的测试程序实例publicclassRankTest{/*该类是用于测试Rank类的例子。*//*主程序*/publicstaticvoidmain(Stringargs[]){/*Rank类的测试程序。*/RankaRank;
intvalue;
System.out.println();
System.out.println("=======RankTest=======");
aRank=newRank('Q');
System.out.print(aRank);
System.out.println("<Q");
System.out.print(aRank.value());
System.out.println("<11");
aRank=newRank(5);
System.out.print(aRank);
System.out.println("<6");
System.out.print(aRank.value());
System.out.println("<5");
aRank=newRank('B');
System.out.print(aRank);
System.out.println("<*");
System.out.print(aRank.value());
System.out.println("<0");
aRank=newRank(14);
System.out.print(aRank);
System.out.println("<*");
System.out.print(aRank.value());
System.out.println("<0");}}2.Suit类(12分)publicclassSuit{/*该类的一个实例代表一套标准扑克牌:黑桃、红桃、方块、梅花。*//*构造方法*/publicSuit(charaChar){/*按照给定的字符's'->黑桃,'h'->红桃,'d'->方块,'c'->梅花来初始化我,如果使用了无效字符,显示$。*/
}publicSuit(intanInt){/*按照给定的数值4->黑桃,3->红桃,2->方块,1->梅花来初始化我,如果使用了无效整数,显示$。*/}/*实例方法*/publicintvalue(){/*返回我的数值:黑桃->4,红桃->3,方块->2,梅花->1如果我无效,返回数值0。*/
}publicStringtoString(){/*用一个小写字母返回能代表我的字符串:s,h,d,或c.如果我无效,返回字符串:$。由于定义了toString()方法,可以用PrintStream类中的方法:print(Object)println(Object)打印该类的实例。也就是说我们可以使用:System.out.print(aSuit)。*/
}
}提示:你可以在该类中使用字符常量;你不必将该常量定义为私有静态常量privatestaticfinal。3.Card类(8分)publicclassCard{/*该类的一个实例代表一个有等级和花色的标准扑克牌。*//*构造方法*/publicCard(RankaRank,SuitaSuit){/*用给定的等级和花色初始化我。*/
}/*实例方法*/publicStringtoString(){/*返回一个能代表的等级和花色的字符串。例如:"Ac"或"Kd"或"Ts"或"3h"等。由于定义了toString()方法,可以用PrintStream类中的方法print(Object)和println(Object)打印该类的实例。也就是说我们可以使用System.out.print(aCard)。*/
}publicintvalue(){/*用两倍于我的花色加我的等级的值来响应我的牌。如:As的值为:13+2*4=21,2c的值为:1+2*1=3.*/
}
}提示:你可以在该类用2这个常数;在Card类中,你不必用privatestaticfinal常量来替换2。假设变量sourceRank已经包含了一个Rank对象,并且变量targetRank是一个空的Rank变量: RanksourceRank=newRank(7); RanktargetRank;若想把sourceRank中的对象的地址复制到targetRank,请用以下语句:targetRank=sourceRank;这也可以运用于Suit类的对象。TocopytheRankobjectreferredtobysourceRanktotargetRank,dothefollowing: targetRank=sourceRank; ThisappliestoSuitobjectsaswell.4.Player类(8分)publicclassPlayer{/*该类的一个对象代表扑克牌游戏中的一个玩家。*//*构造方法*/publicPlayer(StringaString){/*用所给的字符串初始化我的姓名,并且所赢的次数为0。*/
}
/*实例方法*/publicvoidincrementScore(){/*将我赢的记录次数加一。*/
}publicStringtoString(){/*以以下格式返回代表我的字符串:"Fred--游戏赢数=4"。由于该类定义了一个toString()方法,可以用PrintStream类中的print(Object)和println(Object)方法打印实例变量的值。也就是说我们可以用System.out.print(aPlayer)。*/
}
}提示:Player类的正确实现只需要很少的代码。5.Confirm类(12分)publicclassConfirm{/*该类的一个实例会问用户yes或no的问题。*//*构造方法*/publicConfirm(Stringquestion){/*用所给的问题字符串初始化我。例如,这个问题字符串可以是:"Doyouwishtoquit"。*/
}/*实例方法*/publicbooleanask(){/*向用户提出我的问题,如果用户以yes响应返回true,以no响应返回false。要求用以下的形式提出问题"Doyouwishtoquit<y>esor<n>o?"。也就是在我的问题后面加上字符串"<y>esor<n>o?"。如果用户输入任何以"y"or"Y"开头的单词,我返回true,如果用户输入任何以"n"or"N"开头的单词,我返回false。如果用户输入的单词不是"y","Y","n"或"N”开头的,我就继续提问,直到用户输入任何以"y","Y","n"或"N”开头的单词。*/
}}在剩余的类中将用到Vector和For语句。所以在做该作业之前你应该能先做完实验7,实验7中包含Vector和For语句。6.Hand类(12分)publicclassHand{/*该类的一个实例代表一轮扑克游戏。*//*构造方法*/publicHand(){/*初始化我持有0张纸牌。*/
}/*实例方法*/publicvoidaddCard(CardaCard){/*将所发的牌作为最后一张牌加在我手中的牌里。*/
}publicCardremoveCard(){/*从我手中的牌里删除第一张牌,并返回它。如果我手中没有牌了返回null.*/
}publicStringtoString(){/*返回能代表我手中的牌的字符串,以它们发到我手中的顺序,中间再加上"-"号。如:"As-Kc-3h-2d-5c"。如果没有牌返回空字符串。由于该类定义了一个toString()方法,可以用PrintStream类中的print(Object)和println(Object)方法打印实例变量的值。也就是说我们可以用System.out.print(aHand)。*/
}publicintvalue(){/*返回我手中的牌的总合。*/
}
}提示:从Hand类看包含在Hand对象中的牌的个数没有限制。7.Deck类(13分)publicclassDeck{/*该类的一个实例代表一副普通52张的纸牌。*//*构造方法*/publicDeck(){/*以以下顺序创建我的一个实例:As,Ks,Qs,...2s,Ah,...,2h,Ad,...,2d,Ac...,2c*/
}/*实例方法*/publicvoidshuffle(){/*洗牌,使我的牌处于随机的顺序。*/
}publicvoiddealHands(Vectorhands,intcount){/*为每个hands(人),分发给定数量的纸牌(由参数count指定),每次每人轮流发1张。你必须从一副纸牌的最上面开始发放。例如,如果牌还没有被洗,方块A应该在最顶层,因此其应该是发放的第一张牌。*/
}publicvoidgatherCards(Vectorhands){/*从每人手中收取纸牌,并把它们放在我里面。*/
}publicStringtoString(){/*按顺序返回我里面的所有纸牌,用"-"分隔。例如:"As-Kc-3h-2d-5c-4h...".由于该类定义了一个toString()方法,可以用PrintStream类中的print(Object)和println(Object)方法打印实例变量的值。也就是说我们可以用System.out.print(aDeck)。*/
}
}8.Round类(13分)publicclassRound{/*该类的一个实例代表一轮纸牌游戏。*/
/*构造方法*/publicRound(VectorplayerVector){/*把我初始化为由参数playerVector给定的玩家,并且为每个玩家创建一个空手。最后,创建一副新的单牌。*/
}/*实例方法*/publicvoidplay(){/*洗牌,给每个人发5张牌,并且显示每个玩家手中的牌和玩家,一行显示一个玩家,以以下格式:2d-Ac-5s-4d-Thvalue=45Fred--gameswon=4显示完每人手中的牌后,增加赢家的赢牌次数,然后,以以下格式显示赢家的信息:赢家是:Fred--gameswon=5注意:如果两个玩家打成平局,宣布任意一个为赢家。最后,把所有的牌返回给Deck.*/
}
}9.CardGame类(10分)publicclassCardGame{/*该类的一个实例为一个纸牌游戏。由一人和3个由计算机生成的对手进行比赛,对手的名字为:1bot,2bot和3bot。用户可以想玩几轮就玩几轮,并且每一轮过后游戏的成绩都得被更新。如果想知道CardGame是如何工作的,请看样例。*//*构造方法*/publicCardGame(){/*把我初始化为能够玩的状态。*/
}/*实例方法*/publicvoidplay(){/*玩纸牌游戏。*/
}
}提示请记住构造方法用于初始化其对象的状态。9.1用于测试CardGame类的测试代码:publicclassAssignment2{/*该类是测试纸牌游戏类的测试程序。它只测试了最终的CardGame类。*//*主程序*/publicstaticvoidmain(Stringargs[]){/*程序开始。*/CardGamegame;game=newCardGame();game.play();}}以下为纸牌游戏的运行样例。你的纸牌游戏的功能应该跟其完全一样。黑体部分为你的输入内容。WelcometotheCardGame.Whatisyourname?FredWellFredwearegoingtoplayacardgame.
Doyouwantinstructions,<y>esor<n>o?sure
Doyouwantinstructions,<y>esor<n>o?yes
Therearethreecomputerplayersandyou.
Eachplayerwillreceivefivecards.
Theplayerwiththehighesthandscorewillbeassignedonegamepoint.
Youwillthenhavethechoiceofplayinganotherroundorquitting.
Thehandscorewillbethesumofthevaluesofeachcardinyourhand.
Thevalueofacardisthevalueofitsrankplustwicethevalueofitssuit.
value(Ace)=13,value(King)=12,value(Queen)=11,value(Jack)=10,
value(10)=9,value(9)=8...value(2)=1
value(spade)=4,value(heart)=3,value(diamond)=2,value(club)=1.
PresstheENTERkeytocontinue...
Kd-4s-8d-6s-4cvalue=56Fred--gameswon=0
Js-9s-4d-3c-6cvalue=521bot--gameswon=0
7d-Qh-2d-2c-5hvalue=452bot--gameswon=0
Qs-2s-6d-3h-5svalue=573bot--gameswon=0
Thewinneris:3bot--gameswon=1
Doyouwanttoplayanotherround,<y>esor<n>o?Y
3d-As-7c-Qd-Advalue=67Fred--gameswon=0
8d-Js-Jh-Qs-Acvalue=791bot--gameswon=0
3s-3c-Jd-6h-Tdvalue=522bot--gameswon=0
5c-4h-4d-7h-2svalue=433bot--gameswon=1
Thewinneris:1bot--gameswon=1
Doyouwanttoplayanotherround,<y>esor<n>o?YES
9h-Td-5h-6s-Qcvalue=63Fred--gameswon=0
Kd-8h-3c-Qs-Asvalue=731bot--gameswon=1
Th-Ks-Js-2d-Jcvalue=702bot--gameswon=0
4c-8c-Jd-2s-9dvalue=493bot--gameswon=1
Thewinneris:1bot
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 广西大专考试题目及答案
- 考点分解2024年药理学试题及答案
- 湖北省鄂北六校2021-2022学年高一下学期期中联考生物试卷(含答案)
- 采购过程风险及防控
- 2024年二手车评估师考试模拟试题与答案
- 2024年计算机操作评估试题及答案
- 食品检验数据的可靠性分析试题及答案
- 湖北省咸宁市赤壁市人教版(PEP)2023-2024学年三年级下学期英语期中监测模拟试题(含答案)
- 小自考汉语言文学考试深度解析与试题答案
- 理解宠物教育与营养试题及答案
- 2025年4月自考15043中国近现代史纲要押题及答案
- 江苏省淮安市洪泽区2024-2025学年七年级下学期3月调研地理试题(含答案)
- 黄金卷02(广州专用)-【赢在中考·黄金预测卷】2025年中考数学模拟卷(考试版)
- 2025-2030年班用帐篷项目投资价值分析报告
- 2025年国家粮食和物资储备局垂直管理系统事业单位招聘701人历年自考难、易点模拟试卷(共500题附带答案详解)
- 射线无损探伤合同范本
- 创意活动策划方案及执行流程
- 中职高教版(2023)语文职业模块-第五单元:走近大国工匠(一)展示国家工程-了解工匠贡献【课件】
- 回转窑车间培训教材幻灯片资料
- 管理咨询行业企业战略规划与咨询服务方案
- 人工智能与医学影像技术
评论
0/150
提交评论