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

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

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

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

Q&A

解決済

3回答

6863閲覧

for文の繰り返しの構造

inyuuy

総合スコア13

Java

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

0グッド

0クリップ

投稿2017/05/26 02:41

###前提・実現したいこと
for文を使って、指定した回数、指定した個数ずつ表示を減らしていく文の構造を理解したい

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

Java

1 for(int i=h-1;i>=0;i=i-1){ 2 for(int j=i;j>0;j=j-1){ 3 System.out.print("-"); 4 } 5 System.out.println(""); 6 }

###試したこと

hは入力で指定する数です。h=10とすると、

--------- -------- ------- ------ ----- ---- --- -- -

このような実行結果が得られました。
i=9から、i--していってiが0になるまで、つまり10回(10行分)、繰り返す中で、
j=9から、j--していってjが1になるまで、つまり9回、"-"を出力するということまで理解しています。
ここで、実行結果が

- - - - - - - - -

とならずに、上のようになるのが理解できていません。
初歩的ですが、きちんと納得したいのでご教授願いたいです、お願いします。

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

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

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

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

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

guest

回答3

0

i=9から、i--していってiが0になるまで、つまり10回(10行分)、繰り返す中で、

j=9から、j--していってjが1になるまで、つまり9回、"-"を出力するということまで理解しています。

この理解が間違っていて、実際は

i=9から、i--していって、iが0になるまで、(つまり10回(10行分))以下を行う。
j=iから、j--していってjが1になるまで"-"を出力することを繰り返す。その後改行する。」

つまり、
j=9から、j--していってjが1になるまで"-"を出力することを繰り返す。その後改行する。」
j=8から、j--していってjが1になるまで"-"を出力することを繰り返す。その後改行する。」
...
j=1から、j--していってjが1になるまで"-"を出力することを繰り返す。その後改行する。」
j=0から、j--していってjが1になるまで"-"を出力することを繰り返す。(つまり何も出力しない)その後改行する。」


根本的に

java

1public static void main(String[] args) throws Exception { 2 for(int j=3; j>0; j--){ 3 System.out.print("-"); 4 } 5}

の出力結果が

---

になるのは理解してますよね?

投稿2017/05/26 02:50

編集2017/05/26 03:56
ozwk

総合スコア13521

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

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

inyuuy

2017/05/26 03:14

ありがとうございます。 理解が少し間違っていました。 「j=iから、j--していってjが1になるまで"-"を出力する」のところで、iの部分を任意の数、例えば5にすると、 ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- となってしまうのですが、なぜ ----- ---- --- -- - というふうにならないのでしょうか?
ozwk

2017/05/26 03:25

for(int j=5;j>0;j=j-1){と書いたら云々って話ですよね? 5回で固定しているんですから-----しか出力されないのは当然です。
inyuuy

2017/05/26 03:32

5=5-1とはならないんですか?
ozwk

2017/05/26 03:41

なりません for(int i=10-1; i>=0; i--){ System.out.println(5); } で5が10回表示されるのと同じです。
inyuuy

2017/05/26 03:45

ではこの場合i--は何も機能していないということですか?
ozwk

2017/05/26 03:51

質問文のコードだと iが全行数(10始まり降順) jの初期値が行ごとの"-"の数です。 そしたら j=iとすれば今の行数分"-"が書かれますし j=5とすれば今の行数にかかわらず"-----"が書かれますよねってだけの話です。
inyuuy

2017/05/26 04:05

なるほど、確かにそうですね。 長々と質問してしまいすみませんでした。 ご回答ありがとうございました。
guest

0

ベストアンサー

まず、printとprintlnの違いは理解されていますか?
printは文字出力のみ、printlnは文字出力+改行をします。

提示のコードですと、printが実行されている限りは改行されず、printlnが実行されたときに改行が発生します。
つまり「-----」と表示されているような場合、System.out.print("-")が5回実行されています。

上記を念頭に再度コードを確認しますと、

1.iを用いたループに入る。hを10とすると、iのループは10-1の9回繰り返される。
1-1【iのループ1度目 iは9】.jを用いたループに入る。jはその時点のiの回数繰り返されるので、System.out.print("-")が9回実行される。jを用いたループ終了後、 System.out.println("")が実行され文字が出力されず改行のみ実行される。
1-2.【iのループ2度目 iは8】.jを用いたループに入る。jはその時点のiの回数繰り返されるので、System.out.print("-")が8回実行される。jを用いたループ終了後、 System.out.println("")が実行され文字が出力されず改行のみ実行される。
1-3.【iのループ3度目 iは7】・・・

と実行していくと、ご提示のような実行結果になります。

※※※追記 机上での計算処理※※※

机上でその処理を分解してみましょうか?長くなってしまい申し訳ありません。

※h=10とする ■iのループ 【条件】 初期処理:iにh-1を代入する 継続条件:i >= 0の場合 処理終了時の処理:i - 1を実行する 【実行処理】 jのループを実行する。 jのループが完了したら改行する。 ■jのループ 【条件】 初期処理:jにiを代入する 継続条件:j > 0の場合 処理終了時の処理:j - 1を実行する 【実行処理】 「-」を出力する。 iのループを展開してみます。 ◆処理実行 初期処理:iにh-1を代入する i = 9 jのループを実行する。 改行する 処理終了時の処理:i - 1を実行する i = 8 jのループを実行する。 改行する 処理終了時の処理:i - 1を実行する i = 7 ・・・・ 更に、jのループも展開してみます。 ◆処理実行 iのループ初期処理:iにh-1を代入する i = 9 jのループを実行する。  jのループ初期処理:jにiを代入する  j = 9  「-」を出力する  jのループ処理終了時の処理:j - 1を実行する  j = 8  「-」を出力する  jのループ処理終了時の処理:j - 1を実行する  j = 7  「-」を出力する  jのループ処理終了時の処理:j - 1を実行する  j = 6  「-」を出力する  jのループ処理終了時の処理:j - 1を実行する  j = 5  「-」を出力する  jのループ処理終了時の処理:j - 1を実行する  j = 4  「-」を出力する  jのループ処理終了時の処理:j - 1を実行する  j = 3  「-」を出力する  jのループ処理終了時の処理:j - 1を実行する  j = 2  「-」を出力する  jのループ処理終了時の処理:j - 1を実行する  j = 1  「-」を出力する  jのループ処理終了時の処理:j - 1を実行する  j = 0  継続条件:j > 0の場合 に当てはまらなくなったのでjのループ終了 改行する iのループ処理終了時の処理:i - 1を実行する i = 8 jのループを実行する。  jのループ初期処理:jにiを代入する  j = 8  「-」を出力する  jのループ処理終了時の処理:j - 1を実行する  j = 7  「-」を出力する  jのループ処理終了時の処理:j - 1を実行する  j = 6  「-」を出力する  jのループ処理終了時の処理:j - 1を実行する  j = 5  「-」を出力する  jのループ処理終了時の処理:j - 1を実行する  j = 4  「-」を出力する  jのループ処理終了時の処理:j - 1を実行する  j = 3  「-」を出力する  jのループ処理終了時の処理:j - 1を実行する  j = 2  「-」を出力する  jのループ処理終了時の処理:j - 1を実行する  j = 1  「-」を出力する  jのループ処理終了時の処理:j - 1を実行する  j = 0  継続条件:j > 0の場合 に当てはまらなくなったのでjのループ終了 改行する iのループ処理終了時の処理:i - 1を実行する i = 7 ・・・・

投稿2017/05/26 02:51

編集2017/05/26 04:25
akabee

総合スコア1947

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

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

inyuuy

2017/05/26 03:20

ありがとうございます。 printは理解しております。 jを用いたループの条件文の応用ができないのですが、ここで先ほどの逆三角形と同時に、隣に他の記号”*"などを用いて三角形を表示したいときは、iを用いたループとは別にfor文を作るのでしょうか?
akabee

2017/05/26 03:51

同時に別記号で三角形を表示という件については、話が飛んでしまって何を伝えれば良いのかよく分かりません。forでも勿論可能だとは思いますが、実現の方法が一つではありませんので。 できるだけ混乱を招かないようアドバイスしたいので教えて欲しいのですが、いったいどこに納得がいかないのでしょう?
akabee

2017/05/26 04:08

回答に、ループが展開されたあとの処理を記載してみましたので参考にして下さい。
inyuuy

2017/05/26 04:09

public static int Print(int h){ for(int i=h-1;i>=0;i=i-1){ for(int j=i;j>0;j=j-1){ System.out.print("-"); } for(int k=1;k>=0;k=k-1){ for(int l=k;l<=h*2-1;l=l+2){ System.out.print("*"); } } System.out.println(""); } return h; } としたとき、実行結果が ---------******************** --------******************** -------******************** ------******************** -----******************** ----******************** ---******************** --******************** -******************** ******************** となりました。 ここで”*”の個数が変化しない要因がわかりません。"-"と同じように書いているはずなのですが。
swordone

2017/05/26 04:14

それは質問を編集するか、別質問で立てるべきでは?
akabee

2017/05/26 04:21

同じように書かれているようには見えませんね。 まず  for(int k=1;k>=0;k=k-1) の 条件文は2度繰り返して実行する条件になっています。 次に for(int l=k;l<=h*2-1;l=l+2) の条件文ですが、多少ややこしい条件文ですがhの数だけ実行されます。 というわけで、下の箇所はhの数だけ「*」を出力する、という処理を2度実行することになります。 実行すると「*」が20個出力されて完了です。
inyuuy

2017/05/26 04:22

理解しました! 計算処理の追記、本当にありがとうございました。 とても分かりやすかったです、本当に助かりました。 お手本にして、*の処理も自分で考えてみます。 ありがとうございました。
guest

0

printとprintlnの違いです。
printは改行しませんが、printlnは改行します。
内側のfor文ではprintを使っているため改行されません。
そのため内側のforが続く間は出力が横に続くことになり、
内側のforが終わったあと、printlnによる改行が行われます。

補足
printlnのlnはline(行)の略です。

投稿2017/05/26 02:48

編集2017/05/26 02:48
swordone

総合スコア20651

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

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

inyuuy

2017/05/26 03:08

ありがとうございます。 printとprintlnは理解しているのですが、おそらく"-"の出力の条件文が理解できておりません
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問