Java语言程序设计A实验1类与对象资料.docx
《Java语言程序设计A实验1类与对象资料.docx》由会员分享,可在线阅读,更多相关《Java语言程序设计A实验1类与对象资料.docx(24页珍藏版)》请在冰豆网上搜索。
Java语言程序设计A实验1类与对象资料
实验课程名称:
Java语言程序设计A
实验项目名称
实验1:
类与对象
实验成绩
实验者
专业班级
组别
同组者
无
开始日期
第一部分:
实验预习报告(包括实验目的及意义,实验基本原理与方法,主要仪器设备及耗材,实验内容及要求,实验方案与技术路线等)
一.实验目的及意义
1.根据实际需求,使用UML类图,合理设计类及其成员(实例变量、方法)。
2.编写、调用构造函数,初始化新建对象。
3.编写、调用方法,完成相关操作。
4.实现信息隐藏与封装。
5.创建对象、调用对象方法。
6.正确使用对象数组。
7.设计、实现算法逻辑。
二.实验基本原理与方法
1.面向对象的概念、思想、思维方式。
2.UML面向对象设计初步。
2.类的概念、结构、定义、使用。
3.构造函数的概念、结构、定义、调用。
4.方法的概念、结构、定义、调用。
5.信息隐藏与封装的概念、实现。
6.对象的概念、创建、使用。
7.对象数组的概念、使用。
8.控制流程。
三.主要仪器设备及耗材
1.PC及其兼容机。
2.计算机操作系统。
3.程序编辑器EditPlus。
4.Java开发工具JDK。
四.实验内容及要求
实验1-1:
请设计一个类Student,该类的实例变量有学号studentNumber、姓名studentName、
专业specialty、学费tuition。
学费tuition要实现封装,最低学费4500元。
请绘制完
整的UML类图,写出类Student的Java源代码。
然后,编写测试类StudentTest,给
出运行结果。
实验1-2:
编写类Book,其实例变量简化为:
bookName
numRated5
numRated4
numRated3
numRated2
numRated1
方法addRating()应保证能接收一个有效整数作为形参,将与形参匹配的评级人数加
1。
例如,如果接收3,则numRated3加1。
方法getAverage(),返回所有评级的平均值。
编写测试类BookReviewTest,在main()方法中,创建一个Book对象,为这本图书评级6次,最后输出这本图书的书名、平均评级。
程序的一种可能的输出结果:
HeadFirstJava,AverageRating:
4.2
实验1-2(数组版本):
重做实验1-2,使用数组代替变量保存图书评级,所有修改只应局限于
类Book内部,测试类BookReviewTest无需修改。
实验1-3(选做):
编写储蓄账户类及测试类,模拟存款,参考以下运行方式:
(1)新开5个储蓄账户,各储蓄账户的编号、户名在新开储蓄账户时初始化,假设每位用户新开储蓄账户时都存入了一笔钱。
(2)提示用户从键盘输入储蓄账户编号。
(3)若输入的储蓄账户编号与新开的5个储蓄账户编号之一匹配,则提示用户从键盘输入存款金额,存款金额必须大于0,否则显示错误提示,直到用户输入的存款金额大于0为止。
(4)相应储蓄账户的余额被更新。
(5)存款完成后,提示存款成功,显示该储蓄账户的编号、户名、余额。
(6)若输入的储蓄账户编号与新开的5个储蓄账户编号均无法匹配,显示错误提示,并询问是否还要继续存款。
(7)用户输入yes,继续执行步骤
(2),否则显示退出信息。
最基本要求:
绘制UML类图;储蓄账户的余额必须确保大于等于0。
五.实验方案及技术路线(设计思路、UML类图、算法、注意事项)
1)对于实验1-1,可以对studentNumber,studentName,specialty,tuition四个变量都进行封装,使用private关键字,然后在类中使用get和set方法,实现对这些实例变量的获取和更改。
在setTuition()方法中,首先通过if语句对传入的参数进行判断,若数值大于或等于4500,则修改成功,否则输出错误提示,简略的UML图如下:
2)对于实验1-2中,各个星级人数的统计通过switch(){case}语句即可实现,但要注意的是,最好加上default语句用以处理错误输入的情况。
数组版本只需要将numRated5、numRated4、numRated3、numRated2、numRated1这几个变量放入一个int[]数组中即可。
3)实验1-3中,因为考虑到各个储蓄账号不能重复,并且在每次操作的时候需要进行匹配,若每次都通过for()循环遍历则比较繁琐,操作时间长,说以采用HashMap集合存储账号,账号number为关键字,每个Account对象为值,因为在测试类中会使用到containsKey()等方法,所以在Account类中需要重写toString()、equal()以及hashCode()方法。
简略的UML图如下:
第二部分:
实验过程记录(可加页)(代码、运行结果、实验中出现的问题及解决过程)
⏹实验1-1
程序代码如下:
1)Student类代码:
publicclassStudent
{
privateStringstudentNumber;
privateStringstudentName;
privateStringspecialty;
privatedoubletuition;
publicStudent(StringstudentNumber,StringstudentName,Stringspecialty,doubletuition)
{
this.studentNumber=studentNumber;
this.studentName=studentName;
this.specialty=specialty;
this.tuition=tuition;
}
publicvoidsetStudentNumber(StringstudentNumber){
this.studentNumber=studentNumber;
}
publicStringgetStudentNumber(){
returnstudentNumber;
}
publicStringgetStudentName(){
returnstudentName;
}
publicvoidsetStudentName(StringstudentName){
this.studentName=studentName;
}
publicStringgetSpecialty(){
returnspecialty;
}
publicvoidsetSpecialty(Stringspecialty){
this.specialty=specialty;
}
publicvoidsetTuition(doubletuition){
if(tuition<4500)
{
System.out.println("最低学费为4500,请不要低于此数值。
");
}
else
{this.tuition=tuition;}
}
publicdoublegetTuition(){
returntuition;
}
}
2)StudentTest类代码:
publicclassStudentTest{
publicstaticvoidmain(String[]args){
//创建学生实例
Studentstudent1=newStudent("学号","姓名","专业",5000);
Studentstudent2=newStudent("学号","姓名","专业",5500);
//修改student2的学号
student2.setStudentNumber("新学号");
//修改student2的姓名
student2.setStudentName("新姓名");
//修改student1的专业信息
student1.setSpecialty("新专业");
//修改student1学费信息
student1.setTuition(4500);
//输出student1和student2的信息
System.out.println("学号:
"+student1.getStudentNumber()+"\n"+
"姓名:
"+student1.getStudentName()+"\n"+
"专业:
"+student1.getSpecialty()+"\n"+
"学费:
"+student1.getTuition()+"\n");
System.out.println("学号:
"+student2.getStudentNumber()+"\n"+
"姓名:
"+student2.getStudentName()+"\n"+
"专业:
"+student2.getSpecialty()+"\n"+
"学费:
"+student2.getTuition()+"\n");
}
}
运行结果如下:
省略
⏹实验1-2
程序代码如下:
1)Book类代码:
publicclassBook{
privateStringbookName;
privateintnumRate1,numRate2,numRate3,numRate4,numRate5;
publicBook(StringbookName)
{
this.bookName=bookName;
//初始化各星级的人数为0
numRate1=0;
numRate2=0;
numRate3=0;
numRate4=0;
numRate5=0;
}
publicStringgetBookName()
{
returnbookName;
}
publicvoidsetBookName(StringbookName)
{
this.bookName=bookName;
}
publicvoidaddRating(intrateIn)
{
switch(rateIn)
{
case1:
numRate1++;break;
case2:
numRate2++;break;
case3:
numRate3++;break;
case4:
numRate4++;break;
case5:
numRate5++;break;
default:
System.err.println("数字"+rateIn+"不在星级评定范围,此次输入无效,请输入数字1-5!
");break;
}
}
publicdoublegetAverage()
{doubleaverage=0;average=(numRate1*1+numRate2*2+numRate3*3+numRate4*4+numRate5*5)*1.0/(numRate1+numRate2+numRate3+numRate4+numRate5);
returnaverage;
}
}
2)(数组版)Book类代码:
publicclassBook
{
privateStringbookName;
privateint[]numRate=newint[5];
publicBook(StringbookName)
{
this.bookName=bookName;
//初始化各星级的人数为0
for(inti=0;i<5;i++)
{
numRate[i]=0;
}
}
publicStringgetBookName()
{
returnbookName;
}
publicvoidsetBookName(StringbookName)
{
this.bookName=bookName;
}
publicvoidaddRating(intrateIn)
{
switch(rateIn)
{
case1:
numRate[0]++;break;
case2:
numRate[1]++;break;
case3:
numRate[2]++;break;
case4:
numRate[3]++;break;
case5:
numRate[4]++;break;
default:
System.err.println("数字"+rateIn+"不在星级评定范围,此次输入无效,请输入数字1-5!
");break;
}
}
publicdoublegetAverage(){
doubleaverage=0;
average=(numRate[0]*1+numRate[1]*2+numRate[2]*3+numRate[3]*4+numRate[4]*5)*1.0/(numRate[0]+numRate[1]+numRate[2]+numRate[3]+numRate[4]);
returnaverage;
}
}
3)BookReviewTest类代码:
importjava.util.Scanner;
publicclassBookReviewTest{
publicstaticvoidmain(String[]args)
{
Bookbook=newBook("Java大学教程");
Scannersc=newScanner(System.in);
//6次评级
for(inti=1;i<=6;i++)
{
System.out.println("书本《Java大学教程》星级评分开始,请输入数字1-5:
");
intrating=sc.nextInt();
book.addRating(rating);
}
System.out.println("书名:
"+book.getBookName()+"\n"
+"平均星级:
"+book.getAverage());
}
}
运行结果如下:
1)当出现输入星级大于5或小于0时
2)当输入正常时:
⏹实验1-3
程序代码如下:
1)储蓄账户Account类代码:
publicclassAccount
{
privateStringnumber;
privateStringname;
privatedoublebalance;
publicAccount(Stringnumber,Stringname)
{
this.number=number;
this.name=name;
balance=0;
}
publicStringgetNumber()
{
returnnumber;
}
publicStringgetName()
{
returnname;
}
publicdoublegetBalance()
{
returnbalance;
}
publicvoiddeposit(doubleamountIn)
{
balance-=amountIn;
}
publicvoidwithdraw(doubleamountIn)
{
balance+=amountIn;
}
publicStringtoString()
{
return"("+number+","+name+","+balance+")\n";}
publicbooleanequals(ObjectobjIn)
{
AccountaccIn=(Account)objIn;
returnnumber.equals(accIn.number);
}
publicinthashCode()
{
returnnumber.hashCode();
}
}
2)测试类AccountTest代码
importjava.util.HashMap;
importjava.util.InputMismatchException;
importjava.util.Map;
importjava.util.Scanner;
publicclassAccountTest{
publicstaticvoidmain(String[]args)
{
MapaccountList=newHashMap();
//创建3个账户并放入集合accountList中
Accountaccount1=newAccount("11111","dengqiuping");
account1.withdraw(500);
accountList.put("11111",account1);
Accountaccount2=newAccount("22222","lixi");
account2.withdraw(100);
accountList.put("22222",account2);
Accountaccount3=newAccount("33333","chengying");
account3.withdraw(1000);
accountList.put("33333",account3);
Accountaccount4=newAccount("44444","susu");
account4.withdraw(5000);
accountList.put("44444",account4);
Accountaccount5=newAccount("55555","zhangxi");
account5.withdraw(300);
accountList.put("55555",account5);
//当用户输入数据类型错误的时候,输出错误提示
try{
selectChoice(accountList);
}catch(InputMismatchExceptione){
System.err.println("输入错误,请输入数字1-4!
");
selectChoice(accountList);
}
}
publicstaticvoidselectChoice(MapaccountListIn)
{
Scannersc=newScanner(System.in);
intinput;
do
{
System.out.println("1.存款");
System.out.println("2.取款");
System.out.println("3.余额查询");
System.out.println("4.退出");
System.out.println("请输入操作【1-4】:
");
input=sc.nextInt();
switch(input)
{
case1:
option1(accountListIn);break;
case2:
option2(accountListIn);break;
case3:
option3(accountListIn);break;
case4:
System.exit(0);
//当输入的数字小于1或大于4时输出错误提示
default:
System.err.println("无效输入,请输入数字【1-4】!
");
}
}while(input!
=4);
}
//取款操作
privatestaticvoidoption1(MapaccountListIn)
{StringtempNumber;
Scannersc1=newScanner(System.in);
System.out.println("请输入账号(输入'0'返回上一级):
");
tempNumber=sc1.next();
if(accountListIn.containsKey(tempNumber))
{
try{
for(;;)
{
System.out.println("请输入存款数额:
");
DoubletempAmount=sc1.nextDouble();
if(tempAmount<0)
{
System.err.println("存款数额不能小于0元,请从重输入数值!
");
}
else
{
AccountcurrAccount=accountListIn.get(tempNumber);
currAccount.withdraw(tempAmount);
System.out.println("存款成功!
");
System.out.println("账号:
"+currAccount.getNumber()+"\n"+
"账户名:
"+currAccount.getName()+"\n"+
"余额:
"+currAccount.getBalance());
break;
}
}
}catch(InputMismatchExceptione){
System.err.println("无效输入,请输入大于0的数值!
");
option1(accountListIn);
}}
elseif(tempNumber.equals("0"))
{selectChoice(accountListIn);}
else
{
Stringc=reChoice();
if(c.equals("1"))
{option1(accountListIn);}
else{//返回主菜单
}}}
//取款
privatestaticvoidoption2(MapaccountListIn)
{
Scannersc2=newS