一个自己编写的小型管理系统,运用非常基础的思想和方法,可以实现学生人数,及其相关成绩,学号,姓名等等信息的调用与存储。理解起来非常简单,是期末救急的好程序(doge)。

                先展示下运行过程,代码在下面。

输入学生基本信息
请输入学生人数
3
当前学生人数为3人
请输入科目数量
2
当前科目数量为2科
请输入学生姓名
q
请输入学生学号
1
学生姓名和学号为q1
请输入第1科成绩
123
请输入第2科成绩
124
 
q学生成绩为
 
123
124
请输入学生姓名
w
请输入学生学号
2 
学生姓名和学号为w2
请输入第1科成绩
125
请输入第2科成绩
126
 
w学生成绩为
 
125
126
请输入学生姓名
e
请输入学生学号
3
学生姓名和学号为e3
请输入第1科成绩
127
请输入第2科成绩
128
 
e学生成绩为

127
128
请在以下功能中选择,并将功能名称输入
求得平均分,并列出90以上学生的信息
获得按照某一课成绩排序的学生名单
获得总成绩名单
结束使用
求得平均分,并列出90以上学生的信息                                  
q学生的平均分为123.5
w学生的平均分为125.5
e学生的平均分为127.5


90分以上的。。。出列!!!


姓名q学号1得分123.5
姓名w学号2得分125.5
姓名e学号3得分127.5
请在以下功能中选择,并将功能名称输入
求得平均分,并列出90以上学生的信息
获得按照某一课成绩排序的学生名单
获得总成绩名单
结束使用
获得按照某一课成绩排序的学生名单
你想要以第几项成绩作为排名的依据?
2
e学生的第2成绩为128学号为3
w学生的第2成绩为126学号为2
q学生的第2成绩为124学号为1
请在以下功能中选择,并将功能名称输入
求得平均分,并列出90以上学生的信息
获得按照某一课成绩排序的学生名单
获得总成绩名单
结束使用
获得总成绩名单
e学生的总成绩为255.0学号为3
w学生的总成绩为251.0学号为2
q学生的总成绩为247.0学号为1
请在以下功能中选择,并将功能名称输入
求得平均分,并列出90以上学生的信息
获得按照某一课成绩排序的学生名单
获得总成绩名单
结束使用
结束使用
拜拜

                首先直接上整段代码吧,如有需要后面有较为详细的讲解和分步。

import java.util.Scanner;
import java.util.Arrays;
class Student{
    int xuehao;                                 //学号
    String name2;                               //名称
    int chengjishuzu[];                         //各科成绩储存在一个成绩数组里
    float pingjunfen;                           //平均分
    float fenshuhe;                             //分数之和
    int a;                                      //a这里是用于控制循环次数的变量
    int x;            //用于记录人数
    int y;            //用于记录科目数
}
public class xueshengchengji {
    public static void main(String [] args){
        System.out.println("输入学生基本信息");
        Scanner sc = new Scanner(System.in);
        Student s = new Student();
        Student ren[] = new Student[shuruxinxi1(s)];                
        shuruxinxi2(s,ren);
        //在java语言中是没有指针这个东西的,但是如果不使用指针的话,我们难以在各个函数内部修改一个变量的值,其实Java也有所谓的指针
        //那就是类以及其成员,在一个类中的成员属性可以被随时调用,只要传输成员作为参数即可,我们这里便使用Student类 s,作为我们的"指针"

        //首先输入学生基本信息,两个输入函数分开使用,第一个函数的的返回值作为学生人数的数量对Student的成员数组进行长度修饰
        //获得基本信息





        while(true){
            //利用while循环反复显示用户可能的需求,直至用户完全完成工作,输入结束使用程序停止


        System.out.println("请在以下功能中选择,并将功能名称输入");
        System.out.println("求得平均分,并列出90以上学生的信息");
        System.out.println("获得按照某一课成绩排序的学生名单");
        System.out.println("获得总成绩名单");
        System.out.println("结束使用");
        String yonghu = sc.nextLine();
        if(yonghu.equals("求得平均分,并列出90以上学生的信息")){    
            qiupingjunfen(s,ren);
            //调用equals方法,判断用户需求,调用不同的函数,其中反复出现的ren,即为存储所有学生成员的Student数组
        }
        if(yonghu.equals("获得按照某一课成绩排序的学生名单")){
            chengjipaixu(s,ren);
        }   
        if(yonghu.equals("获得总成绩名单")){
            zonghcengjipaiming(s, ren);
        }
        if(yonghu.equals("结束使用")){
            System.out.println("拜拜");
            break;
        }
        }
}





public static int shuruxinxi1(Student s){
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入学生人数");
        s.x = sc.nextInt();                                              
        System.out.println("当前学生人数为"+s.x+"人");
        System.out.println("请输入科目数量");
        s.y = sc.nextInt();
        System.out.println("当前科目数量为"+s.y+"科");
        return s.x;
}




public static void shuruxinxi2(Student s,Student ren[]){
    Scanner sc = new Scanner(System.in);
    s.a = 0;                                                                //利用a控制循环次数
            while(s.a<s.x){
            ren[s.a] = new Student();
            System.out.println("请输入学生姓名");
            ren[s.a].name2 = sc.next();
            System.out.println("请输入学生学号");
            ren[s.a].xuehao = sc.nextInt();
            System.out.println("学生姓名和学号为"+ren[s.a].name2+ren[s.a].xuehao);          //ren[x]代表的是一个具体的Student类的成员

            ren[s.a].chengjishuzu = new int[s.y];
            for(int aa = 0;aa < s.y;aa++){
                System.out.println("请输入第"+(aa+1)+"科成绩");
                ren[s.a].chengjishuzu[aa] = sc.nextInt();
                ren[s.a].fenshuhe += (float)ren[s.a].chengjishuzu[aa];              //这里使用强制类型转换计算出总成绩
            }
            System.out.println(" ");
            System.out.println(ren[s.a].name2+"学生成绩为");
            System.out.println(" ");
            for(int ba:ren[s.a].chengjishuzu){                      //使用foreach循环遍历学生成绩结果
            System.out.println(ba);
            }
            s.a++;
            }
            }




public static void qiupingjunfen(Student s,Student ren[]){
    s.a = 0;
    while(s.a<s.x){
        ren[s.a].pingjunfen = (ren[s.a].fenshuhe/s.y);
        System.out.println(ren[s.a].name2+"学生的平均分为"+ren[s.a].pingjunfen);
        s.a++;
    }

    System.out.println(" ");
    System.out.println(" ");
    System.out.println("90分以上的。。。出列!!!");//流浪地球2的梗(doge)
    System.out.println(" ");
    System.out.println(" ");
    for(Student s1:ren){
        if(s1.pingjunfen>90){
            System.out.println("姓名"+s1.name2+"学号"+s1.xuehao+"得分"+s1.pingjunfen);
        }
    }
}




public static void chengjipaixu(Student s,Student ren[]){
        Scanner sc = new Scanner(System.in);
        System.out.println("你想要以第几项成绩作为排名的依据?");
        int xuanze = sc.nextInt();
        int chengji[] = new int[s.x];                               
        for(int d = 0;d<s.x;d++){
            chengji[d] = ren[d].chengjishuzu[xuanze-1];         //这里成绩顺序与学生成员在ren数组里的顺序保持一致
        }                 
        for(int ax = 0;ax<chengji.length-1;ax++){                       
            for(int bx = ax+1;bx<chengji.length;bx++){          //经典的冒泡排序,这里是对成绩进行排序,但是在交换位置是我们交换的是ren
                if(chengji[bx]>chengji[ax]){                    //数组中的成员位置,后续输出成绩时就可以利用ren[]数组中的成员来调用相关的属性
                    Student t = ren[ax];                        //最重要的好处还是我们不仅仅局限于输出成绩,更可以利用排序后的成员调用其他属性
                    ren[ax] = ren[bx];                          //在输出成绩的同时输出其他的相关信息,比如姓名学号
                    ren[bx] = t;
                }
            }
        }
        for(Student s1:ren){
            System.out.println(s1.name2+"学生的"+"第"+xuanze+"成绩为"+s1.chengjishuzu[xuanze-1]+"学号为"+s1.xuehao);
        }
}
public static void zonghcengjipaiming(Student s,Student ren[]){
    float chengji[] = new float[s.x];
    for(int a = 0;a<s.x;a++){
        chengji[a] = ren[a].fenshuhe;
    }
            for(int ax = 0;ax<chengji.length-1;ax++){
            for(int bx = ax+1;bx<chengji.length;bx++){          //大同小异对总成绩进行排名
                if(chengji[bx]>chengji[ax]){
                    Student t = ren[ax];
                    ren[ax] = ren[bx];
                    ren[bx] = t;
                }
            }
        }
    for(Student s1:ren){
        System.out.println(s1.name2+"学生的"+"总成绩为"+s1.fenshuhe+"学号为"+s1.xuehao);
    }
}


}

         好,那么我们首先来看唯一的类Student,与相应的主函数的调用,Student类的属性声明十分简单,最重要的其实也就是对于Student ren[]这个数组的使用,通过这个我们便可以让用户来确定学生的人数,也可以通过调用数组的第x号元素来调用相应的人员属性,这在后面的依据成绩进行排序,并且调用出相应的姓名,学号等等有重要意义。

我们不应该拘泥于课本上教授的一些方法,更应该自己去更贴近用户的在使用时的真实感受,就拿我自己举例,我们老师对这个程序的要求是仅仅是假设有四个学生,然后对其进行操作,这样显然是降低了难度,直接定义Student1,2,3,4,就完事了,但实际上不可能真的每个用户都刚好对四个学生的信息进行操作,如果有五个学生难道这个程序就用不了了吗?即使是刚刚接触程序也应该努力向提高复用率,多用途场景去做考虑。

import java.util.Scanner;
import java.util.Arrays;
class Student{
    int xuehao;                                 //学号
    String name2;                               //名称
    int chengjishuzu[];                         //各科成绩储存在一个成绩数组里
    float pingjunfen;                           //平均分
    float fenshuhe;                             //分数之和
    int a;                                      //a这里是用于控制循环次数的变量
    int x;            //用于记录人数
    int y;            //用于记录科目数
}
public class xueshengchengji {
    public static void main(String [] args){
        System.out.println("输入学生基本信息");
        Scanner sc = new Scanner(System.in);
        Student s = new Student();
        Student ren[] = new Student[shuruxinxi1(s)];                
        shuruxinxi2(s,ren);
        //在java语言中是没有指针这个东西的,但是如果不使用指针的话,我们难以在各个函数内部修改一个变量的值,其实Java也有所谓的指针
        //那就是类以及其成员,在一个类中的成员属性可以被随时调用,只要传输成员作为参数即可,我们这里便使用Student类 s,作为我们的"指针"

        //首先输入学生基本信息,两个输入函数分开使用,第一个函数的的返回值作为学生人数的数量对Student的成员数组进行长度修饰
        //获得基本信息





        while(true){
            //利用while循环反复显示用户可能的需求,直至用户完全完成工作,输入结束使用程序停止


        System.out.println("请在以下功能中选择,并将功能名称输入");
        System.out.println("求得平均分,并列出90以上学生的信息");
        System.out.println("获得按照某一课成绩排序的学生名单");
        System.out.println("获得总成绩名单");
        System.out.println("结束使用");
        String yonghu = sc.nextLine();
        if(yonghu.equals("求得平均分,并列出90以上学生的信息")){    
            qiupingjunfen(s,ren);
            //调用equals方法,判断用户需求,调用不同的函数,其中反复出现的ren,即为存储所有学生成员的Student数组
        }
        if(yonghu.equals("获得按照某一课成绩排序的学生名单")){
            chengjipaixu(s,ren);
        }   
        if(yonghu.equals("获得总成绩名单")){
            zonghcengjipaiming(s, ren);
        }
        if(yonghu.equals("结束使用")){
            System.out.println("拜拜");
            break;
        }
        }
}

        接下来就是各个子函数,包括了多种方法

        这是第一个,先输入各个学生的基础信息比较有价值的其实就是一个foreach循环,非常好用foreach格式就是(Object obj:你想遍历的东东)。

public static int shuruxinxi1(Student s){
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入学生人数");
        s.x = sc.nextInt();                                              
        System.out.println("当前学生人数为"+s.x+"人");
        System.out.println("请输入科目数量");
        s.y = sc.nextInt();
        System.out.println("当前科目数量为"+s.y+"科");
        return s.x;
}




public static void shuruxinxi2(Student s,Student ren[]){
    Scanner sc = new Scanner(System.in);
    s.a = 0;                                                                //利用a控制循环次数
            while(s.a<s.x){
            ren[s.a] = new Student();
            System.out.println("请输入学生姓名");
            ren[s.a].name2 = sc.next();
            System.out.println("请输入学生学号");
            ren[s.a].xuehao = sc.nextInt();
            System.out.println("学生姓名和学号为"+ren[s.a].name2+ren[s.a].xuehao);          //ren[x]代表的是一个具体的Student类的成员

            ren[s.a].chengjishuzu = new int[s.y];
            for(int aa = 0;aa < s.y;aa++){
                System.out.println("请输入第"+(aa+1)+"科成绩");
                ren[s.a].chengjishuzu[aa] = sc.nextInt();
                ren[s.a].fenshuhe += (float)ren[s.a].chengjishuzu[aa];              //这里使用强制类型转换计算出总成绩
            }
            System.out.println(" ");
            System.out.println(ren[s.a].name2+"学生成绩为");
            System.out.println(" ");
            for(int ba:ren[s.a].chengjishuzu){                      //使用foreach循环遍历学生成绩结果
            System.out.println(ba);
            }
            s.a++;
            }
            }

         我稍微动了点脑子的地方就是这个排序,如果真的只能对一个成绩数组输出成绩,却不知道相应的人员信息,是不是也太离谱了点,所以使用了比较对成绩,排序对人员的方法,由于人员数组与成绩数组顺序一致,那么便可以实现相应的功能

public static void chengjipaixu(Student s,Student ren[]){
        Scanner sc = new Scanner(System.in);
        System.out.println("你想要以第几项成绩作为排名的依据?");
        int xuanze = sc.nextInt();
        int chengji[] = new int[s.x];                               
        for(int d = 0;d<s.x;d++){
            chengji[d] = ren[d].chengjishuzu[xuanze-1];         //这里成绩顺序与学生成员在ren数组里的顺序保持一致
        }                 
        for(int ax = 0;ax<chengji.length-1;ax++){                       
            for(int bx = ax+1;bx<chengji.length;bx++){          //经典的冒泡排序,这里是对成绩进行排序,但是在交换位置是我们交换的是ren
                if(chengji[bx]>chengji[ax]){                    //数组中的成员位置,后续输出成绩时就可以利用ren[]数组中的成员来调用相关的属性
                    Student t = ren[ax];                        //最重要的好处还是我们不仅仅局限于输出成绩,更可以利用排序后的成员调用其他属性
                    ren[ax] = ren[bx];                          //在输出成绩的同时输出其他的相关信息,比如姓名学号
                    ren[bx] = t;
                }
            }
        }
        for(Student s1:ren){
            System.out.println(s1.name2+"学生的"+"第"+xuanze+"成绩为"+s1.chengjishuzu[xuanze-1]+"学号为"+s1.xuehao);
        }
}

        整体就是这么一个程序,没有什么特别突破性的想法,大家随便看一看就好。