实现思路及关键代码
(1) 创建 CustomerBiz 类,添加属性姓名数组。
(2) 创建 addName(String name) 方法,实现姓名的添加。
(3) 创建 showNames( )方法,实现姓名的显示。
(4) 创建测试类 TestCustomer, 实现循环,输入姓名。
参考解决方案
CustomerBiz 类的 addName(String name) 方法参考代码如下。
package cn.jbit.test1; /* * 上机阶段1:实现客户姓名显示和添加 * */ public class CustomerBiz { String[] names = new String[30]; // 姓名数组 /* * 增加姓名 * @param name要增加的姓名 */ public void addName(String name){ for(int i =0;i<names.length;i++){ if(names[i]==null){ names[i]=name; break; } } } /* * 显示姓名 */ public void showNames(){ System.out.println("**************************"); System.out.println("\t客户姓名列表:"); System.out.println("**************************"); for(int i =0;i<names.length;i++){ if(names[i]!=null){ System.out.print(names[i]+"\t"); } } System.out.println(); } }
TestCustomer 类实现循环输入,参考代码如下。
package cn.jbit.test1; import java.util.*; public class TestCustomer { public static void main(String[] args) { CustomerBiz cb=new CustomerBiz(); boolean con=true; Scanner input = new Scanner(System.in); while(con){ System.out .print("请输入客户的姓名:"); String newName = input.next(); cb.addName(newName); System.out .print("继续输入吗?(y/n):"); String choice=input.next(); if(choice.equals("n")){ con=false; } } cb.showNames(); } }
上机练习2
指导——修改客户姓名
需求说明
修改学生姓名,输入新、旧姓名,进行修改并显示是否修改成功。
程序运行结果如图 14.2 所示。
图 14.2 上机练习 2 的运行结果
提示:在数组中查询到该客户,进行修改姓名。根据分析可以设计一个方法,通过传递两个参数(需要修改的姓名、新姓名)来实现。参考代码如下。
CustomerBiz 类的 方法参考代码如下。
package cn.jbit.test2; /* * * 实现客户信息的管理 * */ public class CustomerBiz { String[] names = new String[30]; // 客户姓名数组 /* * 增加姓名 * @param name要增加的姓名 */ public void addName(String name){ for(int i =0;i<names.length;i++){ if(names[i]==null){ names[i]=name; break; } } } /* * 修改客户姓名 * @param oldName旧名字 * @param newName新名字 */ public boolean editName(String oldName,String newName){ boolean find = false; // 是否找到并修改成功标识 // 循环数组,找到姓名为oldName的元素,修改为newName for(int i=0;i<names.length;i++){ if(names[i].equals(oldName)){ names[i] = newName; find=true; break; } } return find; } /* * 显示姓名 */ public void showNames(){ System.out.println("**************************"); System.out.println("\t客户姓名列表:"); System.out.println("**************************"); for(int i =0;i<names.length;i++){ if(names[i]!=null){ System.out.print(names[i]+"\t"); } } System.out.println(); } }
TestModify 类实现循环输入,参考代码如下。
package cn.jbit.test2; import java.util.Scanner; public class TestModify { public static void main(String[] args) { CustomerBiz st = new CustomerBiz(); Scanner input = new Scanner(System.in); for(int i=0;i<5;i++){ System.out.print("请输入客户姓名:"); String newName = input.next(); st.addName(newName); } st.showNames(); System.out.print("\n请输入要修改的客户姓名:"); String oldname = input.next(); System.out.print("请输入新的客户姓名:"); String newname = input.next(); System.out.println("\n*****修改结果*****"); if(st.editName(oldname, newname)){ System.out.println("找到并修改成功!"); } else{ System.out.println("没找到该客户!"); } st.showNames(); } }
14.2 深入理解带参方法
14.2.1 数组作为参数的方法
问题:有五位学员参加了 Java 知识竞赛的决赛,输出决赛的平均成绩和最高成绩。
分析:将多个类型相同的数值型数据存储在数组中,并对其求总和、平均值、最大值、最小值等是实际应用中常见的操作,可以设计求总和、平均值、最大值、最小值等的方法,并把数组作为参数,这样便可以在多种场合下调用这些方法,如示例 4 所示。
示例4
package cn.jbit.classandobject; /** * * 实现学生信息的管理 * */ public class StudentsBiz { String[] names = new String[30]; // 学员姓名数组 /** * 增加学生姓名 * @param name要增加的姓名 */ public void addName(String name){ for(int i =0;i<names.length;i++){ if(names[i]==null){ names[i]=name; break; } } } /** * 显示本班的学生姓名 */ public void showNames(){ System.out.println("本班学生列表:"); for(int i =0;i<names.length;i++){ if(names[i]!=null){ System.out.print(names[i]+"\t"); } } System.out.println(); } /** * 修改学员姓名 * @param oldName旧名字 * @param newName新名字 */ public boolean editName(String oldName,String newName){ boolean find = false; // 是否找到并修改成功标识 // 循环数组,找到姓名为oldName的元素,修改为newName for(int i=0;i<names.length;i++){ if(names[i].equals(oldName)){ names[i] = newName; find=true; break; } } return find; } /** * 在一定区间查找学生姓名 * @param start 开始位置 * @param end 结束位置 * @param name 查找的姓名 * @return find 是否查找成功 */ public boolean searchName(int start,int end,String name){ boolean find = false; // 是否找到标识 // 指定区间数组中,查找姓名 for(int i=start-1;i<end;i++){ if(names[i].equals(name)){ find=true; break; } } return find; } /** * 求平均分 * @param scores 参赛成绩数组 */ public double calAvg(int[] scores){ int sum=0; double avg=0.0; for(int i =0;i<scores.length;i++){ sum+=scores[i]; } avg=(double)sum/scores.length; return avg; } /** * 求最高分 * @param scores 参赛成绩数组 */ public int calMax(int[] scores){ int max=scores[0]; for(int i =1;i<scores.length;i++){ if(max<scores[i]){ max=scores[i]; } } return max; } }
示例 4 中的 StudentsBiz 类定义了两个方法,分别实现了求平均成绩和最高成绩,它们都是带数组参数并且带返回值的方法。
public double calAvg(int[] scores)
public int calMax(int[] scores)
参数 scores 数组传递所有学员的比赛成绩,而且定义方法时并没有指定数组大小,而是在调用方法时确定要传递的数组的大小。 return 语句用来返回平均成绩和最高成绩。
示例 4 的运行结果如图 14.3 所示。
图 14.3 示例 4 的运行结果
14.2.2 对象作为参数的方法
问题:在示例 1 中,实现了增加一个学生姓名的功能,那么,如果不仅要增加学生的姓名,还要增加学生的年龄和成绩,应该如何实现呢?
分析:在示例 1 中,设计了一个方法,通过传递一个参数(新增的学生姓名)来实现。同样,要新增年龄和成绩,可以在类中定义两个分别表示年龄和成绩的数组,同时在方法中增加两个参数(要新增的学生的年龄、要新增的学生的成绩)。但是,这样设计会有一些问题,在类中声明的数组较多,在方法中的参数较多,试想,如果新增的学生信息包括的更多,如家庭住址、联系电话、身高、体重、性别等,那么是不是需要在类中定义更多的数组和在方法中定义更多的参数呢?显然,这不是最好的解决方案。其实,大家已经学习过类和对象,可以使用面向对象的思想,把所有要新增的学生信息封装到学生类中,只需要在方法中传递一个学生对象就可以包含所有的信息,如示例 5 所示。
示例5
package cn.jbit.class4; /* * * 学生类 * */ class Student{ public int id; public String name; public int age; public int score; public void showInfo(){ System.out.println(id+"\t"+name+"\t"+age+"\t"+score); } } /* * * 实现学生信息的管理 * */ public class StudentsBiz { Student[] students = new Student[30]; // 学生数组 /* * 增加学生 * @param 一个学生 */ public void addStudent(Student stu){ for(int i =0;i<students.length;i++){ if(students[i]==null){ students[i]=stu; break; } } } /* * 显示本班的学生信息 * */ public void showStudents(){ System.out.println("本班学生列表:"); for(int i =0;i<students.length;i++){ if(students[i]!=null){ students[i].showInfo(); } } System.out.println(); } }