(一)实验类型:设计性
(二)实验目的:
1. 掌握Java语言的集合类;
2. 掌握程序调试的常用方法,培养良好的Java编程习惯。
(三)实验内容:
1. 编写一个学生管理程序,选择集合类存储学生的学号、姓名和期末考试各科的成绩(课程名+成绩,假设只包括数学、语文和英语三门课程)。实现如下功能:
(1)学生信息(学号+姓名)录入;
(2)学生成绩录入(课程+得分);
(3)根据姓名查找学号。
(4)根据学号查找姓名。
(5)根据学号查找成绩。
(6)根据学号和课程名查找学生的成绩。
(7)根据学号计算平均分,并屏幕输出。
(8)根据平均分对班级学生成绩排序,按从高到低的顺序输出姓名和平均成绩。
import java.util.*;class Stu
{ private String id;private String name;private String classChe,classMath,classEng;//课程名private int che,math,eng;//成绩 public Stu(String id,String name,String classChe,String classMath,String classEng,int che,int math,int eng){this.id=id;this.name=name;this.classChe=classChe;this.classMath=classMath;this.classEng=classEng;this.che=che;this.math=math;this.eng=eng;}//直接重载类写方法直接插入数据//重载类不是方法,不需要写类型!不要写void!//创建set就是为了存储数据到类中,get就是为了得到单个变量的值//如果用了重载类储存数据也可不写set,更简洁。//因为class是动态的,不是静态就不能直接stu[i].che这样获取值//必须要写一个函数如get实现return来获取值public String getId(){return id;}public String getName(){return name;}public int getEng(){return eng;}public int getMath(){return math;}public int getChe(){return che;}public String getClassEng(){return classEng;}public String getClassMath(){return classMath;}public String getClassChe(){return classChe;}public String find1(String name,int len,Stu[] stu)//写方法的时候表明是对象数组即可{for (int i = 0; i < len; i++)if (stu[i].getName().equals(name)) return stu[i].id;//将类中存放的名字与传入的名字比对//找到相同名字时就将对象中的学号返回,//后面同理return null;//java中必须要有明确的返回值} public String find2(String id,int len,Stu[] stu){for (int i = 0; i < len; i++)if (stu[i].getId().equals(id)) return stu[i].name;return null;} public int find3(String id,int len,Stu[] stu){for (int i = 0; i < len; i++)if (stu[i].getId().equals(id))return i;return -1;} public int find4(String classname,int len,Stu[] stu){for (int i = 0; i < len; i++)if (stu[i].getClassChe().equals(classname)||stu[i].getClassMath().equals(classname)||stu[i].getClassEng().equals(classname))return i;return -1;} public int ave(int a,int b,int c){return (a+b+c)/3;}}class R
{public String name;public int ave;public R(String name,int ave){this.name=name;this.ave=ave;}public int getAve(){return ave;}public String getName(){return name;}
}public class Demo{public static void main(String args[]){Scanner in=new Scanner(System.in);int n=in.nextInt();//插入学生个数Stu[] stu = new Stu[n];//创建数组for(int i=0;i<n;i++){stu[i]=new Stu(in.next(),in.next(),in.next(),in.next(),in.next(),in.nextInt(),in.nextInt(),in.nextInt());//分配空间}//只设置一次查找先,需要查找多少次可以自己设置//根据姓名查找学号。String name=in.next();String id=stu[0].find1(name,n,stu);//这里随便用一个学生的find即可 System.out.println(id);//传参的时候只用把数组的名字传上去就行了//根据学号查找姓名。id=in.next();name=stu[0].find2(id,n,stu);System.out.println(name);//根据学号查找成绩。id=in.next();int key=stu[0].find3(id,n,stu);//成绩有三个//为了方便输出结果,我们换成获取下标。System.out.println("语文数学英语"+stu[key].getChe()+" "+stu[key].getMath()+" "+stu[key].getEng());//根据课程名查找学生的成绩。String className=in.next();key=stu[0].find4(className,n,stu);//成绩有三个//为了方便输出结果,我们换成获取下标。System.out.println("语文数学英语"+stu[key].getChe()+" "+stu[key].getMath()+" "+stu[key].getEng());// int[] rank=new int[n];err 因为要存放两个量,所以不能只开一个整型数组//其实java的class在存放变量的性质就跟结构体是一样的//多个变量就要开一个类来包装使用//根据学号计算平均分,并屏幕输出。id=in.next();key=stu[0].find3(id,n,stu);int val=stu[key].ave(stu[key].getChe(),stu[key].getMath(), stu[key].getEng());//平均分也是要几个成绩,所以获取下标//本质上也是根据学号获取下标,可以复用前面的方法System.out.println(val);//根据平均分对班级学生成绩排序,按从高到低的顺序输出姓名和平均成绩。R[] rank=new R[n];for(int i=0;i<n;i++){val=stu[i].ave(stu[i].getChe(),stu[i].getMath(), stu[i].getEng());rank[i]=new R(stu[i].getName(),val);///申请空间+重载赋值}//java只有升序,且降序输出比较困难,所以干脆就先升序排序然后降序输出//Collections.sort(rank, (p1, p2) -> ((R) p2).getAve()-((R) p1).getAve()); err//比对了很多方法,发现插入到列表中再排序是最方便简洁的List<R>rankList=new ArrayList<>();for(int i=0;i<n;i++)rankList.add(rank[i]);Collections.sort(rankList,(p1,p2)->p2.getAve()-p1.getAve());// 排序对象 选定先后元素 从哪里-哪里,-就相当于从..到..的意思for(R r:rankList)//R是元素类型,r是元素/一个对象,rankList指循环中的所有对象 //元素的名字可以任意取{//System.out.println(r); // err//直接写元素为什么不行见//https://blog.csdn.net/ASBSIHD/article/details/131018839?csdn_share_tail=%7B%22type%22%3A%22blog%22%2C%22rType%22%3A%22article%22%2C%22rId%22%3A%22131018839%22%2C%22source%22%3A%22ASBSIHD%22%7DSystem.out.println(r.getName()+" "+r.getAve());}// for (int i = 0; i < rankList.size(); i++) {
// System.out.println(rankList.get(i));
// }//获取到列表的下标就能直接输出其结果
// //常规输出方法示例//知识: for (type variable : collection) {// code block to be executed}//其中,type表示要遍历集合中的元素类型,variable表示一个临时变量,//用于存储集合中每个元素的值,collection表示要遍历的集合对象。//代码可以改进,都改为获取下标,只要是根据的数据不变//都是可以复用方法的!//没有必要开这么多个方法//测试样例
//1
//1314
//Amiya
//chinese
//math
//english
//80
//88
//95
//Amiya
//1314
//1314
//math
//1314//行吧,eclipse本身的问题,可能我的这个样例的编排有问题。或者这么长的数据//本身就数据量太大了,一次输出不完,所以要再次回车才能输出完全}