成績表アプリの作成を通して、クラスの作り方、オブジェクト配列についての理解を深めよう。
この記事の対象者
Javaでオブジェクト指向を学び始めた人でクラスの基本がわかってきた人
最初のお題
(一般クラス)Subjectクラスと(アプリケーションクラス)SubjectAppクラスを作成し、以下の処理を作成せよ
[実行例] 何科目ありますか>>3 1科目の名前>>英語 1科目の点数>>23 2科目の名前>>数学 2科目の点数>>18 3科目の名前>>国語 3科目の点数>>25 英語:**********|**********|*** 数学:**********|******** 国語:**********|**********|******
作成の手順
Subjectクラスの作成
//インスタンスフィールド String name;//科目名 int score;//点数 //引数二個のコンストラクタ //インスタンスメソッド void showInfo() //実行例のように点数を*で表示するメソッド
作成例
public class Subject{
String name;
int score;
Subject(String name,int score){
this.name=name;
this.score=score;
}
void showInfo(){
System.out.printf("%s:",this.name);
for(int i=0;i<this.score;i++){
System.out.print("*");
if((i+1)%10 ==0){
System.out.print("|");
}
}
System.out.println();
}
}
SubjectAppクラスの作成
//Scannerインスタンスを作成 //何科目あるか聞く //科目数でSubject配列作成 //forループ --科目名を聞く --点数を聞く --Subjectインスタンスを作成し、配列に入れる //拡張forループ --SubjectインスタンスがshowInfoを実行する
作成例
import java.util.*;
public class SubjectApp{
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
System.out.print("何科目ありますか>>");
int n = sc.nextInt();
Subject[] data=new Subject[n];
for(int i=0;i<data.length;i++){
System.out.printf("%d科目の名前>>",i+1);
String name=sc.next();
System.out.printf("%d科目の点数>>",i+1);
int score=sc.nextInt();
data[i]=new Subject(name,score);
}
for(Subject s:data){
s.showInfo();
}
sc.close();
}
}
成績表アプリの作成
新たに(一般クラス)Studentクラスと (アプリケーションクラス)StudentAppクラスを作成し、 以下の処理を実現せよ。結果表示は総合点降順とすること (さきほど作ったSubjectクラスも利用する)
実行例
科目数は>>3 科目1>>英語 科目2>>数学 科目3>>国語 生徒は何人ですか>>3 1人目の名前を入力>>山田 山田の英語>>20 山田の数学>>18 山田の国語>>22 2人目の名前を入力>>田中 田中の英語>>28 田中の数学>>24 田中の国語>>26 3人目の名前を入力>>佐藤 佐藤の英語>>12 佐藤の数学>>30 佐藤の国語>>8 ---結果--- 1.田中(78) 英語:**********|**********|******** 数学:**********|**********|**** 国語:**********|**********|****** 2.山田(60) 英語:**********|**********| 数学:**********|******** 国語:**********|**********|** 3.佐藤(50) 英語:**********|** 数学:**********|**********|**********| 国語:********
Student クラスの作成
//インスタンスフィールド String name;//生徒の名前 Subject[] subjectData;//科目のデータ int totalScore;総合点 //コンストラクタ 名前でnewできるようにする(引数1つ) //インスタンスメソッド void showInfo() 実行例にあるように自分の情報を以下の出力形式で出力する 田中(78) 英語:**********|**********|******** 数学:**********|**********|**** 国語:**********|**********|******
作成例
public class Student{
String name;
Subject[] subjectData;
int totalScore;
Student(String name){
this.name=name;
}
void showInfo(){
System.out.printf("%s(%d)%n",this.name,this.totalScore);
for(Subject s:subjectData){
s.showInfo();
}
}
}
StudentApp クラスの作成
//Scannerインスタンスの生成 //科目数を聞く //科目数でString 型配列を作成する //forループ --科目名を聞く --科目名を配列に入れる //生徒の人数をきく //生徒の人数でStudent 型配列を作成する //forループ --名前を入力 --名前をもとにStudentインスタンスを作成し、配列に入れる --Subject型の配列を科目数で作成する --//forループ ----誰々の英語>>など聞く ----点数をその人の合計点数に加算する ----科目名と点数をもとにSubjectインスタンスを作成し、配列にいれる --作成したSuject 型配列をStudentインスタンスにセットする //Student配列を合計点数で降順にソート //--結果--を出力 //forループ //実行例のように出力する
作成例
import java.util.*;
public class StudentApp{
public static void main(String[] args){
Scanner sc =new Scanner(System.in);
System.out.print("科目数は>>");
int n=sc.nextInt();
String[] subjectNames=new String[n];
for(int i=0;i<n;i++){
System.out.printf("科目%d>>",i+1);
subjectNames[i]=sc.next();
}
System.out.print("生徒は何人ですか>>");
n=sc.nextInt();
Student[] data=new Student[n];
for(int i=0;i<data.length;i++){
System.out.printf("%d人目の名前を入力>>",i+1);
data[i]=new Student(sc.next());
Subject[] subjectData=new Subject[subjectNames.length];
for(int j=0;j<subjectData.length;j++){
System.out.printf("%sの%s>>",data[i].name,subjectNames[j]);
int score=sc.nextInt();
data[i].totalScore += score;
subjectData[j]=new Subject(subjectNames[j],score);
}
data[i].subjectData=subjectData;
}
//総合点降順処理
for(int i=0;i<data.length-1;i++){
for(int j=i+1;j<data.length;j++){
if(data[i].totalScore < data[j].totalScore){
Student temp=data[i];
data[i]=data[j];
data[j]=temp;
}
}
}
System.out.println("---結果---");
for(int i=0;i<data.length;i++){
System.out.printf("%d.",i+1);
data[i].showInfo();
}
}
}
コメント