目标是利用当前所学的各种知识做一个学生成绩录入与管理的小项目
实现学生个人信息和成绩的录入,实现这些信息的保存,调用,增删改,根据不同选项的成绩进行排序并打印成绩单,还能单个打印一个人的所有成绩等等功能,最好还能读入已有表格和导出排序后表格,但是由于水平有限,想法很好,可是功能只算实现了一半
先记下来吧,看看后期学的差不多了会不会心血来潮的改一改,完成这个半成品
先整完整代码和效果图吧,
package stu;
import java.util.*;
public class AchievementManagement {
static boolean flag=true;
public static void main(String[] agre){
Scanner scanner=new Scanner(System.in);
Listlist=new ArrayList();
//第二步,实现学生信息的录入(完成)(已测试)
Input input=new Input();
while (flag){
Stuednt stuednt=new Stuednt();
input.studentInput(stuednt);
list.add(stuednt);
System.out.println("回车继续输入,退出请输入“000”");
String s=scanner.nextLine();
if (s.equals("000"))
flag=false;
}
input.sort("语文",list);//根据传入不同参数的科目获取每一科的排名,包括了平均分,总分的排名
System.out.println("-----------------");
input.query(list);//打印一份包含所有学生信息和成绩的表格,排序按照前面选择的科目排完序后输出
input.query("张三",list);//根据学生姓名输出学生成绩
}
}
class Stuednt{//第一步,实现类的创建,保存学生信息(完成)
String 姓名,性别,学号;
int 年龄;
int 单人总分=0;
String 科目= "平均分";
int 平均分;
Map Stuachcur = new HashMap<>();
public void getStudent(String 学号,String 姓名, String 性别, int 年龄) {
//if (姓名.getBytes().length == 姓名.length()) 字符格式判断后期添加(未完成)
this.姓名 = 姓名;
this.性别 = 性别;
this.学号 = 学号;
this.年龄 = 年龄;
}
}
class Input{
void studentInput(Stuednt stuednt){
Scanner scanner=new Scanner(System.in);
System.out.println("请按:“学号 姓名 性别 年龄”的格式输入学生信息");
String s=scanner.nextLine();
String[] inf=s.split(" ");//拆分字符串
//设置检测函数,检测输入信息是否符合格式
stuednt.getStudent(inf[0],inf[1],inf[2],Integer.parseInt(inf[3]));
;//学生成绩录入,有点麻烦,先确定科目信息,后录入成绩吧
StuAchInp(stuednt);
}
static String s;
String[] ach;//成绩
String[] cur;//科目
void StuAchInp(Stuednt stuednt){
Scanner scanner=new Scanner(System.in);
if(s==null) {
System.out.println("请输入科目信息,用空格分离:");
s=scanner.nextLine();
s=s.trim();
cur=s.split(" ");//拆分字符串
}
System.out.println("请输入以下格式成绩信息,用空格分离:"+s);
String ss=scanner.nextLine();
ss=ss.trim();
ach=ss.split(" ");//拆分字符串
//System.out.println(cur.length);
System.out.println("-----------------");
for(int i=0;i=0){
stuednt.Stuachcur.put(cur[i],Integer.parseInt(ach[i]));
stuednt.单人总分+=Integer.parseInt(ach[i]);
Integer.parseInt(ach[i]);
}
}
stuednt.Stuachcur.put("单人总分",stuednt.单人总分);
stuednt.平均分=stuednt.单人总分/cur.length;
stuednt.Stuachcur.put("平均分",stuednt.平均分);
for(int i=0;i list){
Stuednt s=new Stuednt();
int flag = 0;
int a=list.size();
for (int i=0;ilist.get(j).Stuachcur.get(科目).intValue()?flag:j;
}
System.out.println("----------"+flag);
s=list.get(flag);
list.remove(flag);
list.add(s);//泡是冒不了了,没办法,选择从集合所有元素找出最大值,添加到末尾,删除原来元素,然后忽略末尾元素重复寻找最大值加到末尾,全部循环完成则排序完成。
flag=0;
//System.out.println("----"+list.size());
}
for (int i=0;i list){
System.out.print("序号t"+"姓名t学号t性别t年龄");
for(int i=0;i list){
int j=0;
for (int i=0;i
完整代码如上所示,也没有多复杂,想来我这个菜鸟现在也搞不出什么复杂的玩意儿。
class Stuednt{//第一步,实现类的创建,保存学生信息(完成)
String 姓名,性别,学号;
int 年龄;
int 单人总分=0;
String 科目= "平均分";
int 平均分;
Map Stuachcur = new HashMap<>();
public void getStudent(String 学号,String 姓名, String 性别, int 年龄) {
//if (姓名.getBytes().length == 姓名.length()) 字符格式判断后期添加(未完成)
this.姓名 = 姓名;
this.性别 = 性别;
this.学号 = 学号;
this.年龄 = 年龄;
}
}
这里有一个学生类用来存储学生信息,包含姓名年龄,学号,性别四个基本信息的存储,里面有一个HashMap的类实现科目和成绩的一一对应和保存,科目需要用户输入所有是没有定义的,本来想把平均分,个人总分都一样定义在HashMap里,但是有一个计算加保存的过程,就在写的过程中添加了平均分,总分的变量。定义String=平均分是为了存入HashMap有一个名字,不过现在想想,为什么一定要存入HashMap?我放外面不行吗?个人总分我貌似就放外面了?不过。。。我后期实现科目名排序的时候,是操作的HashMap里的数据,如果个人总分没放在HashMap里,就没办法用个人总分排序啊???但是平均分的话,似乎也可以代替总分排序?!
好家伙,写的我自己都不好意思了,成绩的格式为什么是int啊,就没有0.5分了吗?
平均分算下来都是整数,离谱啊。
void studentInput(Stuednt stuednt){
Scanner scanner=new Scanner(System.in);
System.out.println("请按:“学号 姓名 性别 年龄”的格式输入学生信息");
String s=scanner.nextLine();
String[] inf=s.split(" ");//拆分字符串
//设置检测函数,检测输入信息是否符合格式
stuednt.getStudent(inf[0],inf[1],inf[2],Integer.parseInt(inf[3]));
;//学生成绩录入,有点麻烦,先确定科目信息,后录入成绩吧
StuAchInp(stuednt);
}
这里定义了学生信息的输入,利用Scanner方法获取输入的信息,切割字符串,转型,调用student类里的getStudent方法把信息录入Student类,后面还有个StuAchInp方法是录入学生成绩的,代码如下:
static String s;
String[] ach;//成绩
String[] cur;//科目
void StuAchInp(Stuednt stuednt){
Scanner scanner=new Scanner(System.in);
if(s==null) {
System.out.println("请输入科目信息,用空格分离:");
s=scanner.nextLine();
s=s.trim();
cur=s.split(" ");//拆分字符串
}
System.out.println("请输入以下格式成绩信息,用空格分离:"+s);
String ss=scanner.nextLine();
ss=ss.trim();
ach=ss.split(" ");//拆分字符串
//System.out.println(cur.length);
System.out.println("-----------------");
for(int i=0;i=0){
stuednt.Stuachcur.put(cur[i],Integer.parseInt(ach[i]));
stuednt.单人总分+=Integer.parseInt(ach[i]);
Integer.parseInt(ach[i]);
}
}
stuednt.Stuachcur.put("单人总分",stuednt.单人总分);
stuednt.平均分=stuednt.单人总分/cur.length;
stuednt.Stuachcur.put("平均分",stuednt.平均分);
for(int i=0;i
定义了一个静态变量s保存输入的科目字符串信息,如果为空就表示还没有输入过科目,所有要先输入一次科目信息,之后输入第二个人的信息以后,录入科目成绩的时候,就不用重新输入科目了
还有几行代码判断输入的成绩是不是在0~100之间,如果不在就。。。。。就啥也没有,好吧,我没有注意到这里,不过也不知道能不能添加一个重新输入的语句,不知道递归一下可不可以?
循环过程搞定了个人总分的录入,循环外面搞定平均分,然后输出一下科目和对应的成绩。
接下来有一个对listj集合元素进行排序的方法,不过今天继续学习看课程了解了一种更方便的办法,总觉得自己的办法太垃圾了,果然是学无止境,今天的自己就能吊打昨天的自己。就花点功夫重写一下吧,顺便试试今天的学习成果。
class Stuednt implements Comparable{//第一步,实现类的创建,保存学生信息(完成)
String 姓名,性别,学号;
int 年龄;
int 单人总分=0;
String 科目= "平均分";
int 平均分;
String 科;
Map Stuachcur = new HashMap<>();
public void set科(String 科) {
this.科 = 科;
}
public void getStudent(String 学号, String 姓名, String 性别, int 年龄) {
//if (姓名.getBytes().length == 姓名.length()) 字符格式判断后期添加(未完成)
this.姓名 = 姓名;
this.性别 = 性别;
this.学号 = 学号;
this.年龄 = 年龄;
}
public int compareTo(Stuednt o) {
if (this.Stuachcur.get(科)>o.Stuachcur.get(科目))
return 1;
return -1;
}
public String toString(){
return Stuachcur.get(科)+" "+姓名;
}
}
这里的Student类继承Comparable接口,实现一个compareTo的方法,这个方法是一个比较器,如果当前类里的要比较的值大于传入类的比较值返回1,小于返回-1,等于返回0,只不过我懒得写返回零了,就1和-1两种情况试试吧。
构造比较参数后,在主函数里调用Collections.sort(list);方法进行排序,输出结果如图:
上面是没调用排序方法前,下面是排序后,比我前面自己写的排序方法方便多了。
后面就是打印个人成绩和所有人成绩的两个方法,也没什么意思,就不说了。
行吧,马马虎虎就这么过去吧,以后有心情在完善



