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

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

ただいまの
回答率

89.08%

java キーボード入力を用いた計算プログラム

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 2,374

kazuo-maru

score 12

概要

キーボードから入力したテストの結果から、合計・平均・順位(バブルソート)分散・標準偏差を導出するプログラムを作っています。
具体的には
生徒数を入力

生徒数の応じた点数を入力

使いたい機能を番号で選択

結果の表示
みたいな感じです。コンパイルのエラーは出ないのですが、結果の表示の部分で合計は0、平均は0のような羅列が無限に表示されます。入力した結果を配列の中に一時保存して、その配列を引数として別のクラスで計算してからメインクラスで表示したいのですが、結果がうまく配列化されず引数が0であることが原因だと考えています。色々な方からアドバイスを受けるのですが自力ではどうにもなりませんでした。お願いします。条件としてはクラスを二つ使うこと、キーボード入力をすることです。

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

    Main() {
    String ss=null;
    int t=0,j=0,ninzu=0;

    BufferedReader k=new BufferedReader(new InputStreamReader(System.in));
      System.out.println("こんにちは!");
      System.out.println("ここではテスト結果の合計・平均、順位、分散、標準偏差を算出できます。");
    System.out.println("はじめに生徒数を教えてね。");
    try{
    //生徒数の確認
    ss=k.readLine();
    ninzu=Integer.parseInt(ss);
  }catch(IOException e) {
        System.out.println("error");
      }

    System.out.println("人数分の点数を入力してね。終わったらendと入力して!");
    //入力した結果を配列化する
    try{
    for(int i=0;i<ninzu;i++){
        ss=k.readLine();
        int[] score=new int[ninzu];//この部分が機能していない?
        score[i]=Integer.parseInt(ss);
          }
      }catch(Exception e) {
            System.out.println("エラーが発生しました");
        }

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

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

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

                case 3:
                     System.out.println("分散は"+TestResult.getVar(score)+","+"標準偏差は"+TestResult.getStddev(score));
                     break;
            }
        }
    }
}
class TestResult {
    private static int[] result;
    private static int[] sortedResult;

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

    public TestResult() {
        this.result = result;

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

    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 static int computeTotal(int[] x) {
    for(int i=0;i<x.length;i++){
     total=total+x[i];
    }
    return total;
  }
    private static double computeAverage(int[] x) {
      for(int i=0;i<x.length;i++){
       total=total+x[i];
    }
    return (total/x.length);
}

    private static double computeVar(int[] x){
      for (int j=0; j<x.length; j++) {
          total = total+x[j];
    }
              double e=0;
             ave=(total/x.length);

             for(int j=0; j<x.length; j++) {
                     e= (ave-x[j])*(ave-x[j]);
     }
            var=(e/x.length);
            return var;
     }

    private static double computeStddev(int[] x){
      double e=0;
      for (int j=0; j<x.length; j++) {
      total = total+x[j];

    }
             ave=(total/x.length);
             for(int j=0; j<x.length; j++) {
                     e= (ave-x[j])*(ave-x[j]);
     }
            var=(e/x.length);
            stddev=Math.sqrt(var);
            return stddev;
    }
    private static int[] sortedResult(int[] x){
      int tmp=0;

      for(int j=x.length-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;

        }
      }
    }
    return sortedResult;
  }
}
  • 気になる質問をクリップする

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 1

checkベストアンサー

0

ともかく、それなりに動作(コンパイルエラーを取る、無限に出力がくりかえされないようにする) ようにしたものを示します。
(別回答として、全体をかきなおしたものを投稿する予定です)

teratail/Main.java

package teratail;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;

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

    Main() {
        String ss = null;
        int t = 0, j = 0, ninzu = 0;

        BufferedReader k = new BufferedReader(new InputStreamReader(System.in));
        System.out.println("こんにちは!");
        System.out.println("ここではテスト結果の合計・平均、順位、分散、標準偏差を算出できます。");
        System.out.println("はじめに生徒数を教えてね。");
        try {
            // 生徒数の確認
            ss = k.readLine();
            ninzu = Integer.parseInt(ss);
        } catch (IOException e) {
            System.out.println("error");
        }

        System.out.println("人数分の点数を入力してね。終わったらendと入力して!");
        // 入力した結果を配列化する
        int[] score = new int[ninzu];// この部分が機能していない?
        try {
            for (int i = 0; i < ninzu; i++) {
                ss = k.readLine();
                score[i] = Integer.parseInt(ss);
            }
        } catch (Exception e) {
            System.out.println("エラーが発生しました");
        }

        TestResult testResult = new TestResult(score);
        while (true) {

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

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

            case 2:
                System.out.println("順位は");
                System.out.println(Arrays.toString(testResult.getSortedResult()));
                break;

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

teratail/TestResult.java

package teratail;

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

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

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

        this.total = computeTotal(result);
        this.ave = computeAverage(result);
        this.var = computeVar(result);
        this.stddev = computeStddev(result);
        this.sortedResult = sortedResult(result.clone());
    }

    public int getTotal() {
        return this.total;
    }

    public double getAverage() {
        return this.ave;
    }

    public double getVar() {
        return this.var;
    }

    public double getStddev() {
        return this.stddev;
    }

    public int[] getResult() {
        return this.result;
    }

    public int[] getSortedResult() {
        return this.sortedResult;
    }

    // Private Methods
    private static int computeTotal(int[] x) {
        int total = 0;
        for (int i = 0; i < x.length; i++) {
            total = total + x[i];
        }
        return total;
    }

    private static double computeAverage(int[] x) {
        int total = computeTotal(x);
        return (total / x.length);
    }

    private double computeVar(int[] x) {
        double e = 0;
        double ave = computeAverage(x);
        for (int j = 0; j < x.length; j++) {
            e = (ave - x[j]) * (ave - x[j]);
        }
        double var = (e / x.length);
        return var;
    }

    private double computeStddev(int[] x) {
        double var = computeVar(x);
        double stddev = Math.sqrt(var);
        return stddev;
    }

    private static int[] sortedResult(int[] x) {
        int tmp = 0;

        for (int j = x.length - 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;

                }
            }
        }
        return x;
    }
}

実行例:
イメージ説明

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/08/13 20:05

    ありがとうございます。解決できました。

    キャンセル

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

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

関連した質問

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