アプリ版:「スタンプのみでお礼する」機能のリリースについて

C言語で中抜きの正方形を作れという問題だったのですが 解答を見ても解説は無く
ちんぷんかんぷんで
どこでどういう処理をして、こういった解答になるのかが分からないのです
特に教えていただきたいのが何故この文で白抜きの部分ができるのかという事です
初歩的な所だと思うのですがお恥ずかしながら質問させていただきます

ちなみに解答はこうありました

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

do
{
printf("2~9の数字を入力");
scanf("%d",&hen);
if(hen<2||hen>9)
printf("エラー\n");
}
while(hen<2||hen>9);

for(i=1;i<=hen;i++)
{

for(j=1;j<=hen;j++)
{
if(i==1||i==hen)
putchar('*');
else
{
if(j==1||j==hen)
putchar('*');
else
putchar(' ');
}
}
putchar('\n');
}
}

A 回答 (2件)

コメントを書いてみますね。


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

/* ユーザーから辺の長さをもらう (2 - 9の範囲内の値をもらえるまで繰り返し) */
do
{
printf("2~9の数字を入力");
scanf("%d",&hen);
if(hen<2||hen>9)
printf("エラー\n");
}
while(hen<2||hen>9);

/* 各行を描画 */
for(i=1;i<=hen;i++)
{

/* 1行を描画 */
for(j=1;j<=hen;j++)
{
if(i==1||i==hen) /* 最初の行 あるいは 最後の行の場合 (a) */
putchar('*');
else
{
if(j==1||j==hen) /* 各行の最初あるいは最後の文字の場合 (b) */
putchar('*');
else
putchar(' '); /* それ以外 */
}
}
putchar('\n');
}
}

というのでなんとなくわかりますか?
まず"最初の行 あるいは 最後の行の場合 (a)"は、*で囲わないといけないのですべて*を表示します。
そして、各行の最初あるいは最後の文字の場合 (b)の条件で各行についても最初の要素と最後の要素に*を表示することで1行として
* 間の空白 *<改行>
を表示します。

ループのところをこう書くとまだわかりやすいかもしれません。

for(line = 1; line <= hen; line++)
{
for(character =1; character <= hen; character++)
{
if((line == 1 || line == hen) /* 先頭行か最後の行 */
|| (character == 1 || character == hen) /* 先頭文字か最後の文字 */)
putchar('*');
else
putchar(' ');
}
putchar('\n'); /* 各行に分けるために末尾に改行を入れる */
}
    • good
    • 3

とりあえず、scanf のところから、hen に適当な値を仮定して


トレースするんだ!

それすらせずに質問するのは甘い。
    • good
    • 0
この回答へのお礼

おっしゃる通りですね…もう少しあれこれ考えてみてから今後は質問させていただこうと思います

お礼日時:2012/08/20 01:43

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