二重for文の特長を活かし、次のような表示を行うプログラムを書きなさい。
※四角形からダイヤ型をくり貫いたような表示。

ただし、キーボード入力で数字を出力し、その数字の数が、横配列の■の最大値となるようにすること(この例の場合、出力した数字は7)。
つまりは、出力した数字に応じて、■とダイヤの大きさが変化する。

A 回答 (4件)

要求に対してシステムがどのような振舞をするかを書いたのがNo2です。


これは要求を分析して、どのようにするとそれが満たされるかを考えたものです。
後は素直にCのコーディングにすれば良いのではないでしょうか?
ちなみにy軸は普通の座標と逆と考えます。
下限値をy0として、上限値をy9とすると、(y0<y && y < y9)の時に白抜きになるという事を書けばよいのです。

#include <stdio.h>
int
main (int argc, char *argv[])
{
 int x, y;
 int n = (argc > 1) ? atoi (argv[1]) : 7;
 for (y = 0; y < n; y++)
  {
   for (x = 0; x < n; x++)
{
 int y0, y9;
 if (x < (n / 2))
  {
   y0 = -x + n / 2;
   y9 = x + n / 2;
  }
 else
  {
   y0 = x - n / 2;
   y9 = -x + 3 * n / 2;
  }
 printf ("%s", (y0 < y && y < y9) ? "□" : "■");
}
   printf ("\n");
  }
}
----
省略値で7となるようになっています。
■■■■■■■
■■■□■■■
■■□□□■■
■□□□□□■
■■□□□□■
■■■□□■■
■■■□■■■

このプログラムに20を引数で渡すのこんな風になります。
■■■■■■■■■■■■■■■■■■■■
■■■■■■■■■■□■■■■■■■■■
■■■■■■■■■□□□■■■■■■■■
■■■■■■■■□□□□□■■■■■■■
■■■■■■■□□□□□□□■■■■■■
■■■■■■□□□□□□□□□■■■■■
■■■■■□□□□□□□□□□□■■■■
■■■■□□□□□□□□□□□□□■■■
■■■□□□□□□□□□□□□□□□■■
■■□□□□□□□□□□□□□□□□□■
■□□□□□□□□□□□□□□□□□□□
■■□□□□□□□□□□□□□□□□□■
■■■□□□□□□□□□□□□□□□■■
■■■■□□□□□□□□□□□□□■■■
■■■■■□□□□□□□□□□□■■■■
■■■■■■□□□□□□□□□■■■■■
■■■■■■■□□□□□□□■■■■■■
■■■■■■■■□□□□□■■■■■■■
■■■■■■■■■□□□■■■■■■■■
■■■■■■■■■■□■■■■■■■■■

キーボード入力で数字をという要求は満たしていません。
    • good
    • 0

(「回答」するか、躊躇しました。

初めての経験です)

>C言語に詳しい方、お願いします!

 質問者様は、「この問題は、C言語に詳しくないと、解けない」とお考えですね。
 どうして、そんな問題にチャレンジしたのですか?。
 なぜ、「困り度」が最高なのですか?。

☆まず自分で「考える・解決する」という気構えが・・・と思います。

>※四角形からダイヤ型をくり貫いたような表示。

 をするには、「出力した数字」の最小は、いくつか?考えてみましたか。
 偶数で実現できるかどうかも。

 これを考えるのに必要なのは、紙と筆記具だけで、「C言語に詳しい」かどうかは無関係ですよ。
   12345
   ■■■■■
   ■■ ■■
   ■   ■
   ■■ ■■
   ■■■■■

 この図が、最も小さい?と思われます。
 まわりに1つ追加したものを想定してみると・・(×偶数)。

「ここまで判ったのですが、コード化できません」のような質問・・。
+++++++++++++++++++++++++++++++++++++++++++++
確かに、難しいですね、・・「詳しくない」からかなぁ?。

で、No.2 さんのをコード化してみました。

・どうして3が出てくるかは、考えてください。
   ヒント:切片 y = x + b

#include <stdio.h>
#include <stdlib.h>

char cZen[ 2 ][ 4 ] = { "■", "□" };

int main( void )
{
 int x, y, iGrid[ 32 ][ 32 ] = { { 0 } }, iKazu, iHan, iCode;

 scanf( "%d", &iKazu );

 if( 0 == ( iKazu % 2 ) ) iKazu++; // 強制奇数化

 if( iKazu < 5 ) return( -1 );
 if( iKazu > 31 ) return( -1 );

 printf( "%d\n", iKazu );

 iHan = iKazu / 2;

 for( y = 1; y <= iHan; y++ ){

  for( x = 1; x < iHan; x++ ){

   if( ( iHan - x ) < y ) iGrid[ x ][ y ] = 1;
  }
  for( x = iHan; x < iKazu; x++ ){

   if( ( x - iHan ) < y ) iGrid[ x ][ y ] = 1;
  }
 }
 for( y = iHan; y < iKazu; y++ ){

  for( x = 1; x < iHan; x++ ){

   if( ( x + iHan ) > y ) iGrid[ x ][ y ] = 1;
  }
  for( x = iHan; x < iKazu; x++ ){

   if( ( 3 * iHan - x ) > y ) iGrid[ x ][ y ] = 1;
  }
 }
 for( y = 0; y < iKazu; y++ ){

  for( x = 0; x < iKazu; x++ ){

   iCode = iGrid[ x ][ y ];

   printf( "%s", cZen[ iCode ] );
  }
  printf( "\n" );
 }
 return( 0 );
}
注:インデントに全角空白を用いています。コピペ後、タブに一括変換して下さい。
    • good
    • 0

キーボードから入力された数字をnとする。


[0<=x && x<=n/2]の時
下限値 y=-x+n/2 上限値 y=x+n/2
[n/2<x && x<=n]の時
下限値 y=x-n/2 上限値 y=-x+3*n/2
こんな座標を考えてみてはどうでしょう。

座標の原点とか向きは少し考える必要があると思います。
    • good
    • 0

#include <stdio.h>



int main(void)
{
char* c[7]={
"■■■■■■■",
"■■■ ■■■",
"■■   ■■",
"■     ■",
"■■   ■■",
"■■■ ■■■",
"■■■■■■■"
};

for(int i=0;i<7;i++){
printf("%s\n", c[i]);
for(int j=0;j<7;j++);
}

return(0);
}
    • good
    • 0

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


人気Q&Aランキング