写了一个Java练习题已知每个学生这次成绩(0~100)范围内的整数 * 1.求平均、最高和最低成绩 * 2.统计考试成绩的分布率最后判读成绩分布规律 变量设置较多 有没有什么办法优化

写了一个Java练习题
已知每个学生这次成绩(0~100)范围内的整数
* 1.求平均、最高和最低成绩
* 2.统计考试成绩的分布率
最后判读成绩分布规律 变量设置较多 有没有什么办法优化

import java.util.Scanner;

public class Studentgrade_out {

    /**
     * 需求:
     *     已知每个学生这次成绩(0~100)范围内的整数
     *      1.求平均、最高和最低成绩
     *      2.统计考试成绩的分布率
     */

     class studentgrade_in{       //学生成绩内部类
        int[] grede;
        public void grade(int number){      //接收成绩方法
            grede=new int[number];          //定义数组 给定长度
            Scanner scanner = new Scanner(System.in);//键盘输入成绩
            System.out.println("请输入"+number+"位学生成绩(百分制):");
            for (int i = 0; i <number; i++) {
                grede[i]=scanner.nextInt();     //给数组赋值
            }
//            for (int i = 0; i < grede.length; i++) {
//                System.out.println(grede[i]);
//            }
        }
        public void judge(int number){  //判读数据的最大和最小数
            /**
             * 冒泡排序 比较相邻数据元素大小 把数组从大到小排序
             */
            for (int i = 0; i < grede.length; i++) {
                for (int j = 0; j < grede.length-1-i; j++) {
                    if (grede[j]>grede[j+1]) {
                        /**
                         * 引用中间变量 交换前后数据 将较大后移
                         */
                        int temp =grede[j];
                        grede[j]=grede[j+1];
                        grede[j+1]=temp;
                    }
                }
            }
            //此时数组顺序从小到大排序,第一个数据是最小值,最后一个数据是最大值
            System.out.println("最小值是:"+grede[0]);
            System.out.println("最大值是:"+grede[grede.length-1]);
        }
        public  void sum(int number) {  //平均成绩
            int sum=0;          //number个数据相加总和
            for (int i = 0; i < number; i++) {
                sum+=grede[i];
            }
            //成绩总和/人数 平均成绩
            System.out.println("这次测试平均成绩是:"+sum/number);
        }
        public void stage(int number){      //统计考试成绩分布规律
            int l=0,j=0,k=0,g=0,f=0,d=0,q=0;    //定义变量记录每个分数段的人数

            for (int i = 0; i < number; i++) {  //遍历数组
                int a=grede[i];         //接收数组元素进行判断
                if (a < 60) {
                    l++;
                }else if (a>=60) {
                    d++;
                }
                if (a >=60&&a<70 ) {
                    k++;
                }else if (a >=70&&a<80) {
                    g++;
                }else if(a>=80&&a<90){
                    f++;
                }else if (a>=90&&a<=100){
                    q++;
                }
            }
            System.out.println("不及格人数有"+l+"个");
            System.out.println("及格人数有"+d+"个");
            System.out.println("60-70的人数有"+k+"个");
            System.out.println("70-80的人数有"+g+"个");
            System.out.println("80-90的人数有"+f+"个");
            System.out.println("90-100的人数有"+q+"个");
        }
    }

    /*
    外部类方法
    */
    public void get(int number){      //实例化内部类调用方法(内部类非静态;main方法不能直接调用)
         studentgrade_in si = new studentgrade_in();
        si.grade(number);
        si.judge(number);
        si.sum(number);
        si.stage(number);
     }
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        System.out.println("请问有少位学生成绩输入:");
        int number = scanner.nextInt();
        /**
         * main()  只能调用静态方法
         *
         * 也可以将 get 方法写成静态方法
         */
        Studentgrade_out so = new Studentgrade_out();   //实例化外部类
        so.get(number);     //调用get();方法
    }
}

  1. Studentgrade_out,类名不要混用驼峰命名和匈牙利命名,参考命名:StudentGradeOut
  2. 内部类尽量不要写,非要写,建议用静态内部类【这个不讲,自己去查】
  3. 最大最小值不需要排序的,如果要排序建议用快速或者归并排序,最大最小值最常用的就是打擂台算法,就是下面这样:
    int max = 0;
    for(int i = 0; i < n; i++){
     max = Math.max(nums[i],max);
    }
    
  4. 多个if...else的情况,建议用数组或哈希构造替换,能非常有效的缩短代码长度,使得代码的思路更清晰
  5. 永远有个概念:输入数据不安全,所有输入数据非法情况都需要做检查或处理

按你思路写的,精简了一点点,不保存输入,直接算结果,看看行不?另加了数据检查,增强健壮性。
看不懂可以问我。希望给个采纳。
输出计算:时间O(n) 空间O(1)


import java.util.Scanner;
//不要混用驼峰命名和匈牙利命名!所有单词首字母大写!
public class StudentCalculate {
    int max = 0;//最大
    int min=100;//最小
    int sum = 0;//求和
    int cnt = 0;//数量
    int[] addIndex;//统计对应索引
    int[] calculates;//统计数组
    String[] strs;//统计提示文字

    public StudentCalculate(){
        addIndex = new int[]{0,0,0,0,0,0,1,2,3,4,4};
        calculates = new int[5];//0:不及格,1:60-70,2:70-80,3:80-90,4:90-100(包含100)
        strs = new String[]{"不及格","60-70","70-80","80-90","90-100"};
    }

    public void addNum(int num) throws Exception{
        if(num < 0 || num > 100)
            throw new Exception("非法数据,请重新输入!");

        sum += num;
        ++cnt;
        max = Math.max(num,max);
        min = Math.min(num,min);

        ++calculates[addIndex[num/10]];
    }

    public void getResult() throws Exception{
        if(cnt == 0){
            throw new Exception("不存在有效的学生成绩!");
        }
        System.out.println("最大值:"+max);
        System.out.println("最小值:"+min);
        System.out.println("平均值:"+sum/cnt);
        for(int i = 0; i < 5; i++){
            System.out.println(strs[i]+"人数:"+calculates[i]);
        }
    }

    public static void main(String[] args){
        StudentCalculate sc = new StudentCalculate();
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();
        if(n < 0){
            System.out.println("非法数据,程序结束!");
            return;
        }
        for(int i = 0;  i < n; i++){
           try{
              sc.addNum(scanner.nextInt());
           }catch (Exception e){
               System.out.println(e.getMessage());
               //假设数据不合法,就要求重新输入
               i--;
           }
        }

        try{
            sc.getResult();
        }catch (Exception e){
            System.out.println(e.getMessage());
        }

    }

}

1.除了第一个 grade(int number) 需要参数int number,其他几个方法都可以不用,给了参数可能会统计不全或出错,可以直接用grede.length;
2.最大最小没必要对所有的做排序,遍历一次得到最大最小就行了;
3.求平均这样写问题不大,但是sum一般是表示求和;