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

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

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

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

Q&A

解決済

2回答

8836閲覧

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

kazuo-maru

総合スコア12

Java

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

0グッド

0クリップ

投稿2017/08/07 08:15

大学の課題で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/ツール等のバージョンなど)
より詳細な情報

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

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

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

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

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

guest

回答2

0

ベストアンサー

大前提

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

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

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

本題

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

Java

1void bable(double []Y){ 2 Double[] X=new Double[30]; 3 Double tmp=0.0; 4 int n=0; 5 X[n]=Y[n]; 6 7 for(int j=n-1;j>0;j--){ 8 for(int l=0;l<j;l++){ 9 if(X[l]<X[l+1]){ 10 tmp=X[l]; 11 X[l]=X[l+1]; 12 X[l+1]=tmp; 13 } 14 } 15 } 16 17問題点: 18(1) 中カッコの対応が取れないこと 19(2) 入力されるデータが整数なのに、なぜかDouble型を用いていること 20(3) X[n]=Y[n]; このコードの必要性が感じられないこと 21(4) せっかく処理して作ったX[30]が、メソッド外に渡されることなく捨てられていること 22(5) bable → bubble

Java

1s=k.readLine(); 2while(flag!=-1) { 3 if(s.equals("end")) { 4 flag=-1; 5 } 6 else { 7 int[] l= new int[30]; 8 l[n]=Double.parseDouble(s); 9 n=n+1; 10 } 11} 12obj.bable(l[]); 13 14問題点: 15(1) lのスコープを意識していない 16(2) やっぱり入力値は整数ではないのか? 17(3) メソッドにリストを渡すときの書き方が違う

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

本当の本題

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

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

Java

1class TestResult { 2 private int[] result; 3 private int[] sortedResult; 4 5 private int total; 6 private double average, var, stddev; 7 8 public TestResult(int[] result) { 9 this.result = result; 10 11 total = computeTotal(); 12 average = computeAverage(); 13 以下略 14 } 15 16 public int getTotal() { 17 return total; 18 } 19 public double getAverage() { 20 return average; 21 } 22 分散を返すメソッド 23 標準偏差を計算するメソッド 24 resultを返すメソッド 25 sortedResultを返すメソッド 26 27// 28// Private Methods 29 private int computeTotal() { 30 return resultの合計; 31 } 32 private double computeAverage() { 33 return resultの平均値; 34 } 35 分散を計算するメソッド 36 標準偏差を計算するメソッド 37 38 バブルソートをするメソッド 39}

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

Java

1class Main { 2 Main() { 3 0. ユーザからの入力を受け付け、int[]のリストを作る 4 1. TestResultのインスタンスtestResultを作る。 5 6 while(true) { 7 switch(ユーザの入力) { 8 case 1: 9 testResult.Total()の結果とtestResult.Average()の結果を出力 10 break; 11 以下略 12 } 13 } 14 } 15 16 public static void main(String[] args) { 17 new Main(); 18 } 19}

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

投稿2017/08/07 14:02

LouiS0616

総合スコア35660

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

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

kazuo-maru

2017/08/08 03:38

ご指摘ありがとうございます。 javaに関しては素人中の素人なので至らない点が多々あり、申し訳ありませんでした。 現在LouiS0616さんの回答を参考にして、作り直しているのですが、TestresultのクラスでprivateMethodsの計算をするとき、メインクラスでキーボード入力した値をtestresultのクラスに飛ばす歩法がわからないので教えていただきたいです。
LouiS0616

2017/08/08 06:10

「メインクラスでキーボード入力した値」とは、生徒の成績データでしょうか?それとも1~3のモードの入力でしょうか? 私が例示したクラス設計の場合、前者はTestResultのコンストラクタに与えるようになっています。 また、後者に関しては、入力されたモードをメインクラスが判別し、それに応じたgetXXメソッドを呼び出すようになっています。
LouiS0616

2017/08/08 06:13

誰でも最初は初心者ですので、わからないことばかりで仕方ないと思いますよ。 いちおう、質問のマークダウン表記だけ直していただけると嬉しいです。
kazuo-maru

2017/08/08 08:08 編集

回答ありがとうございます。一応自分で調べてわかる部分はやったつもりですが、TestResultで実際に計算するプログラムについてわからないことが多いです。以下に現在状況を報告します。 ```import java.io.*; class Main { public static Main() { String ss; BufferedReader k=new BufferedReader(new InputStreamReader(System.in)); System.out.println("こんにちは!"); System.out.println("ここではテスト結果の合計・平均、順位、分散、標準偏差を算出できます。"); System.out.println("はじめに生徒数を入力してね!"); System.out.println("入力し終わったらendと入力して!"); ss=k.readLine(); int num=integer.parseInt(ss) int[] ninzu =new int[num]; System.out.println("人数分の点数を入力してね。") public int[] score=new int[num]; for(int i=0;i<ninzu.length;i++){ ss=k.readLine(); if(ss.equals("end")){ i=-1; }else{ score[]=Integer.parseInt(ss); } } Calc ref=new TestResult(); 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 int getTotal() { return total; } public double getAverage() { return ave; } public double getVar(){ return var; } public double getStddev(){ return stddev; } public int[] getResult(){ return result; } public int[] getSortedResult(){ return sortedResult; } // Private Methods private int computeTotal() { total=total+score[]; return total; } private double computeAverage() { return (total/ninzu[]); } private double computeVar(){ 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(){ stddiv=Math.sqrt(var); return stddiv; } private int[] sortedResult(){ 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; } } } }``` よろしくお願いします。
LouiS0616

2017/08/08 08:19

クラスは、intやcharなどの型と似たような宣言をします。 例えば、int a = 3; とかね。int型のaを、int型の値3で初期化しているんですね。 クラスMyClassの場合、こうかきます。 MyClass foo = new MyClass(); MyClass型のfooを、MyClassのインスタンスで初期化しているのです。
LouiS0616

2017/08/08 08:23

クラスTestResultも同様に宣言します。 TestResult testResult = new TestResult(score); インスタンスを作るときに引数を与えられるのは、そのように『コンストラクタ』を定義しているからです。 インスタンスのメソッドmethodAを呼び出すには、次のようにすればよいです。 testMethod.methodA();
LouiS0616

2017/08/08 08:25

Calcを代替する目的でTestResultクラスを設計したので、Calcは使わなくても大丈夫です。
kazuo-maru

2017/08/09 03: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; } } } } } お願いします。
LouiS0616

2017/08/09 03:20

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

2017/08/09 03:21

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

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 02:50

ygoooo

総合スコア71

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

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

kazuo-maru

2017/08/08 03:33

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問