ページ 1 / 1
三角形アートについて
Posted: 2011年10月25日(火) 18:48
by アドミラル・ヒッパー
学校の課題でピラミッドアートを作っています。
四角形はできたのですが、
三角形
入力 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文の中をいろいろ変えていますが思うように行きません。
ご教授お願いします。
Re: 三角形アートについて
Posted: 2011年10月25日(火) 20:45
by box
ディスプレイをXY平面とみなして、当該の三角形を
X軸、Y軸、1次関数の式(y=ax+b)で囲んだ領域として考える、
というアプローチもあります。
Re: 三角形アートについて
Posted: 2011年10月25日(火) 21:50
by Dixq (管理人)
数式を書いてみて、それをプログラムに落とし込むと楽ですよ。
まず、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」みたいな文字もかけそうですね。やってみて下さい。
Re: 三角形アートについて
Posted: 2011年10月26日(水) 08:49
by non
前の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--)
のようにです。
Re: 三角形アートについて
Posted: 2011年10月26日(水) 10:23
by asd
既に皆さんが適切な回答をしているので重複になりますが、
簡単にコメントを入れてみました。
コード:
#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");
}
こんな流れになろうと思います。
やってみてわからないことがあれば遠慮せず聞いてくださいね。
無事三角旗までできることをお祈りしております。
Re: 三角形アートについて
Posted: 2011年10月27日(木) 15:51
by アドミラル・ヒッパー
たくさんの返信ありがとうございます。
皆さんに教えていただいたことでやっていたら、つ、遂に出来ましたー!
ありがとうございました!
これがソースです。
コード:
#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
一応、質問した内容は出来ましたので、解決にします。