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

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

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

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

Q&A

解決済

5回答

2936閲覧

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

worrrld

総合スコア12

Java

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

0グッド

0クリップ

投稿2016/05/04 10:33

編集2016/05/04 11:23

###前提・実現したいこと
Javaのメソッドを使う問題を解いています。
問題は以下の通りです。

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

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

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

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

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

###該当のソースコード

Java

1import java.io.BufferedReader; 2import java.io.IOException; 3import java.io.InputStreamReader; 4 5public class FindAnimalInfo { 6 7 public static void main(String[] args) { 8 getName(); 9 } 10 11 private static void getName() { 12 String str = inputString(); 13 String carrot = "ニンジン"; 14 String banana = "バナナ"; 15 String cabbage = "キャベツ"; 16 17 if (str.equals(carrot)) { 18 System.out.print("ウマ"); 19 System.out.print(" -> "); 20 System.out.println("足が速い"); 21 } else if (str.equals(banana)) { 22 System.out.print("サル"); 23 System.out.print(" -> "); 24 System.out.println("木登りがうまい"); 25 } else if (str.equals(cabbage)) { 26 System.out.print("ウサギ"); 27 System.out.print(" -> "); 28 System.out.println("耳がいい"); 29 } else { 30 System.out.print("正体不明の動物"); 31 System.out.print(" -> "); 32 System.out.println("謎の特徴"); 33 } 34 } 35 36 public static String inputString() { 37 BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)); 38 String str = null; 39 try { 40 System.out.println("餌を与えて下さい。"); 41 return reader.readLine(); 42 } catch (IOException e) { 43 System.out.println("予期せぬエラーが発生しました"); 44 e.printStackTrace(); 45 } 46 return str; 47 } 48 49}

###補足情報(言語/FW/ツール等のバージョンなど)
Javaのバージョンは8です。
コードを書く際はEclipseを使用しています。

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

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

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

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

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

tonarino210

2016/05/04 10:55

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

回答5

0

ベストアンサー

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

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

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

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

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

Java

1import java.util.Scanner; 2 3public class FindAnimalInfo { 4 5 private static final String CARROT = "ニンジン"; 6 private static final String BANANA = "バナナ"; 7 private static final String CABBAGE = "キャベツ"; 8 9 public static void main(String[] args) { 10 System.out.println("餌を与えてください。"); 11 Scanner scan = new Scanner(System.in); 12 String inputFood = scan.next(); 13 14 String name = getName(inputFood); 15 String detail = getDetail(inputFood); 16 17 System.out.println(name + "->" + detail); 18 19 scan.close(); 20 } 21 22 /** 23 * 餌に紐づいた動物名を返す 24 * @param food 食べ物 25 * @return 動物の名前 26 */ 27 private static String getName(String food){ 28 String name; 29 switch(food){ 30 case CARROT: 31 name = "ウマ"; 32 break; 33 case BANANA: 34 name = "サル"; 35 break; 36 case CABBAGE: 37 name = "ウサギ"; 38 break; 39 default: 40 name = "正体不明の動物"; 41 } 42 return name; 43 } 44 45 /** 46 * 餌に紐づいた動物の特徴を返す 47 * @param food 48 * @return 動物の特徴 49 */ 50 private static String getDetail(String food){ 51 String detail; 52 switch(food){ 53 case CARROT: 54 detail = "足が速い"; 55 break; 56 case BANANA: 57 detail = "木登りがうまい"; 58 break; 59 case CABBAGE: 60 detail = "耳がいい"; 61 break; 62 default: 63 detail = "謎の特徴"; 64 } 65 return detail; 66 } 67 68}

投稿2016/05/04 11:38

kentei_syunrai

総合スコア946

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

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

worrrld

2016/05/04 11:55

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

0

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

java

1import java.io.BufferedReader; 2import java.io.IOException; 3import java.io.InputStreamReader; 4import java.util.HashMap; 5import java.util.Map; 6 7class FindAnimalInfo { 8 static final private Map<String, String[]> map = new HashMap<String, String[]>() { 9 { put("ニンジン", new String[] { "ウマ", "足が速い" }); } 10 { put("バナナ", new String[] { "サル", "木登りがうまい" }); } 11 { put("キャベツ", new String[] { "ウサギ", "耳がいい" }); } 12 }; 13 static final private String[] unknown = new String[] { "正体不明の動物", "正体不明の動物" }; 14 15 private String[] getData(String food) { 16 String[] ans = map.get(food); 17 if (ans == null) { 18 return unknown; 19 } 20 return ans; 21 } 22 23 public String getName(String food) { 24 return getData(food)[0]; 25 } 26 27 public String getCharacteristic(String food) { 28 return getData(food)[1]; 29 } 30} 31 32public class Sample01 { 33 34 public static void main(String[] args) throws IOException { 35 FindAnimalInfo fai = new FindAnimalInfo(); 36 BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)); 37 System.out.println("餌を与えて下さい。"); 38 String food = reader.readLine(); 39 System.out.println(fai.getName(food) + " -> " + fai.getCharacteristic(food)); 40 } 41}

投稿2016/05/04 15:16

katoy

総合スコア22324

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

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

worrrld

2016/05/05 00:05

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

2016/05/05 10:26

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

0

メソッド名は、そのメソッドが行う処理を表します。
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 11:09

dsuzuki

総合スコア1682

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

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

worrrld

2016/05/04 13:32

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

0

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

・メソッド: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 10:57

TetsujiMiwa

総合スコア1124

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

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

worrrld

2016/05/04 13:34

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

0

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

Java

1import java.io.BufferedReader; 2import java.io.IOException; 3import java.io.InputStreamReader; 4 5public class FindAnimalInfo { 6 7 public static void main(String[] args) { 8 String food = inputString(); 9 String animal_name = GetName(food); 10 String animal_detail = GetDetail(food); 11 String result = animal_name + " -> " + animal_detail; 12 System.out.println(result); 13 } 14 15 private static String GetName(food) { 16 String str = "正体不明の動物"; 17 if (isCarrot(food)) { 18 str = "ウマ"; 19 } else if (isBanana(food)) { 20 str = "サル"; 21 } else if (isCabbage(food)) { 22 str = "ウサギ"; 23 } 24 return str; 25 } 26 27 private static String GetDetail(food) { 28 String str = "謎の特徴"; 29 if (isCarrot(food)) { 30 str = "足が速い"; 31 } else if (isBanana(food)) { 32 str = "木登りがうまい"; 33 } else if (isCabbage(food)) { 34 str = "耳がいい"; 35 } 36 return str; 37 } 38 39 private static isCarrot(food) { 40 return (food.equals("ニンジン")); 41 } 42 43 private static isBanana(food) { 44 return (food.equals("バナナ")); 45 } 46 47 private static isCabbage(food) { 48 return (food.equals("キャベツ")); 49 } 50 51 public static String inputString() { 52 BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)); 53 String str = null; 54 try { 55 System.out.println("餌を与えて下さい。"); 56 return reader.readLine(); 57 } catch (IOException e) { 58 System.out.println("予期せぬエラーが発生しました"); 59 e.printStackTrace(); 60 } 61 return str; 62 } 63 64}

投稿2016/05/04 11:58

編集2016/05/04 13:43
takasima20

総合スコア7458

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

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

worrrld

2016/05/04 13:30

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問