(Java实现) HDOJ 2023 求平均成绩 面向对象设计思想

假设一个班有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;
		}
	}

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值