ページ 11

トライフォース型

Posted: 2019年6月15日(土) 16:47
by spitz
任意の2以上のxを入力し 辺(アスタリスクの数)xの二等辺三角形をトライフォースのようにxこ二等辺三角形を積み重ねるようなプログラムを作成しようと思ったところx=2だけであれば作成できるのですがxが3以上の時どのように分岐、ループさせればいいのかわかりません。どのようにやればよろしいでしょうか?

Re: トライフォース型

Posted: 2019年6月15日(土) 17:29
by かずま
spitz さんが書きました:
11ヶ月前
x=2だけであれば作成できるのですが
その作成できたプログラムを見せてください。
また、x = 3、x = 4 の場合の期待する結果を提示してください。

私は次のように考えたのですが、これでは、
x = 2 のとき 底辺3、斜辺2 の二等辺三角形 3個
x = 3 のとき 底辺5、斜辺3 の二等辺三角形 3個
x = 4 のとき 底辺7、斜辺4 の二等辺三角形 3個
となって、辺 x の二等辺三角形 x個積み重ねるようにはなっていません。

コード:

x = 2
   *            
  ***           
 *   *        
*** ***            
    
x = 3
     *
    ***          
   *****         
  *     *
 ***   *** 
***** *****

x = 4
       *
      ***
     *****       
    *******        
   *       *
  ***     *** 
 *****   *****
******* *******

Re: トライフォース型

Posted: 2019年6月15日(土) 19:15
by spitz
x=2のときだけしか考えていなく一般化できてないですが、このようなプログラムを作りました。

コード:

#include<stdio.h>

int main(void){
    int n,i,j;

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

    for(i=1;i<=n;i++){
        for(j=1;j<=n*n-n-i;j++){
            printf(" ");
        }
        for(j=1;j<=2*i-1;j++){
            printf("*");
        }
        for(j=1;j<=2*(n-i+1)-1;j++){
            printf(" ");
        }
         for(j=1;j<=2*i-1;j++){
            printf("*");
        }
         for(j=1;j<=n*n-n-i;j++){
            printf(" ");
        }
        printf("\n");
    }
    
    
    return 0;
}
理想としているのはこのようなものです。

コード:

x=2
---*---
--***--
-*---*-
***-***

x=3
--------*--------
-------***-------
------*****------
-----*-----*-----
----***---***----
---*****-*****---
--*-----*-----*--
-***---***---***-
*****-*****-*****

x=4
---------------*---------------
--------------***--------------
-------------*****-------------
------------*******------------
-----------*-------*-----------
----------***-----***----------
---------*****---*****---------
--------*******-*******--------
-------*-------*-------*-------
------***-----***-----***------
-----*****---*****---*****-----
----*******-*******-*******----
---*-------*-------*-------*---
--***-----***-----***-----***--
-*****---*****---*****---*****-
*******-*******-*******-*******

二等辺三角形を図のようにx段積みあげるという意味でした。説明が下手で申し訳ないです。

Re: トライフォース型

Posted: 2019年6月15日(土) 20:07
by かずま
規則正しいものは、適当な変数を用意して繰り返せばできます。

コード:

#include <stdio.h>

void plot(int c, int n) { while (--n >= 0) putchar(c); }

void draw(int x)
{
	int n = 0, i = 1, k = 0, s = x*x;
	while (--s >= 0) {
		plot('_', s), plot('*', i);
		for (int j = 0; j < k; j++) plot('_', x*2 - i), plot('*', i);
		plot('_', s), putchar('\n');
		i += 2;
		if (++n == x) n = 0, i = 1, k++; 
	}
}

int main(void)
{
	for (int x = 2; x <= 4; x++) printf("\nx = %d\n", x), draw(x);
}

Re: トライフォース型

Posted: 2019年6月15日(土) 22:36
by spitz
すみません。main()関数のみでのプログラム作成になります。

Re: トライフォース型

Posted: 2019年6月15日(土) 23:12
by かずま
spitz さんが書きました:
11ヶ月前
すみません。main()関数のみでのプログラム作成になります。
plot を draw の中に入れ、draw を main の中に入れるだけじゃないですか。

コード:

#include <stdio.h>

int main(void)
{
	for (int x = 2; x <= 4; x++) {
		printf("\nx = %d\n", x);
		int n = 0, i = 1, k = 0, s = x*x, m, j;
		while (--s >= 0) {
			for (m = s; --m >= 0; ) putchar('_');
			for (m = i; --m >= 0; ) putchar('*');
			for (j = k; --j >= 0; ) {
				for (m = x*2-i; --m >= 0; ) putchar('_');
				for (m = i; --m >= 0; ) putchar('*');
			}
			for (m = s; --m >= 0; ) putchar('_');
			putchar('\n');
			i += 2;
			if (++n == x) n = 0, i = 1, k++; 
		}
	}
}

Re: トライフォース型

Posted: 2019年6月16日(日) 01:36
by spitz
ありがとうございました。

Re: トライフォース型

Posted: 2019年6月16日(日) 12:29
by かずま
ループの中に if文があるのが気に食わないので書き直してみました。

コード:

#include <stdio.h>

void plot(int c, int n) { while (--n >= 0) putchar(c); }

void draw(int x)
{
	int s = x*x, t = x*2, i, j, k;
	for (i = 0; i < x; i++)
		for (j = 1; j < t; j += 2) {
			plot('.', --s), plot('*', j);
			for (k = i; --k >= 0; ) plot('.', t-j), plot('*', j);
			plot('.', s), putchar('\n');
		}
}

int main(void)
{
	for (int x = 2; x <= 4; x++) printf("\n x = %d\n", x), draw(x);
}
解は一つではありません。いろいろな解答を考えてみましょう。

Re: トライフォース型

Posted: 2019年6月16日(日) 15:51
by かずま
「*」を打たないところがスペースでよければ、printf が使えます。

コード:

#include <stdio.h>

int main(void)
{
	static char a[] = "*************************************************";
	for (int x = 2; x <= 4; x++) {
		printf("\n x = %d\n", x);
		for (int s = x*x, t = x*2, i = 0; i < x; i++)
			for (int j = 1; j < t; j += 2) {
				printf("%*.*s", --s + j, j, a);
				for (int k = i; --k >= 0; ) printf("%*.*s", t, j, a);
				putchar('\n');
			}
	}
}