三角形アートについて

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
アドミラル・ヒッパー

三角形アートについて

#1

投稿記事 by アドミラル・ヒッパー » 14年前

学校の課題でピラミッドアートを作っています。

四角形はできたのですが、

三角形
入力 5
*****
****
***
**


逆三角形
入力 5

**
***
****
*****

三角旗
入力 5

**
***
****
*****
****
***
**


が、出来ません。
過去のログを見ていたのですが、途中までしか載っていなかったので解りませんでした。

四角形のソースからいろいろ試しているのですが、全然わかりません

コード:

#include <stdio.h>
void main(void)
{
	int n,i,j;

	printf("input:");
	scanf("%d",&n);
	
	for(i=0; i<n; i++)
	{

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

}
for文の中をいろいろ変えていますが思うように行きません。
ご教授お願いします。

box
記事: 2002
登録日時: 15年前

Re: 三角形アートについて

#2

投稿記事 by box » 14年前

ディスプレイをXY平面とみなして、当該の三角形を
X軸、Y軸、1次関数の式(y=ax+b)で囲んだ領域として考える、
というアプローチもあります。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

アバター
Dixq (管理人)
管理人
記事: 1662
登録日時: 15年前
住所: 北海道札幌市
連絡を取る:

Re: 三角形アートについて

#3

投稿記事 by Dixq (管理人) » 14年前

数式を書いてみて、それをプログラムに落とし込むと楽ですよ。

まず、yの正が下方向である場合、y=xという方程式は

画像

で表されますよね。その内 y<=x の領域は以下のようになります。

画像
(x,yは正とする)

つまり、格子点を全て調べて行って、 y<=x なら「*」を、違うなら「 」を表示すれば良いです。
20x20の格子点を調べて、上の通り実行するプログラムを書いてみました。

コード:


#include <stdio.h>
int main(){
	for( int y=0; y<20; y++ ){
		for( int x=0; x<20; x++ ){
			if( y <= x ){
				printf("*");
			} else {
				printf(" ");
			}
		}
		printf("\n");
	}
	return 0;
}

実行結果
********************
 *******************
  ******************
   *****************
    ****************
     ***************
      **************
       *************
        ************
         ***********
          **********
           *********
            ********
             *******
              ******
               *****
                ****
                 ***
                  **
                   *
 

範囲を指定すれば「X」を書くことや「L」「N」みたいな文字もかけそうですね。やってみて下さい。

non
記事: 1097
登録日時: 15年前

Re: 三角形アートについて

#4

投稿記事 by non » 14年前

前の2つの課題は両方とも12行目の
for(j=0; j<n; j++)
のところを変えて実現します。
例えば、最初の課題

*****
****
***
**


ですが、iを縦の行数、jを横の*の個数と考えると
i=0のときj=5個
i=1のときj=4個
i=2のときj=3個
i=3のときj=2個
i=4のときj=1個
となりますから、jはiとの関係がありそうですね。
すなわち、i行の時はjはn-i個という一般式が導き出されます。

12行のiのとき
for(j=0; j<n; j++)
がn-i回繰り返すようにすればよいことになります。
繰り返す方法は何通りもあります。例えば
for(j=0; j<n-i; j++)
for(j=i; j<n; j++)
for(j=n-i; j>0; j--)
for(j=n; j>i; j--)
のようにです。
non

アバター
asd
記事: 319
登録日時: 15年前

Re: 三角形アートについて

#5

投稿記事 by asd » 14年前

既に皆さんが適切な回答をしているので重複になりますが、
簡単にコメントを入れてみました。

コード:

#include <stdio.h>
void main(void)
{
    int n,i,j;
 
    printf("input:");
    scanf("%d",&n);
    
    for(i=0; i<n; i++)//(1)何行出力するか。0,1,・・・n-1までn行出力する
    {

        for(j=0; j<n; j++)//(2)各行ごとに何個*を出力するか。常に0~n-1まで繰り返すので四角形になる
        {
            printf("* ");
        }
        printf("\n");
    }
    printf("\n");
 
}
三角形、逆三角形については行(iの値)と*の個数の関係を見ていくと分かりやすいと思います。

三角形の場合(入力が5の場合)
iの値(行) *の個数(2の繰り返し回数)
0       5個(回)
1       4個(回)
2       3個(回)
3       2個(回)
4       1個(回)

逆三角形の場合(入力が5の場合)
iの値(行) *の個数(2の繰り返し回数)
0       1個(回)
1       2個(回)
2       3個(回)
3       4個(回)
4       5個(回)

iの値に応じて(2)の繰り返し回数が変わるので、nonさんの回答にあるように
iの値を使って(2)のfor文を書いてあげる必要があります。

続いて三角旗の場合は先の2つの組み合わせであることに気がつけば簡単に実現できます。
例えば入力が5の場合、


**
***
****
*****
****
***
**


となりますがこれは、入力が5の逆三角形と入力が4(つまり5-1)の三角形の組み合わせです。
(入力が4(5-1)の逆三角形と入力が5の三角形の組み合わせでもOKです)
一般式に置き換えると入力がnの逆三角形と入力がn-1の三角形を出力すればOKです。
なので単純に書くとこんな流れになります。

コード:

#include <stdio.h>
void main(void)
{
    int n,i,j;
 
    printf("input:");
    scanf("%d",&n);
    
  //入力nの逆三角形を出力
    for(i=0; i<n; i++)
    {

        for()//条件式は考えてみてください
        {
            printf("* ");
        }
        printf("\n");
    }
  //引き続き入力n-1の三角形を出力
    for(i=0; i<n-1; i++)
    {

        for()//条件式は考えてみてください
        {
            printf("* ");
        }
        printf("\n");
    }

    printf("\n");
 
}
こんな流れになろうと思います。
やってみてわからないことがあれば遠慮せず聞いてくださいね。

無事三角旗までできることをお祈りしております。
Advanced Supporting Developer
無理やりこじつけ(ぉ

アドミラル・ヒッパー

Re: 三角形アートについて

#6

投稿記事 by アドミラル・ヒッパー » 14年前

たくさんの返信ありがとうございます。

皆さんに教えていただいたことでやっていたら、つ、遂に出来ましたー!
ありがとうございました!

これがソースです。

コード:

#include <stdio.h>
void main(void)
{
	int n,i,j;

	printf("input:");
	scanf("%d",&n);

	for(i=0; i<n; i++)		//四角形
	{

		for(j=0; j<n; j++)
		{
			printf("* ");
		}
		printf("\n");
	}
	printf("\n");
	
	for(i=0; i<n+1; i++)	//三角形
	{

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

	for(i=n; i>0; i--)		//逆三角形
	{

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

	for(i=0; i<n; i++)		//三角旗
	{

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

	for(i=n; i>0; i--)		
	{

		for(j=0; j<i; j++)
		{
			printf("* ");
		}
		printf("\n");
	}
	printf("\n");
}
どうでしょうか?おかしい所はないでしょうか?
特に、三角旗は、これがベストなのでしょうか?(ただくっつけただけなので)


やっと出来ましたが、
実はこれを関数化にして、入力したら図形をメニュー形式にして、選ぶようにしないといけないのです><

しかし、これは、同じようなソースがありますので、皆さんの力を借りるまでもないかもしれません。
解らなかったら、また質問しにきますwww

一応、質問した内容は出来ましたので、解決にします。

閉鎖

“C言語何でも質問掲示板” へ戻る