学生成绩计算评级排序(java实现)

问题说明

题目很简单,问题要求如下:

输入一个班的学生的平时和考试成绩,计算每个学生的总成绩和等级,并且按照成绩从高到低输出。需要检查输入的合法性,增强程序健壮性。需要对程序进行模块化分解,利用方法实现不同的模块。

需求分析

如果我们是一个使用者,我们想要这个程序具有什么样的功能呢?

  1. 快速录入大量学生信息 ,毕竟如果几十上百号学生一一手动录入,这谁顶的住啊;
  2. 录入学生数量灵活可控 ,考虑到每个班的学生数量不一,避免造成空间浪费;
  3. 排序简单可靠 ,对录入的学生成绩进行稳定可靠的排序;
  4. 能准确定位错误信息, 如果在输入过程中出现了错误,凭借肉眼很难看出来,这时需要程序能对错误之处进行准确定位;
  5. 能一定程度兼容办公软件 ,能一定程度的兼容Excel、Wps,能进行快速而直接的复制粘贴等操作;
  6. 模块独立易于维护, 希望该程序的各模块相互独立,这样的程序更容易适应不同的需求,如不同的成绩比例,评级方法等;

问题分解

本来准备详细一一说明的,但想想除了我自己之外,估计也没啥人会看,就不麻烦了,此之后文字内容均直接截图

在这里插入图片描述

程序模块

模块总览如下
在这里插入图片描述

数据输入模块

private static void input(String[][] student, int n)//数据输入
{
   Scanner in = new Scanner(System.in);
   
   for(int i = 0; i < n; i++)
   {
      //System.out.printf("第%d位学生:",  i + 1);
      for(int j = 0; j < 4; j++)
      {
         student[i][j] = in.next();         //每位学生信息占一行
      }
   }
   
   in.close();    //释放内存
}

数值转换模块

private static double change(String s) //数值转换方法
{
   double a = Double.parseDouble(s);
   
   return a;                             //保留一位小数
}

合法判断模块

private static boolean isLegal(double i) //判断输入是否合法
{
   if ((0 <= i) && (i <= 100))
   {
      return true;
   }
   else return false;
}

错误提示模块

private static void wrong(String[][] student, double[] rs, double[] ts, int i)//输出错误提示信息
{
   if (!isLegal(rs[i]))
   {
      System.out.printf("\n    %s%s的平时成绩不合法,请重新输入!", 
            student[i][0],student[i][1]);
   }
   if (!isLegal(ts[i]))
   {
      System.out.printf("\n    %s%s的考试成绩不合法,请重新输入!", 
            student[i][0],student[i][1]);
   }
}

成绩计算模块

private static double score(double i, double j) //计算总成绩
{
   double a = (i * 0.3 + j * 0.7);
   
   BigDecimal bd = new BigDecimal(a);          //将Double类型的数据保留1位小数                                          
   Double d = bd.setScale(1, BigDecimal.ROUND_HALF_UP).doubleValue();
   return d;                         //解决精度丢失的问题
}

选择排序模块

private static void selection(String[][] student, double[] sum, int n)//选择排序
{
   double temp;   
   String[][] p = new String[1][6];
   
   for(int i = 0; i < n; i++)        //根据总分进行降序排序
   {
      int max = i;
      for(int j = n - 1; j > i; j--)
      {
         if(sum[max] < sum[j])
         {
            max = j;
         }
      }
      temp = sum[i];
      sum[i] = sum[max];
      sum[max] = temp;

      p[0] = student[i];
      student[i] = student[max];
      student[max] = p[0];
   }
}

成绩评级模块

private static String grade(double sum)//评级
{
   String grade;
   
   switch ((int)sum / 10)
   {
      case 10:
      case 9:
         grade = "A";
         break;
      case 8:
         grade = "B";
         break;
      case 7:
         grade = "C";
         break;
      case 6:
         grade = "D";
         break;
      default:
         grade = "E";
         break;
   }
   return grade;
}

程序输出模块

private static void output(String[][] student, int n) //输出
{  
   for(int i = 0; i < n; i++) //打印降序排列之后的学生信息
   {
      for(int j = 0; j < 6; j++)
      {
         System.out.print(student[i][j]+"        ");
      }
      System.out.print("\n");
   }
}

数据结构

在这里插入图片描述

主要算法

一个比较标准的选择排序方法。

private static void selection(String[][] student, double[] sum, int n)//选择排序
{
   double temp;   
   String[][] p = new String[1][6];
   
   for(int i = 0; i < n; i++)        //根据总分进行降序排序
   {
      int max = i;
      for(int j = n - 1; j > i; j--)
      {
         if(sum[max] < sum[j])
         {
            max = j;
         }
      }
      temp = sum[i];
      sum[i] = sum[max];
      sum[max] = temp;

      p[0] = student[i];
      student[i] = student[max];
      student[max] = p[0];
   }
}

程序流程图

在这里插入图片描述

程序全部代码

import java.math.BigDecimal;
import java.util.*;

public class 学生成绩学生成绩计算评级排序 //@author axxdllw
{
   private static void input(String[][] student, int n)//数据输入
   {
      Scanner in = new Scanner(System.in);
      
      for(int i = 0; i < n; i++)
      {
         //System.out.printf("第%d位学生:",  i + 1);
         for(int j = 0; j < 4; j++)
         {
            student[i][j] = in.next();         //每位学生信息占一行
         }
      }
      
      in.close();    //释放内存
   }
   private static double change(String s) //数值转换方法
   {
      double a = Double.parseDouble(s);
      
      return a;                             //保留一位小数
   }
   private static boolean isLegal(double i) //判断输入是否合法
   {
      if ((0 <= i) && (i <= 100))
      {
         return true;
      }
      else return false;
   }
   private static void wrong(String[][] student, double[] rs, double[] ts, int i)//输出错误提示信息
   {
      if (!isLegal(rs[i]))
      {
         System.out.printf("\n    %s%s的平时成绩不合法,请重新输入!", 
               student[i][0],student[i][1]);
      }
      if (!isLegal(ts[i]))
      {
         System.out.printf("\n    %s%s的考试成绩不合法,请重新输入!", 
               student[i][0],student[i][1]);
      }
   }
   private static double score(double i, double j) //计算总成绩
   {
      double a = (i * 0.3 + j * 0.7);
      
      BigDecimal bd = new BigDecimal(a);          //将Double类型的数据保留1位小数                                          
      Double d = bd.setScale(1, BigDecimal.ROUND_HALF_UP).doubleValue();
      return d;                         //解决精度丢失的问题
   }
   private static String grade(double sum)//评级
   {
      String grade;
      
      switch ((int)sum / 10)
      {
         case 10:
         case 9:
            grade = "A";
            break;
         case 8:
            grade = "B";
            break;
         case 7:
            grade = "C";
            break;
         case 6:
            grade = "D";
            break;
         default:
            grade = "E";
            break;
      }
      return grade;
   }
   private static void selection(String[][] student, double[] sum, int n)//选择排序
   {
      double temp;   
      String[][] p = new String[1][6];
      
      for(int i = 0; i < n; i++)        //根据总分进行降序排序
      {
         int max = i;
         for(int j = n - 1; j > i; j--)
         {
            if(sum[max] < sum[j])
            {
               max = j;
            }
         }
         temp = sum[i];
         sum[i] = sum[max];
         sum[max] = temp;

         p[0] = student[i];
         student[i] = student[max];
         student[max] = p[0];
      }
   }

   private static void output(String[][] student, int n) //输出
   {  
      for(int i = 0; i < n; i++) //打印降序排列之后的学生信息
      {
         for(int j = 0; j < 6; j++)
         {
            System.out.print(student[i][j]+"        ");
         }
         System.out.print("\n");
      }
   }
   
   public static void main(String[] args) 
   {
      Scanner in = new Scanner(System.in);
      
      System.out.println("请输入该班学生总人数:");    
      int n = in.nextInt(); //确定总人数确定数组大小
       
      String[][] student = new String[n][6];     //创建学生信息的二维数组

      System.out.println("请输入该班学生信息(学号、姓名、平时成绩、考试成绩):");
      input(student, n); //录入班级学生信息

      double[] sum = new double[n]; //存放总分的一个double数组
      double[] rs = new double[n]; //存放平时成绩的一个double数组
      double[] ts = new double[n]; //存放考试成绩的一个double数组
      
      for(int i = 0; i < n; i++) //如果成绩合法计算每位学生的总分和等级
      {
         rs[i] = change(student[i][2]);
         ts[i] = change(student[i][3]);
         if (isLegal(rs[i]) && isLegal(ts[i]))
         {     
            sum[i] = score(rs[i], ts[i]);
            student[i][4] = grade(sum[i]);          //将等级存入原数组
            student[i][5] = String.valueOf(sum[i]); //将double型转为字符串存入原数组
         }
         else  //输出错误提示信息
         {
            wrong(student, rs, ts, i);
         }
      }

      selection(student, sum, n); //用选择排序按总成绩进行降序排序

      System.out.println("\n\n最终的学生成绩排名为:\n");
      System.out.println(" 学号           姓名       平时成绩  考试成绩   等级      总成绩");
      output(student, n); //输出

      in.close();    //释放内存    
   }
}

输出示例

输入正确时的排序:
在这里插入图片描述
输入错误信息时提示错误信息并定位:
在这里插入图片描述

总结

以上为我在java学习过程中第一次编写的上百行的程序,总的来说不算难。程序还是有挺多缺点,比如说平时成绩和考试成绩如果输入字符串等程序会崩溃等问题。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值