1、内容要求
编写一个学生成绩管理系统。学生的属性包括学号、姓名、年龄等。每个学生要学习若干课程,每门课程有平时成绩、期中考试成绩、期末考试成绩以及总评成绩,其中总评成绩=平时成绩*30%+期中成绩*30%+期末成绩*40%。请先设计合理的类存放这些信息,然后设计程序完成以下功能:
- 列出某个学生的所有成绩;
- 列出某门课程每个学生的总评成绩,及所有学生总评成绩的平均值;
- 分区段统计某门课程的学生总评成绩,例如60分以下的学生人数、60至70分的学生人数等。
2.设计思路
根据需求,需要设计四个类来实现整个学生成绩管理系统。分别为:
(1)学生信息类
需求:存放学生的基本信息(如:姓名、学号、年龄、选修课程)、初始化学生信息、打印学生信息
实现:
1.定义Private类型的学生属性,通过Get和Set方法修改学生属性;
2.通过构造方法初始化学生信息;
3.重写toString方法打印学生信息
(2)学生成绩类
需求:存放学生每门课程信息(如:学生姓名、课程名、平时成绩、期中成绩、期末成绩)、初始化学生成绩、计算学生总评成绩、打印学生成绩信息
实现:
1.定义Private类型的学生成绩属性,通过Get和Set方法修改学生成绩属性;
2.通过构造方法初始化学生成绩信息;
3.定义getAllGrade方法计算总评成绩;
4.重写toString方法打印学生成绩信息
(3)方法类
需求:添加学生的个人信息和成绩、查询所有的学生信息和成绩、查询课程的总评成绩和平均分、分区段统计课程成绩
实现:
1.定义一个方法添加学生信息,在添加时需要判断学生学号是否重复、输入的年龄和成绩是否合适;
2.定义一个方法打印要查询的学生信息,需要先判断要查询的学生是否存在;
3.定义一个方法查询打印所有学生信息;
4.定义一个方法统计课程总评成绩和平均分,需要先判断输入课程是否有人选修;
5.定义一个方法,分区段统计课程成绩,需要先判断输入的课程是否有人选修。
(4)测试类
需求:创建功能菜单
实现:
1.添加学生信息及成绩
2.查询学生信息及成绩
3.查询所有学生信息及成绩
4.查询课程总评成绩及平均分
5.分区段统计课程成绩
6.退出系统
请输入选项:
3、程序核心代码和运行效果
开发环境:JDK17;IntelliJ IDEA
略...
参考代码:
Student.java
import java.util.Arrays;
public class Student {
//定义学生类的属性
private String name;
private String id;
private int age;
private String[] scores = new String[10];
//空参构造
public Student() {
}
//带参构造
public Student(String name, String id, int age, String[] scores) {
this.name = name;
this.id = id;
this.age = age;
this.scores = scores;
}
//get和set方法
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String[] getScores() {
return scores;
}
public void setScores(String[] scores) {
this.scores = scores;
}
//重写toString
@Override
public String toString() {
return "学生信息{" +
"姓名:" + name +
", 学号:" + id +
", 年龄:" + age +
", 所学课程:" + Arrays.toString(scores) +
'}';
}
}
Scores.java
public class Scores {
//定义成绩类中的属性
private String scores;
private String name;
private double usualGrade;
private double minGrade;
private double endGrade;
//空参构造
public Scores() {
}
//代餐构造
public Scores(String name, String scores, double usualGrade, double minGrade, double endGrade) {
this.name = name;
this.scores = scores;
this.usualGrade = usualGrade;
this.minGrade = minGrade;
this.endGrade = endGrade;
}
//get和set方法
public String getScores() {
return scores;
}
public void setScores(String scores) {
this.scores = scores;
}
public double getUsualGrade() {
return usualGrade;
}
public void setUsualGrade(double usualGrade) {
this.usualGrade = usualGrade;
}
public double getMinGrade() {
return minGrade;
}
public void setMinGrade(double minGrade) {
this.minGrade = minGrade;
}
public double getEndGrade() {
return endGrade;
}
public void setEndGrade(double endGrade) {
this.endGrade = endGrade;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
//获得总评成绩的方法
public double getAllGrade() {
return usualGrade * 0.3 + minGrade * 0.3 + endGrade * 0.4;
}
//重写toString
@Override
public String toString() {
return "成绩{" +
"科目:" + scores +
", 平时成绩:" + usualGrade +
", 期中成绩:" + minGrade +
", 期末成绩:" + endGrade +
", 总评成绩:" + getAllGrade() +
'}';
}
}
Method.java
import java.util.ArrayList;
import java.util.Scanner;
public class Method {
//添加学生信息及成绩
public static void addStudent(ArrayList<Student> list1, ArrayList<ArrayList<Scores>> list2) {
System.out.println("---添加学生信息---");
Scanner sc = new Scanner(System.in);
//录入学生信息
System.out.println("请输入学生学号:");
String id = null;
while (true) {
id = sc.next();
//判断输入的ID是否合法
if (!(id.matches("[1-9]\\d{11}"))) {
System.out.println("输入的学生ID不合法,请重新输入");
}
//判断输入的学生是否存在
else if (getIndex(list1, id) >= 0) {
System.out.println("该学生信息已存在,请重新输入");
} else {
break;
}
}
System.out.println("请输入学生姓名:");
String name = sc.next();
System.out.println("请输入学生年龄:");
int age = 0;
while (true) {
age = sc.nextInt();
if (!(Integer.toString(age).matches("[1-3]\\d"))) {
System.out.println("输入的年龄不符合要求,请重新输入");
} else {
break;
}
}
System.out.println("请输入学生所学课程:");
sc.nextLine();
//接受录入的学生课程,并将其分割开,放入数组中
String scores = sc.nextLine();
String[] s = scores.split(" ");
//创建对象,接受学生信息
Student s2 = new Student(name, id, age, s);
//录入学生成绩
//获取该学生的课程数目
int a = s.length;
//定义学生成绩的多个属性
double usualGrade = 0;
double minGrade = 0;
double endGrade = 0;
//定义接受学生课程名的变量
String sco = null;
/*
创建ArrayList集合,接受课程所对应的不同类型的成绩
一个学生有一个对应的成绩集合,这个集合里面存放该学生各个课程的成绩
*/
ArrayList<Scores> list = new ArrayList<>();
//循环,录入学生成绩
while (a != 0) {
//获取学生课程名
sco = s[s.length - a];
System.out.println("请输入" + sco + "平时成绩、期中成绩、期末成绩:");
//接受录入的成绩,并将其分割开,放入数组中
String g = sc.nextLine();
String[] grade = g.split(" ");
//判断输入的成绩是正确
boolean b = cheekGrade(grade, sco);
if (b) {
continue;
}
//获取学生不同类型的成绩。使用parseDouble方法,将字符串转换成浮点型
usualGrade = Double.parseDouble(grade[0]);
minGrade = Double.parseDouble(grade[1]);
endGrade = Double.parseDouble(grade[2]);
a--;
//创建对象,接受学生成绩信息
Scores s1 = new Scores(name, sco, usualGrade, minGrade, endGrade);
//将元素添加进集合
list.add(s1);
}
//将元素添加到对应的集合
list2.add(list);
list1.add(s2);
}
//通过ID获取索引,判断学生是否存在
public static int getIndex(ArrayList<Student> list, String id) {
//遍历集合
for (int i = 0; i < list.size(); i++) {
//获取每一个学生对象
Student stu = list.get(i);
//获取每一个学生对象ID
String sid = stu.getId();
//集合中学生ID和输入的学生ID进行比较
if (sid.equals(id)) {
//存在,返回索引
return i;
}
}
//循环结束,不存在,返回-1
return -1;
}
//判断学生成绩是否正确
public static boolean cheekGrade(String[] str, String sco) {
//判断录入的成绩数量是否正确
if (str.length != 3) {
//不正确给出提醒,返回true
System.out.println("您少输入" + sco + "课程的成绩了,请重新输入");
return true;
}
//遍历字符串数组,判断成绩是否合法
for (int i = 0; i < str.length; i++) {
//使用parseDouble方法,将字符串转换成浮点型
double grade = Double.parseDouble(str[i]);
//判断成绩是否合法
if (grade < 0 || grade > 100) {
System.out.println("您输入的成绩不合理,请重新输入");
return true;
}
}
return false;
}
//查询学生信息及成绩
public static void queryStudent(ArrayList<Student> list1, ArrayList<ArrayList<Scores>> list2) {
System.out.println("---查询学生信息---");
System.out.println("请输入要查询学生的学号");
Scanner sc = new Scanner(System.in);
while (true) {
//输入要查询的学生ID
String studentID = sc.next();
//获取学生信息索引
int index = getIndex(list1, studentID);
//判断学生是否存在着
if (index < 0) {
System.out.println("您要查询的学生不存在,请重新输入");
continue;
}
//打印学生信息
System.out.println(list1.get(index));
ArrayList<Scores> list = list2.get(index);
for (Scores scores : list) {
System.out.println(scores);
}
break;
}
}
//查询所有学生信息及成绩
public static void queryAllStudent(ArrayList<Student> list1, ArrayList<ArrayList<Scores>> list2) {
System.out.println("---查询所有学生信息及成绩---");
//遍历学生信息集合
for (int i = 0; i < list1.size(); i++) {
//获取索引对应的学生信息,并打印
Student student = list1.get(i);
System.out.println(student);
/*
因为学生信息与学生成绩集合索引位置一一对应,
所以通过学生信息的索引可以从成绩集合中获取存放该学生个人成绩的集合
*/
ArrayList<Scores> list = list2.get(i);
//遍历学生个人成绩集合,并打印
for (Scores scores : list) {
System.out.println(scores);
}
System.out.println();
}
}
//查询课程总评成绩及平均分
public static void queryScores(ArrayList<ArrayList<Scores>> list2) {
System.out.println("---查询课程总评成绩及平均分---");
//定义变量接收总成绩及数量
double sum = 0;
double index = 0;
Scanner sc = new Scanner(System.in);
System.out.println("请输入要查询的课程");
String sco = null;
while (true) {
//键盘录入需要查询的课程名
sco = sc.next();
boolean b = cheekScores(list2, sco);
//判断课程是否存在
if (b) {
System.out.println("要查询的课程不存在,请重新输入");
} else {
break;
}
}
System.out.println("选修" + sco + "课程的学生的总评成绩如下:");
//遍历成绩集合,获取选项该课程的所有学生成绩信息
for (ArrayList<Scores> list : list2) {
for (Scores scores : list) {
if (scores.getScores().equals(sco)) {
sum = sum + scores.getAllGrade();
index++;
System.out.println(scores.getName() + "的总评成绩为:" + scores.getAllGrade());
}
}
}
//打印总评成绩平均分
System.out.println(sco + "课程总评成绩平均分:" + sum / index);
}
//分区段统计课程成绩
public static void countScores(ArrayList<ArrayList<Scores>> list2) {
System.out.println("---分区段统计课程成绩---");
Scanner sc = new Scanner(System.in);
System.out.println("请输入要查询的课程");
String score = null;
while (true) {
//键盘录入需要查询的课程名
score = sc.next();
boolean b = cheekScores(list2, score);
//判断课程是否存在
if (b) {
System.out.println("要统计的课程不存在,请重新输入");
} else {
break;
}
}
//调用成绩分级方法
int[] matchScores = matchScores(list2, score);
//打印分区段成绩
System.out.println("成绩在[100,90)以内的学生有" + matchScores[0] + "人");
System.out.println("成绩在[90,80)以内的学生有" + matchScores[1] + "人");
System.out.println("成绩在[80,70)以内的学生有" + matchScores[2] + "人");
System.out.println("成绩在[70,60)以内的学生有" + matchScores[3] + "人");
System.out.println("成绩在60分以下的学生有" + matchScores[4] + "人");
}
//判断课程是否存在
public static boolean cheekScores(ArrayList<ArrayList<Scores>> list2, String sco) {
//遍历学生成绩集合
for (ArrayList<Scores> list : list2) {
//遍历学生个人成绩集合
for (Scores scores : list) {
//只要有一个符合就表示改门课程有人选修,返回false
if (scores.getScores().equals(sco)) {
return false;
}
}
}
//如果遍历完集合没有人选修这课程,表示这么课程不存在,返回true
return true;
}
//课程分级方法
public static int[] matchScores(ArrayList<ArrayList<Scores>> list2, String sco) {
//定义分区段计数变量
int count1, count2, count3, count4, count5;
count1 = count2 = count3 = count4 = count5 = 0;
//变量成绩集合
for (ArrayList<Scores> list : list2) {
//遍历学生个人成绩集合
for (Scores scores : list) {
//判断是否为要统计的课程
if (scores.getScores().equals(sco)) {
//获取该学生这么课程的总评成绩
double allGrade = scores.getAllGrade();
//分区段统计
if (allGrade <= 100 && allGrade > 90) {
count1++;
} else if (allGrade <= 90 && allGrade > 80) {
count2++;
} else if (allGrade <= 80 && allGrade > 70) {
count3++;
} else if (allGrade <= 70 && allGrade > 60) {
count4++;
} else {
count5++;
}
}
}
}
//放回统计好的成绩
int[] a = {count1, count2, count3, count4, count5};
return a;
}
}
StudentSystem.java
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Scanner;
public class StudentSystem {
public static void main(String[] args) {
//创建学生信息集合,存放每一个学生的信息
ArrayList<Student> list1 = new ArrayList<>();
//创建学生成绩集合,存放每一个学生的成绩集合
ArrayList<ArrayList<Scores>> list2 = new ArrayList<>();
//维持系统一直运行,防止系统运行一次后关闭
while (true) {
//打印功能菜单
System.out.println("=========================欢迎来到学生成绩管理系统============================");
System.out.println("1.添加学生信息");
System.out.println("2.查询学生信息");
System.out.println("3.查询所有学生信息及成绩");
System.out.println("4.查询课程总评成绩及平均分");
System.out.println("5.分区段统计课程成绩");
System.out.println("6.退出系统");
System.out.println("请输入选项:");
//键盘录入选项
Scanner sc = new Scanner(System.in);
String choose = sc.next();
//判断输入的选项,实行相应的功能
switch (choose) {
case "1" -> Method.addStudent(list1, list2);
case "2" -> Method.queryStudent(list1, list2);
case "3" -> Method.queryAllStudent(list1, list2);
case "4" -> Method.queryScores(list2);
case "5" -> Method.countScores(list2);
case "6" -> {
System.out.println("退出");
System.exit(0);
}
//如果输入的选项不存在,则提醒用户没有改选项
default -> System.out.println("没有这个选项");
}
}
}
}