文字で簡単な図形を表現するプログラム

【1】「*を使って7×7の正方形を描く,二重ループ用いたをプログラムを作成しなさい」という課題を考えよう。
この課題を素直に言葉で表して,C言語で表現できる形に整えて,プログラムに至るまでを考えよう。

*を7×7の正方形になるように表示する

  ↓

7この*を改行しながら,7回表示する。

  ↓

次の事を7回行う {
 7個の*を表示する
 改行する
}


  ↓

次の事を7回行う {
 次のことを7回行う {
  *を1つ表示する
 }
 改行する
}

  ↓

for (i=0; i<7; i++) {
    for (j=0; j<7; j++) {
        printf("*");
    }
    printf("\n");
}

  ↓

変数宣言が必要なので追加

int i,j;
for (i=0; i<7; i++) {
    for (j=0; j<7; j++) {
        printf("*");
    }
    printf("\n");
}
  ↓

Cプログラムとして整える

#include <stdio.h>
int main()
{
    int i,j;
    for (i=0; i<7; i++) {
        for (j=0; j<7; j++) {
            printf("*");
        }
        printf("\n");
    }
    return 0;
}

出来上がり


【2】 正奇数nを与えて「*」「/」で図形を描くプログラムをつくる時の考え方をみてみよう。

一辺の長さがの正方形で,例えばn=9の時は次のような図形とする。

*********
/*******+
//*****++
///***+++
////*++++

考え方
最初から正奇数nでプログラムを作るのは難しいので,
具体的にn=9のときn=7のときを考えて,
nがどんな数でもよいように一般化する。


1.n=9の時だけ使えるプログラムを考えて図形を描いてみよう。

プログラムを書く前に,日本語でこの作業を書いてみると次のようになる

「*」を9個書きなさい。
「/」を1個書きなさい。 「*」を7個書きなさい。 「+」を1個書きなさい。 改行しなさい。
「/」を2個書きなさい。 「*」を5個書きなさい。 「+」を2個書きなさい。 改行しなさい。
「/」を3個書きなさい。 「*」を3個書きなさい。 「+」を3個書きなさい。 改行しなさい。
「/」を4個書きなさい。 「*」を1個書きなさい。 「+」を4個書きなさい。 改行しなさい。

となる。これをそのままプログラムにすると次のようになるが,汎用性がまったくないプログラムが出来上がる。

#include <stdio.h>

int main()
{
    printf("*********\n");
    printf("/*******+\n");
    printf("//*****++\n");
    printf("///***+++\n");
    printf("////*++++\n");
    return 0;
}

/*実行結果

*********
/*******+
//*****++
///***+++
////*++++

*/

個々の作業が何行目なのかわかるようにすると

(1行目)「*」を9個書きなさい。
(2行目)「/」を1個書きなさい。 「*」を7個書きなさい。 「+」を1個書きなさい。 改行しなさい。
(3行目)「/」を2個書きなさい。 「*」を5個書きなさい。 「+」を2個書きなさい。 改行しなさい。
(4行目)「/」を3個書きなさい。 「*」を3個書きなさい。 「+」を3個書きなさい。 改行しなさい。
(5行目)「/」を4個書きなさい。 「*」を1個書きなさい。 「+」を4個書きなさい。 改行しなさい。

となる。変数化するのに都合よいように,1行目でなく0行目から数え始めると

(0行目)「/」を0個書きなさい。 「*」を9個書きなさい。 「+」を0個書きなさい。 改行しなさい。
(1行目)「/」を1個書きなさい。 「*」を7個書きなさい。 「+」を1個書きなさい。 改行しなさい。
(2行目)「/」を2個書きなさい。 「*」を5個書きなさい。 「+」を2個書きなさい。 改行しなさい。
(3行目)「/」を3個書きなさい。 「*」を3個書きなさい。 「+」を3個書きなさい。 改行しなさい。
(4行目)「/」を4個書きなさい。 「*」を1個書きなさい。 「+」を4個書きなさい。 改行しなさい。

となり,これをプログラムにすると次のようになる。

#include <stdio.h>

int main()
{
    int j;
    for (j=0; j<0; j++) printf("/");
    for (j=0; j<9; j++) printf("*");
    for (j=0; j<0; j++) printf("+");
    printf("\n");
    for (j=0; j<1; j++) printf("/");
    for (j=0; j<7; j++) printf("*");
    for (j=0; j<1; j++) printf("+");
    printf("\n");
    for (j=0; j<2; j++) printf("/");
    for (j=0; j<5; j++) printf("*");
    for (j=0; j<2; j++) printf("+");
    printf("\n");
    for (j=0; j<3; j++) printf("/");
    for (j=0; j<3; j++) printf("*");
    for (j=0; j<3; j++) printf("+");
    printf("\n");
    for (j=0; j<4; j++) printf("/");
    for (j=0; j<1; j++) printf("*");
    for (j=0; j<4; j++) printf("+");
    printf("\n");
    return 0;
}

/*実行結果

*********
/*******+
//*****++
///***+++
////*++++

*/

この図形を描く作業では,4行の表示を行うが,その1行分の作業は次のようになっている。

for (j=0; j<◆; j++) printf("/");
for (j=0; j<■; j++) printf("*");
for (j=0; j<◆; j++) printf("+");
printf("\n");

一般法則化するために i 行目について記述すると次のようになる

( i 行目)「/」を i 個書きなさい。
 「*」を (9-2*i) 個書きなさい。
 「+」を i 個書きなさい。
 改行しなさい。

これを用いてプログラム化すると

#include <stdio.h>

int main()
{
    int i,j;
    for (i=0; i<5; i++) {
        for (j=0; j<i; j++) printf("/");
        for (j=0; j<9-2*i; j++) printf("*");
        for (j=0; j<i; j++) printf("+");
        printf("\n");
    }
    return 0;
}

/*実行結果

*********
/*******+
//*****++
///***+++
////*++++

*/


2.次にn=7の時だけ使えるプログラムを考えて図形を描いてみよう。

(0行目)「/」を0個書きなさい。 「*」を7個書きなさい。 「+」を0個書きなさい。 改行しなさい。
(1行目)「/」を1個書きなさい。 「*」を5個書きなさい。 「+」を1個書きなさい。 改行しなさい。
(2行目)「/」を2個書きなさい。 「*」を3個書きなさい。 「+」を2個書きなさい。 改行しなさい。
(3行目)「/」を3個書きなさい。 「*」を1個書きなさい。 「+」を3個書きなさい。 改行しなさい。

0行目から3行目まであるが,一般法則化するためにi行目について記述すると

( i 行目)「/」を i 個書きなさい。 「*」を (7-2*i) 個書きなさい。 「+」を i 個書きなさい。 改行しなさい。

これをプログラム化すると

#include <stdio.h>

int main()
{
    int i,j;
    for (i=0; i<4; i++) {
        for (j=0; j<i; j++) printf("/");
        for (j=0; j<7-2*i; j++) printf("*");
        for (j=0; j<i; j++) printf("+");
        printf("\n");
    }
    return 0;
}

/*実行結果

*******
/*****+
//***++
///*+++

*/



3.一般的に正奇数nに対して使えるプログラムを考えて図形を描いてみよう。

作業する行数はn=9の時5行,n=7の時4行,n=5の時3行....となるので,行数nlinesは(n+1)/2
となる

(0行目)「/」を0個書きなさい 「*」をn個書きなさい 「+」を0個書きなさい 改行しなさい
(1行目)「/」を1個書きなさい 「*」をn-2*1個書きなさい 「+」を1個書きなさい 改行しなさい
(2行目)「/」を2個書きなさい 「*」をn-2*2個書きなさい 「+」を2個書きなさい 改行しなさい
(3行目)「/」を3個書きなさい 「*」をn-2*3個書きなさい 「+」を3個書きなさい 改行しなさい
                                    :
((nlines-1)行目)「/」をnlines-1個書きなさい 「*」をn-2*(nlines-1)個書きなさい 「+」をnlines-1個書きなさい 改行しなさい

一般的な i 行目の作業は

( i 行目)「/」を i 個書きなさい。
 「*」を n-2*i 個書きなさい。
 「+」を i 個書きなさい。
 改行しなさい

これをプログラム化すると

#include <stdio.h>

int main()
{
    int nodd;  /*与えられた奇数*/
    int nlines;/*行数*/
    int i,j;

    printf("正奇数を入力してね : ");
    scanf("%d",&nodd);
    nlines=(nodd+1)/2;
    for (i=0; i<nlines; i++) {
        for (j=0; j<i; j++) printf("/");
        for (j=0; j<nodd-2*i; j++) printf("*");
        for (j=0; j<i; j++) printf("+");
        printf("\n");
    }
    return 0;
}

/*実行結果

正奇数を入力してね : 13
*************
/***********+
//*********++
///*******+++
////*****++++
/////***+++++
//////*++++++

*/