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

这里发生了两件事:

  1. 缩进变化(-1 到“中”,+1“后”)

  2. 星数变化(+2 到“中”,-2“之后”)

现在,这可以通过两个循环来完成(一个用于顶部到“中间”,一个用于“之后”),但也可以通过一些数学来确定这些值。让我们探索一下:-)

以下是数字:

        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)

然后这xs(如上面的增量中所述的 2)有关:

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

希望能提供一些见解!

于 2012-05-04T22:11:53.177 回答
1

几乎可以肯定是作业,所以这里有一个线索。

计算一行前的空格数和该行中的星数。您正在寻找的是行号与这两个值之间的关系。

然后你可以使用两个连续for的循环,一个增加星数,另一个减少它。

这些循环中的每一个中,都会有两个连续的循环,以打印出所需数量的空格,然后是所需数量的星号,然后是换行符。


如果您在阅读上述内容后仍然遇到问题,请考虑这一点。对于 (奇数,正如您在评论中声明的那样) 的输入n,空间计数从 开始,(n - 1) / 2星数从 开始1。对于随后的每一行,空格数减少 1,1星数增加 0 2

这一直有效,直到空间计数达到0,然后你转身走另一条路,确保你不打印中间线两次。

一旦星数达到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

到一个单独的函数中,因为它在两个循环之间是通用的。


现在,既然你已经有了自己的代码,下面是我用于概念证明的 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 回答
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

我有点挣扎。也很抱歉,我的最终代码是 C++,而不是严格的 C,因为我已经有 10 年没有使用过 C 了。对于那些试图了解如何为自己解决这个问题的人来说,这里有一个更冗长的解释。在我开始之前,您可以做的一件事来帮助自己,那就是从如下声明开始:

int numStars = 1,numSpaces = 10;

numSpaces 并不重要,只要它足够小以适合您的屏幕......您可以插入任何数字并稍后进行测试。然后,制定你的算法,然后你可以处理输入。

此外,星星之后的空格数与此问题无关。

然后,解决如何输出钻石顶部的问题。我使用计数器循环打印空格,直到我打印第一行的空格数,然后第二个循环(非嵌套)打印该行所需的星数。我们知道在第 1 行中,我们需要打印 10 次空格和 1 次星号。

一旦该行具有所需的空格数和星号,您将转到换行符(“\n”或 endl)。但是下一行你需要多打印 2 个星和少 1 个空格。所以你必须适当地增加/减少。

当你到达中间那排之前的那一排时,你会停下来。换句话说,当 numSpaces 大于 0 时,top 循环需要继续。在循环的最后一次 pass 结束时,numSpaces 减为 0,但它不会打印有 0 个空格和 n 个星(2 个星)的行对于您开始使用的每个空间)。这发生在你的下一个循环中......

然后,您可以运行第二个循环,在最后反转您的增量/减量,但其他方面几乎相同。只有这一次,它应该打印 0 个空格和 10n 个星。然后换行,最后将 numStars 减少 2 并将 numSpaces 增加 1。

如果您还没有使用功能或不允许在实现中使用,那就是它。但是,您可以轻松地调用一个函数,将其传递给每个循环 numSpaces/numStars,以消除重复代码。

这是我在 C++ 中的代码:

#include <iostream>

using namespace std;

int main()
{
    int     numStars = 1,
            numSpaces = 10;

    while (numSpaces > 0)
    {
        for (int i = 0; i < numSpaces; i++)
        {
            cout << " ";
        }
        for (int i = 0; i < numStars; i++)
        {
            cout << "*";
        }
        cout << "\n";

        numStars += 2;
        numSpaces--;
    }
    while (numStars > 0)
    {
        for (int i = 0; i < numSpaces; i++)
        {
            cout << " ";
        }
        for (int i = 0; i < numStars; i++)
        {
            cout << "*";
        }
        cout << "\n";
        numStars -= 2;
        numSpaces++;
    }

    return 0;
}
于 2015-05-21T05:47:13.320 回答
0

我不想给你代码,你应该学习。

输入数字将是菱形的宽度,因此请确保在空格和星号之间建立不超过此数字的关系。

主要思想是从 1 个星号开始,每次递增 2,直到达到输入数字。

此外,如果用户输入偶数,请采取措施防止出错。

于 2012-05-04T22:03:51.133 回答
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
 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
#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

嗨,我在更少的行数中找到了解决这个问题的最佳方法

int b=0;
for(int a=0;b<=50;a=(b<=25) ? a+2 : a-2 ){
    b+=2;
    for(int b=25-a;b>0;b-=2){
        printf(" ");
    }
    for(int c=0;c<=a;c++){
        printf("*");
    }
    printf("\n");
}
于 2015-06-15T03:04:45.050 回答
0

通过星号输出 C 中的菱形

#include<stdio.h>
main()
{
int n, i, j;

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

/* Create up arrow. */
for(i=1; i<=n; i++)
{   /* Left side. */
    for(j=i; j<=n+1; j++)
    {
        printf(" ");

    }
    for(j=1; j<=1; j++)
    {
        printf("*");
    }
    /* Middle. */
    for(j=1; j<i-1; j++)
    {
        printf(" ");

    }

    /* Right side. */
    for(j=1; j<i; j++)
    {
        printf(" ");

    }
    for(j=1; j<=1; j++)
    {
        if(i!=n-(n-1))
            printf("*");
    }
    printf("\n");
}
/* Create down arrow. */
for(i=1; i<=n; i++)
{   /* Left side. */
    for(j=1; j<=i+2; j++)
    {
        printf(" ");

    }
    for(j=1; j<=1; j++)
    {
        if(i!=n)
        printf("*");
    }
    /* Middle. */
    for(j=i; j<n-2; j++)
    {
        printf(" ");

    }
    /* Right side. */
    for(j=i; j<n-1; j++)
    {
        printf(" ");

    }
    for(j=1; j<=1; j++)
    {
        if(i<n-1)
        printf("*");
    }
    printf("\n");
}
}
于 2016-10-26T06:57:58.130 回答