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

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

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

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

Q&A

解決済

5回答

3868閲覧

メソッド作成時の不要な変数とは。

yukiharu23

総合スコア12

Java

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

0グッド

1クリップ

投稿2016/09/03 05:07

public class MesoddoA {
double kakezan(int a, int b, int c){
int d = a * b * c;
return d;

これを作成し先生に提出いたしましたら
不要な変数が多いです、javaらしく書き直してといわれました。

int dが不要なのかと思い、int dを消し、return a * b * c;
と変更しても違ったので

引数の変数が不要なかと思い数字を直接いれたらエラーが発生してしまったので
質問いたしました。

ご教示お願いいたします。

使ってるのはEcripsです。

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

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

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

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

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

yuba

2016/09/03 05:14

どんなメソッドを作ることが課題だったのですか?
yukiharu23

2016/09/03 05:26

 「intの引数を3つ持ち、全ての値を掛け算した答えをdoubleで返す」  というメソッドを作成しましょう。 という課題でした。
yuba

2016/09/03 05:31

回答に追記しました。
ozwk

2016/09/06 03:37

他にも課題が出ていて、実はその別の課題の解答について指摘されていたということはありませんか?
yukiharu23

2016/09/06 06:08

いえ、指摘いただいてます課題はこちらで間違いないです!
kunai

2016/09/07 04:25

課題文は「intの引数を3つ持ち、全ての値を掛け算した答えをdoubleで返す」というそのままの文ですか? これが課題文をあなたの言葉で書きなおしたモノである場合、課題文をそのままコピペして提示いただけますか。
yukiharu23

2016/09/07 09:23

課題文そのままです。「intの引数を3つ持ち、すべての値を掛け算した答えをdoubleで返す」というメソッドを作成してくださいって課題です
yuba

2016/09/07 15:20

しかしteratailでは珍しく、「課題の全文をコピペしてください」「正解のプログラムはこう(のはず)です」という問答が続いていますね。普段なら課題の全文をコピペするのは嫌われるしあえて正解のプログラムを書かずヒントだけという回答が並ぶものなのに。 異常事態というか、やっぱりおかしい出題・評価です。中高ですか? 専門学校? 大学? 通信教育? 別の先生に打ち明けることで当人をたしなめてもらうなど可能ならそういった動きをすることの方が有益という気がしています。
swordone

2016/09/08 01:13

そもそも「不要な変数が多い」という話から始まったはずなのに、なぜ「戻り値の型の意味を考えろ」という話に変化してるのかもよくわからないのです。そもそもこの課題の目的は何なのでしょうか?何らかの授業の課題として出されているのだと思うのですが、授業の内容に対応したことをさせることが目的だと思うのです。であれば、この課題が出された時に授業で扱った内容こそが重要な手がかりになると思うのですが、いかがでしょうか?
yukiharu23

2016/09/08 07:42

私は今度未経験のSEとして入社するのですが入社日までの間、通信で教えていただけるということでお願いしてましてそれでいただいた課題でこの問題を今やってます! 授業などはまったくなく完全にメールでのやりとりです。 一番はじめは不要な変数が多いですと言われ、質問をいたしましたら戻り値に型の意味を理解すればわかると言われました。。
swordone

2016/09/08 07:50

その人、何者ですか?また、学校でないのなら、「ではどう書けばいいのか?」と質問して、お手本を見せてもらえないですか?
yukiharu23

2016/09/08 08:18

皆様大変お騒がせいたしました。sowrdone様ので正解頂きました。 double kakezan(double a, double b, double c){ return a * b * c; } こちらで正解でした。たくさんのご意見皆様ありがとうございました!!
ozwk

2016/09/08 08:51

(出題者的には)正解
guest

回答5

0

ベストアンサー

なんかよくわからん質問ですね。
「intの引数を3つ持ち」の時点で、変数を最低3つ使うことが確定します。
となると変数dを使わないreturn a * b * c;しかないように思えますが…
どういう点を指摘されたのか今一度確認する必要がありそうです。


「不要な変数」の正体がわかりませんし、そもそもこれが題意に沿っているかわかりませんが、「戻り値の型」と絡めて考えるとこういうことになるのでしょうか?

java

1double kakezan(double a, double b, double c){ 2 return a * b * c; 3}

「int型の引数を3つ持ち」を「int型の引数を3つ取り」と解釈してみました。int型の値がdouble型に代入されるところで暗黙キャストが発生するので、これならdoubleで計算ができます。

投稿2016/09/03 15:31

編集2016/09/05 15:28
swordone

総合スコア20649

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

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

yukiharu23

2016/09/05 09:32

戻り値に型宣言している意味を理解していますか?と尋ねられました。
swordone

2016/09/08 15:12

仕様変更でアクティブタブにベストアンサーのアクションが出なかったため気づくのが遅くなりました。 正直あの出題および指摘からこの回答に辿り着かせるのはかなり無理があると思います。 入社してから大変なことになりそうですが、入社後の質問者に幸あれ。
guest

0

先生の求めている正解とは違いそうな気がしますが、私なら3数に限らず任意の数の積を求められるよう

java

1double kakezan(double... xs) 2{ 3 double result; 4 for(double x: xs) result *= x; 5 return result; 6}

などと組みますね。
あと、質問文のプログラムでは引数がintで戻りがdoubleというのがおかしいです。
動くのですが、doubleで戻す意味がありません。

(追記)

intの引数を3つ持ち、全ての値を掛け算した答えをdoubleで返す」  というメソッドを作成しましょう。 という課題

あ、ほんとにそういう課題だったのですか⋯
だとすると、abcではだめです。

なぜdoubleで返すか。
数値の上限ですね。intは約21億が上限ですから、かけ算の結果これを越えて(オーバーフローして)しまい無意味な値を返すことになってしまいます。だからdoubleで返そうと。
ただし、abcと書いたらintとしてかけ算が行われるので、この時点でオーバーフローが発生します。doubleとしてかけ算させる必要があるのです。
(double)a * (double)b * (double)c
と書くとクリアできます。
doubleとintのかけ算はdoubleとして実行されるという性質がありますので、
(double)a * b * c
でも十分ですが。

投稿2016/09/03 05:18

編集2016/09/03 05:31
yuba

総合スコア5568

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

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

yukiharu23

2016/09/03 05:39

public class MesoddoA { double kakezan(int a, int b, int c){ return (a * b * c); } このような記述で正しいでしょうか??
yuba

2016/09/03 05:40

public class MesoddoA { double kakezan(int a, int b, int c){ return (double)a * (double)b * (double)c; } じゃなきゃだめです。 ためしに kakezan(100000,100000,100000) をの結果を見てみてください。
yuba

2016/09/03 05:48

(しかし「Javaらしく」と言われたら、こう書くのが筋なんだろう⋯) static double kakezan(int... xs) { return java.util.stream.IntStream.of(xs).asDoubleStream().reduce(1.0, (a,b)->a*b); }
yukiharu23

2016/09/03 06:06

ありがとうございます!これで提出してみます!
yukiharu23

2016/09/05 09:31

yubaさん 提出したのですがだめでした。。。 戻り値に型宣言している意味を理解していますか?と言われました。 型を宣言してるのは処理した結果がこの型になるようにするためではないのでしょうか?
ozwk

2016/09/05 10:06 編集

どれを提出したのですか?
yukiharu23

2016/09/05 10:16

public class MesoddoA { static double kakezan(int a, int b, int c){ return (double)a * (double)b * (double)c; } を提出しました!
yuba

2016/09/05 11:55

先生のレベルが低いんじゃないか疑惑が出てきましたね…
swordone

2016/09/05 15:24 編集

レベルが低いというか、目的地が不明ですね… そもそも「不要な変数」の話はどこに行ったんでしょう?
yohhoy

2016/09/07 04:05

良くある話ですが「Javaらしく」というのは「俺の気に入る書き方で」以上の意味はなさそうですね...
guest

0

変数が多いらしいので、変数をたった一つにしました。

Java

1double kakezan(int ...a) { 2 return java.util.Arrays.stream(a).mapToObj(java.math.BigInteger::valueOf) 3 .reduce(java.math.BigInteger::multiply).get().doubleValue(); 4}

とてもJava8らしくなったと思います。

投稿2016/09/03 16:56

raccy

総合スコア21733

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

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

PineMatsu

2016/09/05 09:40

確かにJavaらしいですけど、「intの引数を3つ持ち、全ての値を掛け算した答えをdoubleで返す」という課題には反していますよね(笑)。 この先生はどういう答えを期待して課題を出したんだでしょうね?
raccy

2016/09/05 09:46

ほ、ほら、1つでも2つでも4つでも5つでも対応しているのだし、大は小を兼ねると言うじゃ無いですか…先生、これでは駄目ですか?(TдT)
PineMatsu

2016/09/05 09:50

先生「どこに引数3つがあるのじゃ?」
yuba

2016/09/07 03:25

テストコードを kakezan(0x1000, 0x1000, 0x1000) とすれば、実引数は3つあると言えます。先生は「仮引数を3つ持ち」とは言っていないから。
swordone

2016/09/07 07:13

mapToDoubleにしてDoubleStreamで乗算すれば十分だと思います。
raccy

2016/09/07 09:09

double二つを乗算するだけ関数が見つからなかったんです。ラムダ式を使っちゃいますと変数が2個も増えてしまいますし。
guest

0

暗黙的な型変換を利用しろと言う事ではないでしょうか。

Java

1public class MesoddoA { 2 double kakezan(int a, int b, int c){ 3 double result; 4 int d = a * b * c; 5 result = d; 6 return result; 7 } 8}

変数増えてるやんって言わないでくださいね?

投稿2016/09/07 05:04

kunai

総合スコア5405

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

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

yuba

2016/09/07 07:27

これ、たぶんいけません。 kakezan(2000,1100,1000) でどういう値が返ることを期待するかって話になってきます。
kunai

2016/09/07 08:36

あ、確かに。 じゃあ、 double result; result = 1*a; result *= b; result *= c; return result; とかそんな感じですかね。
yuba

2016/09/08 00:35

御意。
guest

0

前後の課題でかわるきがするがうちの場合 掛け算の可変引数の場合こうするな。
※ 可変引数の掛け算では1つ目を必須としたいため

あと yuba さんの方式だと 多分 常に 0 が返る気がするが触れないでおこう

java

1/* package whatever; // don't place package name! */ 2 3import java.util.*; 4import java.lang.*; 5import java.io.*; 6 7/* Name of the class has to be "Main" only if the class is public. */ 8class Ideone 9{ 10 public static void main (String[] args) throws java.lang.Exception 11 { 12 // your code goes here 13 System.out.println(multiplied(1,2)); 14 System.out.println(multiplied(2,2)); 15 System.out.println(multiplied(2,2,3)); 16 } 17 18 public static double multiplied(int a, int ...bs) { 19 double result = a; 20 for (int b : bs) { 21 result *= b; 22 } 23 return result; 24 } 25}

動作

投稿2016/09/03 05:46

編集2016/09/03 05:53
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

yuba

2016/09/04 04:03

いや、0が返るどころか未初期化でコンパイルエラーになりますねあれだと。 1に初期化しないと。
退会済みユーザー

退会済みユーザー

2016/09/04 04:20 編集

そういえばそうだっけ まあ1に初期化すると 引数なしの場合に1がかえってしまうw
yuba

2016/09/04 12:29

引数0個で1が返るのはわりと自然な仕様じゃないですかね。 自然数のゼロ乗が1になるのと同様。
swordone

2016/09/06 16:19

ゼロの階乗も、正の数のゼロ乗も1ですからね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問