本题要求编写程序,根据输入学生的成绩,统计并输出学生的平均成绩、最高成绩和最低成绩。建议使用动态内存分配来实现。
输入格式:
输入第一行首先给出一个正整数N,表示学生的个数。接下来一行给出N个学生的成绩,数字间以空格分隔。
输出格式:
按照以下格式输出:
average = 平均成绩
max = 最高成绩
min = 最低成绩
结果均保留两位小数。
输入样例:
3
85 90 95
输出样例:
average = 90.00
max = 95.00
min = 85.00
/**
* 将字符串数组转为 double 类型数组的方法
* 同时判断数据量是否正确
*
* @param N 总人数
* @param str 成绩字符串
* @return
*/
public static double[] splitString(int N, String str) {
double sum = 0;
// 按空格拆分字符串
String[] String_array = str.split("\\s+");
int length = String_array.length;
if (N != length) {
// 数据量不对返回空数组
return new double[0];
}
double[] array = new double[length + 1];
for (int i = 0; i < length; i++) {
// 将每个成绩从字符串格式转为double格式并放入数组
double sorce = Double.parseDouble(String_array[i]);
array[i] = sorce;
sum += sorce; // 求总成绩
}
// 数组最后一个是总成绩
array[length] = sum;
return array;
}
/*
* 获取结果的方法
*/
public static double[] result(Scanner in) {
int N; // 总人数
// 输入的成绩需要使用字符串接收
String scorce_String;
// 转换为 double 类型数据的成绩数组
double[] sorces;
double[] result = new double[4];
System.out.print("请输入学生数量:");
// 接收输入的总人数
try {
N = Integer.parseInt(in.nextLine());
System.out.print("已确认,请输入成绩(每个同学成绩使用空格分隔):");
// 接收成绩字符串
scorce_String = in.nextLine();
System.out.println("已接收,请等候");
sorces = splitString(N, scorce_String);
if (sorces.length == 0) {
System.out.println("成绩数据数量不对,请重新输入\t");
// 递归调用此方法重新进行输入
return result(in);
}
// 对数组进行自然排序
Arrays.sort(sorces);
// 最小值是数组第一个
result[0] = sorces[0];
// 最大值是数组倒数第二个
result[1] = sorces[N - 1];
// 总成绩应该在数组最后一个,求平均值
result[2] = sorces[N] / N;
// 总成绩
result[3] = sorces[N];
return result;
} catch (NumberFormatException e) {
System.out.println("数据格式不正确,请重新输入");
return result(in);
}
}
public static void main(String[] args) {
Scanner in = new Scanner(System.in); // 键盘输入对象
double[] result = result(in);
in.close();
System.out.printf("最小值:%.2f\n", result[0]);
System.out.printf("最大值:%.2f\n", result[1]);
System.out.printf("平均值:%.2f\n", result[2]);
System.out.printf("总成绩:%.2f\n", result[3]);
}