- 締切済み
プログラムの内容
public class Graph1 public static void main(String[] args){ for(int i=0;i<10;i++){ for(int j=0;j<i*i;j++){ System.out.print("*"); } Syatem.out.println(""); } } } これは放物線をグラフを描写するプログラムなのですがforが二回使われているところがわかりません。丁寧にこの箇所を解説してもらえる方お願いします。i=0から具体的にお願いします。
- みんなの回答 (4)
- 専門家の回答
みんなの回答
- samzee
- ベストアンサー率0% (0/2)
>例えばi=0のとき、外側のfor文の条件に適しているので内側のfor文に移行し、j=0の値に対し0*0(=0)の値とイコールになるので*は表示されずJ++でj=1になる。 ここまでは正しいです。 >そしてj<i*iで評価されるが今i*iは0なのでこの条件に適さない。 j=1のときには評価は行われないです。j=0のときに評価式を満たさないので、そのままfor文を抜けます。 >よって内側のfor文を抜けて外側のfor文に再び戻ってi++でi=1となりi<10に適しているので内側のfor文へ。j=1とi*i=1との比較になるがj<i*iに適さないので*は表示されない。。。 ここが間違いです。一度内側のfor文は抜けているので、再度このfor文に入るときにはjには、まず、0が代入されます。j=0,i*i=1なのでj<i*iを満たすので*を表示します。つぎに、j++でjが1になり評価式を満たさなくなるので、内側のfor文を抜けます。 >*が表示される個数は条件式j<i*iに由来しているのでしょうか。 *の表示数はi*iの計算結果になります。 for文を抜けた後も、jの値が保存されていると考えていたのがプログラムの間違った理解につながっていたようですね^^;
- kmee
- ベストアンサー率55% (1857/3366)
これは Visual Basic では文法がまったく正しくありません。 エラーになります ...って話じゃないですよね?
お礼
ごめんなさい。投稿する場所を間違えてしまいました。Javaのカテゴリーに投稿するべきでした。。。
- samzee
- ベストアンサー率0% (0/2)
>for(int i=0;i<10;i++){ > for(int j=0;j<i*i;j++){ > System.out.print("*"); > } > Syatem.out.println(""); > } このプログラムを実行すると * **** ********* **************** ・ ・ ・ * × 81 というような放物線の半分が描画されます まず、始めのfor文でi<10とあります。このfor文の最後のprintln("")では単に改行が行われます。つまり、改行は10回行われます。 二つ目のfor文ではj<i*iとあるので、 例えばiが0のときは*を0個描画、その後に先ほどの説明の改行が入ります。つまり、単に改行されるだけですね。 例えばiが3のときはj=0、1、2、3…9が順に代入されていき(3x3=9なので)、最後に改行が入ります。 これをi=0から9まで順におこなっていくので放物線を描画できます。
お礼
ご回答ありがとうございます。私の勉強不足でsamzeeさんの考えを理解することができません。。私の考えを以下に述べます。以下の説明で改行される仮定は省きます。 例えばi=0のとき、外側のfor文の条件に適しているので内側のfor文に移行し、j=0の値に対し0*0(=0)の値とイコールになるので*は表示されずJ++でj=1になる。そしてj<i*iで評価されるが今i*iは0なのでこの条件に適さない。よって内側のfor文を抜けて外側のfor文に再び戻ってi++でi=1となりi<10に適しているので内側のfor文へ。j=1とi*i=1との比較になるがj<i*iに適さないので*は表示されない。。。 このように私は考えてしまってるのでいつまでたっても*が表示されないことになってしまいます。また、*が表示される個数は条件式j<i*iに由来しているのでしょうか。
- yomyom01
- ベストアンサー率12% (197/1596)
これはy=x^2のグラフを書くプログラムです x=0,1,2,3,4,5,6,7,8,9のとき、それぞれ y=0,1,4,9,16,25,36,49,64,81個の*が表示されます。
お礼
やっとわかりました!指摘どうりの勘違いをしていました。。 ありがとうございました。