使用嵌套循环在C中打印星形('*')钻石?

时间:2012-05-04 21:58:26

标签: c loops for-loop nested

当用户为钻石输入5时,我希望能够打印出这样的钻石。但也适用于任何奇数且大于0的值。

enter image description here

我有一个代码,用于为用户输入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;
}

非常感谢任何帮助。谢谢。

麦克

11 个答案:

答案 0 :(得分:5)

这里有两件事情发生:

  1. 缩进更改(-1到“mid”,+ 1“后面”

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

  3. 现在,这可以通过两个循环完成(一个用于顶部到“mid”和一个“after”),但是值也可以用一点数学来确定。让我们探索那个: - )

    以下是数字:

            s(spaces)  x(stars) n(line number)
    __X          2        1        0
    _XXX         1        3        1
    XXXXXX       0        5        2
    _XXX         1        3        3
    __X          2        1        4

    首先注意s关于“mid”是对称的:

    • s = abs(2 - n)

    然后xs相关(如上面的增量中所述,为2):

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

    希望能提供一些见解!

答案 1 :(得分:1)

几乎可以肯定的功课,所以这里有一个线索。

计算一行前的空格数和该行中的星数。你要找的是行号和这两个值之间的关系。

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

中,每个循环都会有两个 more 连续循环,用于打印所需数量的空格,后跟所需数量的星号,后跟换行符。< / p>


如果您在阅读完上述内容后仍然遇到问题,请考虑一下。如果输入为(奇数,当您在评论中强制执行时)n,则空格数从(n - 1) / 2开始,星号从1开始。对于每个后续行,空格数减少1,星号增加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,将结果钻石放入您的终端)并享受输出: - )

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

答案 2 :(得分:1)

你现在可能正在上初级C级课程,而且和其他人一样,我会阻止你复制,但是这里的参考是一个答案:

为了使答案变得简单,您需要知道的是要打印多少个空格和星星。

序列如下: [打印空间] [打印星星] [打印空间] [打印'\ n']
观察中间行我们需要:(0)空格,(numStars)星号,(0)空格
在上面和下面的行中,我们需要:(1)空格,(numStars - 2)星星,(1)空格
等等...

这应该让你觉得要计算空间数,你需要计算距离中间行的距离。另请注意,每行距离中间,星数会减少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功能。

答案 3 :(得分:1)

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

int numStars = 1,numSpaces = 10;

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

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

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

一旦行有所需的空格和星号数,就转到换行符(&#34; \ n&#34;或endl)。但是下一行你需要打印2个星星,少1个空格。所以你必须适当增加/减少。

当你到达中间行之前的行时,你将停止。换句话说,当numSpaces大于0时,顶部循环需要继续。在循环中最终传递结束时,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;
}

答案 4 :(得分:0)

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

输入数字将是钻石的宽度,因此请务必在空格和星号之间建立一个不超过此数字的关系。

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

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

答案 5 :(得分: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

答案 6 :(得分: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();
        }

答案 7 :(得分:0)

#include <iostream>
using namespace std;

int main()
{
int n=0, star=0, space=0, ct2=0, ct3=1;
cin >> n;
ct2=n/2;
for(int ct=0; ct< (n/2); ct++)
{
    for(space; space<ct2; space++)
    {
        cout << " ";
    }
    ct2--;
    space=0;
    for(star; star<ct3; star++)
    {
        cout << "*";
    }
    ct3 += 2;
    star=0;
    cout << endl;
}
ct3=n;
ct2=0;
space=0;
star=0;
for(int ct=0; ct< (n/2); ct++)
{
    for(star; star<ct3; star++)
    {
        cout << "*";
    }
    cout << endl;
    ct3 -= 2;
    star=0;
    ct2++;
    space=0;
    for(space; space<ct2; space++)
    {
        cout << " ";
    }
}
cout << "*" << endl;
return 0;
}

答案 8 :(得分: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");
}
}

答案 9 :(得分: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");
}

答案 10 :(得分:0)

Output a diamond in C by asterisk sign

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