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

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

ただいまの
回答率

88.20%

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

解決済

回答 5

投稿

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

yukiharu23

score 12

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です。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

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

  • swordone

    2016/09/08 16:50

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

    キャンセル

  • yukiharu23

    2016/09/08 17:18

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

    キャンセル

  • ozwk

    2016/09/08 17:51

    (出題者的には)正解

    キャンセル

回答 5

checkベストアンサー

+2

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


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

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


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

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2016/09/05 18:32

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

    キャンセル

  • 2016/09/09 00:12

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

    キャンセル

+2

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

double kakezan(double... xs)
{
  double result;
  for(double x: xs) result *= x;
  return result;
}

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

(追記)

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

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

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

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2016/09/05 20:55

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

    キャンセル

  • 2016/09/05 22:38 編集

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

    キャンセル

  • 2016/09/07 13:05

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

    キャンセル

+1

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

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


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

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2016/09/07 12:25

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

    キャンセル

  • 2016/09/07 16:13

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

    キャンセル

  • 2016/09/07 18:09

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

    キャンセル

0

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

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

/* package whatever; // don't place package name! */

import java.util.*;
import java.lang.*;
import java.io.*;

/* Name of the class has to be "Main" only if the class is public. */
class Ideone
{
    public static void main (String[] args) throws java.lang.Exception
    {
        // your code goes here
        System.out.println(multiplied(1,2));
        System.out.println(multiplied(2,2));
        System.out.println(multiplied(2,2,3));
    }

    public static double multiplied(int a, int ...bs) {
        double result = a;
        for (int b : bs) {
            result *= b;
        }
        return result;
    }
}

動作

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2016/09/04 13:03

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

    キャンセル

  • 2016/09/04 13:18 編集

    そういえばそうだっけ

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

    キャンセル

  • 2016/09/04 21:29

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

    キャンセル

  • 2016/09/07 01:19

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

    キャンセル

0

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

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

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

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2016/09/07 16:27

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

    キャンセル

  • 2016/09/07 17:36

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

    キャンセル

  • 2016/09/08 09:35

    御意。

    キャンセル

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

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

関連した質問

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