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

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

ただいまの
回答率

89.24%

java 入力した値を別のクラスで使う方法について

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 3,479

kazuo-maru

score 12

大学の課題でjavaを用いた簡易プログラミングを行なっているのですが、キーボードで入力した値を用いた平均、合計、順位、分散、標準偏差を計算するプログラムを書こうと思っています。しかし、クラスを2つに分けて書くという制限があるためキーボード入力した値を、別のクラスに飛ばそうと思っているのですがうまくいきません。改善の余地がありましたら教えていただきたいです。

発生している問題・エラーメッセージ

エラーメッセージ

該当のソースコード

import java.io.*;

class kadai{
public static void main(String args[])throws IOException{
double sum=0,ave=0,varac=0,stddiv=0,a=0,b=0,e=0;
int i=100,d=0,t=0,n=0;
String s;

BufferedReader k=new BufferedReader(new InputStreamReader(System.in));
System.out.println("こんにちは!");
System.out.println("ここではテスト結果の合計・平均、順位、分散、標準偏差を算出できます。");
System.out.println("はじめにどの機能を使うのか教えてね。");
System.out.println("合計と平均なら1、順位を知りたいときは2、分散と標準偏差なら3と入力してください");

s=k.readLine();
t=Integer.parseInt(s);

Calc obj=new Calc();

switch(t){
case 1:
System.out.println("次にテストの点数を入力してね。完了したらendと入力してください");

while(i!=-1){
s=k.readLine();
if(s.equals("end")){
i=-1;

}else{
a=Double.parseDouble(s);
sum=sum+a;
}
}

System.out.println("生徒数を教えてください");
s=k.readLine();
b=Double.parseDouble(s);

obj.set(sum,b);
double m;
m=obj.ave();
System.out.println("テストの合計点は"+sum+","+"平均点は"+m);

break;

case 2:
System.out.println("生徒数は30人以内でお願いします!");
System.out.println("テストの点数を入力してね。入力し終わったらendと入力してください");

int flag=100;

s=k.readLine();
while(flag!=-1){
if(s.equals("end")){
flag=-1;

}else{
int[] l= new int[30];
l[n]=Double.parseDouble(s);
n=n+1;
}
}
obj.bable(l[]);
for(int y=0;y<30;y++){
System.out.println(l[y]);

}
break;

case 3:
System.out.println("生徒数を教えてね");
s=k.readLine();
d=Integer.parseInt(s);

System.out.println("テストの点数を入力してね。完了したらendと入力してください");
int[] c= new int[d];
for (int j=1; j<=d; j++) {
s=k.readLine();
int h = Integer.parseInt(s);
sum = sum+h;
c[j-1] = h;

}
ave=sum/d;

for(int j=0; j<d; j++) {
e= (ave-c[j])*(ave-c[j]);
}
varac=e/d;
stddiv=Math.sqrt(varac);

System.out.println("分散は"+varac+","+"標準偏差は"+stddiv);
}
}
}

class Calc{
double a=0,b=0;

void set(double x,double y){
a=x;
b=y;
System.out.println("a="+x+"b="+y+"に設定");
}

double ave(){
return(a/b);
}

void bable(double []Y){
Double[] X=new Double[30];
Double tmp=0.0;
int n=0;
X[n]=Y[n];

for(int j=n-1;j>0;j--){
for(int l=0;l<j;l++){
if(X[l]<X[l+1]){
tmp=X[l];
X[l]=X[l+1];
X[l+1]=tmp;
}
}
}

試したこと

課題に対してアプローチしたことを記載してください

補足情報(言語/FW/ツール等のバージョンなど)

より詳細な情報

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 2

checkベストアンサー

+2

大前提

質問をするのならば、最低限以下の点を明記してください。

  • 環境は何か?(Windows/Linux? Eclipse/NetBeans?)
  • なにをしようとしているのか?(理想的な入出力)
  • どのように考えて今のコードを組んだのか?
  • どんなふうに上手くいかないのか?(コンパイルできない/想定通りの結果が出ない/実行中に落ちる)
  • 自分で思い当たる原因は何か?

また、コードはバッククオート三つで括ってください。
よくわからない場合は、マークダウン記法について調べてみてください。
これをしているかどうかで、回答の量と質が変わってきます。
(マークダウン記法を用いていない質問には、回答しない方針の人もいます)

本題

私の環境(Win10, IntelliJ IDEA)で試したところ、コンパイルエラーが数か所発生しました。
問題の個所と解決の方針を一部示します。

void bable(double []Y){
    Double[] X=new Double[30]; 
    Double tmp=0.0;
    int n=0;  
    X[n]=Y[n];

    for(int j=n-1;j>0;j--){
        for(int l=0;l<j;l++){
            if(X[l]<X[l+1]){
                tmp=X[l];
                X[l]=X[l+1];
                X[l+1]=tmp;
            }
        }
    }

問題点:
(1) 中カッコの対応が取れないこと
(2) 入力されるデータが整数なのに、なぜかDouble型を用いていること
(3) X[n]=Y[n]; このコードの必要性が感じられないこと
(4) せっかく処理して作ったX[30]が、メソッド外に渡されることなく捨てられていること
(5) bable → bubble
s=k.readLine();
while(flag!=-1) {
    if(s.equals("end")) {
        flag=-1;
    }
    else {
        int[] l= new int[30];
        l[n]=Double.parseDouble(s);
        n=n+1;
    }
}
obj.bable(l[]);

問題点:
(1) lのスコープを意識していない
(2) やっぱり入力値は整数ではないのか?
(3) メソッドにリストを渡すときの書き方が違う

...他にもいろいろあります。全部書いたらきりがないです。
ちょっとやそっと直しただけで動くコードでもなく、なぜ動くと思ったのか聞きたいほどです。

本当の本題

一から作り直してください。
条件とのことなので、仕方ないのかもしれませんが...
変にクラスを用いようとしたせいで、ひどいコードになっています。

こういうクラス作ればいいんじゃないですかね... 疑似コードです。

class TestResult {
    private int[] result;
    private int[] sortedResult;

    private int total;
    private double average, var, stddev;

    public TestResult(int[] result) {
        this.result = result;

        total = computeTotal();
        average = computeAverage();
        以下略
    }

    public int getTotal() {
        return total;
    }
    public double getAverage() {
        return average;
    }
    分散を返すメソッド
    標準偏差を計算するメソッド
    resultを返すメソッド
    sortedResultを返すメソッド

//
// Private Methods
    private int computeTotal() {
        return resultの合計;
    } 
    private double computeAverage() {
        return resultの平均値;
    }
    分散を計算するメソッド
    標準偏差を計算するメソッド

    バブルソートをするメソッド
}

こんな風に、『テストの結果から色んな統計値を計算する』クラスを作ります。
メインクラスの処理は簡単です。

class Main {
    Main() {
        0. ユーザからの入力を受け付け、int[]のリストを作る
        1. TestResultのインスタンスtestResultを作る。
        
        while(true) {
            switch(ユーザの入力) {
                case 1:
                    testResult.Total()の結果とtestResult.Average()の結果を出力
                    break;
                以下略
            }
        }
    }

    public static void main(String[] args) {
        new Main();
    }
}

かなり突貫ですが、これなら最低限読みやすいコードが書けるかと。
やりよう次第で無駄な処理は大分省けます、インタフェースもさらに簡潔になるでしょう。
頑張ってくださいね。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/08/09 12:07

    一応完成してコンパイルしてみたのですが、Testresultの部分でScoreとNinzuのシンボルがないと言われてしまいました。
    ```
    import java.io.*;

    class Main {
    Main() {
    String ss;
    int t=0;

    BufferedReader k=new BufferedReader(new InputStreamReader(System.in));
    System.out.println("こんにちは!");
    System.out.println("ここではテスト結果の合計・平均、順位、分散、標準偏差を算出できます。");
    System.out.println("はじめに生徒数を入力してね!");

    ss=k.readLine();
    int num=Integer.parseInt(ss);
    int ninzu =new int[num];

    System.out.println("人数分の点数を入力してね。");
    int score=new int[score];
    for(int i=0;i<ninzu.length;i++){
    ss=k.readLine();
    if(ss.equals("end")){
    i=-1;
    }else{
    score()=Integer.parseInt(ss);
    }
    }

    System.out.println("次にどの機能を使うのか教えてね。");
    System.out.println("合計・平均なら1、順位なら2、分散・標準偏差なら3と入力してね");
    ss=k.readLine();
    t=Integer.parseInt(ss);

    while(true) {
    switch(t) {
    case 1:
    System.out.println("合計は"+TestResult.getTotal()+","+"平均は"+TestResult.getAverage());
    break;

    case 2:
    System.out.println("順位は"+TestResult.getSortedResult());
    break;

    case 3:
    System.out.println("分散は"+TestResult.getVar()+","+"標準偏差は"+TestResult.getStddev());
    break;
    }
    }
    }


    public static void main(String[] args) throws IOException{
    new Main();
    }
    }


    ```class TestResult {
    private int[] result;
    private int[] sortedResult;

    private int total;
    private double ave, var, stddev;

    public TestResult(int[] result) {
    this.result = result;

    total = computeTotal();
    ave = computeAverage();
    var = computeVar();
    stddev = computeStddev();
    }

    public static int getTotal() {
    return total;
    }
    public static double getAverage() {
    return ave;
    }
    public static double getVar(){
    return var;
    }
    public static double getStddev(){
    return stddev;
    }
    public static int[] getResult(){
    return result;
    }
    public static int[] getSortedResult(){
    return sortedResult;
    }

    // Private Methods
    private int computeTotal() {
    TestResult.score();
    total=total+score();
    return total;

    }
    private double computeAverage() {
    TestResult.score();
    TestResult.ninzu();
    total=total+score();
    return (total/ninzu());
    }

    private double computeVar(){
    TestResult.score();
    TestResult.ninzu();

    for (int j=1; j<=ninzu.length; j++) {
    total = total+score();
    score(j-1) = h;

    }
    ave=(total/ninzu());
    for(int j=0; j<ninzu.length; j++) {
    e= (ave-score(j))*(ave-score(j));
    }
    var=(e/ninzu);
    return var;
    }

    private double computeStddev(){
    TestResult.score();
    TestResult.ninzu();

    for (int j=1; j<=ninzu.length; j++) {
    total = total+score();
    score(j-1) = h;

    }
    ave=(total/ninzu());
    for(int j=0; j<ninzu.length; j++) {
    e= (ave-score(j))*(ave-score(j));
    }
    var=(e/ninzu);
    return var;
    stddiv=Math.sqrt(var);
    return stddiv;
    }
    private int[] sortedResult(){
    TestResult.score();
    Double tmp=0.0;

    for(int j=n-1;j>0;j--){
    for(int l=0;l<j;l++){
    if(score(l)<score(l+1)){
    tmp=score(l);
    score[l]=score(l+1);
    score(l+1)=tmp;
    }
    }
    }


    }
    }
    お願いします。

    キャンセル

  • 2017/08/09 12:20

    TestResultから、Mainクラスのフィールドにアクセスすることはできません。resultの値を用いれば問題ないはずです。ただし人数に関しましては、TestResultのコンストラクタを修正し、第二引数に人数を受け取るような構造にしてもよいでしょう。
    それ以外にも多々おかしな箇所がありますが、単純に文法の知識不足の場合、ある程度ご自身で気付いてほしい感もあります。

    キャンセル

  • 2017/08/09 12:21

    あと、個人的に次のコードが不可解でたまらないのですが...
    int num = Integer.parseInt(ss);
    int ninzu = new int[num];
    そもそもコンパイル通らないですよね。もっとシンプルに書きましょう。
    int ninzu = Integer.parseInt(ss);

    キャンセル

0

直接ソースに関係ある回答ではありませんが
アルファベット一文字等の簡潔すぎる変数命名はやめましょう。
見直す側が何の変数かわからなくなり混乱してしまいます。

BufferedReader reader=new BufferedReader(new InputStreamReader(System.in));
System.out.println("こんにちは!");
System.out.println("ここではテスト結果の合計・平均、順位、分散、標準偏差を算出できます。");
System.out.println("はじめにどの機能を使うのか教えてね。");
System.out.println("合計と平均なら1、順位を知りたいときは2、分散と標準偏差なら3と入力してください"); 

inputvalue=Integer.parseInt(reader.readLine()); 

こんな感じで。

Javaですと開発環境はeclipseですかね?
eclipseですとコードアシスト機能があるので
多少長い変数名を定義しても頭数文字入力すれば予測変換で入力できます。

見やすいコーディングを心がけましょう!

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/08/08 12:33

    ご指摘ありがとうございます。
    大学でjavaの基礎の授業を受けたのですが訳も分からず困惑しておりました。
    以後気をつけます。回答ありがとうございました。

    キャンセル

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

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

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