一、学生成绩查询系统(Java实现)

项目要求(我们可以做的更面向对象一点,灵活处理):

JAVA 学生成绩录入系统 java学生成绩查询系统代码_java

具体思路如下:

1、引入程序需要调用的包

2、创建总程序包 "stuScoreInquirySystem"

3、在main类以及其他方法类外面定义好学生名字及课程名称并存入,给予静态赋值

4、分类创建方法

  1、main()方法、

  2、初始化方法  initScore()

  3、输入成绩方法   scanfScore()

  4、显示成绩方法   show()

  5、运行程序方法(实现功能)run()

平均分方法  arg()

查询学生单科成绩方法 get()

单科成绩排名方法   subjectRank()

import java.lang.ArrayIndexOutOfBoundsException;
import java.util.Scanner; //引入Scanner包

public class stuScoreInquirySystem {    //程序包名“学生成绩查询系统”
    Scanner src=new Scanner(System.in);
    final static int STUDENT_NUM=6;  //学生数量
    final static int COURSE_NUM=5;   //课程总数
    static String[] students={"zhang","wang","li","zhao","liu","song"};  //一维数组存入学生名字
    static String[] courses={"C","Java","mySQL","Linux","HTML"};    //一维数组存入课程名字
    static int[][] score=new int[STUDENT_NUM][COURSE_NUM];      //学生成绩存在二维数组中

    //main()入口
    public static void main(String[] args){
        initScore();
        scanfScore(score);
        show();
        run(students,courses,score);
    }
    
    //初始化“学生成绩二维数组”  随机数
    public static void initScore(){
        for(int i=0;i< score.length;i++){
            for(int j=0;j<score[0].length;j++){
                score[i][j]=(int)(Math.random()*1);  //java.lang.Math包里 随机数,返回大于等于0.0小于1.0的随机double数
            }
        }
    }

    //输入成绩
    public static void  scanfScore(int[][] score){
        Scanner src =new Scanner(System.in);
        System.out.println("请分别输入6位学生的成绩");
        for(int i=0;i< score.length;i++){
            System.out.println("请输入第"+(i+1)+"位名叫"+students[i]+"同学的各科成绩");
            System.out.println("请按照“C Java mySQL Linux HTML的顺序输入”");
            for(int j=0;j<score[0].length;j++){
                score[i][j]=src.nextInt();
            }
        }
    }

    //显示成绩方法
    public static void show(){
        System.out.print("\t");//第一行第一列的空格,让其空出来
        for(int i=0;i< courses.length;i++){    //一一打印课程名字(第一行)
            System.out.print(courses[i]+"\t");   //\t表示空格符,它使显示的成绩排列整齐
        }
        System.out.println();            //换行
        for(int i=0;i< score.length;i++){       //循环打印成绩
            System.out.print(students[i]+"\t");     //显示学生名字
            for(int j=0;j<score[i].length;j++){      //显示学生成绩
                System.out.print(score[i][j]+"\t");
            }
            System.out.println();
        }
    }

    //run运行程序
    public static void run(String[] students,String[] courses,int[][] score){
        Scanner sca=new Scanner(System.in);
        while(true){
            System.out.print("请输入命令:");
            String command1=sca.next();

            if(command1.equalsIgnoreCase("avg")){
                String command2=sca.next();
                arg(students, courses, score, command2);
            }
            else if(command1.equalsIgnoreCase("get")){
                String command2=sca.next();
                String command3=sca.next();
                get(students,courses,score,command2,command3);
            }
            else if(command1.equalsIgnoreCase("sort")){
                String comand2=sca.next();
                subjectRank(students,courses,score,comand2);
            }
            else if(command1.equalsIgnoreCase("exit")){
                System.out.println("退出查询系统!byebye!");
                return;
            }
        }
    }

    //arg各科目平均分   学生平均分
    public static void arg(String[] students,String[] courses,int[][] score,String str){
        int i_index=-1;
        int j_index=-1;
        int sum=0;
        int pj=0;
        for(int i=0;i< students.length;i++){
            if(str.equalsIgnoreCase(students[i])){
                i_index=i;
            }
        }
        for(int j=0;j< courses.length;j++){
            if(str.equalsIgnoreCase(courses[j]))
                j_index=j;
        }
        if(i_index==-1&j_index==-1)
            System.out.println("您输入的既不是学生,也不是课程");

        if(i_index!=-1){
            for(int i=i_index;i<=i_index;i++)
                for(int j=0;j< courses.length;j++){
                    sum+=score[i][j];
                }
            pj=sum/ courses.length;
            System.out.println(students[i_index]+"的平均分是:"+pj);
        }
        else if(j_index!=-1){
            for(int i=0;i< students.length;i++)
                for(int j=j_index;j<=j_index;j++ ){
                    sum+=score[i][j];
                }
            pj=sum/ students.length;
            System.out.println(courses[j_index]+"的平均分是:"+pj);
        }
    }

    //get  查询学生单科成绩
    public static void get(String[] students,String[] courses,int[][] score,String str1,String str2){
        int i_index=-1;    //初始化分数行坐标
        for(int i=0;i< students.length;i++){  //判断是否有这位同学,有,记下其坐标(行)
            if(students[i].equalsIgnoreCase(str1))
                i_index=i;
        }
        if(i_index==-1){
            System.out.println("没有"+str1+"这个人");
            return;     //如果没有找到该学生名字,则str1仍然等于-1,就退出(不执行下列代码)
        }

        int j_index=-1;   //初始化分数列坐标
        for(int j=0;j< courses.length;j++){   //判断这位同学是否有这门课程,有,记下其坐标(列)
            if(courses[j].equalsIgnoreCase(str2))
                j_index=j;
        }
        if(j_index==-1){
            System.out.println(str1+"没有"+str2+"这门课程");
            return;           //如果没有找到课程名称,str2仍然等于-1,就退出(不执行下列代码)
        }
        System.out.println(str1+"的"+str2+"的成绩是:"+score[i_index][j_index]);  //根据行列坐标输出这个值
    }

    //单科成绩排名
    public static void subjectRank(String[] students,String[] courses,int[][] score,String str){
        int j_index=-1;  //初始化课程坐标值(列)j
        for(int j=0;j< courses.length;j++){    //查询是否存在该门课程
            if(str.equalsIgnoreCase(courses[j]))
                j_index=j;             //记下课程坐标
        }
        if(j_index==-1){             //判断查询的该门成绩是否存在,不存在退出
            System.out.println("没有"+str+"这门课程");
            return;
        }

        int sum=0;      //排序,先初始化工具量sum
        //String sumStu=new String("");  //建立一个字符串数组,并赋初始值,作为字符串工具转移变量  不知道行不行
        String sumStu=null;
        for(int i=0;i< students.length-1;i++)
            for(int j=0;j< students.length-1-i;j++){
                if(score[j][j_index]>score[j+1][j_index]){
                    sum=score[j][j_index];
                    sumStu=students[j];
                    score[j][j_index]=score[j+1][j_index];
                    students[j]=students[j+1];
                    score[j+1][j_index]=sum;
                    students[j+1]=sumStu;
                }
            }
        System.out.println("名次"+"\t"+"姓名"+"\t"+courses[j_index]+"\t"); //输出排名情况
        int i=0;
        for(int minCi=1;minCi<= students.length&i<students.length;minCi++){
            System.out.println(minCi+"\t"+ students[i]+"\t"+score[i][j_index]+"\t");
            i++;
        }
    }
}

二、代码运行验证:

JAVA 学生成绩录入系统 java学生成绩查询系统代码_初始化_02

三、技巧及知识总结:

1、equalsIgnoreCase()与equals()方法不同的是,前者不区分大小写,因而使得用户输入命令的时候不用考虑大小写的情况

2、random()方法

Java中存在着两种Random函数,他们所在jdk包如下:

java.lang.Math.Random;(我用的是这一种,它可以随机给对象返回大于等于0.0小于1.0的double初始值,来初始化对象属性)

  2、java.util.Random(我还不是很熟,大家可以复制百度一下,或者自己查一下API)

3、ArryIndexOfBoundsException:数组越界

合理:[0,arr.length-1]

越界:arr[-1],arr[arr.length]

在写这行代码的时候笔者也是初学者,报了好几个错误,这个最常见,大家一定要熟悉

4、next()和nextLine()的使用

next()它遇到空格或者enter键就停止读取,nextLine()遇到enter键才结束读取

next()从第一个非空字符开始读取,nextLine()不管字符空或非空,都读取(我举个例子你就明白了,我测试了)

//我输入一下命令(带有空格)
     hello ni hao ya  //hello前我输入了几个空格(注)
//若next()读取,会打印"hello",没有一点空格,而且不会打印“ni”、"hao"等等,因为遇到空格就停止了
//若nextLine[]读取,会打印"     hello ni hao ya",你输入的那一行有啥它就打印出啥,包括空格,直到按下enter键后,按enter键之前的都会打印出来
........................................................
//输入一行字符,以空格分开,怎么样分别存入它的值
//例如:输入“wo shi chao ji wu di da shuai ge” 我是超级无敌大帅哥9段字符,我可以用9个next()读取
//但是实际操作中不想写这么多行next()重复代码,我们可以用递归的思想,慢慢琢磨哈
//所以我这次想表达的是,next()方法可以一段一段读取字符串
...........................................................

5、编写代码是,要时刻考虑是否要立一个flag,如j_index、i_index就是我立的一个flag

6、"\t"的使用:为了实现让程序输出时如同表格一样整齐有序,我们可以巧妙学会使用"\t",它会自动识别字符长度,为字符分配空间。

  "\t"是补全当前字符串长度到8的整数倍,补多少要看你\t前字符串长度,比如当前字符串长度10,那么\t后长度是16,也就是补6个空格,如果当前字符串长度13,此时\t后长度是16,补3个空格

7、有时候我们无法判断数组长度为多少时,可以使用"数组名.length"来解决,调用数组时我们通常用它的数组名,其实也就是它的首地址。

  在这里要注意的是:一维、二维和多维;拿最常见的二维数组来举例:arr[不知道] [也不知道],arr.length表示一维行的长度,arr[0].length表示二维列的长度。都是首地址的形式,想一想哈哈。

8、数组的复制和赋值

赋值,相当于给它一个快捷方式,不开辟这么多空间 ,你就想想电脑桌面的快捷方式就可以了,他们两都指向堆中同一个地址,电脑桌面的快捷方式是指向硬盘中的一个储存地址

复制数组,就要new一个数组,给它开辟一个空间,这个是实实在在分配了与原数组一样的存储空间的

9、for(A;B;C)这个循环我最近也去大胆的乱测了一下,我尝试在A区多谢几条代码,用逗号分开,好像不行,我之后再去多多试一下,可能我说的是错哈B、C区我同样也试了一下,最终结果有待论证,我知道后会更新博客

10、这个成绩管理demo的”学生名字“放在了列,“课程名称”放在了行,它们虽然是以为数组,但是它们的角标可以注入我们的score[] []二维里,这个笔者刚开始想了好久都没想到,后面阴差阳错看了段源码恍然大悟

11、A&&B 与 A&B 的区别(在之后的博客里我会细讲),这次简单点提:前者若A区false,B区就不执行了,后者若A区false,B区仍然执行。

12、注重代码的可读性,如驼峰命名法等

结束语:

不瞒你说,这是笔者学习java写的第一个像样的demo,最终就打算把它以一篇博客的形式呈现给大家,我会不断学习,创造更优质的内容,谢谢大家!

若有不足之处,请多指正!