大孩子 2021-10-22 12:34 采纳率: 100%
浏览 129
已结题

写了一个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();方法
    }
}

  • 写回答

2条回答 默认 最新

  • 钰娘娘 2021-10-22 15:08
    关注
    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条)

报告相同问题?

问题事件

  • 系统已结题 10月30日
  • 已采纳回答 10月22日
  • 创建了问题 10月22日

悬赏问题

  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置
  • ¥15 有没有研究水声通信方面的帮我改俩matlab代码
  • ¥15 对于相关问题的求解与代码
  • ¥15 ubuntu子系统密码忘记
  • ¥15 信号傅里叶变换在matlab上遇到的小问题请求帮助
  • ¥15 保护模式-系统加载-段寄存器
  • ¥15 电脑桌面设定一个区域禁止鼠标操作
  • ¥15 求NPF226060磁芯的详细资料