题目很简单,问题要求如下:
输入一个班的学生的平时和考试成绩,计算每个学生的总成绩和等级,并且按照成绩从高到低输出。需要检查输入的合法性,增强程序健壮性。需要对程序进行模块化分解,利用方法实现不同的模块。
如果我们是一个使用者,我们想要这个程序具有什么样的功能呢?
本来准备详细一一说明的,但想想除了我自己之外,估计也没啥人会看,就不麻烦了,此之后文字内容均直接截图
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学习过程中第一次编写的上百行的程序,总的来说不算难。程序还是有挺多缺点,比如说平时成绩和考试成绩如果输入字符串等程序会崩溃等问题。