dポイントプレゼントキャンペーン実施中!

例えば配列を前からならこのようになるはずです

class TestIntArray {

public static void main(String args[]) {
int vi[] = {0, 1, 2, 3, 4, 5, 6};

for (int i = 0; i < vi.length; i++)
System.out.println("vi[" + i + "] = " + vi[i]);
}

ですが逆に配列を後ろからならどうしたらいいのでしょうか?
今回の場合は6543210を出力させるのが目的です
今までずっと配列って言ったら for (int i = 0; i < vi.length; i++)がほぼ定形分ように頭にはいっていますので考え方がわからないです。
ヒントやアドレスをお願いします。

A 回答 (5件)

問題文の配列を先頭から末尾まで順に走査する場合,



System.out.println(vi[0]);
System.out.println(vi[1]);
System.out.println(vi[2]);
System.out.println(vi[3]);
System.out.println(vi[4]);
System.out.println(vi[5]);
System.out.println(vi[6]);

と7行ひたすら並べて書くこともできるのだけれど,そこに
次の★のような繰り返しパターンを見て取ることができるから,

System.out.println(vi[0]); ★初期値i=0から
System.out.println(vi[1]); ★増分i++して
System.out.println(vi[2]); ★増分i++して
System.out.println(vi[3]); ★増分i++して
System.out.println(vi[4]); ★増分i++して
System.out.println(vi[5]); ★増分i++して
System.out.println(vi[6]); ★増分i++して
★ループ継続条件 i<7 の間だけループし続ける。

次のfor文に置き換えたわけです。
(注:配列viの長さ vi.length は7ですから)

for (int i = 0; i < vi.length; i++) {

----------------------------------------
同様に,問題文の配列を末尾から先頭まで逆に走査する場合,

System.out.println(vi[6]);
System.out.println(vi[5]);
System.out.println(vi[4]);
System.out.println(vi[3]);
System.out.println(vi[2]);
System.out.println(vi[1]);
System.out.println(vi[0]);

と7行ひたすら並べて書くこともできるのだけれど,そこに
次の★のような繰り返しパターンを見て取ることができるから,

System.out.println(vi[6]); ★初期値i=6から
System.out.println(vi[5]); ★増分i--して
System.out.println(vi[4]); ★増分i--して
System.out.println(vi[3]); ★増分i--して
System.out.println(vi[2]); ★増分i--して
System.out.println(vi[1]); ★増分i--して
System.out.println(vi[0]); ★増分i--して
★ループ継続条件 i≧0 の間だけループし続ける。

次のfor文に置き換えられます。
(注:vi.length-1 は 7-1=6ですから)

for (int i = vi.length - 1; i >= 0; i--) {
    • good
    • 3
この回答へのお礼

有難うございます。
一番わかりやすい回答でした、他の方をお礼した後ベストアンサーさせて戴きます。

お礼日時:2012/12/03 22:06

>今までずっと配列って言ったら for (int i = 0; i < vi.length; i++)がほぼ定形分ように頭にはいっていますので考え方がわからないです。



結局のところは for文が何をやってるのかわかってないって事でしょ?
参考書を調べるなりしてfor文がどういうものなのか自分で調べて理解した方がいいと思いますよ。
    • good
    • 0
この回答へのお礼

いやfor文と言ったら
for(初期化; 繰り返し条件; カウントアップorカウントダウン){
}
と理解して
配列なら
int vi[] = {0, 1, 2, 3, 4, 5, 6};
for(int i=0 i<a.length; i+++){
}
i=0 iが配列0,1,2,3,4,5という長さより小さいときがiをカウントアップ
i=1 以下同じ
i=2 以下同じ
i=3 以下同じ
i=4 以下同じ
i=5 以下同じ
i=6 以下同じ
i=7で繰り返し条件がfalseになりfor文が抜けると理解しています。
今までじゃー逆に配列を後ろから数えるという考え、その演習問題、発想がなく質問しました。

お礼日時:2012/12/03 22:23

>for (int i = 0; i < vi.length; i++)



上記の一行を書き換えるだけで可能ですよ。

for (int i = vi.length - 1; i > 0; i--)

こんな感じに書き換えるだけで配列を後ろから参照するようになります。
他にも方法はありますが、この方法が一番簡単かな。


>理解の為説明してもらえますか?

i = vi.length - 1:ループの開始位置
i > 0:ループの終了条件
i--:iの値の増減値

前述の内容に書き換えた場合、i=6からスタートして、i>0という条件を満たしている間ずっとi=i-1を繰り返しながらループするって感じになります。
ちなみに、ループの開始位置がvi.length - 1になるのは、配列の各要素の格納番号というのは0から開始するので、要素の数が7個なら格納番号は0~6の7個になるからです。
    • good
    • 1

申し訳ないです




逆転の発想です。

今回の質問で言うと

表示する配列のスタート地点はどこでしょうか

表示する配列のゴール地点はどこでしょうか


答えは

スタート地点が、7で

ゴールが、0です

ですので7スタートの0ゴールのコードを書けばいいんです


数字って、増えるばかりじゃないですよね

徐々に減らすこともできますし、倍にすることもできますし・・・

今回は7から0なので、減らします。

減らす方法はいろいろあるので考えてみるといいと思います。

説明になってるでしょうか・・・。
    • good
    • 0
この回答へのお礼

有難うございます。
考え方ですね、本当はそういう回答が欲しかったです。待っていた回答です

お礼日時:2012/12/03 22:27

for( int i = 1; i <= vi.length; i++ ) {


System.out.println("vi[" + i + "] = " + vi[ vi.length - i ]);
}

これでできると思います
    • good
    • 0
この回答へのお礼

理解の為説明してもらえますか?
元々その為に質問しましたので・・・

お礼日時:2012/12/03 20:20

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!