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

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

ただいまの
回答率

90.48%

  • Java

    14073questions

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

メソッドを使ったプログラムを作りたいです

解決済

回答 5

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,168

worrrld

score 6

前提・実現したいこと

Javaのメソッドを使う問題を解いています。
問題は以下の通りです。

好物を元に動物の名前と特徴を出力するプログラム 
・作成するクラス 
 FindAnimalInfoクラス 
   →食べ物情報を元に動物名と特徴を出力 

・メソッド:getName(引数:food) 
       getDetail(引数:food) 

・入力と出力の仕様 
 入力値:ニンジン → 出力結果:ウマ -> 足が速い 
 入力値:バナナ  → 出力結果:サル -> 木登りがうまい 
 入力値:キャベツ → 出力結果:ウサギ -> 耳がいい 
 ※ニンジン、バナナ、キャベツ以外 → 出力結果:正体不明の動物 -> 謎の特徴 

・実行例 
 餌を与えて下さい。 
 キャベツ 
 ウサギ -> 耳がいい 

問題なのは、foodとgetDetailの使いどころがわからないということです。
foodとgetDetailを使わずに動作するプログラムが書けたため、正答がわかりません。
foodとgetDetailを使うためには、どう記述すればよいのでしょうか。
また、何のためにfoodとgetDetailを使うのでしょうか。
問題の意図が分かりません。
正答が分かる方がいましたら、回答よろしくお願いします。

該当のソースコード

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

public class FindAnimalInfo {

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

    private static void getName() {
        String str = inputString();
        String carrot = "ニンジン";
        String banana = "バナナ";
        String cabbage = "キャベツ";

        if (str.equals(carrot)) {
            System.out.print("ウマ");
            System.out.print(" -> ");
            System.out.println("足が速い");
        } else if (str.equals(banana)) {
            System.out.print("サル");
            System.out.print(" -> ");
            System.out.println("木登りがうまい");
        } else if (str.equals(cabbage)) {
            System.out.print("ウサギ");
            System.out.print(" -> ");
            System.out.println("耳がいい");
        } else {
            System.out.print("正体不明の動物");
            System.out.print(" -> ");
            System.out.println("謎の特徴");
        }
    }

    public static String inputString() {
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        String str = null;
        try {
            System.out.println("餌を与えて下さい。");
            return reader.readLine();
        } catch (IOException e) {
            System.out.println("予期せぬエラーが発生しました");
            e.printStackTrace();
        }
        return str;
    }

}

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

Javaのバージョンは8です。
コードを書く際はEclipseを使用しています。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

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

  • tonarino210

    2016/05/04 19:55

    ここまで書けているなら、後は無理やり課題通りのメソッドを作成してmain()から呼び出してみるだけかと思いますよ。 作り方が分からないのか、作る意味・意義が分からないのか を示すと回答しやすいかもしれません。

    キャンセル

回答 5

checkベストアンサー

+3

メソッド名を見た時に、何をしているメソッドかわからないといけません。
現状では、GetName()メソッドがDetailも一緒に返すものだとは分かりません。

別に自分しか使わないものならいいかもしれませんが、チームでプログラムを作るときは、色々な人がソースを触ります。
その際、GetName()というメソッドを見た人は、「あっ、これを使えば名前が手に入るんだ」と思って利用するかもしれません。しかし実際はDetailも戻ってくるわけだから、これはバグになってしまいます。

上記のような問題を起こさないようにするためにも、メソッド名は正確に書くようにした方がよく、今回の課題もnameとdetailの2つに分かれているのでしょう。

あとメソッド名はキャメルケースにするのがお作法ですので、GetName ⇒ getNameとすべきです。

例(動くかどうかは試してないので参考程度に)

import java.util.Scanner;

public class FindAnimalInfo {

    private static final String CARROT = "ニンジン";
    private static final String BANANA = "バナナ";
    private static final String CABBAGE = "キャベツ";

    public static void main(String[] args) {
        System.out.println("餌を与えてください。");
        Scanner scan = new Scanner(System.in);
        String inputFood = scan.next();

        String name = getName(inputFood);
        String detail = getDetail(inputFood);

        System.out.println(name + "->" + detail);

        scan.close();
    }

    /**
     * 餌に紐づいた動物名を返す
     * @param food 食べ物
     * @return 動物の名前
     */
    private static String getName(String food){
        String name;
        switch(food){
        case CARROT:
            name = "ウマ";
            break;
        case BANANA:
            name = "サル";
            break;
        case CABBAGE:
            name = "ウサギ";
            break;
        default:
            name = "正体不明の動物";
        }
        return name;
    }

    /**
     * 餌に紐づいた動物の特徴を返す
     * @param food
     * @return 動物の特徴
     */
    private static String getDetail(String food){
        String detail;
        switch(food){
        case CARROT:
            detail = "足が速い";
            break;
        case BANANA:
            detail = "木登りがうまい";
            break;
        case CABBAGE:
            detail = "耳がいい";
            break;
        default:
            detail = "謎の特徴";
        }
        return detail;
    }

}

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2016/05/04 20:55

    具体的な回答ありがとうございます。
    なぜメソッドを2つに分けるのか、という点で納得することができました。
    回答例を参考にさせていただきます。
    ありがとうございました。

    キャンセル

+1

読みやすいコーディングが求められる課題です。

・メソッド:GetName(引数:food)  
   GetDetail(引数:food) 

メソッド名から、何をするメソッドなのかを推測します。
GetNameは、名前(Name)の取得(Get)、すなわち、戻り値が名前(この課題では動物名)となる実装をしないといけません。

同じようにGetDetailは、詳細(この課題では特徴かな)を戻り値とする実装をしないといけません。

恐らく、
    public static void main(String[] args) {
        String foodName = args[0];
        String animalName = GetName(foodName);
        String animalDetail = GetDetail(animalName); // 恐らく引数foodは誤りだと思う

        System.out.println(animalName + " -> " + animalDetail);
    }
みたいなコーディングを求められてるのではないかな。

これでメソッドの中身を実装していてください。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2016/05/04 22:34

    回答ありがとうございます。
    他人にコードを見られる機会があまりないため、読みやすいコーディングを意識できていませんでした。勉強になりました。
    参考にさせていただきます。

    キャンセル

+1

メソッド名は、そのメソッドが行う処理を表します。
GetNameなら、名前を取得する。
GetDetailなら、特徴を取得する。
例えば、
  FindAnimalInfo findInfo = new FindAnimalInfo(); // FindAnimalInfoのインスタンス生成
  String animalName = findInfo.GetName("ニンジン"); // 名前を取得する
  String animalDetail = findInfo.GetDetail("ニンジン"); // 特徴を取得する

メソッド定義例。
public String GetName(Strintg food) {
    //foodに従って動物名を生成
    return 動物名;
}
public String GetDetail(String food) {
    // foodに従って詳細を生成
    return 詳細;
}

推測ですが、FindAnimalInfoクラスを使う側が、GetNameやGetDetailの処理内容を意識することなく、foodを与えることで動物名と特徴を得ることが出来ることの学習ではないでしょうか。
課題の目的がはっきりすれば、別の回答もあるかもしれません。

あと、メソッド名は先頭小文字、先頭大文字はクラス名で使用するべきです。
GetName -> getName
GetDetail -> getDetail

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2016/05/04 22:32

    回答ありがとうございます。
    課題の目的を理解していなかったため、大変参考になりました。

    キャンセル

+1

連想配列をつかって書いてみました。
Sample01.java

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.HashMap;
import java.util.Map;

class FindAnimalInfo {
    static final private Map<String, String[]> map = new HashMap<String, String[]>() {
        { put("ニンジン", new String[] { "ウマ", "足が速い" }); }
        { put("バナナ",  new String[] { "サル", "木登りがうまい" }); }
        { put("キャベツ", new String[] { "ウサギ", "耳がいい" }); }
    };
    static final private String[] unknown = new String[] { "正体不明の動物", "正体不明の動物" };

    private String[] getData(String food) {
        String[] ans = map.get(food);
        if (ans == null) {
            return unknown;
        }
        return ans;
    }

    public String getName(String food) {
        return getData(food)[0];
    }

    public String getCharacteristic(String food) {
        return getData(food)[1];
    }
}

public class Sample01 {

    public static void main(String[] args) throws IOException {
        FindAnimalInfo fai = new FindAnimalInfo();
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        System.out.println("餌を与えて下さい。");
        String food = reader.readLine();
        System.out.println(fai.getName(food) + " -> " + fai.getCharacteristic(food));
    }
}

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2016/05/05 09:05

    回答ありがとうございます。
    HashMapクラスを使ってうまくできなかったので、とても勉強になりました。
    参考にさせていただきます。

    キャンセル

  • 2016/05/05 19:26

    メソッド中にたくさんの if 文を書くのは保守が困難になりがちです。
    まして今回の場合は、異なるメソッド中で food による同様の分岐があらわれすので、なおさらです。
    分岐条件が 5 個を超えるようになり、そこに追加や修正をしていくようになってしまった場合でも、間違いが発生しにくいような工夫をしておくのが好ましいと思っています。

    キャンセル

0

多態を使うっぽいかと思ったけどクラス一つなら…
あー、エラー出たらごめんね。(^_^;

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

public class FindAnimalInfo {

    public static void main(String[] args) {
        String food = inputString();
        String animal_name = GetName(food);
        String animal_detail = GetDetail(food);
        String result = animal_name + " -> " + animal_detail;
        System.out.println(result);
    }

    private static String GetName(food) {
        String str = "正体不明の動物";
        if (isCarrot(food)) {
            str = "ウマ";
        } else if (isBanana(food)) {
            str = "サル";
        } else if (isCabbage(food)) {
            str = "ウサギ";
        }
        return str;
    }

    private static String GetDetail(food) {
        String str = "謎の特徴";
        if (isCarrot(food)) {
            str = "足が速い";
        } else if (isBanana(food)) {
            str = "木登りがうまい";
        } else if (isCabbage(food)) {
            str = "耳がいい";
        }
        return str;
    }

    private static isCarrot(food) {
        return (food.equals("ニンジン"));
    }

    private static isBanana(food) {
        return (food.equals("バナナ"));
    }

    private static isCabbage(food) {
        return (food.equals("キャベツ"));
    }

    public static String inputString() {
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        String str = null;
        try {
            System.out.println("餌を与えて下さい。");
            return reader.readLine();
        } catch (IOException e) {
            System.out.println("予期せぬエラーが発生しました");
            e.printStackTrace();
        }
        return str;
    }

}

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2016/05/04 22:30

    回答ありがとうございます。
    Javaを始めて1か月弱の初心者のため、他の方が書いたコードを見るのはとても勉強になります。
    参考にさせていただきます。

    キャンセル

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

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

関連した質問

  • 解決済

    100になる直前の加算結果出力

    javaで開始値と終了値を入力してその間の偶数を加算していき、合計が100を超えたら「数値が100を超えたため、処理を中止します。」とメッセージを出し、かつ合計が100になる前の加

  • 受付中

    ENTER実行処理

    Enterキーを押して、次の処理に移るCUIを作りたいのですが、思うようにいきません。勇者の攻撃のあとと、HP、MP表示のあとEnter押すまで次の処理しないようにしたのですが、教

  • 解決済

    会員情報システム(Java)での作り方

    javaで会員情報システムのようなものを作りたいです。 下記の実行結果(コマンドプロンプトで実行)になるような、登録プログラムを作成したいのですが、作成方法が分かりませんので、教

  • 解決済

    [Java]AllyNameをNameInputでも使えるようにしたい

    package test; import java.io.BufferedReader; import java.io.IOException; import java.io.In

  • 解決済

    クラスリストの比較でcontainsが動作してくれない

    containsを用いて2つのクラスリストを比較したいのですが、うまく動作してくれません。 class Order{ public int id; publi

  • 解決済

    CSVからデータを取得して検索した文字列のみを表示したい

    プログラム初心者です。 Javaを勉強中で、質問があります。 CSVからデータを取得し、取得したデータの中から検索した文字列のみを表示するプログラムを作りたいです。

  • 解決済

    入力した整数を一文字ずつ配列に格納する方法

    前提・実現したいこと Javaで標準入力に現れた数字文字の出現回数を表示するプログラムを作っています。 入力した整数を一文字ずつ配列に格納する方法が知りたいです。 該当の

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

  • Java

    14073questions

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