QA@IT

javaのプログラミングに関する質問です。

5250 PV
/* 商品コードが格納されている配列(arrayCode)の内容を探索し、
 * 対応する商品名を表示してください。
 * 
 * 【ルール】
 * ①探索したい値と配列の要素の値を、配列の先頭から順に比較する
 * ②等しければ、探索が成功した(見つかった)ので
 *   『(商品コード)の商品は、(商品名)です。』と表示して終了する
 * ③最後まで探索しても一致する要素がなければ、
 *   探索は不成功(見つからない)になるので
 *   『(商品コード)は登録されていません。』と表示して終了する
 *   
 * 探索クラスと表示クラスを作成して、
 * ①は探索クラスで行い
 * ②、③は表示クラスで行うプログラムを作成してください
 */

public class ClassAdd09{
 public static void main(String[] args) {
  int[] arrayCode = {102,800,201,101,283,430,181,550};
  String[] arrayName = {"事務机B型","応接机","会議用机","事務机A型",
        "折り畳み机","木製机","脇机","学生机"};

  Tansaku subA = new Tabsaku();//探索クラスのインスタンス化

  subA.Tansaku(arrayCode,arrayName);//探索メソッド呼び出し

  Hyouji subB = new Hyouji();//表示クラスのインスタンス化

 }
}
class Tansaku{//探索クラス作成

 //商品を検索する。102なら事務机B型
 //商品を検索する。800なら応接机
 //・・・・・・・etc
 //探索クラスで探索された値を返す

 public static void Tansaku(int[] num,String[] num2){//Tansakuメソッド


class Hyouji{//表示クラスの作成
 //コードがヒットしたので、例:「102の商品は、事務机Bです」と表示
 //コードがヒットしなければ、「登録されていません」と表示

 System.out.println( + "の商品は、" + "です");

 System.out.println( + "は登録されていません");

}

ひとまず日本語で流れを書き出してみました。
そこで質問なのですが、配列の先頭から順に検索する、というやり方がいまいちわかりません。
自分でもfor文を使った配列表示や検索が凄く苦手なのは分かっているので勉強しているのですが、
未だに理解してるとは言い難い状況です。同様の理由で、以下の問題も手詰まり状態です。

/*
以下のプログラムはコマンドライン引数で複数の数字を
 受け取り、int型配列arrayに受け取った値を代入して
 arrayの先頭から順番に表示しています。

 変換クラスと、表示クラスを作成し
 ①の部分を変換クラスで、
 ②の部分を表示クラスで行うように修正してください。
*/
class ClassAdd08{
 public static void main(String[] args){
  HenkanClass subA = new HenkanClass();//HenkanClassのインスタンス化

  HyoujiClass subB = new HyoujiClass();//HyoujiClassのインスタンス化
  subB.hyouji();//表示メソッドの呼び出し
 }
}

//****************************     ①     **********************************
class HenkanClass{//変換クラスを新規作成
 public int henkan(int num,int[] args){//変換メソッド
  int len = args.length;
  int[] array = new int[len];
  for(int i = 0; i < len; i++){
   array[i] = Integer.parseInt(args[i]);
  }
  return len;
 }
}

//****************************     ①     **********************************

//****************************     ②     **********************************
class HyoujiClass{//表示クラスを新規作成
 public void hyouji(){//表示メソッド
  int len = Henkan(len,array);//変換メソッドの呼び出し
  System.out.println("受け取った引数:" + len + "個");

  for(int i = 0; i < len; i++){
   System.out.println((i + 1) + "個目の数:" + array[i]);
  }
 }

//****************************     ②     **********************************
}

どなたかお手隙の方がいらっしゃいましたら、お知恵をお貸しください。
よろしくお願い致します。

こちらが元ネタになります。
class ClassAdd08{
  public static void main(String[] args){

//**************************** ① **********************************
  int len = args.length;
  int[] array = new int[len];
  for(int i = 0; i < len; i++){
   array[i] = Integer.parseInt(args[i]);
  }

//**************************** ① **********************************

//**************************** ② **********************************

  System.out.println("受け取った引数:" + len + "個");

  for(int i = 0; i < len; i++){
   System.out.println((i + 1) + "個目の数:" + array[i]);
  }
 }

//**************************** ② **********************************
}

class ClassAdd08 {
public static void main(String[] args) {

//変換クラスのインスタンス化
Henkan subA = new Henkan();
//変換メソッド呼び出し
    int[] array =subA.henkan(args);

//表示クラスのインスタンス化
Hyouji subB = new Hyouji();
//表示メソッドの呼び出し
    subB.hyouji(array);
}

}
//変換クラス
class Henkan {
public static int henkan(String[] num) {//変換メソッド
// **************************** ① **********************************
int len = args.length;
int[] array = new int[len];
for (int i = 0; i < len; i++) {
array[i] = Integer.parseInt(args[i]);
}
return array;//値を返す
// **************************** ① **********************************
}
}
//表示クラス
class Hyouji {
public static void hyouji(int[] num) {//表示メソッド
// **************************** ② **********************************
System.out.println("受け取った引数:" + len + "個");
for (int i = 0; i < len; i++) {
System.out.println((i + 1) + "個目の数:" + array[i]);
}
// **************************** ② **********************************
}
}

ひとまず自分で書いてみたコードです。クラスの課題なので、クラスのインスタンス化をしています。

  • ひとつずつ行きましょう。
    まず、ClassAdd08「修正してください」とあるので、クラスを使わないバージョンがあるように読めるのですが、ClassAdd08のコードは、コンパイルが通らないので、修正する前に元の形が正しいのかどうかが分かりません。
    -
  • (途中で送信してしまいました...)元のプログラムがありましたら、それも書いていただけるとこちらも理解が進みます。 -
  • argius様、回答ありがとう御座います。質問欄に追記しましたので、確認の方よろしくお願い致します。これをコマンドライン引数に適当な数値を入れて実行すると、「受け取った引数○× ○個目の数×」という感じで表示されます。この形を、それぞれクラスに分けて表示させよ、という趣旨の問題になるのですが。。。 -
  • ありがとうございます。ClassAdd08の方から回答を考えますのでお待ちください。 -
  • argius様、本当に助かります。お時間を頂いてしまい申し訳ありませんが、何卒よろしくお願い致します。 -

回答

これだけでは出題者の意図が読み取れませんので、模範解答からは外れるかもしれませんのでご容赦ください。
あと、すでに作られている部分を無視して書いていますが、こちらもご容赦願います。

.

まずは形だけ、単純にクラスに分割するとしたら、こんなふうになると思います。インスタンスを使うべきかどうかは分からなかったので、staticメソッドだけでやってみます。

// 分割結果(コンパイルエラーになります)
class ClassAdd08 {
    public static void main(String[] args) {
        Henkan.henkan();
        Hyouji.hyouji();
    }
}

class Henkan {
    static void henkan() {
        // **************************** ① **********************************
        int len = args.length;
        int[] array = new int[len];
        for (int i = 0; i < len; i++) {
            array[i] = Integer.parseInt(args[i]);
        }
        // **************************** ① **********************************
    }
}

class Hyouji {
    static void hyouji() {
        // **************************** ② **********************************
        System.out.println("受け取った引数:" + len + "個");
        for (int i = 0; i < len; i++) {
            System.out.println((i + 1) + "個目の数:" + array[i]);
        }
        // **************************** ② **********************************
    }
}

このままではコンパイルエラーになってしまいます。
パラメーターと戻り値が全く宣言されていないからです。
クラスに分割する前と同じようにするには、メソッドにパラメーターを渡して、戻り値をもらって、という受け渡しの部分を作る必要があります。

.

①のhenkan()では、argsがあれば事足りそうです。ですので、argsを渡せるようにします。argsの型は、String[]です。
変換した結果int[] arrayは、いったんmainのところに戻しましょう。
ということで、henkan()は、String[] argsを渡してint[] arrayを返すように書き換えればOKです。

②のhyouji()は、henkan()の結果を渡すことができれば、元の処理と同じことができそうです。ということは、hyouji()は、int[] arrayを渡せるようにして、戻り値は無しでOKです。lenは渡していませんが、これはarray.lengthで再度取得してしまった方がシンプルになります。引数が多くなるとこのメソッドを使うのが不便になります。

最後に、mainメソッドの各クラスの呼び出し部分を書き換えてみましょう。

.

ClassAdd08の書き換えは、こんな感じでやってみてはいかがでしょうか。
分からないところがあったら、コメントしてください。ひとつずつ、確実にクリアーしていきましょう。


(追記1)

このまま先に進んでも、次でつまずいてしまうと思いますので、ここでつまずいている箇所を解消していきましょう。

  • コンパイルエラーには、エラーメッセージが出ているはずです。質問する際は、エラーメッセージもあわせて書いておくと、回答しやすくなります。

  • ②のlenのところだけは答えを書きます。hyoujiメソッドの最初に、

        int len = num.length;
    

    を1行追加してください。
    そして、"個目の数:"の後ろのarraynumに書き換えてください。
    これで、②のところはクリアーしたはずです。
    なぜこのように書き換えたのかをよくお考えになってください。

  • このくらいの処理だと、インスタンスは不要かと思ったのですが、00_chelseaさんはインスタンスを作りたいようですので、インスタンスを使ったものに変えましょう。インスタンスメソッドにするのであれば、henkanメソッドとhyoujiメソッドのstaticは不要です。取り除かなくても動作しますが、Javaの作法としてはよろしくありません。

  • henkanメソッドのパラメーターをString[] numとしていますが、これは正しくありません。なぜnumとつけたのでしょうか。numという名前をつけること自体は問題ではありませんが、今のままでは、henkanメソッドの中からは、argsを見ることができません。argsが見えるようにするには、どうしたら良いでしょうか。

  • henkanメソッドの前にあるintは何を意味しているか分かりますか?

あと、続きのためにも、差支えなければ、以下の点についても教えてください。

  • 開発環境は何を使っていますか?
  • このお題は問題集か何かのものですか?
編集 履歴 (1)
  • argius様、回答ありがとうございます。自分でもしていますが、どうしてもコンパイルエラーになってしまいます。コードを追記しますので、確認していただけないでしょうか? -
  • 追加のコードについて、追記しました(追記1)のでご確認ください。 -

当初の09の回答例

public class ClassAdd09{
public static void main(String[] args) {

    int[] arrayCode = {102,800,201,101,283,430,181,550};
    String[] arrayName = {"事務机B型","応接机","会議用机","事務机A型",
                            "折り畳み机","木製机","脇机","学生机"};

    int SearchCode=Integer.parseInt(args[0]);   // コマンド引数の最初を検索コードにしました。

    Tansaku subA = new Tansaku();//探索クラスのインスタンス化

    int SearchIndex = subA.Tansaku(arrayCode,SearchCode);//探索メソッド呼び出し

    Hyouji subB = new Hyouji();//表示クラスのインスタンス化

    subB.Hyouji(arrayCode,arrayName,SearchCode,SearchIndex);
}

}

class Tansaku{//探索クラス作成

//商品を検索する。102なら事務机B型
//商品を検索する。800なら応接机
//・・・・・・・etc
//探索クラスで探索された値を返す

public static int Tansaku(int[] arrayCode,int SearchCode){//Tansakuメソッド
    int len = arrayCode.length;

    int index = 999;    //ありえない数値に初期化しておく

    for(int i=0; i < len; i++){
        if(arrayCode[i] == SearchCode){
            index = i;              //配列の何番目にあったかとっておく(戻り値にするため)
        }
    }

    return index;
}

}

class Hyouji{//表示クラスの作成
//コードがヒットしたので、例:「102の商品は、事務机Bです」と表示
//コードがヒットしなければ、「登録されていません」と表示
public static void Hyouji(int[] arrayCode,String[] arrayName,int SearchCode,int SearchIndex){//Hyoujiメソッド

    if(SearchIndex != 999){
        System.out.println(arrayCode[SearchIndex] + "の商品は、" + arrayName[SearchIndex] + "です");
    }
    else{
        System.out.println(SearchCode + "は登録されていません");
    }
}

}

編集 履歴 (0)
  • akira_onozuk様、回答ありがとう御座いました。こちらも無事に問題を解くことが出来、感謝してもし足りません。本当にありがとう御座いました。 -

そもそも08と09は問題の意図が違います。
09は

・商品コードの配列から任意の商品コードが何番目に位置しているか求め、対応する商品を商品コードとともに表示なさい

です。
なので、質問者さんが最近質問された内容とほぼ同じで、配列が単純に2つになっただけです。
一致するIndexを求めるだけの単純な問題だと思うのですが...。

編集 履歴 (0)
ウォッチ

この質問への回答やコメントをメールでお知らせします。