中空が存在する3角形について

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

中空が存在する3角形について

#1

投稿記事 by ss.8109 » 6年前

コード:

#include<stdio.h>
main()
{
	int n,tate,yoko;
	printf("整数を入力せよ:");
	scanf_s("%d", &n);
	for (tate= n/2;tate>=0; tate--)
	{
		for (yoko = 1; yoko<=tate; yoko++)
		{
			printf(" ");
		}
		for (yoko = 1; yoko <= n - tate* 2; yoko++)          /*辺と中空部分について*/
		{
			if (yoko == 1 || yoko == n - tate * 2 || tate == 0)
			{
				printf("*");
			}
			else
			{
				printf(" ");                  /*中空部分*/
			}
		}
		printf("\n");
	}
}

実行結果
整数を入力せよ:9
*
* *
* *
* *
*********
(ずれているように見えますが一応合ってます)

具体的に何がわからないかというと、空白部分の考え方が一番わかりません。
そのほかにも全体的にどのようなプロセスで解けばいいのかわからないのですが、少しでも協力していただけたら嬉しいです。

shika

Re: 中空が存在する3角形について

#2

投稿記事 by shika » 6年前

tate, tate+1, ................., n-tate
" "...." ", "*", " "............" ",   "*"
1, ................., n-tate-tate
と言った具合に、空白を先に出力している為、tateを1から数え直している様ですが、
全てを、tateだけずらす為に、tate+1 と、n-tate の"*" の位置が、1 と、n-2*tate、と成るのでしょう。
例えほんの少しでも参考に成れば幸いです。

かずま

Re: 中空が存在する3角形について

#3

投稿記事 by かずま » 6年前

ss.8109 さんが書きました:具体的に何がわからないかというと、空白部分の考え方が一番わかりません。
そのほかにも全体的にどのようなプロセスで解けばいいのかわからないのですが、少しでも協力していただけたら嬉しいです。
n = 9 のとき

コード:

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

空白 4、星の幅 1
空白 3、星の幅 3 (中の空白 1)
空白 2、星の幅 5 (中の空白 3)
空白 1、星の幅 7 (中の空白 5)
空白 0、星の幅 9
1行目の空白は、幅 9 の半分の 4 ですから、
空白の個数を tate とすると、tate = n / 2。
行を進めるにつれ 1ずつ減って、0 が最終行です。

星の幅は、全体の幅から左右の空白を引いて
求められるので、n - 2 * tate。

最終行(tate = 0 のとき)以外は中抜きしたいので、
1文字目または (n - 2 * tate)文字目だけを '*' にしています。

返信

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