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

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

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

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

for

for文は、様々なプログラミング言語で使われている制御構造です。for文に定義している条件から外れるまで、for文内の命令文を繰り返し実行します。

Q&A

5回答

10314閲覧

【C】右上直角二等辺三角形の描画【for】

退会済みユーザー

退会済みユーザー

総合スコア0

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

for

for文は、様々なプログラミング言語で使われている制御構造です。for文に定義している条件から外れるまで、for文内の命令文を繰り返し実行します。

0グッド

0クリップ

投稿2016/03/11 06:41

以下、右上直角二等辺三角形を表示するプログラムですが、
下から7行目 for(j=len; j>=i; j--){ の j>=i の部分の意味がどうしてもよく分かりません。
「増えていく数字 i より、減っていくはずの j の方が大きくなければいけない」というようにみえて違和感があります。
ご回答よろしくお願いします。

#include <stdio.h>
int main(void)
{
int len;
int i,j;

puts("右上直角三角形を作ります。"); printf("短辺:"); scanf("%d", &len); for(i=1; i<=len; i++){ for(j=0; j<i-1; j++){ putchar(' '); } for(j=len; j>=i; j--){ putchar('*'); } putchar('\n'); } return 0;

}

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

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

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

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

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

guest

回答5

0

私なら、次のように書きます。

c

1#include <stdio.h> 2 3int main(void) 4{ 5 int len; 6 int i, j; 7 8 puts("右上直角三角形を作ります。"); 9 printf("短辺:"); 10 scanf("%d", &len); 11 12 for(i=1; i<=len; i++) { 13 for(j=0; j < i - 1; j++) { 14 putchar(' '); 15 } 16 //for(j=len; j>=i; j--) { 17 for(; j < len; j++) { 18 putchar('*'); 19 } 20 putchar('\n'); 21 } 22 return 0; 23}

↑の場合、j は 1, 2, ... len と変化していきます。
1, 2, ... (i - 1) では " " を出力し、1, ) + 1, ... len では "*" を出力します。

さて、質問文のコードの場合はどうなっているかというと、
j は 1, 2, .. (i - 1) 変化した後、次は len, len - 1, ... i と変化します。
全体としては j は 1, ,,, len をすべてなめていくのは同じですが、後半は len 側から逆方向になめているのです。
イメージ説明

投稿2016/03/11 10:17

編集2016/03/11 22:58
katoy

総合スコア22324

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

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

0

>「増えていく数字 i より、減っていくはずの j の方が大きくなければいけない」というようにみえて違和感があ

・j は len から始まって減っていく数
・len は増えていく i の最終的な最大値

なので

for(j=len; j>=i; j--){

は「j は i の最大値である len から今の i の値まで逆に減っていくカウンター」という状況になっています。

例えば len=10 と想定した場合
・i=1 の時 j は 10,9,8,7,6,5,4,3,2,1 というループを実行
・i=2 の時 j は 10,9,8,7,6,5,4,3,2 というループを実行
・i=3 の時 j は 10,9,8,7,6,5,4,3 というループを実行
:
・i=9 の時 j は 10,9 というループを実行
・i=10 の時 j は 10 というループを実行
という i が 1~10 の繰り返し実行となります
「減っていくはずの j の方が大きくなければいけない」というのはつまり
「増えていく数字 i の未来に控えている数字達を j に割り当てている」という感じですね。
j は len から減っていってるのでそれを逆順に参照している、と考えれば納得しやすくないでしょうか。
(↓ iは増えていくけどjは減っていくイメージ↓)

1 2 3 4 5 6 7 8 9 10
xx↑
xxi
xx|<--------j------->|

1 2 3 4 5 6 7 8 9 10
xxxx↑
xxxxi
xxxx|<-------j------>|

1 2 3 4 5 6 7 8 9 10
xxxxxxxx↑
xxxxxxxxi
xxxxxxxx|<-----j---->|

投稿2016/03/11 08:03

編集2016/03/11 08:07
HiroshiWatanabe

総合スコア2160

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

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

HiroshiWatanabe

2016/03/11 08:04

あ・・・空白で整形したのが全部詰まってる・・・
HiroshiWatanabe

2016/03/11 08:08

x で整形しなおしてみましたが…思った程分かりやすくなってないですね…失礼しました
WoodenHamlet

2016/03/14 05:51

ソース埋め込みモードにして書いたら読みやすくなるんじゃないかな。 スペース殺さないし、たぶん等幅フォントになるだろうし
guest

0

「増えていく数字 i より、減っていくはずの j の方が大きくなければいけない」

このループが回っている間はiは増えません。
そしてjの初期値はlenです。

例えばlenに5を入力したとすると
全体のループ1回目 該当ループのiは1だからjは5~1まで変動する間にを5つ出力
全体のループ2回目 該当ループのiは2だからjは5~2まで変動する間に
を4つ出力
全体のループ3回目 該当ループのiは3だからjは5~3まで変動する間にを3つ出力
全体のループ4回目 該当ループのiは4だからjは5~4まで変動する間に
を2つ出力
全体のループ5回目 該当ループのiは5だからjは5~5まで変動する間に*を1つ出力

もう一つのループが空白を出力しているので
実際の結果はこんな感じになるでしょう。

***** **** *** ** *

投稿2016/03/11 07:19

編集2016/03/11 07:21
hirohiro

総合スコア2068

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

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

0

動かしてみたのですが、面白ですね!
説明しずらいのですが、
変数iは" "(半角スペース)の出力数のカウントを、
変数jは"*"の出力数のカウントを行っていると考えるとどうですか?

例えば短辺を 3 で実行します。
すると3行分の出力が行われますよね、

1行目 ***
2行目 **
3行目 *

変数iは" "(半角スペース)の数に一致するので、カウントアップされていきます。
一方変数jは"*"の数に一致するので、カウントダウンしていきます。

-- 追記
上記では回答になりませんね(・・;)

i = 行数と考えて問題ないかと思います。
1行目の場合、j >= i( = 1 )なので ""を3つ,
2行目の場合、j >= i( = 2 )なので "
"を2つ,
2行目の場合、j >= i( = 3 )なので "*"を1つ出力することが出来ます。

投稿2016/03/11 07:10

編集2016/03/11 07:25
nanae2222

総合スコア29

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

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

nanae2222

2016/03/11 07:12

例に挙げた三角形が逆になってしまいましたね、すみません。
guest

0

こんにちは。

そのループの回し方、そこそこ良く出てきます。
終わり(len)からiまでを逆順で辿っていると考えるとよいですよ。

投稿2016/03/11 06:43

Chironian

総合スコア23272

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問