(Java實現) HDOJ 2023 求平均成績 面向物件設計思想
阿新 • • 發佈:2019-02-10
假設一個班有n(n<=50)個學生,每人考m(m<=5)門課,求每個學生的平均成績和每門課的平均成績,並輸出各科成績均大於等於平均成績的學生數量。
Input 輸入資料有多個測試例項,每個測試例項的第一行包括兩個整數n和m,分別表示學生數和課程數。然後是n行資料,每行包括m個整數(即:考試分數)。
Output 對於每個測試例項,輸出3行資料,第一行包含n個數據,表示n個學生的平均成績,結果保留兩位小數;第二行包含m個數據,表示m門課的平均成績,結果保留兩位小數;第三行是一個整數,表示該班級中各科成績均大於等於平均成績的學生數量。
每個測試例項後面跟一個空行。
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; } } }