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

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

ただいまの
回答率

90.47%

  • Java

    16163questions

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

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

解決済

回答 3

投稿 編集

  • 評価
  • クリップ 2
  • VIEW 1,072

M.M.O-05

score 9

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

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

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

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);


    }

}
package objects;

public class Score {
    private String name;
    private int score;
    private double standardScore;

    public Score(String n,int s){
        this.name = n;
        this.score= s;            
    }

    public String name(){return this.name;}
    public int score(){return this.score;}
    public double standard(){return this.standardScore;}

    public void setName(String s){this.name=s;}
    public void setScore(int n){this.score=n;}

    public void standardScore(double average,double standardscore){
        this.standardScore=((this.score-average)*10)/standardscore)+50;
    }
    public void display(){
        System.out.println(name+"\\t"+score);
    }




    }


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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • swordone

    2016/10/15 11:06

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

    キャンセル

回答 3

checkベストアンサー

+1

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

import java.util.HashMap;
import java.util.Map;
import java.util.NoSuchElementException;
import java.util.Objects;
import java.util.Optional;

public class Q51375 {

    public static void main(String[] args) {
        ScoreRecord record = new ScoreRecord();
        record.put("A", 70);
        record.put("B", 71);
        record.put("C", 72);
        record.put("D", 73);
        for (String s : new String[] { "A", "B", "C", "D", "E" }) {
            try {
                record.display(s);
            } catch (NoSuchElementException e) {
                System.out.println(e.getMessage());
            }
        }
    }

}

class ScoreRecord {
    private Map<String, Integer> map = new HashMap<>();
    private double sum = 0;
    private double sqSum = 0;

    public void put(String name, int score) {
        int prevScore = Optional.ofNullable(map.put(Objects.requireNonNull(name, "name must not null."), score)).orElse(0);
        sum += score - prevScore;
        sqSum += score * score - prevScore * prevScore;
    }

    public void display(String name) {
        int score = Optional.ofNullable(map.get(name)).orElseThrow(() -> new NoSuchElementException(name + "なんて人いないよ"));
        System.out.println(String.format("%1$s %2$d %3$2.2f", name, score, dev(score)));
    }

    private double dev(int score) {
        return (score - average()) * 10 / stdevp() + 50;
    }

    private double stdevp() {
        return Math.sqrt(sqSum / map.size() - average() * average());
    }

    private double average() {
        return sum / map.size();
    }
}

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/10/21 12:37

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

    キャンセル

  • 2016/10/21 15:15 編集

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

    キャンセル

+1

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

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

private String name;
public String setName(name){
    if(name.length <= 10) {
        this.name=s;
    } else {
        throw new IllegalArgumentException('nameは10文字まで');
    }
}


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

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


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

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

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


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

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


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

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/10/14 14:07

    付け足しで、

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

    これだと、Scoreクラスのname、scoreフィールドは private なので、
    通常クラスの外からはアクセスできないはずです。
    なので、コンパイルエラーになるんじゃないかと。

    キャンセル

+1

条件としては名前.アクセス関数と得点.アクセス関数を別々にする。 
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 17: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の値しか出なかったのですが、どうすればよいでしょうか。
    あと偏差値をどうアクセスさせればよろしいでしょうか。

    キャンセル

  • 2016/10/14 17: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() を追加してください。

    目標達成までは、まだ、かなり道のりは長そうです。

    キャンセル

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

  • ただいまの回答率 90.47%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る

  • Java

    16163questions

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