- ベストアンサー
九九の計算結果を表形式で表示する方法
- ArrayListを使用して九九の計算結果を表形式で表示する方法について説明します。
- for文を使用して九九の計算結果を配列に格納し、その配列内の情報を表形式で表示します。
- ソースコードの一部が改良されていないため、現在のプログラムでは1の位の計算のみが行われています。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
計算は正しく行われ、格納していますよ。 では、まず何を出力してますか? それほど変更していなければ ------------------------------------------------ ArrayList list = new ArrayList(); String[]s = new String[9]; for(int i = 1; i<=s.length; i++){ //----(1) for(int j =1; j<=s.length; j++){ //----(2) list.add(new Integer(i * j)); //ここがどのように記述するか?? } System.out.print(list.get(0)); //----(3) System.out.print(list.get(1)); System.out.print(list.get(2)); System.out.print(list.get(3)); System.out.print(list.get(4)); System.out.print(list.get(5)); System.out.print(list.get(6)); System.out.print(list.get(7)); System.out.print(list.get(8)); //----(4) System.out.print("\n"); } ------------------------------------------------ になっていると思います。 質問者さんはきっと list.get(0)には1の段の計算結果 list.get(1)には2の段の計算結果 … list.get(8)には9の段の計算結果 が入っていると思っているでしょうが、違います。 実際は list.get(0)には1*1の計算結果 list.get(1)には1*2の計算結果 … list.get(8)には1*9の計算結果 が入っています。 まず、最初に(2)のfor文でlistの0~8に1の段の各計算結果が格納され、 (2)のfor文が終わったあとに(3)~(4)で1の段の計算結果が出力されます。 次に2回目のfor文(jが2のとき)で今度はlistの9~17に2の段の計算結果が格納されます。 が、2回目の(2)が終わったあとに、(3)~(4)で「”また”1の段の計算結果」を出力しています。 以降同様に、3~9の段を計算しても、「1の段の計算結果」しか出力していないため、 出力結果が ---------------------------- 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 ---------------------------- になってしまうのです。 ですからNo.1では System.out.print(list.get(9)); … System.out.print(list.get(80)); を表示すれば良いと答えたのですが、 (1)のfor文の中に書いてしまい、1の段の計算結果を格納した時点では2の段以降の計算結果がないため、 例外が発生しています。 だからNo.2で 外側のfor文((1)の部分のこと)の外で System.out.print(list.get(0)); … System.out.print(list.get(80)); とすれば良いと回答したのですが、…どうやら読まれていないようですね。 while文の質問のときにもアドバイスしましたが、いきなり全てを書くのではなく、 1つ1つ書いていくことをお奨めします。 今回だと ・九九の計算結果を格納する部分 ・格納した計算結果を表示する部分 に分けて考えると良いと思います。 for(){ for(){ 九九の計算結果を格納 } } for(){ 格納した九九の計算結果を表示 } こんな感じで。
その他の回答 (3)
- pcbeginner
- ベストアンサー率46% (261/560)
>コンパイルエラー list.add((i*j)); ArrayListにはObjectしか格納できないので。 ^^^^^^^^^^^^^^^^^^^^^ と書いてあるのですが…。 ArrayListにはObjectしか格納できません。 list.add(i*j); というのは「i*j」という基本データのint型を格納しようとしてます。 (i*jの計算結果も当然int型) だから add(Object o) とObjectのインスタンスを引数にしているaddメソッドにintを引数にしてるのでコンパイルエラーが起きるのです。 各基本データ型には「ラッパークラス」という各基本データに対応したクラスがあります。 例えばint型ならjava.lang.Integerクラスです。 他にもBooleanクラスやDoubleクラスなどもあります。 詳細はJavaDocを見て下さい。 list.add(i*j); の部分は Integer hoge = new Integer(i*j); list.add(hoge); でどうでしょうか。
補足
ご回答ありがとうございます。 ラッパークラスを使用しました。 しかし、実行結果が 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 になってしまいます。 先の段の計算がうまくいきません。 プログラムのセンスと知識ないので この先もよろしくお願いします。
- pcbeginner
- ベストアンサー率46% (261/560)
外側のfor文の外で System.out.print(list.get(0)); … System.out.print(list.get(80)); すれば大丈夫です。 ちなみに質問にあるソースはコンパイルできますか? 1.4.2_12だとコンパイルできませんよ。 list.add((i*j)); ArrayListにはObjectしか格納できないので。
補足
ご回答ありがとうございます。 pcbeginnerさまのご指摘の箇所で コンパイルエラーが発生しております。 この場合、どのように記述するのか 教えていただけませんか? よろしくお願いします。
- pcbeginner
- ベストアンサー率46% (261/560)
ぱっと見ですけど、計算はしてるんじゃないですか? ただ、計算結果を System.out.print(list.get(0)); … System.out.print(list.get(8)); としかしていないので、1の段の結果しか表示されていないのでは? System.out.print(list.get(9)); … System.out.print(list.get(80)); を表示するとどうなりますか? あと、 list.add((i * j)); のカッコが1組余分ですね。
補足
ご回答ありがとうございます。 System.out.print(list.get(9)); を加えたら java.lang.IndexOutOfBoundsException (上記のソースを加えた行でエラー) でした。
お礼
ご回答ありがとうございました。 pcbeginnerさまの解説でよく理解できていない ことと、課題のポイントがつかめました。 ありがとうございます。 こんな私ですがまたアドバイスを よろしくお願いします。