ひし形出力

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

ひし形出力

#1

投稿記事 by xj0461jr » 4年前

お世話になります。
学校の課題で分からないところがあるので、質問している次第です。
n の整数値に値を入力すると、その数に応じた、ひし形を描画するプログラムコードです。
n が 9 の時の実行出力は、上部分と下部分の左側が正しく表示されるのですが、右側がおかしくなります。
また、n が 1から7の時も表示がごちゃごちゃになります。

どなたか教えていただけないでしょうか?

コード:


#include <iostream>
using namespace std;

int main(void)
{
	int mid, c = 0, n;

	cout << "整数値を入力 ----> ";
	cin >> n;

	mid = n / 2 + 1;

	for (int y = 1; y <= 9; y++)
	{
		for (int x = 1; x <= 9; x++)
		{
			printf("  ");
			// 左上
			if ((y == c + 1) && (x == mid - c))
			{
				printf("@");
			}
			// 右上
			else if ((y == c + 1) && (x == mid + c))
			{
				printf("@");
			}
			// 左下
			else if ((y == c + 1) && (x == c - 3))
			{
				printf("@");
			}
			// 右下
			else if ((y == mid + 1) && (x == c + 3))
			{
				printf("@");
			}
		}
		cout << "\n";
		c = c + 1;

	}


}

実行結果

整数値を入力 ----> 9
          @
        @    @
      @        @
    @            @
  @                @
    @            @
      @
        @
          @
続行するには何かキーを押してください . . .

整数値を入力 ----> 5
      @
    @    @
  @        @
            @
  @            @
    @            @
      @            @
        @
          @
続行するには何かキーを押してください . . .


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

Re: ひし形出力

#2

投稿記事 by non » 4年前

>n が 9 の時の実行出力は、上部分と下部分の左側が正しく表示されるのですが
と、ありますが、正しい出力はどのような形なのか示して下さい。特に、スペースは例えば、マイナスなどを使って書いてもらえると、わかりやすいです。

プログラムをざっと見た感じでは、14行目や16行目が、あきらかにn=9に限定されたプログラムのようです。
上半分と、下半分に分けてプログラムした方がわかりやすいと思います。
例えばn=9のときなら
----@
---@-@
--@---@
-@-----@
@-------@
まで作ってみるとか。完成図が違っていたらごめんなさい。
non

box
記事: 1746
登録日時: 9年前

Re: ひし形出力

#3

投稿記事 by box » 4年前

ついでに、nが偶数のときはどういう風に出力するのが正しいのでしょうか。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

xj0461jr

Re: ひし形出力

#4

投稿記事 by xj0461jr » 4年前

box さんが書きました:ついでに、nが偶数のときはどういう風に出力するのが正しいのでしょうか。
すいません、情報不足でした。
n が 偶数の時は、考えません。
奇数の時だけ表示するようにします。

xj0461jr

Re: ひし形出力

#5

投稿記事 by xj0461jr » 4年前

non さんが書きました:>n が 9 の時の実行出力は、上部分と下部分の左側が正しく表示されるのですが
と、ありますが、正しい出力はどのような形なのか示して下さい。特に、スペースは例えば、マイナスなどを使って書いてもらえると、わかりやすいです。

プログラムをざっと見た感じでは、14行目や16行目が、あきらかにn=9に限定されたプログラムのようです。
上半分と、下半分に分けてプログラムした方がわかりやすいと思います。
例えばn=9のときなら
----@
---@-@
--@---@
-@-----@
@-------@
まで作ってみるとか。完成図が違っていたらごめんなさい。
各値の時の、理想出力です。
どなたか、教えて下さい。
宜しくお願いします。

n が 1 の時
@

n が 3 の時
----@
--@---@
----@

n が 7 の時
------@
----@----@
--@--------@
@------------@
--@--------@
----@----@
------@

n が 9 の時
--------@
------@----@
----@--------@
--@------------@
@----------------@
--@------------@
----@--------@
------@----@
--------@

かずま

Re: ひし形出力

#6

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

具体的に図を書いてみましょう。

コード:

n = 9, mid = 5
    x
    1 2 3 4 5 6 7 8 9
y 1 - - - - @ - - - -
  2 - - - @ - @ - - -
  3 - - @ - - - @ - -
  4 - @ - - - - - @ -
  5 @ - - - - - - - @
  6 - @ - - - - - @ -
  7 - - @ - - - @ - -
  8 - - - @ - @ - - -
  9 - - - - @ - - - -
左上の線: x + y = 6 = mid + 1
右上の線: x - y = 4 = mid - 1
左下の線: y - x = 4 = mid - 1
右下の線: x + y = 14 = mid + n

ということが分かるので、次のようなコードが書けます。

コード:

    for (y = 1; y <= n; y++) {
        for (x = 1; x <= n; x++) {
		    if      (x + y == mid + 1) cout << " @";
		    else if (x - y == mid - 1) cout << " @";
		    else if (y - x == mid - 1) cout << " @";
		    else if (x + y == mid + n) cout << " @";
			else                       cout << "  ";
		}
		cout << '\n';
	}

YuO
記事: 941
登録日時: 9年前
住所: 東京都世田谷区

Re: ひし形出力

#7

投稿記事 by YuO » 4年前

xj0461jr さんが書きました:n が 3 の時
----@
--@---@
----@
nが3の時は特別扱いですか?

コードブロックを使って整形してみます。
  • そのままコピー

    コード:

    ----@
    --@---@
    ----@
  • -を空白に変換

    コード:

        @
      @   @
        @
行頭に空白が2つで辺の傾きもabs(y/x) = 1/2と,他の行頭に空白が無く辺の傾きがabs(y/x) = 1と異なるようですが。

xj0461jr

Re: ひし形出力

#8

投稿記事 by xj0461jr » 4年前

YuO さんが書きました:
xj0461jr さんが書きました:n が 3 の時
----@
--@---@
----@
nが3の時は特別扱いですか?

コードブロックを使って整形してみます。
  • そのままコピー

    コード:

    ----@
    --@---@
    ----@
  • -を空白に変換

    コード:

        @
      @   @
        @
行頭に空白が2つで辺の傾きもabs(y/x) = 1/2と,他の行頭に空白が無く辺の傾きがabs(y/x) = 1と異なるようですが。
すみません、書き間違いです。
n が 3 の時はこうです。
----@
--@----@
----@

宜しくお願いします。

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

Re: ひし形出力

#9

投稿記事 by non » 4年前

どうしても、スペースの数がわかりません。
----@
--@----@
----@
1行目はスペースが4個
2行目は2個?間に4個?
規則性がわからないのですが・・・・私だけ?
non

xj0461jr

Re: ひし形出力

#10

投稿記事 by xj0461jr » 4年前

かずま さんが書きました:具体的に図を書いてみましょう。

コード:

n = 9, mid = 5
    x
    1 2 3 4 5 6 7 8 9
y 1 - - - - @ - - - -
  2 - - - @ - @ - - -
  3 - - @ - - - @ - -
  4 - @ - - - - - @ -
  5 @ - - - - - - - @
  6 - @ - - - - - @ -
  7 - - @ - - - @ - -
  8 - - - @ - @ - - -
  9 - - - - @ - - - -
左上の線: x + y = 6 = mid + 1
右上の線: x - y = 4 = mid - 1
左下の線: y - x = 4 = mid - 1
右下の線: x + y = 14 = mid + n

ということが分かるので、次のようなコードが書けます。

コード:

    for (y = 1; y <= n; y++) {
        for (x = 1; x <= n; x++) {
		    if      (x + y == mid + 1) cout << " @";
		    else if (x - y == mid - 1) cout << " @";
		    else if (y - x == mid - 1) cout << " @";
		    else if (x + y == mid + n) cout << " @";
			else                       cout << "  ";
		}
		cout << '\n';
	}
かずまさんが書かれたコードを、自分の書いたコードと比較して
紙にトレースして理解できるようにします。
私は、空間認識が低いので努力していきたいです。

皆様、沢山の回答、ありがとうございした。

閉鎖

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