• 締切済み

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

二重for文の特長を活かし、次のような表示を行うプログラムを書きなさい。 ※四角形からダイヤ型をくり貫いたような表示。 ただし、キーボード入力で数字を出力し、その数字の数が、横配列の■の最大値となるようにすること(この例の場合、出力した数字は7)。 つまりは、出力した数字に応じて、■とダイヤの大きさが変化する。

みんなの回答

  • bravy
  • ベストアンサー率0% (0/2)
回答No.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を引数で渡すのこんな風になります。 ■■■■■■■■■■■■■■■■■■■■ ■■■■■■■■■■□■■■■■■■■■ ■■■■■■■■■□□□■■■■■■■■ ■■■■■■■■□□□□□■■■■■■■ ■■■■■■■□□□□□□□■■■■■■ ■■■■■■□□□□□□□□□■■■■■ ■■■■■□□□□□□□□□□□■■■■ ■■■■□□□□□□□□□□□□□■■■ ■■■□□□□□□□□□□□□□□□■■ ■■□□□□□□□□□□□□□□□□□■ ■□□□□□□□□□□□□□□□□□□□ ■■□□□□□□□□□□□□□□□□□■ ■■■□□□□□□□□□□□□□□□■■ ■■■■□□□□□□□□□□□□□■■■ ■■■■■□□□□□□□□□□□■■■■ ■■■■■■□□□□□□□□□■■■■■ ■■■■■■■□□□□□□□■■■■■■ ■■■■■■■■□□□□□■■■■■■■ ■■■■■■■■■□□□■■■■■■■■ ■■■■■■■■■■□■■■■■■■■■ キーボード入力で数字をという要求は満たしていません。

  • yama5140
  • ベストアンサー率54% (136/250)
回答No.3

(「回答」するか、躊躇しました。初めての経験です) >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 ); } 注:インデントに全角空白を用いています。コピペ後、タブに一括変換して下さい。

  • bravy
  • ベストアンサー率0% (0/2)
回答No.2

キーボードから入力された数字を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 こんな座標を考えてみてはどうでしょう。 座標の原点とか向きは少し考える必要があると思います。

  • okg00
  • ベストアンサー率39% (1322/3338)
回答No.1

#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); }

関連するQ&A