0

ユーザーがひし形に 5 を入力すると、このようなひし形を印刷できるようにしたいと考えています。しかし、奇数で0より大きい値でも機能します。

ここに画像の説明を入力

ユーザー入力 5 に対してひし形を作成するコードがありますが、すべての奇数入力に対しては機能しません。

 half = (size/2)+1;

 for (a=1; a <=  half ; a++) /*top to mid row of diamond*/
   {
     for (b=a; b<half;b++)
       {
     printf(" ");
       }
     for (c= size -2* a; c <=  half; c++)
       {
     printf("*");
       } 
      printf("\n");
   }
 for (a = 1; a < half;a++)
   {
     for (b = a; b>0;b--)
       {
     printf(" ");
       }
     for (c = size-2*a; c >0 ;c--)
       {
     printf("*");
       }
     printf("\n");
   }


  return 0;
}

どんな助けでも大歓迎です。ありがとう。

マイク

4

10 に答える 10

5

ここでは、次の 2 つのことが発生します。

  1. インデントの変更 (-1 から "mid"、+1 "after")

  2. スター数の変更 (+2 to "mid", -2 "after")

さて、これは 2 つのループ (1 つはトップから「ミッド」、もう 1 つは「アフター」) で実行できますが、値は少し計算して決定することもできます。それを調べてみましょう:-)

数字は次のとおりです。

        s(スペース) x(星印) n(行番号)
__X 2 1 0
_XXX 1 3 1
XXXXXX 0 5 2
_XXX 1 3 3
__X 2 1 4

s「中間」に関して対称であることに注意することから始めます。

  • s = abs(2 - n)

そして、それは(上記のデルタで述べたように2によってx)関連しています:s

  • x = 5 - (s * 2) = 5 - (abs(2 - n) * 2)

それがいくつかの洞察を与えることを願っています!

于 2012-05-04T22:11:53.177 に答える
1

あなたはおそらく今 C の入門クラスを取っているでしょう。他の皆さんと同じように、私はあなたがコピーするのを思いとどまらせるでしょうが、参考までにここに答えがあります:

答えを簡単にするために、知っておく必要があるのは、印刷するスペースと星の数だけです。

シーケンスは次のとおりです: [スペースを印刷] [星を印刷] [スペースを印刷] ['\n' を印刷] .
中央の行で、(0) スペース、(numStars)スター、(0) スペースが必要になることに注意してください。
上下の行では、(1) space、(numStars - 2) stars、(1) spaceが必要です。
など...

これにより、スペースの数を数えるには、中央の行からの距離を数える必要があるという感覚が得られるはずです。また、中央から離れた行ごとに、星の数が 2 つ減ることにも注意してください。

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char** argv) {

    int num, middle, spaceCount, starCount;

    printf("Enter a num:");
    scanf("%d",&num);   

    middle = (num-1)/2;

    for (int i = 0; i < num; i++){

        spaceCount = abs(middle - i);
        starCount = num - 2*abs(middle - i);

        for(int c = 0; c < spaceCount; c++)
            printf(" ");

        for(int c = 0; c < starCount; c++)
            printf("*");

        for(int c = 0; c < spaceCount; c++)
            printf(" ");

        printf("\n");
    }


    return 0;
}

現在の行と中央の行の間の距離を計算しているため、絶対値を知る必要があります。abs関数は、それを行うための標準 C 関数です。

于 2015-04-17T18:54:33.363 に答える
1

ほぼ間違いなく宿題なので、ここに手がかりがあります。

行の前のスペースの数とその行の星の数を数えます。探しているのは、行番号とこれら 2 つの値の間の関係です。

次に、2 つの連続したループを使用できます。1 つforは星の数を増やし、もう 1 つは減らします。

これらの各ループ内には、さらに2 つの連続したループがあり、必要な数のスペース、必要な数の星、改行文字が出力されます。


上記を読んでもまだ問題がある場合は、これを検討してください。(奇数、コメントで強制すると述べているように) の入力の場合n、スペース数は から始まり(n - 1) / 2、スター数はから始まり1ます。後続の行ごとに、スペース数が減少し1、星の数が増加し2ます。

これは、スペース数が に達するまで機能し0、その後、向きを変えて反対方向に進み、その中央の行を 2 回印刷しないようにします。

星の数が に達したら、完了0です。

あとは、その仕様をコードに変換するだけです :-)


さて、あなたはコメントで、単にコードを渡すのではなく、独自のソリューションを作成することに興味があることを示したので、独自のソリューションをチェックできるものを提供することに抵抗はありません。使用する疑似コードは次のとおりです。

# Input data, check and init counters.

input n
make sure n is odd and greater than 2
set numspaces to (n-1) / 2
set numstars to 1

# Gradually get wider until just before middle line.

while numspaces > 0:
    for i = 1 to numspaces: output " "
    for i = 1 to numstars:  output "*"
    output newline
    subtract 1 from numspaces
    add 2 to numstars

# Gradually get thinner until end.

while numstars > 0:
    for i = 1 to numspaces: output " "
    for i = 1 to numstars:  output "*"
    output newline
    add 1 to numspaces
    subtract 2 from numstars

そして、最後の演習として、次のようにリファクタリングできます。

    for i = 1 to numspaces: output " "
    for i = 1 to numstars:  output "*"
    output newline

2 つのループ間で共通であるため、別の関数に変換します。


これで、独自のコードが機能するようになったので、完全を期すために、概念実証のために使用した Python コードを次に示します。

def lineout (sp, st):
    s = ""
    for i in range (sp): s = "%s "%(s)
    for i in range (st): s = "%s*"%(s)
    print s

n = 21
numspaces = (n-1) / 2
numstars = 1

while numspaces > 0:
    lineout (numspaces, numstars)
    numspaces -= 1
    numstars += 2

while numstars > 0:
    lineout (numspaces, numstars)
    numspaces += 1
    numstars -= 2

より最新の機能を使用すれば、おそらく Python でより簡潔に記述できますが、それでは、迅速な理解と簡単な翻訳という目的が損なわれます。必要な数に変更nするだけです(奇数で2より大きい、結果のダイヤモンドが端末に収まる場合)。出力をお楽しみください:-)

          *
         ***
        *****
       *******
      *********
     ***********
    *************
   ***************
  *****************
 *******************
*********************
 *******************
  *****************
   ***************
    *************
     ***********
      *********
       *******
        *****
         ***
          *
于 2012-05-04T22:04:27.430 に答える
0

ここでmatlabのコード

clear all, clc
n=input('Input an Odd Number ');
for i=1:(n+1)/2
    for m=1:(n+1)/2-i
        fprintf(' ');
    end
    for j=1:(2*i)-1
        fprintf('*');
    end
    fprintf('\n');
end
for k=i-1:-1:1
    for m=1:(n+1)/2-k
        fprintf(' ');
    end
    for j=1:(2*k)-1
        fprintf('*');
    end
    fprintf('\n');
end
于 2013-12-12T08:45:43.163 に答える
0
#include<stdio.h>
main()
{
int i,j,k,n;
scanf("%d",&n);
n=(n+1)/2;
    for(i=1;i<=n;i++)
    {
        for(j=n;j>=i;j--)
            printf(" ");
        for(k=1;k<=(2*i-1);k++)
            printf("*");
        printf("\n");
    }
    for(i=1;i<=(n-1);i++)
    {
        for(j=0;j<=i;j++)
            printf(" ");
        for(k=(2*n-3);k>=(2*i-1);k--)
            printf("*");
        printf("\n");
}
}
于 2015-03-31T13:11:07.380 に答える
0
 static void Main(string[] args)
        {    //check this out more optimized code hope it will be help full.    
    for (int row=-2;row<=2;row++)
        {
        for (int col=-2;col<=2;col++)
        {
        if (Math.Abs(row)+Math.Abs(col)<=2)
        {
        Console.Write("*");
        }
        else
        {
        Console.Write(" ");
        }
        }
        Console.WriteLine();
        }
            Console.ReadKey();
        }
于 2014-02-12T06:54:46.780 に答える
0

私はあなたにコードを教えたくありません。学ぶべきです。

入力数値がひし形の幅になりますので、スペースとアスタリスクの関係がこの数値を超えないようにしてください。

主なアイデアは、1 つのアスタリスクから始めて、入力数に達するまで毎回 2 ずつ増やすことです。

また、ユーザーが偶数を入力した場合にエラーが発生しないようにします。

于 2012-05-04T22:03:51.133 に答える