質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

3回答

4029閲覧

java 得点表。アクセス関数を使用して数値を呼び出すプログラムを作りたい

M.M.O-05

総合スコア15

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

2クリップ

投稿2016/10/14 03:53

編集2016/10/21 03:46

課題なのですが、
2つのオブジェクトを使って
名前を入力したときにアクセス関数によって
得点と偏差値が表示されるプログラムを作りたいのですが、
モデルを教えていただけないでしょうか?

1つは各人の名前と偏差値が書き込まれたオブジェクト、もう1つはメインのプログラムでmain()が書かれたものにしたいです。

途中まで書いたのですが、そこからの関数の使い方がイマイチわかりません。
条件としては名前.アクセス関数と得点.アクセス関数を別々にする。
privateを使うというものですが、
初心者なので、容量を得ません。
途中まで書けたのでそこからの持っていきかたのモデル
を教えていただけませんでしょうか。
宜しくお願いいたします。

lang

1package objects; 2 3public class Scores { 4 5 public static void main(String[] args) { 6 7 Score[] scores={ new Score("A",70), 8 new Score("B",71), 9 new Score("C",72), 10 new Score("D",73) 11 }; 12 System.out.println(scores[0].name+","+scores[0].score); 13 14 15 } 16 17} 18

lang

1package objects; 2 3public class Score { 4 private String name; 5 private int score; 6 private double standardScore; 7 8 public Score(String n,int s){ 9 this.name = n; 10 this.score= s; 11 } 12 13 public String name(){return this.name;} 14 public int score(){return this.score;} 15 public double standard(){return this.standardScore;} 16 17 public void setName(String s){this.name=s;} 18 public void setScore(int n){this.score=n;} 19 20 public void standardScore(double average,double standardscore){ 21 this.standardScore=((this.score-average)*10)/standardscore)+50; 22 } 23 public void display(){ 24 System.out.println(name+"\\t"+score); 25 } 26 27 28 29 30 }

補足ですが、objectsというパッケージにScoresとScoreというクラスを設け、Scoresはmainで、各点数と名前(ここではA,B,C,D)を入力し、Scoreで偏差値の計算を行うプログラムをつくる。
そしてScoresでScoreの計算に基づいて名前や得点のインスタンスにアクセス関数を使用して
(名前,点数,偏差値)がSystem.out.printlnで表示されるプログラムをつくりたい。ということです。
よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

swordone

2016/10/15 02:06

名前.アクセス関数とか得点.アクセス関数ってなんでしょう?名前とか得点のインスタンスに対してアクセス関数を使えということでしょうか?
guest

回答3

0

ベストアンサー

およそ授業でやらないような書き方をしてみました。

java

1import java.util.HashMap; 2import java.util.Map; 3import java.util.NoSuchElementException; 4import java.util.Objects; 5import java.util.Optional; 6 7public class Q51375 { 8 9 public static void main(String[] args) { 10 ScoreRecord record = new ScoreRecord(); 11 record.put("A", 70); 12 record.put("B", 71); 13 record.put("C", 72); 14 record.put("D", 73); 15 for (String s : new String[] { "A", "B", "C", "D", "E" }) { 16 try { 17 record.display(s); 18 } catch (NoSuchElementException e) { 19 System.out.println(e.getMessage()); 20 } 21 } 22 } 23 24} 25 26class ScoreRecord { 27 private Map<String, Integer> map = new HashMap<>(); 28 private double sum = 0; 29 private double sqSum = 0; 30 31 public void put(String name, int score) { 32 int prevScore = Optional.ofNullable(map.put(Objects.requireNonNull(name, "name must not null."), score)).orElse(0); 33 sum += score - prevScore; 34 sqSum += score * score - prevScore * prevScore; 35 } 36 37 public void display(String name) { 38 int score = Optional.ofNullable(map.get(name)).orElseThrow(() -> new NoSuchElementException(name + "なんて人いないよ")); 39 System.out.println(String.format("%1$s %2$d %3$2.2f", name, score, dev(score))); 40 } 41 42 private double dev(int score) { 43 return (score - average()) * 10 / stdevp() + 50; 44 } 45 46 private double stdevp() { 47 return Math.sqrt(sqSum / map.size() - average() * average()); 48 } 49 50 private double average() { 51 return sum / map.size(); 52 } 53}

投稿2016/10/15 02:57

swordone

総合スコア20651

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

M.M.O-05

2016/10/21 03:37

ご回答ありがとうございます。 今回の目標としては、objectsというパッケージに ScoreとScoresという2つのクラスが含まれているプログラム を作りたいのですが、お答え頂いた回答の方法ですとエラーが出てきてしまうのですが どうしたらよろしいでしょうか。 Scoreには各点数と名前を、Scoresにはそれを計算し、 System.out.prinlnで (名前,点数,偏差値)という形で結果が表示される プログラムだとどうなりますか。 すいませんが、宜しくお願いいたします。
swordone

2016/10/21 06:19 編集

さすがに課題丸ごと請け負いはしませんよ。持って行き方を聞かれたのでそれを説明する概念的な意味で書いたコードなので。 エラーがでてるのはおそらくJava7以下だからではないでしょうか。
guest

0

条件としては名前.アクセス関数と得点.アクセス関数を別々にする。

privateを使うというものですが、

書かれたプログラムでは、 score と name はクラス Score の private 変数なので、そのままでは外からアクセスできません。

System.out.println(scores[0].name+","+scores[0].score);

は Score の private 変数に直接アクセスしようとしているので、コンパイルエラーになると思います。
main からはアクセス関数を通して、 score[0].score() のようにアクセスするように修正する必要があります。
値取得用のアクセス関数が変数名と同じなのは若干気持ちが悪いので、getScore, getStandard とかにされたほうが良いでしょう。

名前を入力したときにアクセス関数によって

得点と偏差値が表示されるプログラムを作りたいのですが、

まず、全員のデータが揃ったところで、平均と標準偏差を計算する必要があります。これは、 main の中でループで Score を巡回して実現することになるでしょう。

次に各人の偏差値を計算して設定する必要があります。これも main の中でループを回して全員の standardScore を呼び出す必要があるでしょう。

最後に名前の入力を受け付けて、得点と偏差値を印刷するプログラムを作る必要があります。

  1. 標準入力から名前を読み込む
  2. 読み込まれた名前と一致する Score を探す。(ループを回して探す)
  3. 見つかった Score の display メソッドを呼び出して印刷する

書かれた display() メソッドでは偏差値を印刷していないので、偏差値を印刷するように修正する必要があるでしょう。

読み込まれた名前と一致する Score を探すためにハッシュテーブルを使うほうが一般的です。現在は、Score のインスタンスを配列に格納されていますが、 Hashtable に格納しておけば、簡単に早く探せると思います。件数が増えてくると、配列を前から探す方法では件数に比例して遅くなりますが、ハッシュテーブルにしておけば、遅くなりません。

投稿2016/10/14 05:03

mit0223

総合スコア3401

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

M.M.O-05

2016/10/14 08:01

ご回答ありがとうございます。 main()のオブジェクトについて ```lang-java package objects; public class Scores { public static void main(String[] args) { Score[] scores={ new Score("A",70), new Score("B",71), new Score("C",72), new Score("D",73) }; System.out.println(scores[0].name()+","+scores[0].score()); } } ``` となったのですが、 実行した時に Aの値しか出なかったのですが、どうすればよいでしょうか。 あと偏差値をどうアクセスさせればよろしいでしょうか。
mit0223

2016/10/14 08:55

scores[0] しか印刷していないので、当然、A しか表示されません。Bは score[1], Cは score[2], D は score[3] に入ってます。 目標を達成するためには、私の回答に従って、かなりコーディングする必要があります。 私の回答の中で「ループを回して」となっているところは、for でループを回してすべての要素を巡回してください。 たとえば、すべての要素を印刷してみる(あくまでテスト目的で目標にはふくまれていない)のなら for(int i=0; i< scores.length; i++){ System.out.println(scores[i].name()+","+scores[i].score()); } などとしてください。偏差値も印刷するなら、 scores[i].standard() を追加してください。 目標達成までは、まだ、かなり道のりは長そうです。
guest

0

学生さんだとしたら授業はちゃんと聞いた方がいいですよ
社会に出ると、お金もあって勉強もしたくても時間がなかったりするので、学生の時間は本当に貴重です。

まず、privateメンバにする意味は分かりますか?
仮にnameに「最大10文字まで」という制限を付けたい場合、

Java

1private String name; 2public String setName(name){ 3 if(name.length <= 10) { 4 this.name=s; 5 } else { 6 throw new IllegalArgumentException('nameは10文字まで'); 7 } 8}

とかして、その制限に沿った値しか受け付けないという事が出来るわけですが
public にしてしまうと

scores[0].name = "abcdefg hijklmn";

とか書いても、通ってしまうんですね。
なので、privateにして、アクセサメソッド(setName() getName())を使うわけです。

で、質問文の中のソースコードでは、以下のようにしてname等を出力しようとしていますが

Java

1System.out.println(scores[0].name+","+scores[0].score);

これは、アクセサメソッドを介さずに、直接参照してる形ですよね。
なので、これもアクセサメソッドを利用するようにします。

Java

1System.out.println(scores[0].name()+","+scores[0].score());

メンバとアクセサメソッドが同名だと、このように混乱も招くので、「setName」「getName」等、わかりやすい名前にしておくと良いです。

同じようにして全員のscoreを取得したら、それを計算してaverageを算出します。
同様に、standardScoreも計算します。

その後、ご自身で作られたstandardScore()の引数に与えればよいのでは。

投稿2016/10/14 04:39

kunai

総合スコア5405

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kaputaros

2016/10/14 05:07

付け足しで、 > System.out.println(scores[0].name+","+scores[0].score); これだと、Scoreクラスのname、scoreフィールドは private なので、 通常クラスの外からはアクセスできないはずです。 なので、コンパイルエラーになるんじゃないかと。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問