假设一个班有n(n<=50)个学生,每人考m(m<=5)门课,求每个学生的平均成绩和每门课的平均成绩,并输出各科成绩均大于等于平均成绩的学生数量。
Input
输入数据有多个测试实例,每个测试实例的第一行包括两个整数n和m,分别表示学生数和课程数。然后是n行数据,每行包括m个整数(即:考试分数)。
Output
对于每个测试实例,输出3行数据,第一行包含n个数据,表示n个学生的平均成绩,结果保留两位小数;第二行包含m个数据,表示m门课的平均成绩,结果保留两位小数;第三行是一个整数,表示该班级中各科成绩均大于等于平均成绩的学生数量。
每个测试实例后面跟一个空行。
每个测试实例后面跟一个空行。
一、数据结构
Student[] stu = new Student[n]; //学生对象数组
double[] avg = new double[m]; //各科的平均成绩
class Student{ //学生类
double avg;
double[] grade;
}
二、面向对象的解题思路(类属性的封装):
1.创建n个学生对象的数组
2.依次读入一个学生的各科成绩并将数据记录在科目成绩总和数组中,算出该学生的平均成绩
3.根据学生数循环执行步骤2
4.根据科目成绩总和数组求出各科的平均成绩(avg[j] /= n)
5.计算各科成绩均大于等于平均成绩的学生数量
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
while(in.hasNextInt()){
int n = in.nextInt();
int m = in.nextInt();
Student[] stu = new Student[n]; //创建n个学生对象的数组
double[] avg = new double[m]; //各科的平均成绩
int i,j;
int sum,num = 0;
for(i = 0; i < n; i++){
sum = 0;
stu[i] = new Student(m);
for(j = 0; j < m; j++){ //依次读入一个学生的各科成绩
stu[i].grade[j] = in.nextInt();
sum += stu[i].grade[j]; //一个学生实例的成绩总和
avg[j] += stu[i].grade[j]; //各科的总成绩
}
stu[i].setAvg(sum*1.0/m); //设置该学生的平均成绩
}
for(j = 0; j < m; j++){ //各科的总成绩取平均
avg[j] /= n;
}
boolean flag;
//计算各科成绩均大于等于平均成绩的学生数量
for(i = 0; i < n; i++){
flag = true;
for(j = 0; j < m; j++){
if(stu[i].grade[j] < avg[j]){
flag = false;
break;
}
}
//flag为true时代表该学生各科成绩均大于等于平均成绩
if(flag){
num++;
}
}
//输出,切记要依照格式,System.out.printf("%.2f\n",a);的格式会PE
for(i = 0; i < n-1; i++){
System.out.printf("%.2f ",stu[i].avg);
}
System.out.printf("%.2f",stu[n-1].avg);
System.out.println();
for(i = 0; i < m-1; i++){
System.out.printf("%.2f ",avg[i]);
}
System.out.printf("%.2f",avg[m-1]);
System.out.println();
System.out.println(num);
System.out.println();
}
}
//Student类
public static class Student{
double avg;
double[] grade;
//Student类的构造函数
public Student(int m){
grade = new double[m]; //实例化每个Student的成绩数组
}
public void setAvg(double avg){
this.avg = avg;
}
}
}