トライフォース型

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

トライフォース型

#1

投稿記事 by spitz » 4ヶ月前

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

かずま

Re: トライフォース型

#2

投稿記事 by かずま » 4ヶ月前

spitz さんが書きました:
4ヶ月前
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
       *
      ***
     *****       
    *******        
   *       *
  ***     *** 
 *****   *****
******* *******

spitz

Re: トライフォース型

#3

投稿記事 by spitz » 4ヶ月前

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: トライフォース型

#4

投稿記事 by かずま » 4ヶ月前

規則正しいものは、適当な変数を用意して繰り返せばできます。

コード:

#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);
}

spitz

Re: トライフォース型

#5

投稿記事 by spitz » 4ヶ月前

すみません。main()関数のみでのプログラム作成になります。

かずま

Re: トライフォース型

#6

投稿記事 by かずま » 4ヶ月前

spitz さんが書きました:
4ヶ月前
すみません。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++; 
		}
	}
}

spitz

Re: トライフォース型

#7

投稿記事 by spitz » 4ヶ月前

ありがとうございました。

かずま

Re: トライフォース型

#8

投稿記事 by かずま » 4ヶ月前

ループの中に 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: トライフォース型

#9

投稿記事 by かずま » 4ヶ月前

「*」を打たないところがスペースでよければ、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');
			}
	}
}

返信

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