Java学生成绩管理系统

news2024/11/20 9:22:38

1、内容要求

        编写一个学生成绩管理系统。学生的属性包括学号、姓名、年龄等。每个学生要学习若干课程,每门课程有平时成绩、期中考试成绩、期末考试成绩以及总评成绩,其中总评成绩=平时成绩*30%+期中成绩*30%+期末成绩*40%。请先设计合理的类存放这些信息,然后设计程序完成以下功能:

  1. 列出某个学生的所有成绩;
  2. 列出某门课程每个学生的总评成绩,及所有学生总评成绩的平均值;
  3. 分区段统计某门课程的学生总评成绩,例如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("没有这个选项");
            }
        }
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/106497.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Span-level Bidirectional Network(2022 EMNLP)

论文题目&#xff08;Title&#xff09;&#xff1a;A Span-level Bidirectional Network for Aspect Sentiment Triplet Extraction 研究问题&#xff08;Question&#xff09;&#xff1a;方面情感三元组提取(ASTE)是一种新的细粒度情感分析任务&#xff0c;旨在从评论句中提…

【ML】机器学习中的十大深度学习算法

&#x1f50e;大家好&#xff0c;我是Sonhhxg_柒&#xff0c;希望你看完之后&#xff0c;能对你有所帮助&#xff0c;不足请指正&#xff01;共同学习交流&#x1f50e; &#x1f4dd;个人主页&#xff0d;Sonhhxg_柒的博客_CSDN博客 &#x1f4c3; &#x1f381;欢迎各位→点赞…

RTOS多任务切换实现

实现任务需要的基础知识 1、程序内部细节 通过分析C语言程序的编码会发现程序都是一些指令和数据。 什么是程序&#xff1f; 指令运行过程中的数据 2、常用汇编指令 汇编指令详解 3、ARM架构过程调用标准AAPCS 传参&#xff1a; 通过r0-r3传递&#xff0c;多于4个参数的部…

【矩阵论】6. 范数理论——基本概念——向量范数与矩阵范数

6.1 基本概念 6.1.1 向量范数 a. 模长&#xff08;二范数&#xff09; Cn中向量X(x1x2⋮xn)的模长为∣X∣(X,X)tr(AHA)∣x1∣2∣x2∣2⋯∣xn∣2C^n中向量 X\left( \begin{matrix} x_1\\x_2\\\vdots\\x_n \end{matrix} \right)的模长为 \vert X\vert\sqrt{(X,X)}\sqrt{tr(A^HA…

nginx+keeplived 实现高可用 Web 负载均衡

nginxkeeplived 实现高可用 Web 负载均衡 一、架构简介 在系统设计中&#xff0c;可以利用Nginx的反向代理和负载均衡实现后端应用的高可用性&#xff0c;同时我们还需要考虑Nginx的单点故障。如果Nginx所在服务器宕机&#xff0c;或者Nginx服务不可用就会造成整个系统的不可…

鸡蛋车的控制律

这个老头像幽灵&#xff0c; ​拿个鸡蛋来炸群。 ​只见动画不见车&#xff0c; ​骗人无果还丢人&#xff01; 温州一个做汽车驾驶模拟器的&#xff0c;在重庆为我约了美女&#xff0c;为鸡蛋车站台。他掏空口袋砸我&#xff0c;材料、工资、车马&#xff0c;都是他担。 余姚一…

代码随想录算法训练营第十天(字符串)| 232.用栈实现队列,225. 用队列实现栈

代码随想录算法训练营第九天&#xff08;字符串&#xff09;| 232.用栈实现队列&#xff0c;225. 用队列实现栈 232. 用栈实现队列 大家可以先看视频&#xff0c;了解一下模拟的过程&#xff0c;然后写代码会轻松很多。 题目链接/文章讲解/视频讲解&#xff1a; 看到题目的…

react笔记_08生命周期

目录生命周期(旧)生命周期componentWillMountcomponetdidMountshouldComponentUpdatecomponentWillUpdatecomponentDidUpdatecomponentWillUnmountcomponentWillReceiveProps组件的挂载、更新、销毁案例1渲染过程更新过程1-通过setState去修改数据更新过程2-通过forceUpdate强制…

用Python分析《阿凡达·水之道》的豆瓣短评

《阿凡达水之道》于2022年12月16日上映。第一部的口碑、评分等都非常高&#xff0c;第二部是否能延续呢&#xff0c;本文获取了该电影的豆瓣短评&#xff0c;进行了初步的分析&#xff0c;看下观众都是如何评价的。 数据获取 打开豆瓣首页&#xff0c;搜索电影名&#xff0c;进…

Spring(三): 使用注解来存储和读取Bean对象

目录一、存储Bean对象1.1 配置扫描路径1.2 使用注解存储Bean对象1.3 通过上下文读取Bean对象1.4 Bean命名规则1.5 方法注解 Bean1.5 重命名Bean二、获取Bean对象2.1 属性注入2.2 Setter注入2.3 构造方法注入2.4 Resource注解2.5 Resource注解中name参数的作用一、存储Bean对象 …

说明书丨艾美捷Annexin-V-Cy3凋亡检测试剂盒

Cy3标记的重组人膜联蛋白V显示亮红色荧光&#xff08;Ex&#xff08;max&#xff09;:543nm&#xff1b;Em&#xff08;最大值&#xff09;&#xff1a;570nm&#xff09;。 艾美捷Annexin-V-Cy3凋亡检测试剂盒化学性质&#xff1a; Applications: Flow Cytometry, Fluorescen…

C++【修理之路】初识string

这里写目录标题为什么学习string类&#xff1f;标准库中的string类string的定义转换为C风格的字符串string类的输出和输出访问字符串中的字符字符串的拼接string 字符串的增删改查总结为什么学习string类&#xff1f; C语言中&#xff0c;字符串是以’\0’结尾的一些字符的集合…

3D数学之四元数 学习笔记

四元数有三个虚部&#xff0c;一个实部 [ w (x y z) ] w xi yj zk i j k ijk -1 用于表示&#xff0c;物体在空间中的任意角度旋转 四元数的模 Sqrt(pow(w, 2) pow(x, 2) pow(y, 2) pow(z, 2)) 四元数共轭&#xff1a;p a bi 共轭为&#xff1a; p a - bi …

一文梳理 | 电力企业网络安全管理及等级保护工作重点

前言 为加强电力行业网络安全监督管理&#xff0c;规范电力行业网络安全工作&#xff0c;国家能源局近日印发《电力行业网络安全管理办法》和《电力行业网络安全等级保护管理办法》&#xff08;以下简称“两办法”&#xff09;&#xff0c;有效期均为5年。随着这两部规范性文件…

门神 马丁内斯 要什么样的成就,才不枉这些年的颠沛流离

2022-12-18日 随着劳塔罗的最后一球波网而入 阿根廷成功获得了卡塔尔世界杯的冠军 结束后 所有人都去拥抱劳塔罗 只有梅西拉起了倒在地上的马丁内斯 很多人说 在这次比赛中 阿根廷有两个神 一个是球王梅西 另一个则是 门将 马丁内斯 当场上二比零时 所有人都以为阿根廷胜券在…

(二)汇编语言——寄存器

目录 通用寄存器 汇编指令 物理地址 接下来我们来介绍寄存器&#xff0c;同时会介绍一些基本的语句&#xff08;mov,add等)&#xff0c;好了&#xff0c;就让我们进入今天的学习吧&#xff01;同时&#xff0c;我们以8086为例子来介绍&#xff0c;参考来自王爽老师的书。 说…

JAVA架构与开发(从0开始搭建一个springCloud web项目)

从0开始搭建一个springCloud web项目。 一、首先需要的开发工具&#xff1a; 1、SpringToolSuite4 &#xff0c;个人目前用的最熟练的JAVA开发工具。 2、JDK1.8&#xff0c;按照网上安装jdk的步骤安装就行。 3、maven-3.6.1 4、springBoot官网 Spring Boot 5、配置中心 Apo…

架构师必读 —— 逻辑模型(14)

从"is/is not" "before / after”的角度思考 遇到问题时&#xff0c;为了研究“为什么会发生这种问题”&#xff0c;可以将问题发生之前和发生后做一个对比&#xff0c;这样效果会更明显。通过明确差距&#xff08;差异&#xff09;&#xff0c;可以比较"在…

前端学习-创建vue项目

1.下载vscode windows系统安装第一个 linux系统安装第二个 苹果系统安装第三个 vscode 官网下载地址 下载地址&#xff1a;https://code.visualstudio.com/Download 2.下载git 选择对应的系统下载&#xff0c;跟随官网提示操作 下载地址&#xff1a;https://git-scm.com/down…

C++多线程编程基础

1.创建线程Thread 首先要引入头文件#include&#xff0c;管理线程的函数和类在该头文件中声明&#xff0c;其中包括std::thread类。 语句"std::thread th1(proc1);"创建了一个名为th1的线程&#xff0c;并且线程th1开始执行。 实例化std::thread类对象时&#xff…