lecture:kiso2:ex:ex09-6.c

文書の過去の版を表示しています。


ex09-6.c

正の整数 $n$ の値を入力すると、全角のアスタリスク(星マーク) と全角の空白文字(あるいは、半角の空白文字2つ)を使って次のような $(2n+1)\times(2n+1)$ のサイズの模様を出力するプログラム ex09-6.c を作成し、kiso2コマンドを用いて提出しなさい。 ただし、n に正の整数以外の値が入力された場合は、何も出力せずに終了するものとする。

実行例:

t190900@s01cd0542-160:~/kiso2-2019/ex09$ ./ex09-6
n? 0
t190900@s01cd0542-160:~/kiso2-2019/ex09$ ./ex09-6
n? 1
***
* *
***
t190900@s01cd0542-160:~/kiso2-2019/ex09$ ./ex09-6
n? 2
*****
** **
*   *
** **
*****
t190900@s01cd0542-160:~/kiso2-2019/ex09$ ./ex09-6
n? 5
***********
***** *****
****   ****
***     ***
**       **
*         *
**       **
***     ***
****   ****
***** *****
***********
t190900@s01cd0542-160:~/kiso2-2019/ex09$ ./ex09-6
n? 12
*************************
************ ************
***********   ***********
**********     **********
*********       *********
********         ********
*******           *******
******             ******
*****               *****
****                 ****
***                   ***
**                     **
*                       *
**                     **
***                   ***
****                 ****
*****               *****
******             ******
*******           *******
********         ********
*********       *********
**********     **********
***********   ***********
************ ************
*************************
このプログラムは、たとえば各行を i、各列を j とすると、次のようなソースコードで表現することができます。
for (i=1; i<=2*n+1; i++) {        // 各行の表示
  for (j=1; j<=2*n+1; j++) {      // 各列の表示
    if ( /* "*" を出力する条件 */ )
      printf("*");
    else // それ以外は空白文字を出力する
      printf(" ");
    }
  printf("\n");                   // 行末の改行
}

*を出力する条件は、複数の不等式の組み合わせとして表現するのが考えやすいと思います。 図形が描かれる領域を i j 座標平面だと考えると、図形の左上の座標が (1,1)、左下の座標が (2n+1, 2n+1)、中央上の座標が (n+1, n+1) …と表現されます。 したがって、ひし形の境界面は i = -j + n + 1 で表すことができます。

  • lecture/kiso2/ex/ex09-6.c.1574054335.txt.gz
  • 最終更新: 2019/11/18 14:18
  • by sano