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

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

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

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

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Q&A

解決済

2回答

2318閲覧

C言語 コード解説求む

daisuki64

総合スコア7

C

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

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

0グッド

0クリップ

投稿2020/09/16 10:05

編集2020/09/16 10:37

c

1#include <stdio.h> 2 3int main(void) 4{ 5 int size; 6 int i, j; 7 8 scanf("%d", &size); 9 10 for (i=0; i<size; i++) { 11 for (j=0; j<size; j++) { 12 if (i==j || (size-i-1)==j) 13 printf("X"); 14 else 15 printf(" "); 16 } 17 printf("\n"); 18 } 19 return 0; 20} 21

このコードは入力した数字に対してバツ印を表示します。(例)

>5 x x x x x x x x x >6 x x x x xx x x x x

特にこの部分なのですが、、、

c

1if (i==j || (size-i-1)==j)

挙動などはわかるのですが、どういう発想、思考をしたらこのような綺麗なコードができるのでしょうか?

よろしくお願いいたします。

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

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

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

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

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

m.ts10806

2020/09/16 10:08

「C#」のタグは何のためにつけてますか?
y_waiwai

2020/09/16 10:08

実際に動かしたらどういう動作をするんでしょうか
gentaro

2020/09/16 10:09

C#は明らかに無関係なんでタグを外してください。 あと「ブラックボックス」という言葉の使い方が間違っています。 それは仕様がわかっていても具体的な実装が不明なときに使う言葉です。 これ完全なホワイトボックスです。 条件を考えてデバッグ実行をすれば、全て動作がわかる筈のものです。
m.ts10806

2020/09/16 12:20

タグの付け間違いも質問の不備です。 検索に不要な情報が乗っかってくるので、邪魔になります。 今からでも外してください。
guest

回答2

0

ベストアンサー

こういうときは、sizeに具体的な値を入れたときのことを考えてみればいいのです。たとえば、sizeに5を入れてみると、結果はこうなります。

result

1X X 2 X X 3 X 4 X X 5X X

この結果を得るためには、「左上から右下に向かうX」と、「右上から左下に向かうX」の2つを描画する必要がありそうです。あ、全体として上から下に向かうのは、ターミナルでの出力が上から下という順だからですね。

さて、内側のfor文の内部では、if文によってX のどちらかが表示されます。

C

1if (条件A) 2 printf("X"); 3else 4 printf(" ");

まず、「左上から右下に向かうX」について考えます。もし、sizeが5だとすると、iが0でjが0のとき、iが1でjが1のとき、……、iが4でjが4のときにXを表示すればいいでしょう。この条件を一般化すると、「ijが等しいとき」にXを表示すればよさそうです。

条件Aの左側「i == j」は、まさにこの条件を表わしています。

いっぽう、「右上から左下に向かうX」についても考えてみましょう。もし、sizeが5だとすると、iが0でjが4のとき、iが1でjが3のとき、……、iが4でjが0のときにXを表示すればいいでしょう。jの値がさっきより面倒ですが、sizeの値5から1を引いた値4から始まり、1ずつ減っていって最後は0になります。iの値が0~4まで増加することを利用すると、Xを表示するときのjの値は4 - iで計算できますね。

この条件を一般化すると、「size - 1 - ijが等しいとき」にXを表示すればよさそうです。条件Aの右側(size - i - 1) == jが、この条件を表わしています。

2つの条件は、どちらか一方が成立すればXを表示させたいので||で接続します。もちろん、左右両方の条件が成立する場合でも||で接続した条件は成立します。sizeが5の場合だと、中央のXを表示するときがこれに相当します。

投稿2020/09/16 10:36

Daregada

総合スコア11990

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

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

0

if (i==j || (size-i-1)==j)

のうちの 「i==j」が「\」型に文字「X」を描画する判定で、「(size-i-1)==j」が「/」型に文字「X」を描画する判定で、
論理和「||」で合わせると「☓」型に文字「X」が描画されます。

確認のために、提示ソースの該当部分を

if (i==j)

if ((size-i-1)==j)

のように変更して実行してみると良いかもしれません。

投稿2020/09/16 10:15

編集2020/09/16 10:20
hidezzz

総合スコア1248

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問