1. 程式人生 > >(Java實現) HDOJ 2023 求平均成績 面向物件設計思想

(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;
		}
	}

}