基于Java零基础实现《学生成绩管理系统》的简单小项目

基于Java零基础实现《学生成绩管理系统》的简单小项目

 

声明:由于本人基础薄弱,最近在恶补Java语言能力,故利用这些小项目练习Java基础能力,Java大佬请绕行,当然也可以给点建议再走

 

这个小程序涉及到了以下知识点:

  1. Java基础知识
  2. 队列《数据结构》
  3. 单例模式“双检锁/双重校验锁(DCL,即 double-checked locking)”

废话不多说,来给大家看看运行的效果吧!

首先会获取班级人数

 知识点:这个也就是队列的最大容量

然后会显示信息菜单操作,这一步很简单的。

因为队列中没有数据存在的原因,我们先选择“a(add):添加学生成绩信息”。

最后我们可以查看信息的显示。

 

接下来我们来显示项目的创建吧!本人默认正在看博客的你会用“IDEA”创建项目工程的,所以怎么新建工程我就不讲了。这个项目一共就涉及三个类“ArrayQueue”、“Student”、“ArrayQueueDome

ArrayQueue类(用队列来存储学生成绩信息)

//使用数组模拟队列-编写一个ArrayQueue类
public class ArrayQueue {
    private int maxSize;//表示数组的最大容量
    private int front;//队列头
    private int rear;//队列尾
    private Student[] arr;//该数据用于存放数据,模拟队列

    //创建队列的构造器
    public ArrayQueue(int arrMaxSize){
        maxSize=arrMaxSize;
        arr=new Student[maxSize];
        front=-1;//指向队列头部,分析出from是指向队列头的前一个位置
        rear=-1;//指向队列尾,指向队列尾的数据(即就是队列最后一个数据)
    }

    //判断对列是否满
    public boolean isFull(){
        return rear==maxSize-1;
    }
    //判断对列是否为空
    public boolean isEmpty(){
        return rear==front;
    }

    //添加数据到对列
    public void addQueue(Student student){
        //判断对列是否满
        if (isFull()){
            System.out.println("对列满,不能加入数据~");
            return;
        }
        rear++;//让rear后移
        arr[rear]=student;
    }


    //获取对列的数据,出队列
    public Student getQueue(){
        //判断队列是否空
        if(isEmpty()){
            //通过抛出异常
            throw new RuntimeException("队列空,不能取数据~~~");
        }
        System.out.println("姓名\t\t年龄\t\t学号\t\t语文\t\t数学\t\t英语\t\t综合");
        front++;//front后移
        return arr[front];
    }

    //显示对列的所有数据
    public void showQueue(){
        //遍历
        if(isEmpty()){
            System.out.println("队列空的,没有数据~~");
            return;
        }
        System.out.println("姓名\t\t年龄\t\t学号\t\t语文\t\t数学\t\t英语\t\t综合");
        for (int i=0;i<arr.length;i++){
            if (arr[i]!=null){
                System.out.println(arr[i]);
            }
        }
    }


    //显示对列的头数据,注意不是取出数据
    public Student headQueue(){
        //判断
        if (isEmpty()){
            throw new RuntimeException("队列空的,没有数据~~");
        }
        System.out.println("姓名\t\t年龄\t\t学号\t\t语文\t\t数学\t\t英语\t\t综合");
        return arr[front+1];
    }

}

Student类(用来构建学生对象,涉及到了单例模式,可以着重看一下

public class Student {
    private String name;
    private int age;
    private int id;
    private double ChinsesGrade;//语文成绩
    private double MathGrade;//数学成绩
    private double EnglishGrade;//英语成绩
    private double OverallBandScore;//综合成绩

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public double getChinsesGrade() {
        return ChinsesGrade;
    }

    public void setChinsesGrade(double chinsesGrade) {
        ChinsesGrade = chinsesGrade;
    }

    public double getMathGrade() {
        return MathGrade;
    }

    public void setMathGrade(double mathGrade) {
        MathGrade = mathGrade;
    }

    public double getEnglishGrade() {
        return EnglishGrade;
    }

    public void setEnglishGrade(double englishGrade) {
        EnglishGrade = englishGrade;
    }

    public double getOverallBandScore() {
        return OverallBandScore;
    }

    public void setOverallBandScore(double overallBandScore) {
        OverallBandScore = overallBandScore;
    }

    public static void setStudent(Student student) {
        Student.student = student;
    }
    public void setOverallBandScore(int overallBandScore) {
        OverallBandScore = overallBandScore;
    }
    

    /**双重校验锁(DCL,即 double-checked locking)

      *JDK 版本:JDK1.5 起

      *是否 Lazy 初始化:是

      *是否多线程安全:是

      *实现难度:较复杂

      *描述:这种方式采用双锁机制,安全且在多线程情况下能保持高性能。
 
      *getInstance() 的性能对应用程序很关键。
*/

//采用volatile修饰 这里会涉及到面试的问题,可以看文章最后的面试问题    
    private volatile static Student student;
    private Student(String name,int age,int id,double ChineseGrade,double MathGrade,double EnglishGrade,double OverallBandScore){
        this.name=name;
        this.age=age;
        this.id=id;
        this.ChinsesGrade=ChineseGrade;
        this.MathGrade=MathGrade;
        this.EnglishGrade=EnglishGrade;
        this.OverallBandScore=OverallBandScore;
    }

    public static Student getStudent(String name,int age,int id,double ChineseGrade,double MathGrade,double EnglishGrade,double OverallBandScore) {
        if (student==null){
            synchronized (Student.class){
                if (student==null){
                    student=new Student(name,age,id,ChineseGrade,MathGrade,EnglishGrade,OverallBandScore);
                }
            }
        }
        return student;
    }
//以上都是单例实例


//为了打印学生信息美观,重写toString()方法
    @Override
    public String toString() {
        return name + '\t' +age + '\t' +id + '\t' +ChinsesGrade + '\t' +MathGrade + '\t' +EnglishGrade + '\t' + OverallBandScore ;
//        return "Student{" +
//                "name='" + name + '\'' +
//                ", age=" + age +
//                ", id=" + id +
//                ", ChinsesGrade=" + ChinsesGrade +
//                ", MathGrade=" + MathGrade +
//                ", EnglishGrade=" + EnglishGrade +
//                ", OverallBandScore=" + OverallBandScore +
//                '}';
    }
}

ArrayQueueDome类(涉及到Scanner、swtch)

import java.util.Scanner;

public class ArrayQueueDome {
    public static void main(String[] args) {
        Scanner scanner= new Scanner(System.in);
        //测试一把
        //创建一个队列
        String name;
        int age;
        int id;
        double ChinsesGrade;
        double MathGrade;
        double EnglishGrade;
        double OverallBandScore;
        System.out.println("请输入班级人数:");
        int StuNum=scanner.nextInt();
        ArrayQueue arrayQueue=new ArrayQueue(StuNum);
        char key= ' ';//接受用户输入
        boolean loop=true;
        //输出一个菜单
        while(loop){
            System.out.println("s(show):显示学生信息");
            System.out.println("e(exit):退出学生成绩管理系统");
            System.out.println("a(add):添加学生成绩信息");
            System.out.println("g(get):查询学生成绩信息");
            System.out.println("h(head):查看第一名学生");
            key=scanner.next().charAt(0);//接受一个字符
            switch (key){
                case 's':
                    arrayQueue.showQueue();
                    break;
                case 'e':
                    System.exit(0);
                case 'a':
                    System.out.println("请输入姓名:");
                    name=scanner.next();
                    System.out.println("请输入年龄:");
                    age= scanner.nextInt();
                    System.out.println("请输入学号:");
                    id=scanner.nextInt();
                    System.out.println("请输入语文成绩:");
                    ChinsesGrade=scanner.nextDouble();
                    System.out.println("请输入数学成绩:");
                    MathGrade=scanner.nextDouble();
                    System.out.println("请输入英语成绩:");
                    EnglishGrade=scanner.nextDouble();
                    System.out.println("请输入综合成绩:");
                    OverallBandScore=scanner.nextDouble();
                    arrayQueue.addQueue(Student.getStudent(name,age,id,ChinsesGrade,MathGrade,EnglishGrade,OverallBandScore));
                    break;
                case 'g':
                    try {
                        Student res=arrayQueue.getQueue();
                        System.out.println(res);
                    }catch (Exception e){
                        System.out.println(e.getMessage());
                    }
                    break;
                case 'h':
                    try {
                        Student res=arrayQueue.headQueue();
                        System.out.println(res);
                    }catch (Exception e){
                        System.out.println(e.getMessage());
                    }
                    break;
                default:
                    break;

            }
        }
    }
}

Java面试会出的几个面试题:

  • Java并发这块了解的怎么样?说说你对volatile关键字的理解。
    • 就我理解的而言,被volatile修饰的共享变量,就具有了以下两点特性:
      • 1. 保证了不同线程对该变量操作的内存可见性;
      • 2. 禁止指令重排序
  • 能不能详细说下什么是内存可见性,什么又是重排序呢?
  • 那你具体说说这三个特性呢?
  • volatile关键字如何满足并发编程的三大特性的?
  • volatile的两点内存语义能保证可见性和有序性,但是能保证原子性吗?

以上volatile的面试问题都是我白嫖的(我这个小白可不会这么多)如果你对这些问题也一脸懵逼,你可以看一下大神对volatile的见解“面试官最爱的volatile关键字

  • 你知道单例模式吗?(单例模式特点(什么是单例模式)?)
    • 单例类只能有一个实例。
    • 单例类必须自己创建自己的唯一实例。
    • 单例类必须给所有其他对象提供这一实例。
  • 单例模式的作用(用单例模式的目的)?
    • Singleton模式主要作用是保证在Java应用程序中,一个类Class只有一个实例存在。
  • 一般Singleton模式通常有几种种形式:
    • 这个我就不回答了,感兴趣的童鞋可以自己去查询一下资料

注意:不出意外的话,这几天我会再写一篇《学生成绩管理系统》涉及到的知识点有算法排序,感兴趣的童鞋,可以关注一下。

我是Java小白,我们一起努力学Java吧!(我是2020年07月28日正式开始学习Java语言的,目标四个月后可以实现“北漂”的梦)。

项目源代码获取我会发在评论区里,我建议像我一样基础不好的童鞋可以自己动手敲一遍!!!

源代码

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
package cn.com.dao.chivementdao; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import cn.com.util.DBConnection; import cn.com.util.DBSql; import cn.com.vo.chivementvo.ChivementVo; public class ExamDao { private Connection conn = DBConnection.getConnectionOracle(); private ChivementVo examVo; public ExamDao() { } public ExamDao(ChivementVo examVo) { super(); this.examVo = examVo; } /** * 全部查询 */ public Object[][] selectAll() { Object date[][] = null; int max = 0; int i = 0; PreparedStatement ps = null; ResultSet rs = null; try { ps = conn.prepareStatement(DBSql.SELECT_ALL); rs = ps.executeQuery(); // 得到列数 max = rs.getMetaData().getColumnCount(); date = new Object[getnumberAll(DBSql.SELECT_ALL_COUNT)][max]; while (rs.next()) { for (int j = 0; j < max; j++) { date[i][j] = rs.getObject(j + 1); } i++; } // rs.close(); // ps.close(); // conn.close(); } catch (SQLException e) { e.printStackTrace(); } return date; } /** * 根据学号查询 */ public Object[][] selectBySid() { Object date[][] = null; int max = 0; int i = 0; PreparedStatement ps = null; ResultSet rs = null; try { ps = conn.prepareStatement(DBSql.SELECT_BY_S_ID); ps.setInt(1, examVo.getS_id()); rs = ps.executeQuery(); // 得到列数 max = rs.getMetaData().getColumnCount(); date = new Object[getnumber(DBSql.SELECT_BY_S_ID_COUNT, examVo .getS_id())][max]; while (rs.next()) { for (int j = 0; j < max; j++) { date[i][j] = rs.getObject(j + 1); } i++; } // rs.close(); // ps.close(); // conn.close(); } catch (SQLException e) { e.printStackTrace(); } return date; } /** * 根据组号查询 */ public Object[][] selectByGid() { Object date[][] = null; int max = 0; int i = 0; PreparedStatement ps = null; ResultSet rs = null; try { ps = conn.prepareStatement(DBSql.SELECT_BY_G_ID); ps.setInt(1, examVo.getG_id()); rs = ps.executeQuery(); // 得到列数 max = rs.getMetaData().getColumnCount(); date = new Object[getnumber(DBSql.SELECT_BY_G_ID_COUNT, examVo .getG_id())][max]; while (rs.next()) { for (int j = 0; j < max; j++) { date[i][j] = rs.getObject(j + 1); } i++; } // rs.close(); // ps.close(); // conn.close(); } catch (SQLException e) { e.printStackTrace(); } return date; } /** * 根据课程号查询 */ public Object[][] selectByCid() { Object date[][] = null; int max = 0; int i = 0; PreparedStatement ps = null; ResultSet rs = null; try { ps = conn.prepareStatement(DBSql.SELECT_BY_C_ID); ps.setInt(1, examVo.getC_id()); rs = ps.executeQuery(); // 得到列数 max = rs.getMetaData().getColumnCount(); date = new Object[getnumber(DBSql.SELECT_BY_C_ID_COUNT, examVo .getC_id())][max]; while (rs.next()) { for (int j = 0; j < max; j++) { // System.out.println( examVo.getG_id()); date[i][j] = rs.getObject(j+1); } i++; } // rs.close(); // ps.close(); // conn.close(); } catch (SQLException e) { e.printStackTrace(); } return date; } /** * 根据姓名模糊查询 * * @return */ public Object[][] selectByName() { Object date[][] = null; int max = 0; int i = 0; PreparedStatement ps = null; ResultSet rs = null; try { ps = conn.prepareStatement(DBSql.SELECT_BY_S_NAME); ps.setString(1, examVo.getS_name()); ps.setString(2, "%" + examVo.getS_name() + "%"); ps.setString(3, "%" + examVo.getS_name()); ps.setString(4, examVo.getS_name() + "%"); rs = ps.executeQuery(); // 得到列数 max = rs.getMetaData().getColumnCount(); date = new Object[getnumberByName(DBSql.SELECT_BY_S_NAME_COUNT, examVo.getS_name())][max]; while (rs.next()) { for (int j = 0; j < max; j++) { date[i][j] = rs.getObject(j + 1); } i++; } } catch (SQLException e) { e.printStackTrace(); } return date; } /** * 根据课程名称模糊查询 * * @return */ public Object[][] selectByClassName() { Object date[][] = null; int max = 0; int i = 0; PreparedStatement ps = null; ResultSet rs = null; try { ps = conn.prepareStatement(DBSql.SELECT_BY_CLASS_NAME); ps.setString(1, examVo.getClass_name()); ps.setString(2, "%" + examVo.getClass_name() + "%"); ps.setString(3, "%" + examVo.getClass_name()); ps.setString(4, examVo.getClass_name() + "%"); rs = ps.executeQuery(); // 得到列数 max = rs.getMetaData().getColumnCount(); date = new Object[getnumberByName(DBSql.SELECT_BY_CLASS_COUNT, examVo.getClass_name())][max]; while (rs.next()) { for (int j = 0; j < max; j++) { date[i][j] = rs.getObject(j + 1); } i++; } } catch (SQLException e) { e.printStackTrace(); } return date; } /** * 修改选中学生的成绩 * */ public void updatSelectClass() { PreparedStatement ps = null; ResultSet rs = null; try { ps = conn.prepareStatement(DBSql.UPDATE_EXAM_BY_STUID); ps.setInt(1, examVo.getClassExamChivement()); ps.setInt(2, examVo.getS_id()); ps.setInt(3, examVo.getC_id()); ps.executeUpdate(); } catch (SQLException e) { e.printStackTrace(); } } /** * 得到所有课程号和课程名 * * @return */ public String[] getClassNoName() { String[] classNoName = null; PreparedStatement ps = null; ResultSet rs = null; int j = 0; try { int i = getnumberAll(DBSql.SELECT_CLASS_NAME_COUNT); classNoName = new String[i + i]; ps = conn.prepareStatement(DBSql.SELECT_CLASS_NAME); rs = ps.executeQuery(); while (rs.next()) { classNoName[j] = rs.getString(1); classNoName[j + i] = rs.getString(2); j++; } } catch (SQLException e) { e.printStackTrace(); } return classNoName; } /** * 根据科目修改成绩 查询学号 姓名 成绩 * */ public void SelectClassStuName() { int i = 0; PreparedStatement ps = null; ResultSet rs = null; int j = getnumberBySelectClassName( DBSql.SELECT_CLASS_STU_SNO_SNAME_EXAM_COUNT, examVo.getC_id()); int[] sNum = new int[j]; String[] sName = new String[j]; int[] classExam = new int[j]; try { ps = conn.prepareStatement(DBSql.SELECT_CLASS_STU_SNO_SNAME_EXAM); ps.setInt(1, examVo.getC_id()); rs = ps.executeQuery(); while (rs.next()) { sNum[i] = rs.getInt(1); sName[i] = rs.getString(2); classExam[i] = rs.getInt(3); i++; } } catch (SQLException e) { e.printStackTrace(); } examVo.setSid(sNum); examVo.setSname(sName); examVo.setClassExam(classExam); } /** * 根据科目修改成绩 查询学号 姓名 成绩 后修改成绩 * */ public void UpdateClassStuName() { // int i = 0; PreparedStatement ps = null; ResultSet rs = null; int j = getnumberBySelectClassName( DBSql.SELECT_CLASS_STU_SNO_SNAME_EXAM_COUNT, examVo.getC_id()); try { ps = conn.prepareStatement(DBSql.UPDATE_CHIVEMENT_BY_CLASS); for(int i =0;i<j;i++){ ps.setInt(1, examVo.getClassExam()[i]); ps.setInt(2, examVo.getSid()[i]); ps.setInt(3, examVo.getC_id()); ps.executeUpdate(); } } catch (SQLException e) { e.printStackTrace(); } } /** * 全部查询获得行数 * * @return */ public int getnumberAll(String str) { int number = 0; PreparedStatement ps = null; ResultSet rs = null; try { ps = conn.prepareStatement(str); rs = ps.executeQuery(); rs.next(); number = rs.getInt(1); // rs.close(); // ps.close(); // conn.close(); } catch (SQLException e) { e.printStackTrace(); } return number; } /** * 根据学号 根据组号 根据课程号查询 获得行数 * * @return */ public int getnumber(String str, int i) { int number = 0; PreparedStatement ps = null; ResultSet rs = null; try { ps = conn.prepareStatement(str); ps.setInt(1, i); rs = ps.executeQuery(); rs.next(); number = rs.getInt(1); // rs.close(); // ps.close(); // conn.close(); } catch (SQLException e) { e.printStackTrace(); } return number; } /** * 根据姓名 课程名 查询 获得行数 * */ public int getnumberByName(String str, String i) { int number = 0; PreparedStatement ps = null; ResultSet rs = null; try { ps = conn.prepareStatement(str); ps.setString(1, i); ps.setString(2, "%" + i + "%"); ps.setString(3, "%" + i); ps.setString(4, i + "%"); rs = ps.executeQuery(); rs.next(); number = rs.getInt(1); } catch (SQLException e) { e.printStackTrace(); } return number; } // /** // * 根据课程名查询 获得行数 // * // */ // // public int getnumberByClassName(String str, String i) { // int number = 0; // PreparedStatement ps = null; // ResultSet rs = null; // try { // ps = conn.prepareStatement(str); // ps.setString(1, i); // ps.setString(2, "%" + i + "%"); // ps.setString(3, "%" + i); // ps.setString(4, i + "%"); // rs = ps.executeQuery(); // rs.next(); // number = rs.getInt(1); // } catch (SQLException e) { // e.printStackTrace(); // } // return number; // } /** * * 根据课程名修改成绩获得行数 * * @param str * @param i * @return */ public int getnumberBySelectClassName(String str, int i) { int number = 0; PreparedStatement ps = null; ResultSet rs = null; try { ps = conn.prepareStatement(str); ps.setInt(1, i); rs = ps.executeQuery(); rs.next(); number = rs.getInt(1); } catch (SQLException e) { e.printStackTrace(); } return number; } }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值