• ベストアンサー

C言語

入力した数の高さと幅の長方形を*で表示するプログラミング 縦4、横4のとき (例) **** **** **** **** この長方形を表示するプログラミングを 縁の太さ2 の「中が空白の長方形」になるようにするにはどのようなプログラミングにしたらいいのでしょうか? (例) 縦6 横7 ******* ******* **   ** **   ** ******* ******* 普通に長方形を表示するのはわかったのですが、中を空白にする方法がわかりません。 たぶんif文を使って空白と*を書き分けるのですよね? どのようなif文の条件にするのかが分かりません、どなたか教えてくださいお願いします。 長方形を表示する途中までやったのプログラミング #include <stdio.h> int main (void) {   int i, j, width, height;   scanf("%d %d", &width, &height);   for(j = 1; j <= height; j ++ ) {    for(i = 1; i <= width; i ++ ) {      printf("*");   }    printf("\n");  } return(0); }

質問者が選んだベストアンサー

  • ベストアンサー
  • remwind
  • ベストアンサー率50% (1/2)
回答No.2

こんにちは。 「*」を出すときはどんなとき?を文章にしてみると分かりやすいかと思います。 条件1.1行内では、最初の2つか、後ろの2つのときは「*」、それ以外は「 」を出力する  →((i <= 2) || (i >= width-1)) 条件2.条件1とは別に、最初の2行と最後の2行は「*」を出力する  →((j <= 2) || (j >= height-1)) 1と2のどちらかの条件に当たったときは「*」になりますので、OR(||)でつなげます。 →(((i <= 2) || (i >= width-1)) || ((j <= 2) || (j >= height-1))) すべてOR条件の「どれかに当てはまるなら」の条件文になります。 for(j = 1; j <= height; j ++ ) { for(i = 1; i <= width; i ++ ) { if ((i <= 2) || (i >= width-1) || (j <= 2) || (j >= height-1)) { printf("*"); } else { printf(" "); } } printf("\n"); }

jinnora7
質問者

お礼

回答ありがとうございます。 とてもわかりやすい説明でした。とても参考になりました。 ありがとうございます!!

その他の回答 (2)

  • mako_tyo
  • ベストアンサー率37% (61/161)
回答No.3

こんにちわ 初めに 私はC言語を書けません。叩かれ覚悟で回答します。 下のソースはC#のものです。こんな書き方もあるよって参考程度に見てくれたら幸いです。 static void Main(string[] args) { const int nX = 6; const int nY = 7; //出力させる図 string[,] strMap = new string[nX, nY] { {"*","*","*","*","*","*","*"}, {"*","*","*","*","*","*","*"}, {"*","*"," "," "," ","*","*"}, {"*","*"," "," "," ","*","*"}, {"*","*","*","*","*","*","*"}, {"*","*","*","*","*","*","*"}, }; for (int nXCount = 0; nXCount < nX; nXCount++) { for (int nYCount = 0; nYCount < nY; nYCount++) { Console.Write(strMap[nXCount, nYCount]); } Console.WriteLine("");//改行させる } Console.ReadLine(); } 何行目で空白にするとかifで決めるのではなく予め、2次元配列を使って作画イメージを定義してそれをfor文で出力したものです。 もし出力内容を変更しなさいって言われたらこっちのほうが何も考えないで楽かなーって思い回答してみました。

jinnora7
質問者

お礼

回答ありがとうございます。 こういう考え方もあるんですね。 参考になりました!

  • t_nojiri
  • ベストアンサー率28% (595/2071)
回答No.1

学校の課題か何かだと思いますけどとりあえず、 考え方だけ この際、2行と言う事で書きますが *を全部表示する部分は? 上側:1行目、2行目(2行目) 下側:height-1行目、Height行目(Height-2行目) *と空白を幅行分書く部分は? if((2 < j) && (j < (Height-2)){ if((i < 2) || ((width - 2) < i)){ printf("*"); } }else{ /* 上下の*描画部分 */ printf("*"); } for文の中に入れればとりあえず、それらしく動くと思いますけど。

jinnora7
質問者

補足

回答ありがとうございます。 参考になりました。 おかげで納得してつくることができました。

関連するQ&A